定时1秒级联计算方法:
首先明确 1、机械周期= 1/晶振频率(12MHZ) * 12 =1μS
2、了解计算定时最大时间:2^16 *1μS=65.536ms
3、计算50ms 对应的16进制值
50ms/1μs=50000=0xC350
4、设置定时器工作为16bit 2^16= 0xFFFF
设置初值:T0=0xFFFF-0xC350=0x3CAF 即 从这个初始值开始,累计到最高 值时,用时50ms
5、累计20个50ms 得到1s 定时周期
#include<reg51.h> //共阳极数码管真值表 unsigned char code LedChar[]={ 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E }; void main() { unsigned int i=0; unsigned char cnt=0; unsigned int tcnt=0; TMOD = 0x01; //设置工作模式 TH0 = 0xB8; //定义初值 高字节 TL0 = 0x00; //定义初值 低字节 TR0 = 1; //开始计数 从初值开始计数++ while(1) { if(TF0==1) // 从初值累计到最高时间0xFFFF 触发一次TF0 溢出标志位 ,先计算20ms 多少个机器周期 ,并且转成16进制 , { TF0=0; TH0=0xB8; TL0=0x00; tcnt++; if(tcnt>=50) { tcnt=0; if(cnt<8) { P0=~(0x01<<cnt); //0000 0001->1111 1110 0000 0010 ->1111 1101 P2=LedChar[cnt+1]; } else if(cnt>=8) { P0= ~(0x80>>(cnt-7)); //1000 0000->0111 1111 P2=LedChar[cnt-7]; } cnt++; if(cnt>=15) { cnt=0; } } } } }