一個(gè)關(guān)于單片定時(shí)器中斷的典型錯(cuò)誤
分析一下以下程序以下程序?yàn)槭裁磿?huì)間斷的現(xiàn)實(shí)40(本想編成40S倒計(jì)時(shí))提示:?jiǎn)栴}出在延時(shí)子程序
#include
#define uchar unsigned char
#define uint unsigned int
sbit p14=P1^4;
sbit p13=P1^3;
uint i,t,z=50;
void delay()
{
while(z--); }
#define uchar unsigned char
#define uint unsigned int
sbit p14=P1^4;
sbit p13=P1^3;
uint i,t,z=50;
void delay()
{
while(z--); }
unsigned char code tab[] =
{
0XC0,//;0
0XF9,//;1
0XA4,//;2
0XB0,//;3
0X99,//;4
0X92,//;5
0X82,//;6
0XF8,//;7
0X80,//;8
0X90,//;9
};
void main()
{i=40;
t=0;
TMOD=1;//設(shè)置定時(shí)器0為工作方式1
TH0=(65536-46080)/256;//定時(shí)50ms高8位求模
TL0=(65536-46080)%256;//定時(shí)50ms低8位求余
EA=1;//開(kāi)總中斷
ET0=1;//定時(shí)器0中斷
TR0=1;//啟動(dòng)定時(shí)器0
while(1)
{
if(t==20)//50ms中斷20次
{
t=0;
i--;//倒計(jì)時(shí)總數(shù)每秒減1
}
if(i>0)
{
p14=0;//數(shù)碼管個(gè)位位選關(guān)閉
p13=1;//數(shù)碼管十位位選選通
P0=tab[i/10];//顯示十位數(shù)據(jù)
delay();
P0=0xff;//關(guān)閉數(shù)碼管段選
p14=1;//數(shù)碼管個(gè)位位選選通
p13=0;//數(shù)碼管十位位選關(guān)閉
P0=tab[i%10];//顯示個(gè)位數(shù)據(jù)
delay();
P0=0xff;//關(guān)閉數(shù)碼管段選
}
else{i=40;}
}
}
void timer0() interrupt 1//定時(shí)器0中斷入口
{TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
}
{
0XC0,//;0
0XF9,//;1
0XA4,//;2
0XB0,//;3
0X99,//;4
0X92,//;5
0X82,//;6
0XF8,//;7
0X80,//;8
0X90,//;9
};
void main()
{i=40;
t=0;
TMOD=1;//設(shè)置定時(shí)器0為工作方式1
TH0=(65536-46080)/256;//定時(shí)50ms高8位求模
TL0=(65536-46080)%256;//定時(shí)50ms低8位求余
EA=1;//開(kāi)總中斷
ET0=1;//定時(shí)器0中斷
TR0=1;//啟動(dòng)定時(shí)器0
while(1)
{
if(t==20)//50ms中斷20次
{
t=0;
i--;//倒計(jì)時(shí)總數(shù)每秒減1
}
if(i>0)
{
p14=0;//數(shù)碼管個(gè)位位選關(guān)閉
p13=1;//數(shù)碼管十位位選選通
P0=tab[i/10];//顯示十位數(shù)據(jù)
delay();
P0=0xff;//關(guān)閉數(shù)碼管段選
p14=1;//數(shù)碼管個(gè)位位選選通
p13=0;//數(shù)碼管十位位選關(guān)閉
P0=tab[i%10];//顯示個(gè)位數(shù)據(jù)
delay();
P0=0xff;//關(guān)閉數(shù)碼管段選
}
else{i=40;}
}
}
void timer0() interrupt 1//定時(shí)器0中斷入口
{TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
}
評(píng)論