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