这是一个单片机程序问题,,还望高手指点下!谢谢

来源:百度知道 编辑:UC知道 时间:2024/06/08 01:05:33
这是一个秒表自动计时的程序,,为什么当while(!key4)把该句加上后,,当按下KEY2时,程序暂停,,但是再用点力按KEY4后,程序就静止显示数字,,过了好几秒才动,,而把while(!key4)该句删去后,,才能自如自控制其暂停与启动呢???
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void display(uint,uint,uint, uint);
void init();
uchar a,b,num,d;
uint bai, shi, ge,temp,jishu,c;
uint code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
sbit key2=P3^3;
sbit key3=P3^4;
sbit key4=P3^5;
sbit beep=P3^6;
void delay(uchar z)
{
uchar i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
init();
jishu=0;
d=0;

while(1)
{
if(num==2)
{ num=0;
temp++;
if(temp==1000)
{
temp=0;
jishu++;
if(jishu==16)jishu=0;
if(jishu==1)
{
beep=0;
delay(2000);
beep=1;
}

这段代码有问题:
if(key4==0)
{
TR0=1;
while(!key4); 不明白该步骤!
//TR0=1;
}
“TR0=1;”,定时器就开始工作了,接着执行“while(!key4);”,等待Key4释放。由于key4等待时间比较长,在Key4释放前,又来了一次定时器中断,程序重新开始执行中断服务子程序。至于你说的过了好几秒才能动,我认为是这样的:在Key4释放前,定时器中断打入了很多次,每来一次都出现一次中断嵌套,这样当程序从中断嵌套一层一层地返回时,花掉了很多时间。

补充:
由于我对你的程序不是很了解,不知道你这个程序的编写目的,基本思路,所以一下子也提不出什么好的建议,建议你把你的设计思路介绍一下,再就是你的程序缺少注释,添加注释是个很好的习惯。

最好用此程序来去抖
if(key2==0)while(key2==0);...即按键放手后再动作
初步看了看。你的中断服务子程序里没有显示子程序,如果你按键时不得显示的乱了吗?最好在中断服务程序里也加上显示程序,而且中断里的程序要尽量的少不然会影响时间的准确度。
你说的情况估计是抖动太大影响的,你按我上面给你的程序改动下试试,如果还有问题我再帮你解决

关键在于while后面的分号吧?
消抖是一个方面,但还要注意等待按键释放!