单片机病床呼叫C语言编程,单片机C51病床呼叫系统源程序

#include              //调用单片机头文件

#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

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

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;

}

}

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值