• 基于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

  • 相关阅读:
    [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇
    TIDB集群部署
    【Android系统蓝牙开发】蓝牙基础知识-蓝牙核心系统架构
    Vue Router
    RTL乒乓运算模块设计 - Submodul Design
    react自定义hook解决websocket连接,useWebSocket
    还在手动包裹产品吗?—机器已逐步取代人工,导电滑环厂家解析
    基于Solidworks的三维光路结构示意图绘制实例演示
    C#学习 - 初识类型、变量、方法
    LeetCode 2525. 根据规则将箱子分类:优雅解法?
  • 原文地址:https://blog.csdn.net/lilihexiaoxiangege/article/details/133052307