一、系統(tǒng)方案 設(shè)計一個可容8張床位的病房呼叫系統(tǒng)。要求每個床位都有一個按鈕,當(dāng)患者需要呼叫護(hù)士時,按下按鈕,此時護(hù)士值班室內(nèi)的呼叫系統(tǒng)板上顯示該患者的床位號,并蜂鳴器報警。當(dāng)護(hù)士按下“響應(yīng)”鍵時,結(jié)束當(dāng)前呼叫。
二、硬件設(shè)計 原理圖如下:
三、單片機軟件設(shè)計 1、首先是系統(tǒng)初始化
//LCD端口初始化
void LCDPort_Init(void)
{
LCD_BUS = 0XFF;
LCD_BUS_Direction_REG =0XFF; //LCD數(shù)據(jù)端口設(shè)置為輸出
LCD_ControlPort_SET; //RS RW EN腳均設(shè)置為輸出
LCD_ControlPort_CLR; //RW RW EN低電平
}
//LCD寫指令
void Write_Com(unsigned char LCD_Com)
{
RS_CLR; //RS=0,寫指令
RW_CLR; //RW=0,寫命令
EN_SET; //E=1,寫操作
LCD_BUS=LCD_Com; //數(shù)據(jù)送往數(shù)據(jù)端口?
_delay_ms(1); //這個延時非常重要,結(jié)合時序圖來理解,可以跟送數(shù)據(jù)順序調(diào)換
EN_CLR;// E=0,下角
_delay_ms(1);
}
2、液晶顯示程序
//LCD端口初始化
void LCDPort_Init(void)
{
LCD_BUS = 0XFF;
LCD_BUS_Direction_REG =0XFF; //LCD數(shù)據(jù)端口設(shè)置為輸出
LCD_ControlPort_SET; //RS RW EN腳均設(shè)置為輸出
LCD_ControlPort_CLR; //RW RW EN低電平
}
//LCD寫指令
void Write_Com(unsigned char LCD_Com)
{
RS_CLR; //RS=0,寫指令
RW_CLR; //RW=0,寫命令
EN_SET; //E=1,寫操作
LCD_BUS=LCD_Com; //數(shù)據(jù)送往數(shù)據(jù)端口?
_delay_ms(1); //這個延時非常重要,結(jié)合時序圖來理解,可以跟送數(shù)據(jù)順序調(diào)換
EN_CLR;// E=0,下角
_delay_ms(1);
}
3、按鍵程序
//按鍵處理函數(shù)
void key_with(void)
{
uchar i;
if(key_can <= 8)
{
if(key_can == 1)
L1_0 ; //1號病房燈亮
if(key_can == 2)
L2_0 ; //2號病房燈亮
if(key_can == 3)
L3_0 ; //3號病房燈亮
if(key_can == 4)
L4_0; //4號病房燈亮
if(key_can == 5)
L5_0 ; //5號病房燈亮
if(key_can == 6)
L6_0 ; //6號病房燈亮
if(key_can == 7)
L7_0 ; //7號病房燈亮
}
4、核心算法程序
void main(void)
{
unsigned char key =1;
LCDPort_Init();
LCD_Init();
DDRB=0x7F;
PORTB=0xff;
DDRC=0xFF;
PORTC=0xff;
DDRD=0x00;
PORTD=0xff;
DDRA=0xFF;
PORTA=0xff;
write_string(1,0,Timer_buf);
write_string(2,0," wu bingrenhujiao");
while(1)
{
Timer_buf[13] = br_geshu%10+47;
write_string(1,0,Timer_buf); //寫顯示
if(br_geshu > 1)
BEEP_0 ; //蜂鳴器報警
else
BEEP_1; //取消報警
key_with();
if((PIND&0x01)==0x00) // 按鍵1按下
{
_delay_ms(10); // 延時消抖
if((PIND&0x01)==0x00) // 確定按鍵依然1按下
{
while((PIND&0x01)!=0X01); // 判斷手松開
key_can = 1;
}
}
if((PIND&0x02)==0x00) // 按鍵1按下
{
_delay_ms(10); // 延時消抖
if((PIND&0x02)==0x00) // 確定按鍵依然1按下
{
while((PIND&0x02)!=0X02); // 判斷手松開
key_can = 2;
}
}
if((PIND&0x04)==0x00) // 按鍵1按下
{
_delay_ms(10); // 延時消抖
if((PIND&0x04)==0x00) // 確定按鍵依然1按下
{
while((PIND&0x04)!=0X04); // 判斷手松開
key_can = 3;
}
}
if((PIND&0x08)==0x00) // 按鍵1按下
{
_delay_ms(10); // 延時消抖
if((PIND&0x08)==0x00) // 確定按鍵依然1按下
{
while((PIND&0x08)!=0X08); // 判斷手松開
key_can = 4;
}
}
if((PIND&0x10)==0x00) // 按鍵1按下
{
_delay_ms(10); // 延時消抖
if((PIND&0x10)==0x00) // 確定按鍵依然1按下
{
while((PIND&0x10)!=0X10); // 判斷手松開
key_can = 5;
}
}
if((PIND&0x20)==0x00) // 按鍵1按下
{
_delay_ms(10); // 延時消抖
if((PIND&0x20)==0x00) // 確定按鍵依然1按下
{
while((PIND&0x20)!=0X20); // 判斷手松開
key_can = 6;
}
}
if((PIND&0x40)==0x00) // 按鍵1按下
{
_delay_ms(10); // 延時消抖
if((PIND&0x40)==0x00) // 確定按鍵依然1按下
{
while((PIND&0x40)!=0X40); // 判斷手松開
key_can = 7;
}
}
if((PIND&0x80)==0x00) // 按鍵1按下
{
_delay_ms(10); // 延時消抖
if((PIND&0x80)==0x00) // 確定按鍵依然1按下
{
while((PIND&0x80)!=0X80); // 判斷手松開
key_can = 8;
}
}
if((PINB&0x80)==0x00) // 按鍵1按下
{
_delay_ms(10); // 延時消抖
if((PINB&0x80)==0x00) // 確定按鍵依然1按下
{
while((PINB&0x80)!=0X80); // 判斷手松開
key_can = 9;
}
}
}
}
四、 proteus仿真設(shè)計 Proteus軟件是一款應(yīng)用比較廣泛的工具,它可以在沒有硬件平臺的基礎(chǔ)上通過自身的軟件仿真出硬件平臺的運行情況,這樣就可以通過軟件仿真來驗證我們設(shè)計的方案有沒有問題,如果有問題,可以重新選擇器件,連接器件,直到達(dá)到我們設(shè)定的目的,避免我們搭建實物的時候,如果當(dāng)初選擇的方案有問題,我們器件都已經(jīng)焊接好了,再去卸載下去,再去焊接新的方案的器件,測試,這樣會浪費人力和物力,也給開發(fā)者帶來一定困惑,Proteus仿真軟件就很好的解決這個問題,我們在設(shè)計之初,就使用該軟件進(jìn)行模擬仿真,測試,選擇滿足我們設(shè)計的最優(yōu)方案。最后根據(jù)測試沒問題的仿真圖紙,焊接實物,調(diào)試,最終完成本設(shè)計的作品。 |