用51单片机(芯片为STC89C52)写了实现一个范围为0~99的秒表,并用按键控制秒表的启动和暂停的程序,但程序烧录后,数码管一直停在00,不管按K1按键多少次都没有反应,不知道程序错在哪里,求指教
- #include<reg52.h>
- typedef unsigned int u8;
- typedef unsigned char u16;
- sbit LSA=P2^2;//使用138译码器
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit K1=P3^1;
- u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5c,0x79,0x71};
- u16 s;
- u8 sec,mb[2];
- void delay(u16 i)
- {
- while(i--);
- }
- void Time0Init()
- {
- TMOD|=0x01;//选择定时器0模式,工作方式1,仅用TR0打开启动
- TH0=0xFC; //给定时器赋初值,定时1ms
- TL0=0x18;
- TR0=1;//定时器启动
- }
- void Digdisplay()
- {
- u8 i;
- for(i=0;i<2;i++)
- {
- switch(i)//位选,选择点亮的数码管
- {
- case(0):LSA=0;LSB=0;LSC=0;break;//显示第0位
- case(1):LSA=1;LSB=0;LSC=0;break;//显示第1位
- }
- P0=smgduan[mb[i]];//发送段码
- delay(1);//间隔一段时间扫描
- P0=0x00;//消隐
- }
- }
- void display()
- {
- if(TF0==1)
- {
- TF0=0;
- TH0=0xFC;
- TL0=0x18;
- s++;
- }
- if(s==1000) //到达1s时间
- {
- s=0;
- sec++;
- if(sec==99)sec=0;//计时到99s重新开始
- }
- mb[0]=sec%10;//秒表个位
- mb[1]=sec/10;//秒表十位
- Digdisplay();
- }
- void main()
- {
- Time0Init();
- while(1)
- {
- display();
- if(K1==0)//判断按键K1是否按下
- {
- delay(1000);//消抖
- if(K1==0)
- {
- TR0=0;//定时器中断
- while(!K1)
- {
- display();
- }
- TR0=1;//定时器重新打开,继续计时
- }
- }
- }
- }
复制代码
|