找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1045|回复: 0
打印 上一主题 下一主题
收起左侧

基于51单片机呼叫病房程序设计

[复制链接]
跳转到指定楼层
楼主
ID:1062867 发表于 2023-2-15 14:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>          //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义 变量范围0~255
#define uint  unsigned int  //无符号整型 宏定义 变量范围0~65535
  

sbit rs=P2^6;  
sbit rw=P2^5;  
sbit e =P2^7;

sbit beep = P1^5; //蜂鸣器IO口定义
sbit key_quxiao = P3^3;   //取消键IO口定义

bit flag_300ms ;    //300ms的标志位


sbit led1 = P2^0;   //第1号病房指示灯
sbit led2 = P2^1;   //第2号病房指示灯
sbit led3 = P2^2;   //第3号病房指示灯

sbit key1 = P3^1;   //按键1定义
sbit key2 = P3^0;   //按键2定义
sbit key3 = P3^2;   //按键3定义
sbit key4 = P3^3;   //按键4定义

uchar dis_lcd[8];   //3个病房数据显示的缓冲区
uchar br_geshu;     //报警病人数
uchar key_can;  //按键值

/********************************************************************
* 名称 : 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)
{
  rs=0;      //写命令
rw=0;      //对1602写操作
P0=com;      //P0口对1602写命令数据
delay_uint(25);
e=1;  //e=1使能信号
delay_uint(100);   //延时一下等1602完成操作
e=0;
}

/***********************lcd1602写数据函数************************/
void write_data(uchar dat)
{
  rs=1;      //写数据
rw=0;      //对1602写操作
P0=dat;    //P0口对1602写数据
delay_uint(25);
e=1;  //e=1使能信号
delay_uint(100);   //延时一下等1602完成操作
e=0;
}


/***********************lcd1602上显示这字符串函数************************/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)   
write_com(0x80+add);    //1602写第一行的地址
else
write_com(0x80+0x40+add);   //1602写第二行的地址
while(1)  
{
if(*p == '\0')  break; //\0字符串的结尾标志  break结束while循环 结束写字符
write_data(*p);     //写数据
p++;             //指针地址加1  
}
}

/***********************lcd1602上显示这字符函数************************/
void write_string_ge(uchar hang,uchar add,uchar *p,uchar ge)
{
uchar i;
if(hang==1)   
write_com(0x80+add);    //1602写第一行的地址
else
write_com(0x80+0x40+add);  //1602写第二行的地址
for(i=0;i<ge;i++)
{
write_data(0x30+*p);    //写数据
p++;             //指针地址加1  
}
}

/***********************lcd1602初始化设置************************/
void init_1602()  //lcd1602初始化设置
{
write_com(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口 不检测忙信号
write_com(0x0c);  //开显示 不显示光标
write_com(0x06);  //当写一个字符是,地址指针加 1
  write_string(1,0," bingfang hujiao "); //初始化显示  
write_string(2,0,"  wu bingren     "); //初始化显示
}

/*********************定时器0、定时器1初始化******************/
void time0_init()   
{  
EA  = 1;     //开总中断
TMOD = 0X01;   //定时器0、工作方式1
ET0 = 1;   //开定时器0中断
TR0 = 1;   //允许定时器0定时
TH0 = 0X3C;
TL0 = 0XB0;    //50ms

}

/********************独立按键程序*****************/


void key()  //独立按键程序
{

key_can = 0;            //按键值还原
if((key1 == 0)&&(led1==1))           //按键按下
{
delay_1ms(1);     //延时按键消抖动
if(key1 == 0)   //确认是按键按下
key_can = 1; //得到按键值
}
if((key2 == 0)&&(led2==1))            //按键按下
{
delay_1ms(1);     //延时按键消抖动
if(key2 == 0)   //确认是按键按下
key_can = 2; //得到按键值
}
if((key3 == 0)&&(led3==1))            //按键按下
{
delay_1ms(1);     //延时按键消抖动
if(key3 == 0)   //确认是按键按下
key_can = 3; //得到按键值
}
   
}
void key_qx()  //取消按键程序
{
if(key_quxiao == 0) //按键按下
{
delay_1ms(1);       //延时按键消抖动
if(key_quxiao == 0)
{ //确认是按键按下
key_can = 4; //得到按键值
while(key_quxiao == 0);  //等待按键松手
}
}
}

pdf格式的原理图: 病房呼叫.pdf (218.6 KB, 下载次数: 4)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表