找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2423|回复: 8
收起左侧

写的一个单片机秒表程序但bug实在找不出,求大佬帮我看看

[复制链接]
ID:483399 发表于 2019-3-2 20:08 | 显示全部楼层 |阅读模式
用51单片机(芯片为STC89C52)写了实现一个范围为0~99的秒表,并用按键控制秒表的启动和暂停的程序,但程序烧录后,数码管一直停在00,不管按K1按键多少次都没有反应,不知道程序错在哪里,求指教
  1. #include<reg52.h>
  2. typedef unsigned int u8;
  3. typedef unsigned char u16;
  4. sbit LSA=P2^2;//使用138译码器
  5. sbit LSB=P2^3;
  6. sbit LSC=P2^4;
  7. sbit K1=P3^1;
  8. u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5c,0x79,0x71};
  9. u16 s;
  10. u8 sec,mb[2];
  11. void delay(u16 i)
  12. {
  13.   while(i--);
  14. }
  15. void Time0Init()
  16. {
  17. TMOD|=0x01;//选择定时器0模式,工作方式1,仅用TR0打开启动
  18. TH0=0xFC;  //给定时器赋初值,定时1ms
  19. TL0=0x18;
  20. TR0=1;//定时器启动
  21. }
  22. void Digdisplay()
  23. {
  24.   u8 i;
  25.   for(i=0;i<2;i++)
  26.   {
  27.   switch(i)//位选,选择点亮的数码管
  28.    {
  29.      case(0):LSA=0;LSB=0;LSC=0;break;//显示第0位
  30.          case(1):LSA=1;LSB=0;LSC=0;break;//显示第1位
  31.    }
  32.    P0=smgduan[mb[i]];//发送段码
  33.    delay(1);//间隔一段时间扫描
  34.    P0=0x00;//消隐
  35.   }
  36. }
  37. void display()
  38. {
  39. if(TF0==1)
  40. {
  41.    TF0=0;
  42.    TH0=0xFC;
  43.    TL0=0x18;
  44.    s++;
  45.    }
  46.    if(s==1000) //到达1s时间
  47.    {
  48.      s=0;
  49.          sec++;
  50.          if(sec==99)sec=0;//计时到99s重新开始
  51.          }
  52.         mb[0]=sec%10;//秒表个位
  53.         mb[1]=sec/10;//秒表十位
  54.         Digdisplay();
  55. }
  56. void main()
  57. {
  58. Time0Init();
  59. while(1)
  60. {
  61.    display();
  62.    if(K1==0)//判断按键K1是否按下
  63.    {
  64.     delay(1000);//消抖
  65.         if(K1==0)
  66.         {
  67.           TR0=0;//定时器中断
  68.           while(!K1)
  69.           {
  70.            display();
  71.            }
  72.            TR0=1;//定时器重新打开,继续计时
  73.          }
  74.         }
  75.   }
  76. }
复制代码


回复

使用道具 举报

ID:404797 发表于 2019-3-3 00:00 | 显示全部楼层
askb1.zip (33.27 KB, 下载次数: 4)

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:164602 发表于 2019-3-3 09:42 | 显示全部楼层
zxwdown 发表于 2019-3-3 00:00
你的程序我看不懂,我按你的意思编了以下程序,可以实现按钞从0到100计数,到100后双从0开始计数,按K1 ...

用外部中断啊,就不怕扫描不到了。
回复

使用道具 举报

ID:111634 发表于 2019-3-3 10:37 | 显示全部楼层
本帖最后由 zl2168 于 2019-3-3 21:50 编辑

实例93  99.9秒秒表
Proteus仿真一下,确认有效。
99.9秒秒表.jpg
实例95 99.9秒秒表.rar (38.86 KB, 下载次数: 11)
回复

使用道具 举报

ID:164602 发表于 2019-3-3 10:37 | 显示全部楼层
你整人嘛!!!!!!!!!!
调试了半天,才发现你的错误!!!!!!!!!!
极低级的错误!!!!!!!!!!
第二、三行:
typedef unsigned int u8;
typedef unsigned char u16;
写反了吧,所以当s想达到1000时,最大才255,永远达不到,所以不计时!!!!!!!!!!
改了就好了:
typedef unsigned char u8;
typedef unsigned int u16;
回复

使用道具 举报

ID:213173 发表于 2019-3-3 10:42 | 显示全部楼层
你的程序主要问题是数据类型定义错误:typedef unsigned int u8; typedef unsigned char u16;
其次是按键程序有错误,数码管动态显示也有缺陷。都给你改了一下,供参考。
无标题.jpg
  1. #include<reg52.h>
  2. typedef unsigned int u16;
  3. typedef unsigned char u8;
  4. sbit LSA=P2^2;//使用138译码器
  5. sbit LSB=P2^3;
  6. sbit LSC=P2^4;
  7. sbit K1=P3^1;
  8. u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5c,0x79,0x71};
  9. u16 s=0;
  10. u8 sec=0,KeySec=0;//键值
  11. bit flag=0;//起停标志

  12. void Time0Init()
  13. {
  14.         TMOD|=0x01;//选择定时器0模式,工作方式1,仅用TR0打开启动
  15.         TH0=0xFC;  //给定时器赋初值,定时1ms
  16.         TL0=0x18;
  17.         TF0=0;
  18.         TR0=1;//定时器启动
  19. }

  20. void keyscan()        //按键扫描
  21. {
  22.         static u8 count=0;        //计数消抖变量                       
  23.         static bit key_sign=0;        //按键自锁标志
  24.         if(K1==0)                                //检测键按下
  25.         {
  26.                 if((++count>=100)&&(key_sign==0))//100次检测按键如果为0
  27.                 {                       
  28.                         key_sign=1;
  29.                         KeySec++;
  30.                         if(KeySec>=3)
  31.                                 KeySec=0;

  32.                         if(KeySec==0)
  33.                         {       
  34.                                 s=0;
  35.                                 sec=0;
  36.                         }
  37.                         if(KeySec==1)
  38.                                 flag=1;
  39.                         if(KeySec==2)
  40.                                 flag=0;                       
  41.                 }
  42.         }
  43.         else                                         //键松手
  44.         {
  45.                 count=0;                        //计数变量清0
  46.                 key_sign=0;                        //自锁标志清0
  47.         }
  48. }

  49. void Digdisplay()
  50. {
  51.         static u8 i;
  52.         P0=0x00;//消隐
  53.         switch(i)//位选,选择点亮的数码管
  54.         {
  55.                 case(0):LSA=0;LSB=0;LSC=0;P0=smgduan[sec%10];i=1;break;//显示第0位
  56.                 case(1):LSA=1;LSB=0;LSC=0;P0=smgduan[sec/10];i=0;break;//显示第1位
  57.         }
  58. }

  59. void main()
  60. {
  61.         Time0Init();
  62.         while(1)
  63.         {
  64.                 if(TF0==1)
  65.                 {
  66.                         TF0=0;
  67.                         TH0=0xFC;
  68.                         TL0=0x18;
  69.                         if(flag==1)
  70.                         {
  71.                                 s++;
  72.                                 if(s>=1000) //到达1s时间
  73.                                 {
  74.                                         s=0;
  75.                                         sec++;
  76.                                         if(sec>99)
  77.                                                 sec=0;//计时到99s重新开始
  78.                                 }
  79.                         }
  80.                         Digdisplay();//动态数码管显示,周期1ms
  81.                 }
  82.                 keyscan();//按键扫描
  83.         }
  84. }
复制代码



回复

使用道具 举报

ID:404797 发表于 2019-3-3 10:55 | 显示全部楼层
HC6800-ES-V2.0 发表于 2019-3-3 09:42
用外部中断啊,就不怕扫描不到了。

不是外部中断,是计时器0中断,按键是用于中断继续的
回复

使用道具 举报

ID:330301 发表于 2019-3-3 11:35 | 显示全部楼层
1.#include<reg52.h>
2.typedef unsigned int u8;
3.typedef unsigned char u16;
看开头就感觉是神奇的代码,虽然是例行公事,但还是需要细心,毕竟定义都错了,引用就各种神级bug
回复

使用道具 举报

ID:483399 发表于 2019-3-3 12:35 | 显示全部楼层
谢谢各位的指教,才刚开始学单片机,错误低级请大家见谅
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表