模擬病房呼叫系統(tǒng)設(shè)計_第1頁
模擬病房呼叫系統(tǒng)設(shè)計_第2頁
模擬病房呼叫系統(tǒng)設(shè)計_第3頁
模擬病房呼叫系統(tǒng)設(shè)計_第4頁
模擬病房呼叫系統(tǒng)設(shè)計_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、模擬病房呼叫系統(tǒng)設(shè)計一、設(shè)計目的通過設(shè)計模擬病床呼叫的程序,更加熟練掌握單片機C語言指令的使用,培養(yǎng)用單片機來實現(xiàn)一些電子設(shè)備運行的邏輯思路,為以后更好的使用單片機打下基礎(chǔ)。二、設(shè)計要求模擬一個護理站下管8個床位,哪個病人要呼叫可以按鍵,相應(yīng)蜂鳴器響,數(shù)碼管顯示:呼叫數(shù)量_床位號.要求:16個數(shù)碼管,正常情況下顯示時間(時分秒),時間可通過按鍵調(diào)整。2有人呼叫則閃爍顯示數(shù)量_床位號并蜂鳴器響,按應(yīng)答鍵后繼續(xù)顯示時間。3若同時有多個病人呼叫則依次輪流顯示:數(shù)量_床位號。4、要求做出實物。三、硬件電路設(shè)計3.1 系統(tǒng)結(jié)構(gòu)框圖圖3-1系統(tǒng)框圖當(dāng)單片機一上電時,數(shù)碼管顯示時,分,秒。并且可通過按鍵對時

2、,分的調(diào)節(jié)。調(diào)節(jié)按鍵主要運用外部中斷程序,其中時鐘的顯示是通過TO定時器定時1s和數(shù)碼管顯示電路主要運用動態(tài)掃描的方式以實現(xiàn)的。此設(shè)計主要運用鍵盤掃描電路來設(shè)計病床號。當(dāng)有按鍵按下時數(shù)碼管由當(dāng)前的顯示時,分,秒,變?yōu)轱@示當(dāng)前呼叫數(shù)量和呼叫床號,并且呼叫床號按呼叫順序循環(huán)顯示,程序中運用數(shù)組作為按鍵緩沖區(qū),先存儲按鍵鍵值然后實現(xiàn)動態(tài)顯示。當(dāng)按下復(fù)位鍵后重新顯示時,分,秒。并且清空按鍵緩沖區(qū)。3.2 STC89C52單片機芯片 89C52共有四個八位的并行雙向口,即有32根輸入輸出口線。各口的每一位均由鎖存器、輸出驅(qū)動器和輸入緩沖器組成。 圖3-2 STC89C52集成芯片89C52共有四個八位的

3、并行雙向口,即有32根輸入輸出口線。各口的每一位均由鎖存器、輸出驅(qū)動器和輸入緩沖器組成。 VCC(40引腳):電源電壓VSS(20引腳):接地P0端口(P0.0P0.7,3932引腳):P0口是一個漏極開路的8位雙向I/O口。作為輸出端口,每個引腳能驅(qū)動8個TTL負載,對端口P0寫入“1”時,可以作為高阻抗輸入。在訪問外部程序和數(shù)據(jù)存儲器時,P0口也可以提供低8位地址和8位數(shù)據(jù)的復(fù)用總線。此時,P0口內(nèi)部上拉電阻有效。在Flash ROM編程時,P0端口接收指令字節(jié);而在校驗程序時,則輸出指令字節(jié)。驗證時,要求外接上拉電阻。P1端口(P1.0P1.7,18引腳):P1口是一個帶內(nèi)部上拉電阻的8

4、位雙向I/O口。P1的輸出緩沖器可驅(qū)動(吸收或者輸出電流方式)4個TTL輸入。對端口寫入1時,通過內(nèi)部的上拉電阻把端口拉到高電位,這是可用作輸入口。P1口作輸入口使用時,因為有內(nèi)部上拉電阻,那些被外部拉低的引腳會輸出一個電流。P1口特點是輸出鎖存器,輸出時沒有條件。輸入緩沖,輸入時有條件,即需要先將該口設(shè)為輸入狀態(tài),先輸出1。 此外,P1.0和P1.1還可以作為定時器/計數(shù)器2的外部技術(shù)輸入(P1.0/T2)和定時器/計數(shù)器2的觸發(fā)輸入(P1.1/T2EX) P3口為準雙向口。可以字節(jié)訪問,也可以位訪問。P3.0-RXD,串行輸入口。P3.1-TXD,串行輸出口。P3.2-INT0,外部中斷0

5、的請求。P3.3-INT1,外部中斷1的請求。P3.4-T0,定時器/計數(shù)器0外部計數(shù)脈沖。P3.5-T1,定時器/計數(shù)器,1外部計數(shù)脈沖。P3.6-WR,外部數(shù)據(jù)存儲器寫選通。P3.7-RD,外部數(shù)據(jù)存儲器讀選通。RST(9引腳):復(fù)位輸入。當(dāng)輸入連續(xù)兩個機器周期以上高電平時為有效,用來完成單片機單片機的復(fù)位初始化操作。ALE(30引腳):地址鎖存控制信號(ALE)是訪問外部程序存儲器時,鎖存低8位地址的輸出脈沖。XTAL1(19引腳):振蕩器反相放大器和內(nèi)部時鐘發(fā)生電路的輸入端。XTAL2(18引腳):振蕩器反相放大器的輸入端。3.3 鍵盤掃描電路圖3-3 按鍵掃描電路病床呼叫按鈕采用了矩

6、陣鍵盤掃描的方式。按鍵設(shè)置在行、列線交點上,行、列線分別連接到按鍵開關(guān)的兩端。首先將列至零,主程序中掃描P1是否有鍵按下,如果有鍵按下執(zhí)行子程序,先將列至零,掃描行然后置位行掃描列。3.4 數(shù)碼管顯示電路圖3-4 數(shù)碼管顯示電路數(shù)碼管是通過鎖存器573輸出的。驅(qū)動573需要上拉電阻。通過P0口控制他的片選,以及數(shù)碼管的位選,通過P2口控制數(shù)碼管的段選,主程序中通過動態(tài)掃描以實現(xiàn)數(shù)碼管的動態(tài)輸出。原理說明:74HC573的八個鎖存器都是透明的D 型鎖存器,當(dāng)使能(G)為高時,Q 輸出將隨數(shù)據(jù)(D)輸入而變。當(dāng)使能為低時,輸出將鎖存在已建立的數(shù)據(jù)電平上。輸出控制不影響鎖存器的內(nèi)部工作,即老數(shù)據(jù)可以

7、保持,甚至當(dāng)輸出被關(guān)閉時,新的數(shù)據(jù)也可以置入。這種電路可以驅(qū)動大電容或低阻抗負載,可以直接與系統(tǒng)總線接口并驅(qū)動總線,而不需要外接口。特別適用于緩沖寄存器,I/O 通道,雙向總線驅(qū)動器和工作寄存器。當(dāng)輸入的數(shù)據(jù)消失時,在芯片的輸出端,數(shù)據(jù)仍然保持; 這個概念在并行數(shù)據(jù)擴展中經(jīng)常使用到。3.5 系統(tǒng)電路原理圖圖3-7 系統(tǒng)電路原理圖所用器件如下如所示:數(shù)碼管:LD3461AS-SS22鎖存器:74HC573單片機:AT89S52上拉電阻:RESPACK-84、 軟件4.1 程序設(shè)計 圖4-1 程序設(shè)計流程圖 無人呼叫時,運用動態(tài)掃描方式利用定時器T0顯示時間;有人呼叫時,運用數(shù)組作為按鍵緩沖區(qū),先

8、存儲按鍵值然后動態(tài)顯示按鍵床號。4.2 子程序設(shè)計圖4-2 子程序流程圖掃描P1口前四位是否有變化,變化的位數(shù)為按鍵床號所屬的行數(shù);掃描P1口后四位是否有變化,變化的位數(shù)為按鍵床號所屬的列數(shù)。行列結(jié)合可知呼叫的病床號。五、實驗結(jié)果圖仿真時間:啟動后系統(tǒng)會自動進入顯示時間狀態(tài),此狀態(tài)下S8、S9、S10三個按鍵分別能對秒、分、時進行加1設(shè)置,而S12、S13、S14三個按鍵分別能對毫秒、秒、分進行減1設(shè)置。按下S11便暫停顯示。仿真時間如圖所示:圖5-1 仿真時間有呼叫時仿真:在任意時刻按下S0至S7中的一個按鍵,蜂鳴器發(fā)出響聲,進入顯示病床號狀態(tài),左1顯示呼叫總?cè)藬?shù),右1閃爍顯示病床號(若有多

9、個人呼叫)。在按下復(fù)位鍵P37以前如有病人重復(fù)按鍵則只發(fā)出響聲,不會改變呼叫總?cè)藬?shù)的顯示。另外此狀態(tài)下S8至S15處于無效無效狀態(tài),但時間計數(shù)仍未停止。圖5-2 仿真呼叫倒計時秒表仿真:在無人呼叫時按下S15便進入秒表時間設(shè)定狀態(tài),此狀態(tài)下S8、S9、S10三個按鍵分別能對毫秒、秒、分進行加1設(shè)置,而S12、S13、S14三個按鍵分別能對毫秒、秒、分進行減1設(shè)置,設(shè)置完成后再次按下S15倒計時便開始。當(dāng)計時結(jié)束后再次按下S15,便又回到了時間顯示狀態(tài)。兩個狀態(tài)互不影響。圖5-3 倒計時秒表仿真六、源程序/*程序名稱:病床呼叫系統(tǒng)設(shè)計簡要說明:無人呼叫顯示時間,有人呼叫顯示病床號及呼叫總?cè)藬?shù)。P

10、0,P2口接數(shù)碼管顯示,P1口接4*4矩陣鍵盤(鍵號015)。各鍵功能:07號按鍵:病床號07; 810號按鍵:秒,分,時加1調(diào)整鍵 1214號按鍵:秒,分,時減1調(diào)整鍵 11號按鍵:暫停時間顯示鍵 15號按鍵:倒計時的秒表 P3.6接蜂鳴器按鍵 P3.7病床復(fù)位鍵編 寫:邢志杰時 間:2015年07月8日最后修改時間:2015年07月10日*/#include<AT89x52.h>#define uchar unsigned char#define uint unsigned intvoid display();/顯示時間子函數(shù)void display1();/顯示倒計時時間子函

11、數(shù)void disp(); /顯示呼叫病床總數(shù)及當(dāng)前呼叫病床子函數(shù)void Time0() ; /定時中斷子函數(shù),用于改變時間參數(shù)void Time1() ; void rest(); / 初始化子函數(shù),用于病床復(fù)位后uchar code DSY_CODE=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0xc6,0xa1,0x86,0x8e,0x00; /共陰極數(shù)碼管顯示段碼sbit P36=P36; /接蜂鳴器sbit P37=P37; /病床復(fù)位按鍵void DelayMS(uint x) /延時子函數(shù)uchar y

12、;while(x-)for(y=0;y<120;y+);uchar d8=0,0,0,0,0,0,0,0; /用于存放呼叫病床的顯示段碼uchar g=0,j=0,log=0,CEN=0; /下面有詳細說明void rest()/ 初始化子函數(shù),用于病床復(fù)位后g=0; /g計數(shù):要顯示的呼叫病床個數(shù)log=0; /病床呼叫標志位,有人呼叫置1P36=0; /接蜂鳴器,高電平響CEN=0; /當(dāng)前顯示的病床號在數(shù)組d中的偏移量for(j=0;j<8;j+) /清空數(shù)組ddj=0;uchar hour=0,min=0,secon=0,tim0=0,hour1=0,min1=0,seco

13、n1=0,tim1=0;/時分秒的計數(shù)參數(shù)uchar watch=0,t,KeyNo;/watch倒計時秒表標志位,KeyNo保存鍵號void Keys_Scan()/4*4鍵盤掃描得到按鍵號即床號:07存于KeyNo中,815號用于時間調(diào)整uchar temp;P1=0xfe;temp=P1;if(temp!=0xfe) log=1;/病床呼叫標志P36=1;/只要有病床呼叫蜂鳴器便發(fā)出響聲 DelayMS(10);/延時 P36=0;/關(guān)蜂鳴器 switch(temp) case 0xee: KeyNo=0;break; case 0xde: KeyNo=1;break; case 0xb

14、e: KeyNo=2;break; case 0x7e: KeyNo=3;break; P1=0xfd;temp=P1;if(temp!=0xfd) log=1;/病床呼叫標志 P36=1;/只要有鍵按下就開蜂鳴器 DelayMS(10);/延時 P36=0;/關(guān)蜂鳴器 switch(temp) case 0xed: KeyNo=4;break; case 0xdd: KeyNo=5;break; case 0xbd: KeyNo=6;break; case 0x7d: KeyNo=7;break; P1=0xfb;temp=P1;if(temp!=0xfb&&g=0) /無人

15、呼叫時才能進行時間調(diào)整 switch(temp) case 0xeb: KeyNo=8; if(watch!=0) t=secon1; else t=secon; if(+t>=60)t=0; if(watch!=0) secon1=t; else secon=t; break; case 0xdb: KeyNo=9; if(watch!=0) t=min1; else t=min; if(+t>=60)t=0; if(watch!=0) min1=t; else min=t; break; case 0xbb: KeyNo=10; if(watch!=0) t=hour1; el

16、se t=hour; if(+t>=60)t=0; if(watch!=0) hour1=t; else hour=t; break; case 0x7b: KeyNo=11;TR0=TR0;break; /暫停計時 P1=0xf7;temp=P1;if(temp!=0xf7&&g=0) switch(temp) case 0xe7: KeyNo=12; if(watch!=0) t=secon1; else t=secon; if(t-=0)t=59; if(watch!=0) secon1=t; else secon=t; break; case 0xd7: KeyN

17、o=13; if(watch!=0) t=min1; else t=min; if(t-=0)t=59; if(watch!=0) min1=t; else min=t; break; case 0xb7: KeyNo=14; if(watch!=0) t=hour1; else t=hour; if(t-=0)t=59; if(watch!=0) hour1=t; else hour=t; break; case 0x77: KeyNo=15;watch+;/倒計時watch=1設(shè)定倒計時時間, if(watch=2) TR1=1; /watch=2開始計時 if(watch=3) watc

18、h=0; TR1=0; break; /等待按鍵松開 P1=0X0f;temp=P1;while(temp!=0x0f) P1=0X0f;temp=P1;if(log=1)/當(dāng)前按鍵為病床按鍵disp(); /顯示病床號及呼叫總數(shù)else if(watch=0) /當(dāng)前按鍵為時間調(diào)整按鍵且無人呼叫display(); /顯示時間else display1(); /當(dāng)前按鍵為倒計時時間調(diào)整按鍵且無人呼叫void display() /顯示時間函數(shù) P0=0xfe;P2=DSY_CODEhour/10;DelayMS(1);P0=0xfd;P2=DSY_CODEhour%10;DelayMS(1)

19、;P0=0xfb;P2=DSY_CODEmin/10;DelayMS(1);P0=0xf7;P2=DSY_CODEmin%10;DelayMS(1);P0=0xef;P2=DSY_CODEsecon/10;DelayMS(1);P0=0xdf;P2=DSY_CODEsecon%10;DelayMS(1); void display1() /倒計時顯示時間函數(shù)P0=0xfe;P2=DSY_CODEhour1/10;DelayMS(1);P0=0xfd;P2=DSY_CODEhour1%10;DelayMS(1);P0=0xfb;P2=DSY_CODEmin1/10;DelayMS(1);P0=0

20、xf7;P2=DSY_CODEmin1%10;DelayMS(1);P0=0xef;P2=DSY_CODEsecon1/10;DelayMS(1);P0=0xdf;P2=DSY_CODEsecon1%10;DelayMS(1); void disp() /顯示呼叫病床總數(shù)及當(dāng)前呼叫病床DelayMS(1);P0=0xfe;P2=DSY_CODEg; /顯示當(dāng)前呼叫病床總數(shù)DelayMS(1);P0=0xfd;P2=dCEN;/顯示當(dāng)前床號,CEN的值在定時中斷中發(fā)生發(fā)生改變,實現(xiàn)一秒的閃爍顯示,精華之處DelayMS(1);void main() /主程序TMOD=0x00; /定時器T0方式

21、0TH0=(8192-4000)/32; /計時250*4ms=1sTL0=(8192-4000)%32;TH1=(8192-5000)/32; /計時250*4ms=1sTL1=(8192-5000)%32;IE=0x8a; /開T0,T1中斷PX1=1;TR1=0;/關(guān)T1TR0=1; /初始化完畢while(1) /主程序在此處循環(huán)if(g!=0) /有人呼叫時,顯示病床號 disp();else if(watch=0)/無人呼叫時,顯示時、分、秒display();else /無人呼叫顯示倒計時display1(); /判斷是否有病床呼叫P1=0xf0;if(P1!=0xf0)Keys

22、_Scan();/有呼叫則求得床號for(j=0;j<8;j+) /判斷是否是重復(fù)按鍵若是則不再保存本次床號 if(DSY_CODEKeyNo=dj) j=8; log=0; if(log=1) g+; if(g=9)g=0; switch(g) case 1: d0=DSY_CODEKeyNo;break; case 2: d1=DSY_CODEKeyNo;break; case 3: d2=DSY_CODEKeyNo;break; case 4: d3=DSY_CODEKeyNo;break; case 5: d4=DSY_CODEKeyNo;break; case 6: d5=DS

23、Y_CODEKeyNo;break; case 7: d6=DSY_CODEKeyNo;break; case 8: d7=DSY_CODEKeyNo;break; if(P37=0) /按下病床復(fù)位鍵 rest();void Time0() interrupt 1 /顯示時間TH0=(8192-4000)/32; /恢復(fù)初值TL0=(8192-4000)%32;if(dCEN=0)CEN=0; /精華所在之處,非常巧妙if(+tim0!=250) return; tim0=0;CEN+;if(CEN=8)CEN=0;secon+;if(secon=60) secon=0; min+; if(min=60) min=0; hour+; if(hour=24)hour=0; void Time1() interrupt 3 /倒計時秒表 TH1=(8192

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論