标题: 51单片机秒表系统设计 为什么按下K2一直是25秒 [打印本页]

作者: 段婉婷    时间: 2019-11-7 09:10
标题: 51单片机秒表系统设计 为什么按下K2一直是25秒
这是原程序
#include<reg51.h>
typedef unsigned char uint8;
typedef unsigned int  uint16;
/*七段共阴管显示定义*/
uint8 code dispcode[ ]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
/*定义并初始化变量*/
uint8 seconde=0;// second 调整定义
uint16  mstcnt=0;//minite调整定义
sbit key1=P1^6;        //定义P1.6端口为按键1
sbit key2=P1^7;//定义p1.7端口为按键2
/*函数声明*/
void delay(uint8 k ); //延时子程序
void time_pro( ); //时间处理子程序
void display( ); //显示子程序
void keyscan( ); //键盘扫描子程序
/*延时子程序*/
void delay (uint8 k)
{
uint8 j;
while((k--)!=0)
{
for(j=0;j<125;j++)
{;}
}
}
/*时间处理子程序*/
void time_pro(void)
{
if(seconde==99)//秒钟设为99进制
{
seconde=0;
}
}
/* 显示子程序*/
void display(void)
{
P0=dispcode[seconde/10]; //显示秒的十位
delay(4);
P3=dispcode[seconde%10]; //显示秒的个位
delay(4);
}
/*键盘扫描子程序*/
void keyscan (void)
{
if(key1==0) //按键1为开始键
{
delay(60);
if(key1==0)
EA=1;
delay(60);
seconde++;
}
if(seconde==99)
{seconde=0;
}
if(key2==0) //按键2为复位键
{
delay(60);
if(key2==0)
{      
delay(60);
seconde=0;
delay(60);
EA=0;
}
}
}
/*1s定时子程序 */
void timer0(void) interrupt 1 using 0
{
TH0=0xff;
TL0=0x19;
TMOD = 0x01;//定时器0方式1,250us中断一次
mstcnt++;
if(mstcnt==4000)
{
seconde++;
mstcnt=0; //对计数单元的清零
}
}
/*主函数*/
void main(void)
{     
P0=0xff; //初始化p0口,全设为1使数码管
TMOD = 0x01; //time0为定时器,方式1
TH0=0xff; //预置计数初值
TL0=0x19;
EA=0;
ET0=1;
TR0=1;
while (1)
{
keyscan( ); //按键扫描
time_pro( ); //时间处理
display( ); //显示时间
}
}

51hei图片20191107090837.png (24.46 KB, 下载次数: 52)

51hei图片20191107090837.png

作者: xianfajushi    时间: 2019-11-7 10:36
把K2的EA=0;移到seconde=0;之前试看
作者: 1034173792    时间: 2019-11-8 18:14
楼主,你的程序逻辑有问题,你按下开始键的那一刻需要操作的并不是打开总中断EA,即便打开总中断EA,定时器0也是一直在执行计数操作的,只是没有进入中断函数程序。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1