找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机开发板做秒表程序求助

[复制链接]
跳转到指定楼层
楼主
ID:519052 发表于 2020-1-14 08:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在网上找的51秒表程序,下载在普中科技的开发板上  按键没反应 ,请大神帮忙解答一下 ,或者帮忙给写个程序最好不过了,谢谢  51单片机 6位秒表计时 “分、秒、毫秒”精度越高越好或者“秒、毫秒”的也可以


  1. #include   

  2. #define uchar unsigned char  

  3. #define uint unsigned int  

  4. #define PIN0 P0  //数码管段选端  

  5. #define PIN1 P1  //数码管位选端  

  6. #define PIN3 P3  //十分位数码管的段码端  

  7. sbit start=P3^2;  //启动/暂停按钮  

  8. sbit reset=P3^3;  //复位按钮  

  9. uint cnt=0;   //1s的次数的计数值  

  10. uint num=0;     //进入中断次数的计数值(一次50ms)  

  11. uint num1=0;        //0.1s的次数的计数值  

  12. uchar code table[]={0x3f,0x06,0x5b,  

  13. 0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f};  

  14. //不带小数点的共阴极数码管段码0-9  

  15. uchar code table1[]={0xbf,0x86,  

  16. 0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};  

  17. //带小数点的共阴极数码管段码0-9  



  18. char code table2[]={0xc0,0xf9,0xa4,  

  19. 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  

  20. //不带小数点的共阳极数码管段码0-9  

  21. void Display(uint w,uint a,uint b,uint c,uint d);  //声明显示函数  

  22. void InitTimer0();  //声明定时器初始化函数  

  23. void Delayms(uint x);  //声明延时函数  

  24. void main()  

  25. {  

  26. uint ms100=0;   //秒的十分位  

  27. uint s,s1,min,min1,minu=0;   

  28. //依次是秒的个位,秒的十位,分的个位,分的十位  

  29. InitTimer0();     //初始化定时器  

  30. while(1)            //进入死循环  

  31. {     

  32. if(start==0)   //检测启动/暂停键是否按下  

  33. Delayms(20); //延时消抖  

  34. {  

  35. if(start==0)  //消抖之后再次检测  

  36. {  

  37. TR0=!TR0;       //定时器的控制位取反  

  38. while(!start);  //等待按键释放  

  39. }  

  40. }  

  41. if(reset==0)  //检测复位键是否按下  

  42. {  

  43. Delayms(20);    //延时消抖  

  44. if(reset==0)    //消抖之后再次检测  

  45. {  

  46. num=0;        

  47. num1=0;     //进入中断次数值清0  

  48. ms100=0;    //十分位的计数值清0  

  49. cnt=0;      //秒的计数值清0  

  50. minu=0;     //分的计数值清0  

  51. while(!reset);       //等待按键释放  

  52. }  

  53. }  

  54. if(num1>=2)      //检测是否达到0.1s,(两个50ms)  

  55. {  

  56. num1=0;         //进入中断次数值清零  

  57. ms100++;        //秒的十分位的计数值加1  

  58. if(ms100>=10)  //若秒的十分位计数值达到10  

  59. {  

  60. ms100=0;  //清零秒的十分位的计数值  

  61. num1=0;  //进入中断次数值置0  

  62. }  

  63. }  

  64. if(num>=20)  //判断计时时间是否达到1s(20个50ms)  

  65. {  

  66. num=0;     //进入中断次数值置0  

  67. cnt++;       //秒的计数值加1  

  68. if(cnt>=60) //判断是否达到60s  

  69. {  

  70. cnt=0;      //若达到60s,将秒的计数值置零  

  71. minu++;         //分的计数值加1  

  72. if(minu>=60)  //判断是否达到60分钟,一般秒表是用不到60分的,这是为了程序的严谨性  

  73. {  

  74. TR0=!TR0;           //达到60分钟则关闭定时器并清零所有的计数值  

  75. num1=0;               

  76. num=0;  

  77. ms100=0;  

  78. cnt=0;        

  79. minu=0;  

  80. }  

  81. }  

  82. }     

  83. s=cnt%10;   //从秒的计数值里面分离秒的个位  

  84. s1=cnt/10;  //从秒的计数值里面分离秒的十位  

  85. min=minu%10;    //从分的计数值里面分离分的个位  

  86. min1=minu/10;   //从分的计数值里面分离分的十位  

  87. Display(ms100,s,s1,min,min1);  //显示这5个数  

  88. }     

  89. }  

  90. void InitTimer0() //定时器初始化函数  

  91. {  

  92. TMOD=0x01; //选择定时器0的工作方式1  

  93. TH0=(65536-45872)/256;  //装初值(定时50ms),晶振11.0592MHz  

  94. TL0=(65536-45872)%256;  

  95. EA=1;       //打开总中断  

  96. ET0=1;  //打开定时器中断  

  97. TR0=0;  //先不要启动定时器  

  98. }  

  99. void TIMER0()  interrupt 1  //定时器中断服务函数  

  100. {  

  101. TH0=(65536-45872)/256;  //重装初值  

  102. TL0=(65536-45872)%256;  

  103. num++;      //让进入中断次数值加1,用于判断是否达到1s  

  104. num1++;     //让进入中断次数值加1,用于判断是否达到0.1s  

  105. }  

  106. void Delayms(uint x)   //延时xms  

  107. {  

  108. uint i,j;  

  109. for(i=x;i>0;i--)  

  110. for(j=110;j>0;j--);  

  111. }  

  112. void Display(uint w,uint a,uint b,uint c,uint d) //定义显示函数  

  113. {  

  114. PIN3=table2[w];     //秒的十分位的段选  

  115. Delayms(5);  

  116. PIN0=table[a]; //秒的个位的段选  

  117. PIN1=0x7f;       //秒的个位的位选  

  118. Delayms(5);           

  119. PIN0=table[b];  //秒的十位的段选  

  120. PIN1=0xbf;          //秒的十位的位选  

  121. Delayms(5);  

  122. PIN0=table1[c];  //分的个位的段选(带小数点)  

  123. PIN1=0xdf;           //分的个位的位选  

  124. Delayms(5);  

  125. PIN0=table[d];      //分的十位的段选  

  126. PIN1=0xef;              //分的十位的位选  

  127. Delayms(5);      

  128. }  
复制代码




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

使用道具 举报

沙发
ID:519052 发表于 2020-1-15 09:02 | 只看该作者
没人吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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