标题:
基于At89c51的病房呼叫系统Proteus仿真+程序
[打印本页]
作者:
明天123
时间:
2019-2-21 12:27
标题:
基于At89c51的病房呼叫系统Proteus仿真+程序
基于At89c51的病房呼叫系统仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(18.95 KB, 下载次数: 103)
下载附件
2019-2-21 15:27 上传
单片机源程序如下:
#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
uchar code table_num[]="0123456789abcdefg";
sbit rs=P2^5; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit rw=P2^6; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit e =P2^7; //片选信号 下降沿触发
sbit beep = P2^4;
sbit key_quan = P2^0;
sbit key_quxiao = P2^1; //取消键
uchar flag_en;
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号病房指示灯
sbit k1=P2^2;
sbit k2=P2^3;
sbit k3=P3^2;
sbit k4=P3^3;
sbit k5=P3^4;
sbit k6=P3^5;
sbit k7=P3^6;
sbit k8=P3^7;
uchar dis_lcd[8]; //8个病房数据显示的缓冲区
uchar br_geshu; //报警病人数
uchar key_new;
uchar key_new1;
/********************************************************************
* 名称 : 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(k1== 0) key_can = 1; //得到按键值
if(k2== 0) key_can = 2; //得到按键值
if(k3== 0) key_can = 3; //得到按键值
if(k4== 0) key_can = 4; //得到按键值
if(k5== 0) key_can = 5; //得到按键值
if(k6== 0) key_can = 6; //得到按键值
if(k7== 0) key_can = 7; //得到按键值
if(k8== 0) key_can = 8; //得到按键值
}
void key_qx() //取消按键程序
{
key_quxiao = 1; //对应的按键IO口输出为1
if(key_quxiao == 0) //按键按下
{
delay_1ms(1); //按键消抖动
if(key_quxiao == 0)
{ //确认是按键按下
key_can = 9;
while(key_quxiao == 0);
}
}
if(key_quan == 0) //按键按下
{
delay_1ms(1); //按键消抖动
if((key_quan == 0))
{ //确认是按键按下
key_can = 10;
while(key_quan == 0);
}
}
}
/**********************按键处理函数************************/
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号病房灯亮
flag_en = 1;
for(i=0;i<8;i++)
{
if(dis_lcd[i] == table_num[key_can])
{
flag_en = 0; //说明这个病人已经按下过了
}
}
if(br_geshu < 8)
{
if(flag_en == 1) //能进入到这里说明是第一次按下呼叫按键
{
if(br_geshu == 0) //第一次清除显示屏
write_string(2,0," ");
br_geshu ++; //呼叫病人的人数加1
//if(key_can!=1)
{
for(i=7;i>0;i--)
dis_lcd[i] = dis_lcd[i-1] ; //把病人的数据向后移一位
dis_lcd[0] = table_num[key_can] ; //把病人的号码保存起来
}
//if(key_can==1)
{
//dis_lcd[br_geshu-1] =table_num[key_can];
}
write_string_ge(2,0,dis_lcd,br_geshu); //显示出来
}
}
}
if(key_can == 9) //取消键的处理
{
if(br_geshu > 0)
{
if(dis_lcd[br_geshu-1] == '1')
led1 = 0; //1号病房灯灭
if(dis_lcd[br_geshu-1] == '2')
led2 = 0; //2号病房灯灭
if(dis_lcd[br_geshu-1] == '3')
led3 = 0; //3号病房灯灭
if(dis_lcd[br_geshu-1] == '4')
led4 = 0; //4号病房灯灭
if(dis_lcd[br_geshu-1] == '5')
led5 = 0; //5号病房灯灭
if(dis_lcd[br_geshu-1] == '6')
led6 = 0; //6号病房灯灭
if(dis_lcd[br_geshu-1] == '7')
led7 = 0; //7号病房灯灭
if(dis_lcd[br_geshu-1] == '8')
led8 = 0; //8号病房灯灭
dis_lcd[br_geshu-1] = ' ';
br_geshu --; //呼叫病人的人数减1
write_string(2,0," "); //清显示
write_string_ge(2,0,dis_lcd,br_geshu);
if(br_geshu == 0) //取消到最后一次清显示屏
{
write_string(2,0," wu bingren ");
P1 = 0x00;
}
}
}
if(key_can == 10) //取消键的处理
{
for(i=0;i<8;i++)
dis_lcd[i] = ' ';
br_geshu=0; //呼叫病人的人数减1
if(br_geshu == 0) //取消到最后一次清显示屏
{
write_string(2,0," wu bingren ");
P1 = 0x00;
}
}
}
/*****************主函数********************/
void main()
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
(5.22 KB, 下载次数: 94)
下载附件
2019-2-21 15:30 上传
所有资料51hei提供下载:
新病房呼叫仿真.zip
(27.11 KB, 下载次数: 210)
2019-2-21 12:26 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
1029421014
时间:
2019-11-14 09:50
作者我想问下 这个程序实现了什么功能呢,能不能具体点
作者:
1029421014
时间:
2019-11-14 13:14
我将程序跟电路都已画出,发现仿真时,只有铃声跟按键响应,液晶显示屏保持常亮,并未显示出任何字样?这是怎么一回事?求帮助
作者:
小花鸭
时间:
2019-12-19 16:34
优先级怎么实现
作者:
456789987654
时间:
2020-4-3 10:57
请问一下rp1上接的八个电阻和电压实现了什么意思
作者:
456789987654
时间:
2020-4-3 10:58
你好,我想请问作者rp1上接的八个电阻和电压在整个电路中实现了什么功能
作者:
麦迪娜
时间:
2020-4-24 13:14
优先级怎么显示???
作者:
jiangdongbubin
时间:
2020-4-30 22:46
8.6版本的proteus不能打开仿真文件,.c文件看了,程序里是没有右边的通信部分的,程序就是通过按键判别,然后相应灯亮而已
作者:
lyn1949
时间:
2020-9-28 09:22
优先级怎么显示?
作者:
dxcxiaokeai0730
时间:
2020-10-13 09:20
图怎么打开
作者:
别听水星记
时间:
2020-12-3 10:19
请问一下rp1上接的八个电阻和电压实现了什么意思
作者:
六个一
时间:
2020-12-16 11:17
怎么可以循环显示病房呼叫数呀?
作者:
六个一
时间:
2020-12-16 11:42
您好,请问仿真后灯全亮,按键没有作用是键盘扫描函数出错了嘛?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1