1課程設計總體目標
1.1 功能 由單片機AT89C51芯片和LCD顯示器,輔以必要的的電路,構成一個可編程作息時間控制器。電子鐘采用采用單片機來完成,LCD顯示“時”,“分”,LED閃動來做秒計數,定時時間到能發出相應的提示,從而能夠實現作息時間控制。現在是自動化高度發達的時代,特別是電子類產品都是靠內部的控制電路來實現對產品的控制,達到自動運行的目的,這就需要我們這里要做的設計中的電器元件及電路的支持。
(1)在keiluVision和proteus上編寫軟件完成設計。
(2)以AT89C51單片機為核心結合字符型LCD顯示器的可編程作息時間控制器。
(3)按照給定的時間模擬控制,實現廣播、上下課打鈴、燈光控制(屏幕顯示),同時具備日期和時鐘顯示。
(4)上機調試程序。
(5)寫出設計報告。
1.2 總體系統結構可編程作息時間控制器是由簡單的一路鬧鐘的基礎上增加至四路可調鬧鐘,從而實現依次執行作息時間的提醒任務。系統主頓是由時間程序和鬧鐘程序所構成,由顯示模塊、時鐘模塊以及闌鐘模塊三大部分組成。其中時鐘運算模塊要對時、分、秒的數值進行操作,并且秒算到60時,要自己清零并向分進11分算到60時,要自己清零并向時進1,時算到24時,要清零,這樣,才能循環記時。并在不同狀態下使得四個按鍵有著不同的功能,從而實現系統時間的調整,同時可以在不同狀態下可以調整鬧鐘的時間。當定時到達時LCD將顯示出現在的鬧鐘是哪一路,響鈴一分鐘,并可以通過按鍵提前結束鬧鐘,恢復到時間顯示狀態。
使用7890單片機結合字符型LCD顯示器設計一個簡易的可編程作息時間控制器,若LCD選擇有背光顯示的模塊,在夜晚或黑暗的場合中也可使用。程序執行后工作指示燈LED閃動,表示程序開始執行,同時顯示系統時間。作息時間控制器是由4路可調鬧鐘組成,從而實現打鈴等功能。當四路鬧鐘中的任一路到時,均會點亮燈、打鈴。其中操作鍵KI~K4的功能分別為。設置限制的時間/時的調整、顯示鬧鐘設置的時間/分的調整、設置鬧鐘的時間/設置完成、鬧鐘更換。
2硬件設計
2.1硬件電路芯片的選擇系統主要是由AT89C51單片機、1602LCD液晶顯示器以及其他重要元件組成,按鍵作為系統的控制輸入端,可以進行時間、 鬧鐘等內容的設定,并通過液晶顯示器顯示出時間等內容。
AT89C5單片機本設計的核心硬件就是8051芯片,這里選擇了AT9C51, AT89C51是一種帶4K字節閃爍可編程可擦除只讀存儲器(PPEROM Falsh Progr amable and Erasable Read only Me的低電壓,高性能CMOS8位微處理器,俗稱單片機。該器件采用AMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,AMEL的AT89C51是一種高效微控制器,為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。
引腳及其功能:
P0口: P0口為一個8位漏級開路雙向I/O口,每腳可吸收STTL門電流。當P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數據存儲器,它可以被定義為數據/地址的第八位。在FIASH編程時,P0口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。
P1口.:P1口是一個內部提供上拉電阻的8位雙向I70. PI口緩沖器能接收輸出4TTL門電流。PI口管腳寫入1后,被內部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。
P2口: P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩仲器可接收,輸出4個TL門電流,當P2口被寫“1”時,其管腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2 口的管腳被外部拉低,將輸出電流。這是由于內部上拉的緣故。P2口當用于外部程序存儲器或16位地址外部數據存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內部上拉優勢,當對外部八位地址數據存儲器進時,P2口輸出地址的高八位。在結出地址“1”時,它利用內部上拉優勢,當對外部八位地址數據存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內容。P2 口在PLAH編程和校驗時接收高八位地址信號和控制信號。
P3口:P3口管腳是8個帶內部上拉電陽的雙向1/0口,可接收輸出4個TTL門電流。 當P3口寫入“1”后,它們被內部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。
P3 口也可作為AT89051的一些特殊功能口,如下所示,
P3口管腳備選功能
P3.0 RXD(串行輸入口)
P3.1 TXD( 串行輸出口)
P3.2 /INTO( 外部中斷0)
P3.3 /INT1(外 部中斷1)
P3.4 TO(記時器 0外部輸入)
P3.5 T1(記2時器1外部輸入)
P3.6 /MR( 外部數據存儲器寫選通)
P3.7 /RD(外 部數據存儲器讀選通)
P3口同時為閃爍編程和編程校驗接收一些控制信號。
RST復位輸入。當振蕩器復位器件時,要保持RST腳兩個機器周期的高電平時間。
ALE/PROG當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節。在FLASH編程期間,此引腳用于輸人編程脈沖。在平時,ALE 端以不變的領率周期輸出正脈沖信號。此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈神或用于定時目的。然而要注意的是,每當用作外部數據存儲器時,將跳過一個ALE脈神。如想禁止ALE的輸出可在SFREH地址上置0。此時,ALE只有在執行MOVX,MOVC指令是ALB才起作用。另外,該引腳被略微拉高。如果微處理器在外部執行狀態ALE禁止,置位無效。
PSEN外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數據存儲器時,這兩次有效的/PSEN信號將不出現。
EA/VPP當/EA 保持低電平時,則在此期間外部程序存儲器(000H-FFFH),不管是否有內部程序存儲器。注意加密方式1時,/EA將內部鎖定為RESET當/EA端保持高電平時,此間內部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。
XTA1反向振蕩放大器的輸入及內部時鐘I作電路的輸入。
XTA2來自反向振蕩器的輸出。
P1.0口接K1按鍵,P1.1口接K2按鍵,P1.2日接K3按鍵,P1.3口接K4按鍵,P2.0口接RS口, P2.1口接RW口, P2.2口接B口,P2.3口接發光二極管D2陽極,P2.4口接發光二極管D1陽極,P2.5口接電阻R3,P3口的8個口依飲和LCD的數據口D0~D7。
LMO16L 液晶模塊采用HD44780控制器。HD44780 具有簡單面功能較強的指令集,可以實現字符移動、閃爍等功能。UMOLEL 與單片機MOU Micrcontroller Unit)通訊可采用8位或者4位并行傳輸兩種方式。H44780控制器由兩個8位寄存器、指令寄存器( IR)和數據寄存器(DR)、忙標志(FP)、顯示數據RMDDRM)、字符發生器ROM (OCROM)、字符發生器RAM (CGRAM)、地址計數器(AC)。IR用于寄存指令碼,只能寫入不能讀出: DR用于寄存數據,數據由內部操作自動寫入CORAM和CORAM或者暫存從LCRAM和CRAM讀出的數據。BF為1時,液晶模塊處干內部處理模式,不響應外部操作指令和接受效據。DDRAM 用來存儲顯示的字符,能存儲80個字符碼。OGROM由8位字符碼生成5*7點陣字符160種和5*10點陣字符32種,8位字符編碼和字符的對應關系,可以查看參考文獻[3]中的表4.CGRAM是為用戶編寫特殊字符留用的,它的容量僅64字節。可以自定義8個547點陣字符或者4個5*10點陣字符。AC可以存儲ORA和OGRM的地址,如果地址碼隨指令寫入IR.則IR自動把地址碼裝入AC. 同時選擇LORAM或者CGRM單元。UMO16L 液晶模塊的引腳功能見表:
第1腳,VsS為地電源。
第2腳: V0DD換5V正電源。
第3腳: VL為液晶顯示器對比度調整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產生“鬼影”,使用時可以通過一個10K的電位器調整對比度。
第4腳,RS為寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器。
第5腳,R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和R/W共同為低電平時可以寫入指令或者顯示地址,當RS為低電平R/W為高電平時可以讀忙信號,當RS為高電平R/W為低電平時可以寫入數據。
第6腳: B端為使能端,當已端由高電平跳變成低電平時,液品模塊執行命令。
第7~14腳,00~D07為8位雙向數據線。
將reepack-8的1口接電源,2"8口順序和P3口相連接,并和LCD的數據口D1D7相接,VSS接地,VID接電源,VEE接滑動變阻器,RS口接P2.0口,RW口接P2 .1口,B口接P2.2口。
2.2外圍電路
(1)獨立式鍵盤的接口電路。在單片機應用系統中,有時只需要幾個簡單的按鍵向系統輸入信息。這時,可將每個按鍵接在一根1/0接口線上,這種方式的連接稱為獨立式鍵盤。每個獨立式按鍵單獨占有一根I/0接口線,每根I/O接口線的工作狀態不會影響到其他I/接口線 。這種按鍵接口電路配置靈活,硬件結構簡單,但每個按鍵必須占用一根I/0接口線,I/0 接口線浪費較大。故只在按鍵數量不多時采用這種按鍵電路。在此電路中,按鍵輸入都采用低電平有效。上拉電阻保證了按鍵斷開時,I/0 接口線有確定的高電平。當I/0接口內部有上拉電阻時,外電路可以不配置上拉電阻。
(2) 蜂鳴器:將蜂鳴器的一端電源,另一端接至晶閘管集電極,當需要鬧鐘響時,P2.5 將發出有規律的電平使得晶閘管導通,從而使得蜂鳴器發出聲響。
(3) respack-8:上拉電阻鍵K1~K4分別與單片機的P1.0~P1.3口相接。

3 軟件設計
可編程作息時間控制器軟件編程主要包括系統初始化、系統時間校正、系統時間設定、作息時間設定、響鈴處理、邏輯控制以及1602LCD液晶顯示,整個程序中響鈴的合理處理以及顯示部分是核心部分,只有處理好鬧鐘的及時響應才會使得整個可編程作息時間控制器按照預定的設計進行工作,同時各個模塊邏輯上合理分配又將是整個功能實現的基礎。
3.1各模塊子程序流程3.1.1系統初始化程序
bit K1=P1^0; sbit rw=P2^1;
sbit k2=P1^1; sbit leden=P2^2;
sbit K3=P1^2; sbit LED2=P2^3;
sbit K4=P1^3; sbit led=P2^4;
sbit rs=P2^0; sbit beep=P2^5;
TH0=(65536-50000)/256; TLO= (65536-50000)%256;
此段程序主要是是定義電路的外部接口,包括KI^K4按鍵,LCD的rs口、rwD、廣播控制端LBD2、發光二極管控制端led以及蜂嗚器控制端beep.將定時器0的工作模式選擇為工作方式1,同時給定時器裝初值,并且開始計數。
3.1.2系統時間校正程序: fen+t;
THo=(65536-50000)/256; if(fen==60)
TL0=(65536-50000)%256; {fen=0;
aa++ shi++;
if(aa==20) if(shi==24)
{aa=0; {shi=0;}
Miao++; mite_ sfm(9, shi);
if(miao==60) write_ sfm(12, fen);}}
{miao=0;
首先初始化時定時器開始工作,當計時時間到時進入中斷服務,由于方式1沒有自動裝初值的功能,因此需再次裝入初值,每一次所定的時間為50ms,通過軟件計數的方法,當計數達到20次時剛好1秒鐘,如果計數不到20次,則再次給定時器裝入初值,直到計數達到20次,把計數初值清零,并再次向計數器裝初值,重復執行之前操作,同時分加一,并顯示,如果分為60時則不顯示,先清零然后將時加一,再顯示分,如果時不是24時,則直接通過LCD顯示出來,如果時剛好為24時,則現需要清零,然后在用LCD顯示出來。
3.1.3系統時間設定程序:
if(K1==0) while(!K2);
while(!K1) fen++;
TRO=0; if(fen==60)
if (K1==0) fen=0;
shi++, if(K3==0)
if(shi==24) shi=0; TRO=1;
if (K2==0)
當K1被按下時,則修改系統的的時間,同時定時器停止工作。開始時,光標停留在分鐘上,當再次按下K1時,光標將會跳到小時并且小時位的時間將會加一,如果時位的數等于24時,則自動清零,從零開始再往上加,如果按下K2鍵按下則分鐘自動加一,如果分鐘達到60時則自動清零,從零開始往上加,并通過LCD顯示出此時的狀態。當按下K3鍵時,則退出系統時間的更改,并啟動定時器工作,開始通過LCD在第二行顯示出修改后的時間。此程序主要的作用就是通過人為的方法來設定系統的時間,使得系統時間滿足實際需要。
3.1.4作息時間設定程序
if (K3==0) if(shi2==24)
while(!K3); shi1=0;
write_ sfm(12, fen1); write_ sfm(9,shi1);
write_ sfm(9,shil); if(K2==0)
if(K2==0) {while(K2)
{write_ sfm(12, fen1); fen1++;
write sfm(9, shi1); if(fen1==60)
while(!K2); fen1=0,
write_ sfm(12, fen); write_ sfm(12, fen1),
write_ sfm(9, shi); if(K3==0)
if (K1==0) write_ sfm(12, fen);
while(!K1); write_ sfm(9, shi);
Shi1++,
由于可編程時間控制器是由四路鬧鐘構成的。所以只要通過邏輯上的先后順序便可以實現,并且這四路鬧鐘設定上都是相同的,因此在這里將四路鬧鐘選擇其中的第路做介紹。 當通過K4鍵進入鬧鐘設定電路后,如果處于廣播的鬧鐘時間設定時,此時如果沒有按下任何開關鍵,LCD將顯示此時的鬧鐘標志“GB”并且再其后面顯示現在的系統時間,在沒有按下K3鍵之前,如果按下K2鍵,則LCD將顯示此處鬧鐘時間,并且在其前面有此路標志,如“CB”,松開按鍵K2時,LCD將顯示之前的狀態,如果按下首次按下K3鍵,則開始修改鬧鐘的時間,此時光標在分鐘上閃爍,此時按下K2鍵則修改鬧鐘的分鐘,如果分等于60時,則自動清零,否則繼續往上加:如果按下K1鍵則修改鬧鐘的小時,如果小時數等于24,則自動清零,否則繼續往上加。當第二次按下K3鍵,則完成次鬧鐘的設定,并顯示之前的狀態,如果繼續按K4鍵則切換到下一路鬧鐘.也可以進行上述的操作,或者返回系統時間界面。
3.1.5 響鈴處理程序:
if((((fen=fen1)&&(shi==shi1))||(fene==fen2)&&(shi=shi2)||((fen=fen3)&&(shi==shi3))||((fen==fen4)&&(shi==shi4))&&(flag2==1))
if((fen==fen1)&&shi==shi1)&(flag2==1))
ifl((((fen=fen1)&&(shi=sh1)&&(flag2==0)||((fen-1==fen1)&&(shi==shi1)))&&(flag4==0))
if((fen==fen2)& &(shi==shi2)& (flag2==1))
if((((fen=fen2)&&(shi==shi2)&&(flag2==0))||(fen-1==fen2)&&(shi==sh2)))&&(flag4==0))
if( (fen==fen3) &&(shi==shi3)&&flag2==1))
if((((fen==fen3)&&(shi==shi3)&&(flag2==0))||((fen-1=fen3)&&(shi=shi3)))&&(flag4==0))
if( (fen=fen4)&&(shi==shi4)&&(flag2==1))
if((((fen=fen4)&&(shi==shi4)&&(flag2==0)||(fen-1==fen4)&&(shi==shi4))&& (flag4==0))
if(K4==0&&flag3==0)
當四個定時鬧鐘任意一路到達時,在沒有按下響鈴終止鍵K4時,flag2都等于1,此時鬧鐘響起,同時使得fla3等于0.在鬧鐘響鬧完一個周期后將繼續向下執行,并且根據以后程序的判定是哪一路鬧鐘在響鬧,執行這一路所要求的內容,但是不論哪一路時間到都會響鈴并且燈閃,不同的是根據判斷選擇出時間到的那一路并通過LCD顯示出來鬧鐘時間及某路鬧鐘:此時若按下K4鍵,則使得flag2等于0.當進行是否鬧鐘響鬧時將會不在響應,也就是鬧鐘被手動關閉,從而不需要一定要響鈴一分鐘后在關閉鬧鐘,實現手動關斷鬧鐘的功能。當鬧鐘關斷過后將及時跳出,并且使得LCD顯示當前的時間。使得可編程時間控制器能夠在響鈴時能夠顯示當前的鬧鈴及時間,同時可以手動關斷鬧鈴,并且當鬧鈴關斷過后可以跳出當前顯示返回到系統時間。
3.1.6邏輯控制while(1) {K4num++;
{if ((K4==0)&& (flag3==1)) if(K4num==5)
K4num=0; flag4=1;}
if(K4num==0) if (K4num==3)
{time() ; {xiake();
flag4=0; } flag4=1;}
if(K4num==1;) if (K4num==4)
{guangbo(); {dengkong() ;
flag4=1;} flag4=1;}
if(K4num==2) clock();}}
{shangke();
只有當沒有一路鬧鐘響鬧時才會執行此程序,因為在鬧鐘響鬧時K4鍵將會作為鬧鐘的停止的功能鍵使用,所以只有在沒有鬧鐘響鬧時,K4鍵才會早為鬧鐘的更換,同時變量K4num將作為K4鍵所處的鬧鐘或者系統時間區別出來,以實現邏輯上的合理。系統剛啟動時,按鍵K4處于系統時間狀態,在此狀態下可以利用之前所介紹的功能進行所需要的修改,當第一次按下K4鍵時,就會進入廣播定時的控制口,此時可以根據需要修改所要定的時間,并可以顯示自己所定的鬧鐘時間,再次按下K4鍵時,將會進入上課定時的鬧鐘,和之前的鬧鐘一樣,可以進行相同的操作,當再次按下K4鍵時將進入下課鬧鈴狀態,然后將要進入的的是燈光控制定時,此時Knum4為4,當再次按下K4鍵時,將經過判斷清零,重新開始,以此來實現按鍵K4可以更換鬧鐘的功能,同時更改鬧鐘時間的功能。
3.1.71602LC液晶顯示VSS引腳接地,VDD提供電源,VEE接滑動變阻器來控制液晶屏的對比度。RS為寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器。R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和R/W共同為低電平時可以寫入指令或者顯示地址,當RS為低電平RW為高電平時可以讀忙信號,當RS為高電平R/W為低電平時可以寫入數據。E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執行命令。
程序:
void write_ com (uchar com) void write_ date (uchar date)
{rs=0; {rs=1;
rw=0; rw=0;
lcden=0; lcden=0;
P3=com, P3=date;
lcden=1; lcden=1;
lc den=0; } lcden=0; }
當需要將內容顯示到LCD顯示器上之前,首先要向液晶顯示器輸入寫命令函數,有上硬件分析可以得到LCD液晶顯示上一排地址從80H'SFH,-共16位,下面一排地址從COH~CFH,同樣是16位,所以在進行液晶顯示之前首先確定要將結果在哪一位上顯示,然后在調用液晶寫數據函數,只有兩者結合使用才會得到想要的結果。
4心得通過此次的單片機課程設計讓我學到了許多新的知識,讓我受益匪淺,其中對1602LCD液晶顯示器有了非常深刻的認識。