单片机补充案例--LED数码管99秒倒计时

举报
zhangrelay 发表于 2021/07/15 00:15:29 2021/07/15
【摘要】 说明:使用数码管实现倒计时显示 设备: 倒计时 可使用按钮作适当控制,暂停,开始,计时复位等。 程序: #include<8052.h> #define LSC P1_7 //特殊功能寄存器的位定义,#define LSB P1_6 //3-8译码器的输入端,#define LSA P1_5 //控制三极管Q2~Q6的导通unsign...

说明:使用数码管实现倒计时显示

设备:

可使用按钮作适当控制,暂停,开始,计时复位等。

程序:


  
  1. #include<8052.h>
  2. #define LSC P1_7 //特殊功能寄存器的位定义,
  3. #define LSB P1_6 //3-8译码器的输入端,
  4. #define LSA P1_5 //控制三极管Q2~Q6的导通
  5. unsigned char smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x0f8,0x80,0x90};//共阳极的显示代码表0~9
  6. unsigned char T0RH = 0; //T0 重载值的高字节
  7. unsigned char T0RL = 0; //T0 重载值的低字节
  8. unsigned int cnt;
  9. signed char sec;
  10. signed char sec_all=99;
  11. signed char count=0;
  12. /*在51单片机11MHZ时钟下的延时函数*/
  13. void Delayms(unsigned int c); //误差 0us
  14. /*数码管显示函数*/
  15. void LedScan(unsigned char pos,unsigned char dispcode);
  16. void EXINT0() __interrupt 0;
  17. void Timer0() __interrupt 1;
  18. void EXINT1() __interrupt 2;
  19. void ConfigTimer0(unsigned int);
  20. void main()
  21. {
  22. cnt = 0; //中断次数计数器
  23. sec = sec_all; //秒数初值
  24. ConfigTimer0(2); //配置 T0 定时 2ms
  25. EA=1; //开中断
  26. IT0=1;
  27. EX0=1;
  28. IT1=1;
  29. EX1=1;
  30. PX1=1;
  31. TR0=1; //启动 T0
  32. while(1)
  33. {
  34. LedScan(0,smgduan[sec%10]); //显示个位值
  35. LedScan(1,smgduan[sec/10]); //显示十位值
  36. if(count%2==0)
  37. {
  38. TR0 = 1;
  39. }
  40. else
  41. {
  42. TR0 = 0;
  43. }
  44. }
  45. }
  46. void EXINT0() __interrupt 0
  47. {
  48. count++;
  49. }
  50. void EXINT1() __interrupt 2
  51. {
  52. sec_all=0;
  53. }
  54. /* 配置T0, ms-T0定时时间 */
  55. void ConfigTimer0(unsigned int ms)
  56. {
  57. unsigned long tmp; //临时变量
  58. tmp = 11059200 / 12; //定时器计数频率
  59. tmp = (tmp * ms) / 1000; //计算所需的计数值
  60. tmp = 65536 - tmp; //计算定时器重载值
  61. tmp = tmp + 18; //补偿中断响应延时造成的误差
  62. T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
  63. T0RL = (unsigned char)tmp;
  64. TMOD &= 0xF0; //清零 T0 的控制位
  65. TMOD |= 0x01; //配置 T0 为模式 1
  66. TH0 = T0RH; //加载 T0 重载值
  67. TL0 = T0RL;
  68. ET0 = 1; //使能 T0 中断
  69. }
  70. /* T0 中断服务函数,完成数码管、按键扫描与秒表计数 */
  71. void Timer0() __interrupt 1
  72. {
  73. TH0 = T0RH; //重新加载重载值
  74. TL0 = T0RL;
  75. cnt++; //中断次数加1
  76. if (cnt >= 500) //中断500次=1s
  77. {
  78. cnt = 0;
  79. sec--; //达到50次后计数值清零
  80. if (sec < 0) //当显示值到0后,从sec_all开始
  81. {
  82. sec = sec_all;
  83. }
  84. }
  85. }
  86. void Delayms(unsigned int c) //误差 0us
  87. {
  88. unsigned char a,b;
  89. for (; c>0; c--)
  90. {
  91. for (b=199;b>0;b--)
  92. {
  93. for(a=1;a>0;a--);
  94. }
  95. }
  96. }
  97. /*******************************************************************************
  98. * 函 数 名 : segdisp
  99. * 函数功能 : 数码管显示
  100. * 输 入 : i-pos,d-dispcode
  101. * 输 出 : 无
  102. *******************************************************************************/
  103. void LedScan(unsigned char pos,unsigned char dispcode)
  104. {
  105. unsigned char i;
  106. for(i=0;i<=pos;i++)
  107. {
  108. switch(pos) //位选,选择点亮的数码管,
  109. {
  110. case(0):
  111. LSA=1;LSB=0;LSC=0; break;//显示
  112. case(1):
  113. LSA=0;LSB=1;LSC=0; break;//显示第1位
  114. case(2):
  115. LSA=1;LSB=1;LSC=0; break;//显示第2位
  116. case(3):
  117. LSA=0;LSB=0;LSC=1; break;//显示第3位
  118. }
  119. P0=dispcode;//发送段码
  120. }
  121. }

 

文章来源: zhangrelay.blog.csdn.net,作者:zhangrelay,版权归原作者所有,如需转载,请联系作者。

原文链接:zhangrelay.blog.csdn.net/article/details/109667084

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。