找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1206|回复: 2
打印 上一主题 下一主题
收起左侧

stc89C51单片机秒表计时程序错误!

[复制链接]
跳转到指定楼层
楼主
ID:519052 发表于 2020-1-16 10:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教  按键按下后 数码管无显示 但计时会正常进行  按键松开后数码管显示恢复

单片机源程序如下:
  1. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

  2. typedef unsigned int u16;          //对数据类型进行声明定义
  3. typedef unsigned char u8;

  4. sbit LSA=P2^2;
  5. sbit LSB=P2^3;
  6. sbit LSC=P2^4;

  7. sbit k1=P3^3;         //定义P33口是k1
  8. sbit k2=P3^2;         //定义P32口是k2

  9. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  10.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

  11. u8 ssec,sec,min;
  12. u8 DisplayData[8];
  13. /*******************************************************************************
  14. * 函 数 名         : delay
  15. * 函数功能                   : 延时函数,i=1时,大约延时10us
  16. *******************************************************************************/
  17. void delay(u16 i)
  18. {
  19.         while(i--);        
  20. }

  21. /*******************************************************************************
  22. * 函 数 名         : Timer0Init
  23. * 函数功能                   : 定时器0初始化
  24. * 输    入         : 无
  25. * 输    出         : 无
  26. *******************************************************************************/
  27. void Timer0Init()
  28. {
  29.         TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

  30.         TH0=0Xd8;        //给定时器赋初值,定时10ms
  31.         TL0=0Xf0;        
  32.         ET0=1;//打开定时器0中断允许
  33.         EA=1;//打开总中断
  34.         TR0=1;//打开定时器                        
  35. }


  36. void init()//初始化函数
  37. {
  38. TMOD=0x01;//工作方式选择定时器0的工作方式1
  39. TH0=(65536-45872)/256;
  40. TL0=(65536-45872)%256;
  41. EA=1;
  42. ET0=1;
  43. TR0=0;

  44. }


  45. /*******************************************************************************
  46. * 函 数 名         : keypros
  47. * 函数功能                   : 按键处理函数,判断按键K1是否按下
  48. *******************************************************************************/
  49. void keypros()
  50. {
  51.         if(k1==0)                  //检测按键K1是否按下
  52.         {        
  53.                 delay(1000);   //消除抖动 一般大约10ms
  54.                 if(k1==0)         //再次判断按键是否按下
  55.                 {
  56.                         TR0=! TR0;          //定时器状态取反
  57.                 }
  58.                 while(!k1);         //检测按键是否松开
  59.         }               
  60. }




  61. /*******************************************************************************
  62. * 函 数 名         : DigDisplay
  63. * 函数功能                   : 数码管动态扫描函数,循环扫描8个数码管显示
  64. *******************************************************************************/
  65. void DigDisplay()
  66. {
  67.         u8 i;
  68.         for(i=0;i<8;i++)
  69.         {
  70.                 switch(i)         //位选,选择点亮的数码管,
  71.                 {
  72.                         case(0):
  73.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  74.                         case(1):
  75.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  76.                         case(2):
  77.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  78.                         case(3):
  79.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  80.                         case(4):
  81.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  82.                         case(5):
  83.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  84.                         case(6):
  85.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  86.                         case(7):
  87.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位        
  88.                 }
  89.                 P0=DisplayData[i];//发送段码
  90.                 delay(100); //间隔一段时间扫描        
  91.                 P0=0x00;//消隐
  92.         }
  93. }

  94. void datapros()
  95. {
  96.         DisplayData[0]=smgduan[ssec%10];
  97.         DisplayData[1]=smgduan[ssec/10];
  98.         DisplayData[2]=0x40;        
  99.         DisplayData[3]=smgduan[sec%10];
  100.         DisplayData[4]=smgduan[sec/10];
  101.         DisplayData[5]=0x40;
  102.         DisplayData[6]=smgduan[min%10];
  103.         DisplayData[7]=smgduan[min/10];
  104. }
  105. /*******************************************************************************
  106. * 函 数 名       : main
  107. * 函数功能                 : 主函数
  108. * 输    入       : 无
  109. * 输    出             : 无
  110. *******************************************************************************/
  111. void main()
  112. {        
  113.         Timer0Init();  //定时器0初始化
  114.         while(1)
  115.         {
  116.                 datapros();
  117.                 DigDisplay();        
  118.           keypros();
  119.                 init();
  120.         }               
  121. }

  122. /*******************************************************************************
  123. * 函 数 名         : void Timer0() interrupt 1
  124. * 函数功能                   : 定时器0中断函数
  125. * 输    入         : 无
  126. * 输    出         : 无
  127. *******************************************************************************/
  128. void Timer0() interrupt 1
  129. {
  130.         TH0=0Xd8;        //给定时器赋初值,定时10ms
  131.         TL0=0Xf0;
  132.         ssec++;
  133.         if(ssec>=100)  //1s
  134.         {
  135.                 ssec=0;
  136.                 sec++;
  137.                 if(sec>=60)
  138.                 {
  139.                         sec=0;
  140.                         min++;
  141.                         if(min>=60)
  142.                         {
  143.                                 min=0;
  144.                         }
  145.                 }        
  146.         }        
  147. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:378182 发表于 2020-1-16 15:48 | 只看该作者
按键未松开前,一直在循环等待键松开,始终在 keypros()中,显示程序根本得不到执行。计时中断不受影响。
回复

使用道具 举报

板凳
ID:584814 发表于 2020-1-17 07:36 | 只看该作者
while(!k1);         //检测按键是否松开
这里按下就是死循环直到松手当然不会显示什么的。
可以在中断里检测按键并计数,判断计数的来感知按键时长,可防抖可测长按短按连击。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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