|
系統(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ī)源程序如下:
- #include <reg52.h> //調(diào)用單片機(jī)頭文件
- #define uchar unsigned char //無(wú)符號(hào)字符型 宏定義 變量范圍0~255
- #define uint unsigned int //無(wú)符號(hào)整型 宏定義 變量范圍0~65535
- uchar code table_num[]="0123456789abcdefg";
- sbit rs=P2^7; //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器 L:指令寄存器
- sbit rw=P2^6; //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器 L:指令寄存器
- sbit e =P2^5; //片選信號(hào) 下降沿觸發(fā)
- sbit beep = P2^4;
- sbit key_quxiao = P2^0; //取消鍵
- uchar i;
- bit flag_300ms ; //300ms的標(biāo)志位
- sbit led1 = P1^0; //第1號(hào)病房指示燈
- sbit led2 = P1^1; //第2號(hào)病房指示燈
- sbit led3 = P1^2; //第3號(hào)病房指示燈
- sbit led4 = P1^3; //第4號(hào)病房指示燈
- sbit led5 = P1^4; //第5號(hào)病房指示燈
- sbit led6 = P1^5; //第6號(hào)病房指示燈
- sbit led7 = P1^6; //第7號(hào)病房指示燈
- sbit led8 = P1^7; //第8號(hào)病房指示燈
- uchar dis_lcd[8]; //8個(gè)病房數(shù)據(jù)顯示的緩沖區(qū)
- uchar br_geshu; //報(bào)警病人數(shù)
-
- /********************************************************************
- * 名稱 : delay_1ms()
- * 功能 : 延時(shí)1ms函數(shù)
- * 輸入 : q
- * 輸出 : 無(wú)
- ***********************************************************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
- /***********************延時(shí)函數(shù)************************/
- void delay_uint(uint q)
- {
- while(q--);
- }
- /***********************lcd1602寫命令函數(shù)************************/
- void write_com(uchar com)
- {
- e=0;
- rs=0;
- rw=0;
- P0=com;
- delay_uint(3);
- e=1;
- delay_uint(25);
- e=0;
- }
- /***********************lcd1602寫數(shù)據(jù)函數(shù)************************/
- void write_data(uchar dat)
- {
- e=0;
- rs=1;
- rw=0;
- P0=dat;
- delay_uint(3);
- e=1;
- delay_uint(25);
- e=0;
- }
- /***********************lcd1602上顯示這字符函數(shù)************************/
- void write_string(uchar hang,uchar add,uchar *p)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- while(1)
- {
- if(*p == '\0') break;
- write_data(*p);
- p++;
- }
- }
- /***********************lcd1602上顯示這字符函數(shù)************************/
- void write_string_ge(uchar hang,uchar add,uchar *p,uchar ge)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- for(i=0;i<ge;i++)
- write_data(*p++);
- }
- /***********************lcd1602初始化設(shè)置************************/
- void init_1602() //lcd1602初始化設(shè)置
- {
- write_com(0x38); //
- write_com(0x0c);
- write_com(0x06);
- delay_uint(1000);
- write_string(1,0," bingfang hujiao ");
- write_string(2,0," wu bingren ");
- }
- /*********************定時(shí)器0初始化******************/
- void time0_init()
- {
- EA = 1; //開總中斷
- TMOD = 0X01; //定時(shí)器0、工作方式1
- ET0 = 1; //開定時(shí)器0中斷
- TR0 = 1; //允許定時(shí)器0定時(shí)
- }
- /********************獨(dú)立按鍵程序*****************/
- uchar key_can; //按鍵值
- void key() //獨(dú)立按鍵程序
- {
- if((P3 & 0xff) != 0xff) //按鍵按下
- {
- delay_1ms(1); //按鍵消抖動(dòng)
- if((P3 & 0xff) != 0xff)
- { //確認(rèn)是按鍵按下
- switch(P3 & 0xff)
- {
- case 0xfe: key_can = 1; break; //得到按鍵值
- case 0xfd: key_can = 2; break; //得到按鍵值
- case 0xfb: key_can = 3; break; //得到按鍵值
- case 0xf7: key_can = 4; break; //得到按鍵值
- case 0xef: key_can = 5; break; //得到按鍵值
- case 0xdf: key_can = 6; break; //得到按鍵值
- case 0xbf: key_can = 7; break; //得到按鍵值
- case 0x7f: key_can = 8; break; //得到按鍵值
- }
- }
- }
- }
-
- void key_qx() //取消按鍵程序
- {
- key_quxiao = 1; //對(duì)應(yīng)的按鍵IO口輸出為1
- if(key_quxiao == 0) //按鍵按下
- {
- delay_1ms(1); //按鍵消抖動(dòng)
- if((key_quxiao == 0))
- { //確認(rèn)是按鍵按下
- key_can = 9;
- }
- }
- }
- /**********************按鍵處理函數(shù)************************/
- void key_with()
- {
- uchar i;
- if(key_can <= 8)
- {
- if(key_can == 1)
- led1 = 1; //1號(hào)病房燈亮
- if(key_can == 2)
- led2 = 1; //2號(hào)病房燈亮
- if(key_can == 3)
- led3 = 1; //3號(hào)病房燈亮
- if(key_can == 4)
- led4 = 1; //4號(hào)病房燈亮
- if(key_can == 5)
- led5 = 1; //5號(hào)病房燈亮
- if(key_can == 6)
- led6 = 1; //6號(hào)病房燈亮
- if(key_can == 7)
- led7 = 1; //7號(hào)病房燈亮
- if(key_can == 8)
- led8 = 1; //8號(hào)病房燈亮
- if(br_geshu < 8)
- {
- if(br_geshu == 0) //第一次清除顯示屏
- write_string(2,0," ");
- br_geshu ++; //呼叫病人的人數(shù)加1
- dis_lcd[0] = table_num[key_can] ; //把病人的號(hào)碼保存起來(lái)
- for(i=7;i>0;i--)
- dis_lcd[i] = dis_lcd[i-1] ; //把病人的數(shù)據(jù)向后移一位
- write_string_ge(2,0,dis_lcd,br_geshu); //顯示出來(lái)
- }
- }
- if(key_can == 9) //取消鍵的處理
- {
- if(br_geshu > 0)
- {
- if(dis_lcd[br_geshu] == '1')
- led1 = 0; //1號(hào)病房燈滅
- if(dis_lcd[br_geshu] == '2')
- led2 = 0; //2號(hào)病房燈滅
- if(dis_lcd[br_geshu] == '3')
- led3 = 0; //3號(hào)病房燈滅
- if(dis_lcd[br_geshu] == '4')
- led4 = 0; //4號(hào)病房燈滅
- if(dis_lcd[br_geshu] == '5')
- led5 = 0; //5號(hào)病房燈滅
- if(dis_lcd[br_geshu] == '6')
- led6 = 0; //6號(hào)病房燈滅
- if(dis_lcd[br_geshu] == '7')
- led7 = 0; //7號(hào)病房燈滅
- if(dis_lcd[br_geshu] == '8')
- led8 = 0; //8號(hào)病房燈滅
- dis_lcd[br_geshu] = ' ';
- br_geshu --; //呼叫病人的人數(shù)減1
- write_string_ge(2,0,dis_lcd,br_geshu);
- if(br_geshu == 0) //取消到最后一次清顯示屏
- {
- write_string(2,0," wu bingren ");
- }
- }
- }
- }
- /*****************主函數(shù)********************/
- void main()
- {
- time0_init(); //初始化定時(shí)器
- init_1602(); //lcd1602初始化
- while(1)
- {
- key(); //獨(dú)立按鍵程序
- key_qx(); //取消按鍵程序
- key_with();
- if(flag_300ms == 1)
- {
- flag_300ms = 0;
- if(br_geshu > 0)
- beep = ~beep; //蜂鳴器報(bào)警
- else
- beep = 1; //取消報(bào)警
- }
- }
- }
- /**************定時(shí)器0中斷程序*****************/
- void time0() interrupt 1
- {
- uchar value;
- TH0 = 0X3C;
- TL0 = 0XB0; //50ms
- value ++;
- if(value >= 6) //300ms
- {
- value = 0;
- flag_300ms = 1;
- }
- }
復(fù)制代碼
hex文件:
單片機(jī)病房呼叫系統(tǒng).rar
(26.87 KB, 下載次數(shù): 20)
2021-4-14 17:57 上傳
點(diǎn)擊文件名下載附件
|
|