郭天祥教程的练习题,三个独立键盘实现按下第一个时计时停止,按下第二个时计时开始,按下第三个是计数值清零从头开始。这是我自己编的程序,可以正常实现功能。但是我在自己调试程序排错的时候,想到了中断的概念。比如这里按key3键是计数值从0开始显示,我在想如果定时器中断时间到,刚好在bb=0;bai=bb/100;shi=bb%100/10;ge=bb%10;这几句话后面进入中断程序(程序中用红 {MOD}标出了),进入中断后,bb被加到1,中断程序执行完回到主程序,此时个,十,百位分别是1,0,0,这样不是和我们程序的要求不一致了么(程序要求复位从0开始计时)。但是我把程序下载到板子上面没有出现按key3是1的情况,都是符合题目要求的0。请前辈指点,我的概念哪里出错了?
#include<reg52.h>
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
unsigned char aa,ge,shi,bai;
unsigned int bb;
void init();
void display(unsigned char,unsigned char,unsigned char);
void delay(unsigned int);
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void main()
{
init();
while(1)
{
if(key1==0)
{
delay(5);
if(key1==0)
{
TR0=0;
}
}
if(key2==0)
{
if(key2==0)
{
TR0=1;
}
}
if(key3==0)
{
bb=0;
bai=bb/100;
shi=bb%100/10;
ge=bb%10;
//如果在这句话后,定时器中断定的时间到,进入定时器中断,那么bb被加1,个位被刷新为1,此时这个复位键复位到的是1??那么数码管也显示1?和要求不符,但实际下载程序到板子上的结果却是每次按这个键下去都是复位到0. if(key1==1){TR0=1;}
}
display(bai,shi,ge);
}
}
void init() //初始化函数
{ wela=1;
P0=0xff;
wela=0;
dula=1;
P0=0x00;
dula=0;
aa=0;
bb=0;
P3=0xff;
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0() interrupt 1 //定时器0中断
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
aa++;
if(aa==1)
{
aa=0;
bb++;
}
bai=bb/100;
shi=bb%100/10;
ge=bb%10;
if(bb==999)
{
bb=0;
}
}
void display(unsigned char one,unsigned char two,unsigned char three) //显示函数
{
dula=1;
P0=table[one];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;
P0=table[two];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;
P0=table[three];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
}
void delay(unsigned int z) //延时程序
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
此帖出自
小平头技术问答
几次都不对劲,我再发一次
[ 本帖最后由 辛昕 于 2012-4-19 02:07 编辑 ]
一周热门 更多>