• 基于51单片机的智能病房呼叫系统的设计与实现


    一、前言

            显示床位号使用到4位数码管,为了节约单片IO口,使用TM1637来驱动数码管。

    二、TM1637驱动芯片简介

    三、电路设计,使用矩阵按键来模拟每个床位的呼叫按钮

    四、编写51单片机代码

    1. void delay_ms(u16 n)
    2. {
    3. u8 i;
    4. while(n--)
    5. {
    6. i = 111;
    7. while(i--);
    8. }
    9. }
    10. u8 key_scan()
    11. {
    12. u8 keyH, keyL, line, row;
    13. KEY=0xF0;
    14. if(KEY!=0xF0)
    15. {
    16. delay_ms(10); //消抖延时
    17. if(KEY!=0xF0)
    18. {
    19. keyH=KEY&0xF0;
    20. KEY=0x0F;
    21. keyL=KEY&0x0F;
    22. switch(keyH)
    23. {
    24. case 0x70: line=1;break;
    25. case 0xB0: line=2;break;
    26. case 0xD0: line=3;break;
    27. case 0xE0: line=4;break;
    28. }
    29. switch(keyL)
    30. {
    31. case 0x07: row=1;break;
    32. case 0x0B: row=2;break;
    33. case 0x0D: row=3;break;
    34. case 0x0E: row=4;break;
    35. }
    36. while(KEY!=0x0F);
    37. return (line-1)*4+row;
    38. }
    39. }
    40. return 0xFF;
    41. }
    42. code unsigned char tab[] =
    43. {
    44. 0x3F,/*0*/
    45. 0x06,/*1*/
    46. 0x5B,/*2*/
    47. 0x4F,/*3*/
    48. 0x66,/*4*/
    49. 0x6D,/*5*/
    50. 0x7D,/*6*/
    51. 0x07,/*7*/
    52. 0x7F,/*8*/
    53. 0x6F,/*9*/
    54. 0x77,/*10 A*/
    55. 0x7C,/*11 b*/
    56. 0x58,/*12 c*/
    57. 0x5E,/*13 d*/
    58. 0x79,/*14 E*/
    59. 0x71,/*15 F*/
    60. 0x76,/*16 H*/
    61. 0x38,/*17 L*/
    62. 0x54,/*18 n*/
    63. 0x73,/*19 P*/
    64. 0x3E,/*20 U*/
    65. 0x00,/*21 黑屏*/
    66. };
    67. // TM1637串行数据线
    68. sbit CLK = P2^0;
    69. sbit DIO = P2^1;
    70. // LED灯
    71. sbit LED = P3^0;
    72. void delay_us(unsigned int i)
    73. {
    74. for (; i < 0; i--)
    75. _nop_();
    76. }
    77. // TM1637开始信号
    78. void TM1637_Start()
    79. {
    80. CLK = 1;
    81. DIO = 1;
    82. delay_us(2);
    83. DIO = 0;
    84. }
    85. // TM1637结束信号
    86. void TM1637_Stop()
    87. {
    88. CLK = 0;
    89. DIO = 0;
    90. delay_us(2);
    91. CLK = 1;
    92. delay_us(2);
    93. DIO = 1;
    94. }
    95. void TM1637_ACK(void)
    96. {
    97. CLK = 0;
    98. DIO = 1;
    99. while(DIO == 1);
    100. CLK =1;
    101. }
    102. // 向TM1637写数据
    103. void TM1637_Write(unsigned char DATA)
    104. {
    105. unsigned char i;
    106. for (i = 0; i < 8; i++)
    107. {
    108. CLK = 0;
    109. if (DATA & 0x01)
    110. {
    111. DIO = 1;
    112. }
    113. else
    114. {
    115. DIO = 0;
    116. }
    117. DATA = DATA >> 1;
    118. CLK = 1;
    119. delay_us(2);
    120. }
    121. }
    122. void TM1637_Display(u8 index)
    123. {
    124. TM1637_Start();
    125. TM1637_Write(0x40); // 命令
    126. TM1637_ACK();
    127. TM1637_Stop();
    128. TM1637_Start();
    129. TM1637_Write(0xC0); // 地址
    130. TM1637_ACK();
    131. TM1637_Write(0x3F); // 数据1
    132. TM1637_ACK();
    133. TM1637_Write(0x3F); // 数据2
    134. TM1637_ACK();
    135. TM1637_Write(0x3F); // 数据3
    136. TM1637_ACK();
    137. TM1637_Write(0x3F); // 数据4
    138. TM1637_ACK();
    139. TM1637_Write(0x3F); // 数据5
    140. TM1637_ACK();
    141. TM1637_Write(index); // 数据6
    142. TM1637_ACK();
    143. TM1637_Stop();
    144. TM1637_Start();
    145. TM1637_Write(0x89); // 亮度命令
    146. TM1637_ACK();
    147. TM1637_Stop();
    148. }
    149. void main()
    150. {
    151. u8 num;
    152. LED = LED_ON;
    153. TM1637_Display(tab[0]);
    154. while(1)
    155. {
    156. num = key_scan();
    157. if(num!=0xFF)
    158. {
    159. TM1637_Display(tab[num]);
    160. }
    161. }
    162. }

    五、电路仿真运行效果

    六、完整Proteus仿真电路图和51单片机源码下载:

    链接:https://pan.baidu.com/s/1TojZnTWu3sGl8oGfjc2dhw?pwd=ga5p
    提取码:ga5p

  • 相关阅读:
    我问了鹅厂程序员:你们工作中怎么用ChatGPT?如何高效Prompt?
    【知识回顾】Java常用类库-Java Runtime
    (附源码)计算机毕业设计SSM教务管理系统
    深度学习基础之《TensorFlow框架(4)—Operation》
    git将本地文件上传至github
    学会使用这些电脑技巧,可以让你在工作中受益无穷
    【剪映专业版】13快速为视频配好音:清晰、无噪声、对齐
    php+JavaScript实现callback跨域请求jsonp数据
    Go连接Redis集群并实现单例,组件go-redis
    【Android入门】8、Service 后台线程、多线程、IntentService
  • 原文地址:https://blog.csdn.net/lilihexiaoxiangege/article/details/133052307