找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2499|回復(fù): 1
收起左側(cè)

單片機(jī)C51病床呼叫系統(tǒng)源程序

[復(fù)制鏈接]
ID:905777 發(fā)表于 2021-4-14 17:58 | 顯示全部樓層 |閱讀模式
系統(tǒng)是基于51系列的單片機(jī)設(shè)計(jì)的病床呼叫系統(tǒng)。該系統(tǒng)以STC89C52單片機(jī)為核心輔以矩陣鍵盤、LCD1602示電路和部分簡(jiǎn)單模擬和數(shù)字電路組成的能夠?qū)崿F(xiàn)病人和醫(yī)護(hù)人員之間信息的傳遞。在該設(shè)計(jì)中每個(gè)病房都有一個(gè)按鍵,當(dāng)患者有需要時(shí),按下按鍵,此時(shí) 值班室的顯示屏可顯示此患者的床位號(hào),多人使用時(shí)可實(shí)現(xiàn)循環(huán)顯示,醫(yī)護(hù)人員按下“響應(yīng)”鍵取消當(dāng)前呼叫。此系統(tǒng)能夠?yàn)獒t(yī)院提供一個(gè)成本低、效率高、操作方便和易于安裝維護(hù)的快捷系統(tǒng)。

單片機(jī)源程序如下:
  1. #include <reg52.h>             //調(diào)用單片機(jī)頭文件
  2. #define uchar unsigned char  //無(wú)符號(hào)字符型 宏定義    變量范圍0~255
  3. #define uint  unsigned int     //無(wú)符號(hào)整型 宏定義    變量范圍0~65535

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

  5. sbit rs=P2^7;     //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器      L:指令寄存器
  6. sbit rw=P2^6;     //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器      L:指令寄存器
  7. sbit e =P2^5;     //片選信號(hào)   下降沿觸發(fā)

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

  11. bit flag_300ms ;    //300ms的標(biāo)志位

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

  20. uchar dis_lcd[8];   //8個(gè)病房數(shù)據(jù)顯示的緩沖區(qū)
  21. uchar br_geshu;     //報(bào)警病人數(shù)

  22. /********************************************************************
  23. * 名稱 : delay_1ms()
  24. * 功能 : 延時(shí)1ms函數(shù)
  25. * 輸入 : q
  26. * 輸出 : 無(wú)
  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. /***********************延時(shí)函數(shù)************************/
  35. void delay_uint(uint q)
  36. {
  37.     while(q--);
  38. }

  39. /***********************lcd1602寫命令函數(shù)************************/
  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寫數(shù)據(jù)函數(shù)************************/
  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上顯示這字符函數(shù)************************/
  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上顯示這字符函數(shù)************************/
  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初始化設(shè)置************************/
  88. void init_1602()     //lcd1602初始化設(shè)置
  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. /*********************定時(shí)器0初始化******************/
  98. void time0_init()      
  99. {                     
  100.     EA  = 1;           //開總中斷
  101.     TMOD = 0X01;      //定時(shí)器0、工作方式1
  102.     ET0 = 1;          //開定時(shí)器0中斷
  103.     TR0 = 1;          //允許定時(shí)器0定時(shí)
  104. }

  105. /********************獨(dú)立按鍵程序*****************/
  106. uchar key_can;     //按鍵值

  107. void key()     //獨(dú)立按鍵程序
  108. {
  109.       if((P3 & 0xff) != 0xff)        //按鍵按下
  110.     {
  111.         delay_1ms(1);             //按鍵消抖動(dòng)
  112.         if((P3 & 0xff) != 0xff)
  113.         {                        //確認(rèn)是按鍵按下
  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;                     //對(duì)應(yīng)的按鍵IO口輸出為1
  132.     if(key_quxiao == 0)        //按鍵按下
  133.     {
  134.         delay_1ms(1);             //按鍵消抖動(dòng)
  135.         if((key_quxiao == 0))
  136.         {                        //確認(rèn)是按鍵按下
  137.             key_can = 9;
  138.         }            
  139.     }
  140. }   


  141. /**********************按鍵處理函數(shù)************************/
  142. void key_with()
  143. {
  144.     uchar i;
  145.     if(key_can <= 8)
  146.     {
  147.         if(key_can == 1)
  148.             led1 = 1;      //1號(hào)病房燈亮
  149.         if(key_can == 2)
  150.             led2 = 1;      //2號(hào)病房燈亮
  151.         if(key_can == 3)
  152.             led3 = 1;      //3號(hào)病房燈亮
  153.         if(key_can == 4)
  154.             led4 = 1;      //4號(hào)病房燈亮
  155.         if(key_can == 5)
  156.             led5 = 1;      //5號(hào)病房燈亮
  157.         if(key_can == 6)
  158.             led6 = 1;      //6號(hào)病房燈亮
  159.         if(key_can == 7)
  160.             led7 = 1;      //7號(hào)病房燈亮
  161.         if(key_can == 8)
  162.             led8 = 1;      //8號(hào)病房燈亮
  163.           if(br_geshu < 8)
  164.          {
  165.             if(br_geshu == 0)     //第一次清除顯示屏
  166.                 write_string(2,0,"               ");        
  167.             br_geshu ++;               //呼叫病人的人數(shù)加1
  168.             dis_lcd[0] = table_num[key_can] ;    //把病人的號(hào)碼保存起來(lái)
  169.             for(i=7;i>0;i--)
  170.                 dis_lcd[i] = dis_lcd[i-1] ;     //把病人的數(shù)據(jù)向后移一位
  171.            write_string_ge(2,0,dis_lcd,br_geshu);     //顯示出來(lái)
  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號(hào)病房燈滅
  180.             if(dis_lcd[br_geshu] == '2')
  181.                 led2 = 0;      //2號(hào)病房燈滅
  182.             if(dis_lcd[br_geshu] == '3')
  183.                 led3 = 0;      //3號(hào)病房燈滅
  184.             if(dis_lcd[br_geshu] == '4')
  185.                 led4 = 0;      //4號(hào)病房燈滅
  186.             if(dis_lcd[br_geshu] == '5')
  187.                 led5 = 0;      //5號(hào)病房燈滅
  188.             if(dis_lcd[br_geshu] == '6')
  189.                 led6 = 0;      //6號(hào)病房燈滅
  190.             if(dis_lcd[br_geshu] == '7')
  191.                 led7 = 0;      //7號(hào)病房燈滅
  192.             if(dis_lcd[br_geshu] == '8')
  193.                 led8 = 0;      //8號(hào)病房燈滅
  194.             dis_lcd[br_geshu] = ' ';                    
  195.             br_geshu --;               //呼叫病人的人數(shù)減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. /*****************主函數(shù)********************/
  205. void main()
  206. {   
  207.     time0_init();         //初始化定時(shí)器
  208.     init_1602();         //lcd1602初始化
  209.     while(1)
  210.     {
  211.         key();     //獨(dú)立按鍵程序      
  212.         key_qx();     //取消按鍵程序
  213.          key_with();
  214.         if(flag_300ms == 1)
  215.         {
  216.             flag_300ms = 0;
  217.             if(br_geshu > 0)
  218.                 beep = ~beep;   //蜂鳴器報(bào)警
  219.             else
  220.                 beep = 1;       //取消報(bào)警
  221.         }
  222.     }
  223. }


  224. /**************定時(shí)器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. }
復(fù)制代碼

hex文件: 單片機(jī)病房呼叫系統(tǒng).rar (26.87 KB, 下載次數(shù): 20)


回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表