基于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
|