版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
專業(yè)方向課程設(shè)計報告題目:智能電子鐘智能電子鐘一、設(shè)計要求制作一個LCD顯示的智能電子鐘:(1)計時:秒、分、時、日、月、年、星期。(2)閏年自動判別。(3)時間、年、月、日、星期交替顯示。(4)自定任意時刻自動開/關(guān)屏。(5)計時精度:誤差≤1秒/月〔具有微調(diào)設(shè)置〕。二、方案論證1.時鐘方案方案一:軟件時鐘??梢怨?jié)約硬件本錢,但是軟件編寫更為復(fù)雜,且誤差較大。方案二:硬件時鐘。使用時鐘芯片DS1302,雖然增加了硬件本錢,但可直接從芯片讀取時間及日期數(shù)據(jù),大大簡化軟件的編寫,且計時精度高,滿足設(shè)計要求。因此,本智能電子鐘采用硬件時鐘。2.軟件編程方案方案一:所有子程序均處于主程序中。雖然最終僅一個程序文件,但由于本智能電子鐘需用液晶顯示屏顯示且需根據(jù)不同按鍵狀態(tài)轉(zhuǎn)換至不同的功能,子程序較多,相應(yīng)程序的層次結(jié)構(gòu)也較復(fù)雜,假設(shè)采用該方案,不僅很大程度地加大了軟件編寫的難度,而且會使程序顯得復(fù)雜冗長,易讀性很差。方案二:監(jiān)控程序。將各種功能定義為多個任務(wù),用監(jiān)控程序進行任務(wù)調(diào)度的工作,主函數(shù)進行各種初始化、控制及調(diào)用子函數(shù)等工作,而各子函數(shù)那么完成相應(yīng)功能。該方案雖然要使用監(jiān)控程序并且最終會有多個源程序文件,但由于移植性很好,各種功能模塊定義清晰,表達了模塊化的思想,不僅降低了軟件編寫的難度,也增強了程序的易讀性。因此,本智能電子鐘采用監(jiān)控程序進行任務(wù)調(diào)度工作。3.按鍵方案方案一:一鍵一義型按鍵。每按下一個按鍵,就獲得一個鍵盤編碼信息,由鍵碼散轉(zhuǎn)到對應(yīng)功能模塊的入口,啟動對應(yīng)作業(yè)。該方案可使用以下三種方式獲取鍵值:=1\*GB3①單純查詢,主程序用掃描鍵盤等方式來獲取鍵盤信息,執(zhí)行對應(yīng)作業(yè)。=2\*GB3②鍵盤中斷,按下任何按鍵都引起一個外部中斷請求,鍵碼分析過程放在外部中斷子程序中。=3\*GB3③定時查詢,每隔一段時間查詢一次鍵盤,鍵盤查詢過程安排在定時中斷中完成。但由于一個按鍵只對應(yīng)一個功能,在實現(xiàn)功能較多的情況下,所需按鍵數(shù)較多,不僅會加大成品體積,不易操作,也會增加總的硬件本錢。方案二:一鍵多義型按鍵。不根據(jù)當前獲得的一個鍵碼來決定哪一個作業(yè)投入運行,而是根據(jù)一個按鍵操作系列來啟動一個作業(yè),同一按鍵在不同操作系列中有不同的含義。該方案所需按鍵較少,因此占用的端口數(shù)較少,并且減少了硬件本錢,成品體積也較小,雖然在一定程度上,增加了按鍵功能分配的難度,但綜合考慮,本智能電子鐘采用一鍵多義型按鍵。三、理論設(shè)計1.硬件系統(tǒng)1.1硬件原理圖1.2硬件總體框圖1.3工作原理以單片機為核心,結(jié)合軟件及硬件完成設(shè)計要求。在硬件上,時鐘芯片DS1302提供時間及日期數(shù)據(jù),LCD1602那么顯示時間、日期、鬧鐘等信息,鬧鐘鈴聲用蜂鳴器發(fā)出,而軟件上,主程序通過對各子程序的調(diào)用,初始化時鐘芯片、液晶顯示屏,接收時間、日期數(shù)據(jù),按鍵信息等,并輸出顯示信息及各種控制信息。2.軟件系統(tǒng)2.1軟件流程圖2.2監(jiān)控程序2.2OSIntSendSignal中斷中給指定任務(wù)發(fā)送信號,使指定任務(wù)就緒OSSendSignal任務(wù)中給指定任務(wù)發(fā)送信號,使指定任務(wù)就緒OSClearSignal去除指定任務(wù)信號,使指定任務(wù)休眠OSIntExit中斷退出處理函數(shù),在此進行中斷后的任務(wù)切換OSSched非中斷的任務(wù)切換函數(shù)OSTimeTick系統(tǒng)時鐘處理函數(shù),處理各個任務(wù)的延時OSWait系統(tǒng)等待函數(shù),任務(wù)調(diào)用此函數(shù)可以等待一定時間或信號2.2OSQCreate初始化消息隊列OSQPend等待消息隊列中的消息OSQAccept無等待從消息隊列中取得消息OSQIntPost中斷中FIFO方式發(fā)送消息OSQIntPostFront中斷中LIFO方式發(fā)送消息OSQPostFIFO方式發(fā)送消息OSQPostFrontLIFO方式發(fā)送消息OSQNMsgs取得消息隊列中消息數(shù)OSQSize取得消息隊列總?cè)萘縊SQFlush清空隊列2.2OSSemCreate初始化消息隊列OSSemPend等待一個信號量OSSemAccept無等待請求信號量OSSemIntPost中斷中發(fā)送一個信號量OSSemPost發(fā)送一個信號量OSSemQuery查詢信號量OS_CPU_C.COSIdle優(yōu)先級最低的任務(wù)OSStartSmallRTOS51初始化函數(shù),調(diào)用此函數(shù)后多任務(wù)開始運行,首先執(zhí)ID為0的任務(wù)OSTickISR系統(tǒng)時鐘中斷效勞函數(shù)OS_CPU_A.ASMLoadCtx任務(wù)環(huán)境恢復(fù)函數(shù)OSCtxSw任務(wù)主動放棄CPU環(huán)境保存函數(shù)C_OSCtxSw堆棧處理函數(shù)OSIntCtxSw中斷使任務(wù)放棄CPU環(huán)境保存函數(shù)2.2KeyInput鍵盤輸入效勞任務(wù)2.3子程序2.3#include"config.h"uint8xdataDS1302GetData[7];//秒、分、時、日、月、星期、年uint8xdataDS1302Temp0[9]={"23-59-50"};//秒、分、時uint8xdataDS1302Temp1[11]={"2012-01-01"};//年、月、日uint8xdataDS1302Week[4]={"Mon"};//星期voidDS1302WriteByte(uint8Data);uint8DS1302ReatByte();voidDS1302Write(uint8Addr,uint8Data);uint8DS1302Read(uint8Addr);uint8GetTime();voidDS1302Time();voidWriteTime(uint8Num,uint8Tdat);voidDS1302Init();2.3#include"config.h"voidDelay1602US();/*延時*/voidLCD1602SendComm(uint8Command);/*液晶顯示屏寫命令*/voidLCD1602SendData(uint8Data);/*液晶顯示屏寫數(shù)據(jù)*/voidLCD1602DispStr(uint8x,uint8y,char*Data);/*在lcd指定位置顯示一個字符串*/voidLCD1602Disp(uint8x,uint8y,charStr);/*在lcd指定位置顯示一個字符串*/voidLCD1602Clr(uint8y);/*去除lcd的指定行*/voidLCD1602Init(void);/*lcd初始化*/voidLCD1602LoadC(uint8Addr,uint8*Data,uint8NChar);/*從lcd指定地址處寫多個字節(jié)數(shù)據(jù)*/2.4主程序main.c#include"config.h"sbitled=P2^0;sbitSwitchOn=P2^1;uint8Flag0=0;/*時間閃爍標志*/uint8Flag1=0;/*時間閃爍暫存標志*/uint8Flag2=0;/*顯示數(shù)據(jù)標志*/uint8Flag3=0;/*鬧鐘暫存標志*/uint8Flag4=0;/*鬧鐘閃爍標志*/uint8Flag6=0;/*自定義開關(guān)屏閃爍標志*/uint8Flag7=0;/*自定義開關(guān)屏閃爍標志*/bitFlag5=0;/*秒表顯示標志*/bitFlag8=0;/*日期顯示標志*/bitAlarmSwitch0;/*鬧鐘開標志*/bitAlarmSwitch1;/*鬧鐘關(guān)標志*/bitFlag9=0;/*自動校時標志*/bitFlag10=0;/*自動校時標志*/bitFlag11=0;/*自定義開關(guān)屏標志*/bitFlag12=0;/*自定義開關(guān)屏標志*/uint8Ahour,Amin;/*鬧鐘變量*/uint8Shour,Smin;/*自定義開屏變量*/uint8Ehour,Emin=1;/*自定義關(guān)屏變量*/uint8Day1;/*自定義校時變量*/uint16Sec;/*秒表變量*/uint8xdataTemp3[]={"00-00"};/*鬧鐘數(shù)據(jù)顯示變量*/uint8xdataTemp4[]={"00-00"};/*秒表數(shù)據(jù)顯示變量*/uint8xdataTemp5[]={"00-00"};/*自定義開屏數(shù)據(jù)顯示變量*/uint8xdataTemp6[]={"00-00"};/*自定義關(guān)屏數(shù)據(jù)顯示變量*/uint8codeTemp1[]={31,29,31,30,31,30,31,31,30,31,30,31};/*閏年月份天數(shù)*/uint8codeTemp2[]={31,28,31,30,31,30,31,31,30,31,30,31};/*平年月份天數(shù)*/voidmain(){ TMOD=0x11; ET0=1; ET1=1;TR0=1; TH1=(65536-20000)/256; TL1=(65536-20000)%256; LCD1602Init(); DS1302Init(); OSStart();}voidTaskA();/*按鍵掃描并查找高優(yōu)先級任務(wù)*/voidTaskB();/*時間按鍵處理任務(wù)*/voidTaskC();/*日期按鍵處理任務(wù)*/voidTaskD();/*鬧鐘按鍵處理任務(wù)*/voidTaskE();/*秒表按鍵處理任務(wù)*/voidTaskF();/*自定義開關(guān)屏按鍵處理任務(wù)*/voidTaskG();/*液晶掃描及顯示處理任務(wù)*/voidTaskH();/*蜂鳴器處理任務(wù)*/voidTime1()interrupt3/*定時10毫秒*、{ TH1=(65536-20000)/256; TL1=(65536-20000)%256; if(++Sec>=10000) { Sec=0; } Temp4[4]=Sec%10+0x30; Temp4[3]=Sec/10%10+0x30; Temp4[1]=Sec/100%10+0x30; Temp4[0]=Sec/1000%10+0x30; //OSLCD1602DispStr(6,2,Temp4);}voidAlarm();/*鬧鐘顯示計時*、{ Temp3[4]=Amin%10+0x30; Temp3[3]=Amin/10+0x30; Temp3[1]=Ahour%10+0x30; Temp3[0]=Ahour/10+0x30;}voidFlash()/*時間位標志*/{ switch(Flag0) { case1:OSLCD1602DispStr(8,1,"");break; case2:OSLCD1602DispStr(5,1,"");break; case3:OSLCD1602DispStr(13,1,"");break; case4:OSLCD1602DispStr(10,1,"");break; case5:OSLCD1602DispStr(7,1,"");break; case6:OSLCD1602DispStr(2,1,"");break; default:break; }}voidAlarmFlash()/*鬧鐘閃爍*/{ switch(Flag4) { case1:OSLCD1602DispStr(9,1,"");break; case2:OSLCD1602DispStr(6,1,"");break; default:break; }}voidSwitchFlash()/*自定義開關(guān)屏*/{ switch(Flag7) { case1:OSLCD1602DispStr(9,1,"");break; case2:OSLCD1602DispStr(6,1,"");break; case3:OSLCD1602DispStr(9,2,"");break; case4:OSLCD1602DispStr(6,2,"");break; default:break; }}voidTimeCompare()/*時間與鬧鐘時間及自定義開關(guān)屏時間比擬*/{ if((DS1302GetData[2]==Shour)&&(DS1302GetData[1]==Smin)&&Flag11) { led=1; Flag11=0; OSLCD1602Clr(1); OSLCD1602Clr(2); OSLCD1602DispStr(2,1,"YuLilingshikeshuichong"); } if((DS1302GetData[2]==Ehour)&&(DS1302GetData[1]==Emin)&&Flag12) { led=0; Flag12=0; OSLCD1602Clr(1); OSLCD1602Clr(2); } if((DS1302GetData[2]==Ahour)&&(DS1302GetData[1]==Amin)&&AlarmSwitch0) { AlarmSwitch1=1; Flag9=1; } else { AlarmSwitch1=0; SwitchOn=1; } if(((DS1302GetData[1]-Amin)%5==0)&&AlarmSwitch0&&Flag9) { AlarmSwitch1=1; } if(!AlarmSwitch0) { Flag9=0; } if((DS1302GetData[2]==23)&&(DS1302GetData[1]==59)&&(DS1302GetData[0]==59)&&Flag10) { DS1302GetData[0]=DS1302GetData[0]-1; //時間校準 WriteTime(0,DS1302GetData[0]); Flag10=0; } if(DS1302GetData[3]!=Day1) { Flag10=1; } Day1=DS1302GetData[3];}四、電路仿真及仿真結(jié)果分析1.仿真電路圖2.仿真過程及結(jié)果分析將生成的HEX文件加載至單片機中,然后啟動仿真。由于對液晶顯示屏進行仿真要進行忙狀態(tài)檢測,但該仿真軟件無該檢測機制,所以需對程序進行相應(yīng)修改,然后即可看見仿真結(jié)果。五、測試方案與測試結(jié)果連接計算機并下載相應(yīng)程序,進行實際的硬件功能
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版六年級數(shù)學上冊第8單元測試題
- 激光切割機作業(yè)指導(dǎo)書
- 預(yù)防校園欺凌主題班會教案-模板
- 2025年河南省對口升學考綱英語常用短語及重點詞匯
- 比的意義練習題
- 人教版新目標七年級英語上冊unit8單元教案
- 中建總公司《項目管理手冊》版印刷版
- 小學三年級閱讀理解訓(xùn)練
- 小學生課外自主閱讀習慣培養(yǎng)策略
- 影視制作項目執(zhí)行流程及案例
- 胖東來經(jīng)營數(shù)據(jù)全公開管理辦法
- 國企內(nèi)審面試題目及答案
- 瑞幸食品安全培訓(xùn)題庫課件
- 腰果介紹教學課件
- 豬肉進銷存表格-模板
- 中考微機題型
- 仇永鋒一針鎮(zhèn)痛課件
- 中小學校食堂建設(shè)配置標準(試行)
- 網(wǎng)絡(luò)安全風險自查表與整改措施清單
- 2025年歷年水利部面試真題及答案解析
- 郭春林-企業(yè)發(fā)展與戰(zhàn)略管理課件
評論
0/150
提交評論