实现目的是用单片机驱动四位一体的数码管计数从0~2000,程序如下,目前程序存在一个问题就是计数达到256之后就自动归零了,无法继续计数,实在找不到问题所在,特此来论坛求解,有没有大神解惑?
单片机源程序如下:
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
#define LED P0
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管码表
uchar num,t,kilobit,percentile,tenth,units;
void init();//定时器初始化子程序
void timer0();//
void display();//显示子程序
void delay(uchar); //延时子程序
sbit KEY1=P3^6;//设定开始键
sbit KEY3=P1^7;//设定暂停键
sbit KEY2=P3^7;//设定复位键
void main()
{
init();//调用初始化程序
while(1)
{
timer0();//查询时间
display();//显示
if(KEY1==0)//开始
{
if(TR0==0)//定时器没有打开的时候
{
t=0;
num=0;
TR0=1;
}
}
else if(KEY2==0)//复位
{
TR0=0; //关闭定时器
TF0=0; //清除时间溢出标志位
t=0;
num=0;
TR0=1;
}
while(!KEY3)
{
TR0=~TR0;
delay(20);
}
}
}
void init()//定时器初始化部分
{
num=t=0; //清除数据
TMOD=0x01; //定时器初始化,选择为0模式16位计数器
TH0=0xEC; //定时器赋初值,定时50ms,转化为16进制
TL0=0x78; //65536-5000=60536=0xEC78
EA=1; //CPU中断允许
ET0=1; //置1允许T0中断(允许溢出请求)
}
void timer0()
{
if(TF0==1) //查询溢出的时间
{
TF0=0; //清除溢出标志位
t++;
if(t==10) //累计时间到0.5S
{
t=0;
num++;
}
}
}
void display() //显示
{
if(num>2000)
{
num=0; //数据显示限制
// if(TR0==1)
TR0=0;
}
kilobit=num/1000; //取千位
percentile=(num/100)%10; //取十位
tenth=(num/10)%10;
units=num%10;
P2=0X00; //消隐
P0=0XFF;
P2=0x01; //显示第一位
LED=tab[kilobit];
delay(4);//延时
P2=0X00;
P0=0XFF;
P2=0x02; //显示第二位
LED=tab[percentile];
delay(4);//延时
P2=0X00;
P0=0XFF;
P2=0x04; //显示第三位
LED=tab[tenth];
delay(4);//延时
P2=0X00;
P0=0XFF;
P2=0x08; //显示第四位
LED=tab[units];
delay(4);//延时
}
void delay(uchar x)
{
uint i,j;
for(i=1;i<=x;i++)
{
for(j=0;j<=250;j++)
;
}
}
|