欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于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://m.raoushi.com/bbs/)
Powered by Discuz! X3.1