/* 本程序实现了用数码管显示时间的功能,时间计数和现实基本一致(这取决于定时器精度和指令时间)。 该程序提供了一种用定时器延时实现传统 delay 的显示方法,后面给出比较。 文档最后有该程序对应的原理图,大部分开发板都能直接用这个程序,稍微改下 IO 口即可。如有错误之处请包涵,此篇文档仅作交流之用。 */ /*---------------------定时器方法----------------*/ #include /*----------------全局变量定义区----------------*/ sbit duan_xuan=P2^6; //数码管显示控制 I/O sbit wei_xuan=P2^7; unsigned char minute = 0; //分钟的变量,20*60 次 timer0 中断 unsigned char hour = 0; unsigned char i_num_timer0; //定时器中断次数 unsigned char i_num_timer1; unsigned char disp_min1,disp_min2,disp_hour1,disp_hour2; //分解后的数值变量 unsigned char wei = 1; //用来标记显示哪个数码管 unsigned short uc50ms = 0; //记录 time0 中断次数,此程序用两个变量记录 time0中断次数 /*------定义数码管显示的数字---------*/ unsigned char code duan_table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71 }; /*-----------------函数声明段----------------*/ void ini_program(); void disp_time(); //显示时间 void current_time(); //记录小时,分钟变量 // void breakdown_time(uint hour,uint minute);//分解数值,送数码管分别显示 //------------------------------------- void main() { ini_program(); while(1) { current_time(); // breakdown_time(hour,minute); disp_min1=minute%10; disp_min2=minute/10; disp_hour1=hour%10; disp_hour2=hour/10; // disp_time(); } } //------------------------------------ void ini_program() //初始化 { duan_xuan=0; wei_xuan=0; //重置I/O 状态 TMOD=0x11; //定时器0+定时器1,设定方式1 TH1=(65536-1834)/256; TL1=(65536-1834)%256; //2ms 触发一次中断 TH0=(65536-45872)/256; TL0=(65536-45872)%256; //50ms 触发一次中断 EA=1; ET0=1; ET1=1; TR0=1; TR1=1; } /* void breakdown_time(uint hour,uint minute) { disp_min1=minute%10; disp_min2=minute/10; disp_hour1=ho...