欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2477|回復: 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)


回復

使用道具 舉報

ID:328014 發表于 2021-4-14 21:55 | 顯示全部樓層
可惜沒有原理圖
回復

使用道具 舉報

無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表