找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机C51病床呼叫系统源程序

[复制链接]
跳转到指定楼层
楼主
ID:905777 发表于 2021-4-14 17:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
系统是基于51系列的单片机设计的病床呼叫系统。该系统以STC89C52单片机为核心辅以矩阵键盘、LCD1602示电路和部分简单模拟和数字电路组成的能够实现病人和医护人员之间信息的传递。在该设计中每个病房都有一个按键,当患者有需要时,按下按键,此时 值班室的显示屏可显示此患者的床位号,多人使用时可实现循环显示,医护人员按下“响应”键取消当前呼叫。此系统能够为医院提供一个成本低、效率高、操作方便和易于安装维护的快捷系统。

单片机源程序如下:
  1. #include <reg52.h>             //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义    变量范围0~255
  3. #define uint  unsigned int     //无符号整型 宏定义    变量范围0~65535

  4. uchar code table_num[]="0123456789abcdefg";

  5. sbit rs=P2^7;     //寄存器选择信号 H:数据寄存器      L:指令寄存器
  6. sbit rw=P2^6;     //寄存器选择信号 H:数据寄存器      L:指令寄存器
  7. sbit e =P2^5;     //片选信号   下降沿触发

  8. sbit beep = P2^4;
  9. sbit key_quxiao = P2^0;      //取消键
  10. uchar i;

  11. bit flag_300ms ;    //300ms的标志位

  12. sbit led1 = P1^0;   //第1号病房指示灯
  13. sbit led2 = P1^1;   //第2号病房指示灯
  14. sbit led3 = P1^2;   //第3号病房指示灯
  15. sbit led4 = P1^3;   //第4号病房指示灯
  16. sbit led5 = P1^4;   //第5号病房指示灯
  17. sbit led6 = P1^5;   //第6号病房指示灯
  18. sbit led7 = P1^6;   //第7号病房指示灯
  19. sbit led8 = P1^7;   //第8号病房指示灯

  20. uchar dis_lcd[8];   //8个病房数据显示的缓冲区
  21. uchar br_geshu;     //报警病人数

  22. /********************************************************************
  23. * 名称 : delay_1ms()
  24. * 功能 : 延时1ms函数
  25. * 输入 : q
  26. * 输出 : 无
  27. ***********************************************************************/
  28. void delay_1ms(uint q)
  29. {
  30.     uint i,j;
  31.     for(i=0;i<q;i++)
  32.         for(j=0;j<120;j++);
  33. }

  34. /***********************延时函数************************/
  35. void delay_uint(uint q)
  36. {
  37.     while(q--);
  38. }

  39. /***********************lcd1602写命令函数************************/
  40. void write_com(uchar com)
  41. {
  42.     e=0;
  43.     rs=0;
  44.     rw=0;
  45.     P0=com;
  46.     delay_uint(3);
  47.     e=1;
  48.     delay_uint(25);
  49.     e=0;
  50. }

  51. /***********************lcd1602写数据函数************************/
  52. void write_data(uchar dat)
  53. {
  54.     e=0;
  55.     rs=1;
  56.     rw=0;
  57.     P0=dat;
  58.     delay_uint(3);
  59.     e=1;
  60.     delay_uint(25);
  61.     e=0;   
  62. }


  63. /***********************lcd1602上显示这字符函数************************/
  64. void write_string(uchar hang,uchar add,uchar *p)
  65. {
  66.     if(hang==1)   
  67.         write_com(0x80+add);
  68.     else
  69.         write_com(0x80+0x40+add);
  70.         while(1)                                                         
  71.         {
  72.             if(*p == '\0')  break;
  73.             write_data(*p);
  74.             p++;
  75.         }   
  76. }
  77. /***********************lcd1602上显示这字符函数************************/
  78. void write_string_ge(uchar hang,uchar add,uchar *p,uchar ge)
  79. {
  80.     if(hang==1)   
  81.         write_com(0x80+add);
  82.     else
  83.         write_com(0x80+0x40+add);
  84.     for(i=0;i<ge;i++)
  85.         write_data(*p++);   
  86. }

  87. /***********************lcd1602初始化设置************************/
  88. void init_1602()     //lcd1602初始化设置
  89. {
  90.     write_com(0x38);    //
  91.     write_com(0x0c);
  92.     write_com(0x06);
  93.     delay_uint(1000);
  94.     write_string(1,0," bingfang hujiao ");        
  95.     write_string(2,0,"  wu bingren    ");   
  96. }



  97. /*********************定时器0初始化******************/
  98. void time0_init()      
  99. {                     
  100.     EA  = 1;           //开总中断
  101.     TMOD = 0X01;      //定时器0、工作方式1
  102.     ET0 = 1;          //开定时器0中断
  103.     TR0 = 1;          //允许定时器0定时
  104. }

  105. /********************独立按键程序*****************/
  106. uchar key_can;     //按键值

  107. void key()     //独立按键程序
  108. {
  109.       if((P3 & 0xff) != 0xff)        //按键按下
  110.     {
  111.         delay_1ms(1);             //按键消抖动
  112.         if((P3 & 0xff) != 0xff)
  113.         {                        //确认是按键按下
  114.             switch(P3 & 0xff)
  115.             {
  116.                 case 0xfe:  key_can = 1;  break;     //得到按键值
  117.                 case 0xfd:  key_can = 2;  break;     //得到按键值
  118.                 case 0xfb:  key_can = 3;  break;     //得到按键值
  119.                 case 0xf7:  key_can = 4;  break;     //得到按键值
  120.                 case 0xef:  key_can = 5;  break;     //得到按键值
  121.                 case 0xdf:  key_can = 6;  break;     //得到按键值
  122.                 case 0xbf:  key_can = 7;  break;     //得到按键值
  123.                 case 0x7f:  key_can = 8;  break;     //得到按键值
  124.             }
  125.         }            
  126.     }
  127. }
  128.    
  129. void key_qx()     //取消按键程序
  130. {
  131.      key_quxiao = 1;                     //对应的按键IO口输出为1
  132.     if(key_quxiao == 0)        //按键按下
  133.     {
  134.         delay_1ms(1);             //按键消抖动
  135.         if((key_quxiao == 0))
  136.         {                        //确认是按键按下
  137.             key_can = 9;
  138.         }            
  139.     }
  140. }   


  141. /**********************按键处理函数************************/
  142. void key_with()
  143. {
  144.     uchar i;
  145.     if(key_can <= 8)
  146.     {
  147.         if(key_can == 1)
  148.             led1 = 1;      //1号病房灯亮
  149.         if(key_can == 2)
  150.             led2 = 1;      //2号病房灯亮
  151.         if(key_can == 3)
  152.             led3 = 1;      //3号病房灯亮
  153.         if(key_can == 4)
  154.             led4 = 1;      //4号病房灯亮
  155.         if(key_can == 5)
  156.             led5 = 1;      //5号病房灯亮
  157.         if(key_can == 6)
  158.             led6 = 1;      //6号病房灯亮
  159.         if(key_can == 7)
  160.             led7 = 1;      //7号病房灯亮
  161.         if(key_can == 8)
  162.             led8 = 1;      //8号病房灯亮
  163.           if(br_geshu < 8)
  164.          {
  165.             if(br_geshu == 0)     //第一次清除显示屏
  166.                 write_string(2,0,"               ");        
  167.             br_geshu ++;               //呼叫病人的人数加1
  168.             dis_lcd[0] = table_num[key_can] ;    //把病人的号码保存起来
  169.             for(i=7;i>0;i--)
  170.                 dis_lcd[i] = dis_lcd[i-1] ;     //把病人的数据向后移一位
  171.            write_string_ge(2,0,dis_lcd,br_geshu);     //显示出来
  172.         }
  173.     }
  174.     if(key_can == 9)   //取消键的处理
  175.     {
  176.         if(br_geshu > 0)
  177.         {
  178.             if(dis_lcd[br_geshu] == '1')
  179.                 led1 = 0;      //1号病房灯灭
  180.             if(dis_lcd[br_geshu] == '2')
  181.                 led2 = 0;      //2号病房灯灭
  182.             if(dis_lcd[br_geshu] == '3')
  183.                 led3 = 0;      //3号病房灯灭
  184.             if(dis_lcd[br_geshu] == '4')
  185.                 led4 = 0;      //4号病房灯灭
  186.             if(dis_lcd[br_geshu] == '5')
  187.                 led5 = 0;      //5号病房灯灭
  188.             if(dis_lcd[br_geshu] == '6')
  189.                 led6 = 0;      //6号病房灯灭
  190.             if(dis_lcd[br_geshu] == '7')
  191.                 led7 = 0;      //7号病房灯灭
  192.             if(dis_lcd[br_geshu] == '8')
  193.                 led8 = 0;      //8号病房灯灭
  194.             dis_lcd[br_geshu] = ' ';                    
  195.             br_geshu --;               //呼叫病人的人数减1
  196.              write_string_ge(2,0,dis_lcd,br_geshu);
  197.             if(br_geshu == 0)     //取消到最后一次清显示屏
  198.             {
  199.                 write_string(2,0,"  wu bingren    ");   
  200.              }            
  201.         }         
  202.     }
  203. }


  204. /*****************主函数********************/
  205. void main()
  206. {   
  207.     time0_init();         //初始化定时器
  208.     init_1602();         //lcd1602初始化
  209.     while(1)
  210.     {
  211.         key();     //独立按键程序      
  212.         key_qx();     //取消按键程序
  213.          key_with();
  214.         if(flag_300ms == 1)
  215.         {
  216.             flag_300ms = 0;
  217.             if(br_geshu > 0)
  218.                 beep = ~beep;   //蜂鸣器报警
  219.             else
  220.                 beep = 1;       //取消报警
  221.         }
  222.     }
  223. }


  224. /**************定时器0中断程序*****************/
  225. void time0() interrupt 1
  226. {            
  227.     uchar value;
  228.     TH0 = 0X3C;
  229.     TL0 = 0XB0;       //50ms
  230.     value ++;      
  231.     if(value >= 6)             //300ms
  232.     {
  233.         value = 0;
  234.         flag_300ms = 1;
  235.     }
  236. }
复制代码

hex文件: 单片机病房呼叫系统.rar (26.87 KB, 下载次数: 20)


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

使用道具 举报

沙发
ID:328014 发表于 2021-4-14 21:55 | 只看该作者
可惜没有原理图
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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