系统是基于51系列的单片机设计的病床呼叫系统。该系统以STC89C52单片机为核心辅以矩阵键盘、LCD1602示电路和部分简单模拟和数字电路组成的能够实现病人和医护人员之间信息的传递。在该设计中每个病房都有一个按键,当患者有需要时,按下按键,此时 值班室的显示屏可显示此患者的床位号,多人使用时可实现循环显示,医护人员按下“响应”键取消当前呼叫。此系统能够为医院提供一个成本低、效率高、操作方便和易于安装维护的快捷系统。
单片机源程序如下:
- #include <reg52.h> //调用单片机头文件
- #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
- #define uint unsigned int //无符号整型 宏定义 变量范围0~65535
- uchar code table_num[]="0123456789abcdefg";
- sbit rs=P2^7; //寄存器选择信号 H:数据寄存器 L:指令寄存器
- sbit rw=P2^6; //寄存器选择信号 H:数据寄存器 L:指令寄存器
- sbit e =P2^5; //片选信号 下降沿触发
- sbit beep = P2^4;
- sbit key_quxiao = P2^0; //取消键
- uchar i;
- bit flag_300ms ; //300ms的标志位
- sbit led1 = P1^0; //第1号病房指示灯
- sbit led2 = P1^1; //第2号病房指示灯
- sbit led3 = P1^2; //第3号病房指示灯
- sbit led4 = P1^3; //第4号病房指示灯
- sbit led5 = P1^4; //第5号病房指示灯
- sbit led6 = P1^5; //第6号病房指示灯
- sbit led7 = P1^6; //第7号病房指示灯
- sbit led8 = P1^7; //第8号病房指示灯
- uchar dis_lcd[8]; //8个病房数据显示的缓冲区
- uchar br_geshu; //报警病人数
-
- /********************************************************************
- * 名称 : delay_1ms()
- * 功能 : 延时1ms函数
- * 输入 : q
- * 输出 : 无
- ***********************************************************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
- /***********************延时函数************************/
- void delay_uint(uint q)
- {
- while(q--);
- }
- /***********************lcd1602写命令函数************************/
- void write_com(uchar com)
- {
- e=0;
- rs=0;
- rw=0;
- P0=com;
- delay_uint(3);
- e=1;
- delay_uint(25);
- e=0;
- }
- /***********************lcd1602写数据函数************************/
- void write_data(uchar dat)
- {
- e=0;
- rs=1;
- rw=0;
- P0=dat;
- delay_uint(3);
- e=1;
- delay_uint(25);
- e=0;
- }
- /***********************lcd1602上显示这字符函数************************/
- 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上显示这字符函数************************/
- 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初始化设置************************/
- void init_1602() //lcd1602初始化设置
- {
- write_com(0x38); //
- write_com(0x0c);
- write_com(0x06);
- delay_uint(1000);
- write_string(1,0," bingfang hujiao ");
- write_string(2,0," wu bingren ");
- }
- /*********************定时器0初始化******************/
- void time0_init()
- {
- EA = 1; //开总中断
- TMOD = 0X01; //定时器0、工作方式1
- ET0 = 1; //开定时器0中断
- TR0 = 1; //允许定时器0定时
- }
- /********************独立按键程序*****************/
- uchar key_can; //按键值
- void key() //独立按键程序
- {
- if((P3 & 0xff) != 0xff) //按键按下
- {
- delay_1ms(1); //按键消抖动
- if((P3 & 0xff) != 0xff)
- { //确认是按键按下
- 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; //对应的按键IO口输出为1
- if(key_quxiao == 0) //按键按下
- {
- delay_1ms(1); //按键消抖动
- if((key_quxiao == 0))
- { //确认是按键按下
- key_can = 9;
- }
- }
- }
- /**********************按键处理函数************************/
- void key_with()
- {
- uchar i;
- if(key_can <= 8)
- {
- if(key_can == 1)
- led1 = 1; //1号病房灯亮
- if(key_can == 2)
- led2 = 1; //2号病房灯亮
- if(key_can == 3)
- led3 = 1; //3号病房灯亮
- if(key_can == 4)
- led4 = 1; //4号病房灯亮
- if(key_can == 5)
- led5 = 1; //5号病房灯亮
- if(key_can == 6)
- led6 = 1; //6号病房灯亮
- if(key_can == 7)
- led7 = 1; //7号病房灯亮
- if(key_can == 8)
- led8 = 1; //8号病房灯亮
- if(br_geshu < 8)
- {
- if(br_geshu == 0) //第一次清除显示屏
- write_string(2,0," ");
- br_geshu ++; //呼叫病人的人数加1
- dis_lcd[0] = table_num[key_can] ; //把病人的号码保存起来
- for(i=7;i>0;i--)
- dis_lcd[i] = dis_lcd[i-1] ; //把病人的数据向后移一位
- write_string_ge(2,0,dis_lcd,br_geshu); //显示出来
- }
- }
- if(key_can == 9) //取消键的处理
- {
- if(br_geshu > 0)
- {
- if(dis_lcd[br_geshu] == '1')
- led1 = 0; //1号病房灯灭
- if(dis_lcd[br_geshu] == '2')
- led2 = 0; //2号病房灯灭
- if(dis_lcd[br_geshu] == '3')
- led3 = 0; //3号病房灯灭
- if(dis_lcd[br_geshu] == '4')
- led4 = 0; //4号病房灯灭
- if(dis_lcd[br_geshu] == '5')
- led5 = 0; //5号病房灯灭
- if(dis_lcd[br_geshu] == '6')
- led6 = 0; //6号病房灯灭
- if(dis_lcd[br_geshu] == '7')
- led7 = 0; //7号病房灯灭
- if(dis_lcd[br_geshu] == '8')
- led8 = 0; //8号病房灯灭
- dis_lcd[br_geshu] = ' ';
- br_geshu --; //呼叫病人的人数减1
- write_string_ge(2,0,dis_lcd,br_geshu);
- if(br_geshu == 0) //取消到最后一次清显示屏
- {
- write_string(2,0," wu bingren ");
- }
- }
- }
- }
- /*****************主函数********************/
- void main()
- {
- time0_init(); //初始化定时器
- init_1602(); //lcd1602初始化
- while(1)
- {
- key(); //独立按键程序
- key_qx(); //取消按键程序
- key_with();
- if(flag_300ms == 1)
- {
- flag_300ms = 0;
- if(br_geshu > 0)
- beep = ~beep; //蜂鸣器报警
- else
- beep = 1; //取消报警
- }
- }
- }
- /**************定时器0中断程序*****************/
- void time0() interrupt 1
- {
- uchar value;
- TH0 = 0X3C;
- TL0 = 0XB0; //50ms
- value ++;
- if(value >= 6) //300ms
- {
- value = 0;
- flag_300ms = 1;
- }
- }
复制代码
hex文件:
单片机病房呼叫系统.rar
(26.87 KB, 下载次数: 20)
|