|
實(shí)現(xiàn)目的是用單片機(jī)驅(qū)動四位一體的數(shù)碼管計數(shù)從0~2000,程序如下,目前程序存在一個問題就是計數(shù)達(dá)到256之后就自動歸零了,無法繼續(xù)計數(shù),實(shí)在找不到問題所在,特此來論壇求解,有沒有大神解惑?
單片機(jī)源程序如下:
#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};//數(shù)碼管碼表
uchar num,t,kilobit,percentile,tenth,units;
void init();//定時器初始化子程序
void timer0();//
void display();//顯示子程序
void delay(uchar); //延時子程序
sbit KEY1=P3^6;//設(shè)定開始鍵
sbit KEY3=P1^7;//設(shè)定暫停鍵
sbit KEY2=P3^7;//設(shè)定復(fù)位鍵
void main()
{
init();//調(diào)用初始化程序
while(1)
{
timer0();//查詢時間
display();//顯示
if(KEY1==0)//開始
{
if(TR0==0)//定時器沒有打開的時候
{
t=0;
num=0;
TR0=1;
}
}
else if(KEY2==0)//復(fù)位
{
TR0=0; //關(guān)閉定時器
TF0=0; //清除時間溢出標(biāo)志位
t=0;
num=0;
TR0=1;
}
while(!KEY3)
{
TR0=~TR0;
delay(20);
}
}
}
void init()//定時器初始化部分
{
num=t=0; //清除數(shù)據(jù)
TMOD=0x01; //定時器初始化,選擇為0模式16位計數(shù)器
TH0=0xEC; //定時器賦初值,定時50ms,轉(zhuǎn)化為16進(jìn)制
TL0=0x78; //65536-5000=60536=0xEC78
EA=1; //CPU中斷允許
ET0=1; //置1允許T0中斷(允許溢出請求)
}
void timer0()
{
if(TF0==1) //查詢溢出的時間
{
TF0=0; //清除溢出標(biāo)志位
t++;
if(t==10) //累計時間到0.5S
{
t=0;
num++;
}
}
}
void display() //顯示
{
if(num>2000)
{
num=0; //數(shù)據(jù)顯示限制
// 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++)
;
}
}
|
|