單片機課程設(shè)計報告,基于51單片機的電子密碼鎖設(shè)計開題報告
本文選題:51系列單片機設(shè)計實例 + 單片機課程設(shè)計總結(jié)
單片機課程設(shè)計報告,基于51單片機的電子密碼鎖設(shè)計開題報告
時間: 2017-03-25 欄目: <mip-link >單片機課程設(shè)計小結(jié)
一 > 基于51單片機的電子密碼鎖設(shè)計開題報告
基于單片機的電子密碼鎖設(shè)計開題報告
一、畢業(yè)論文代寫課題背景和意義
在日常的生活和工作中, 住宅與部門的安全防范、單位的文件檔案、財務(wù)報表以及一些個人資料的保存多以加鎖的辦法來解決。[)若使用傳統(tǒng)的機械式鑰匙開鎖,人們常需攜帶多把鑰匙, 使用極不方便, 且鑰匙丟失后安全性即大打折扣。隨著科學(xué)技術(shù)的不斷發(fā)展,人們對日常生活中的安全保險的要求越來越高。為滿足人們對鎖的使用要求,增加其安全性,用密碼代替鑰匙的密碼鎖應(yīng)運而生。密碼鎖具有安全性高、成本低、功耗低、易操作等優(yōu)點。
在安全技術(shù)防范領(lǐng)域,具有防盜報警功能的電子密碼鎖逐漸代替?zhèn)鹘y(tǒng)的機械式密碼鎖,克服了機械式密碼鎖密碼量少、安全性能差的缺點,使密碼鎖無論在技術(shù)上還是在性能上都獲得了大大的提高。隨著大規(guī)模集成電路技術(shù)的發(fā)展,特別是單片機的問世,出現(xiàn)了帶微處理器的智能密碼鎖,它除具有電子密碼鎖的功能外,還引入了智能化管理、專家分析系統(tǒng)等功能,從而使密碼鎖具有很高的安全性、可靠性,應(yīng)用日益廣泛。
隨著人們對安全的重視和科技的發(fā)展,許多電子智能鎖(指紋識別、IC卡辨認(rèn))已在國內(nèi)外相繼面世。但是這些產(chǎn)品的特點是針對特定的指紋和有效卡,只能適用于保密要求的箱、柜、門等。而且指紋識識別器若在公共場所使用存在容易機械損壞,IC卡還存在容易丟失、損壞等缺點,再加上其成本較高,一定程度上限制了這類產(chǎn)品的普及和推廣。鑒于目前的技術(shù)水平與市場的接受程度,電子密碼鎖是這類電子防盜產(chǎn)品的主流。
二、畢業(yè)論文代寫課題任務(wù)的主要內(nèi)容
根據(jù)設(shè)定好的密碼,采用4×4鍵盤實現(xiàn)密碼的輸入功能,當(dāng)密碼輸入正確之后,鎖就打開,如果輸入的密碼不正確,就鎖定按鍵3秒鐘,同時發(fā)出報警聲。
(1)單片機型號可選AT89C51。
(2)6位密碼的設(shè)定在程序中完成。
(3)密碼的輸入采用4×4鍵盤實現(xiàn),輸入6位數(shù)字后,按回車鍵結(jié)束。
(4)若輸入的密碼正確,鎖打開,同時用發(fā)光二極管亮1秒作為提示。
(5)報警可采用蜂鳴器或揚聲器。
三、畢業(yè)論文代寫已具備條件
應(yīng)用電子技術(shù)專業(yè)的畢業(yè)生已完成電子線路、數(shù)字電路基礎(chǔ)、單片機原理、單片機應(yīng)用系統(tǒng)設(shè)計等課程的學(xué)習(xí),并通過實踐課的教學(xué)達(dá)到相應(yīng)的電路設(shè)計、軟件編程等能力目標(biāo)。
四、設(shè)計思路與方案
1.系統(tǒng)框圖
2. 組成部分
電子密碼鎖的設(shè)計主要由三部分組成:4×4矩陣鍵盤接口電路、顯示電路、報警電路。
(1)4×4矩陣鍵盤接口電路:設(shè)置6位密碼,通過鍵盤輸入密碼,若密碼正確,則鎖就打
密碼鎖設(shè)計 基于51單片機的電子密碼鎖設(shè)計開題報告
開。(]密碼可以由用戶自己在程序中修改設(shè)定(只支持6位密碼)。
(2)顯示電路:當(dāng)密碼輸入時,按下一個數(shù)字鍵, 一個“-”就顯示在最右邊的數(shù)碼管上,同時將先前輸入的所有“-”向左移動一位。
(3)報警電路:由蜂鳴器和一個發(fā)光二極管組成。當(dāng)密碼輸入正確時,發(fā)光二極管亮1秒鐘。若密碼輸入錯誤,則蜂鳴器發(fā)出報警聲提示,同時鍵盤鎖定3秒鐘。
3.設(shè)計的關(guān)鍵問題
電子密碼鎖設(shè)計的關(guān)鍵問題是實現(xiàn)密碼的輸入、清除、確認(rèn)等功能:
(1) 密碼輸入功能:按下一個數(shù)字鍵,一個“-”就顯示在最右邊的數(shù)碼管上,同時將先前輸入的所有“-”向左移動一位。
(2)清除功能:當(dāng)按下清除鍵時,清除前面輸入的所有值,并清除所有顯示。
(3)確認(rèn)功能:當(dāng)按下確認(rèn)鍵,系統(tǒng)將輸入的密碼與內(nèi)設(shè)密碼進(jìn)行檢查核對,如果正確,鎖打開,否則不打開。
五、預(yù)期目標(biāo)
完成基于單片機設(shè)計的電子密碼鎖的論文。
六、畢業(yè)論文代寫進(jìn)度安排
1.2008年11月1日——11月7日:下達(dá)畢業(yè)設(shè)計任務(wù)書。
2.2008年11月8日——11月21日:撰寫開題報告。
3.2008年11月22日——11月25日:畢業(yè)設(shè)計初期檢查。
4.2008年11月26日——12月31日:完成相關(guān)參考文獻(xiàn)查閱、資料查找,設(shè)計電路原理圖,購買元器件,進(jìn)行硬件設(shè)計與軟件設(shè)計,開始實物安裝、調(diào)試。
5.2009年1月4日——1月9日:畢業(yè)設(shè)計中期檢查。
6.2009年1月10日——1月15日:學(xué)習(xí)論文的撰寫規(guī)范,并確定撰寫方案。
7.2009年1月16日——5月15日:頂崗實習(xí),并且完成畢業(yè)論文,畢業(yè)設(shè)計后期檢查。
8.2009年5月16日——5月18日:上交畢業(yè)論文、實物、畢業(yè)頂崗材料。
二 > 51單片機電子時鐘課程設(shè)計報告
<mip-img src="http://p.cuntuba520.net/cpic/3e/62/5ebaaf255ecd810c06e5732ea1d9623e.jpg">
第一部分 設(shè)計任務(wù)和要求
1.1 單片機課程設(shè)計內(nèi)容
利用STC89C51單片機和LCD1602電子顯示屏實現(xiàn)電子時鐘,可由按鍵進(jìn)行調(diào)時和12/24小時切換。()
1.2 單片機課程設(shè)計要求
1.能實現(xiàn)年、月、日、星期、時、分、秒的顯示;
2.能實現(xiàn)調(diào)時功能;
3.能實現(xiàn)12/24小時制切換;
4.能實現(xiàn)8:00—22:00整點報時功能。
1.3 系統(tǒng)運行流程
程序首先進(jìn)行初始化,在主程序的循環(huán)程序中首先調(diào)用數(shù)據(jù)處理程序,然后調(diào)用顯示程序,在判斷是否有按鍵按下。若有按鍵按下則轉(zhuǎn)到相應(yīng)的功能程序執(zhí)行,沒有按鍵按下則調(diào)用時間程序。若沒到則循環(huán)執(zhí)行。計時中斷服務(wù)程序完成秒的計時及向分鐘、小時的進(jìn)位和星期、年、月、日的進(jìn)位。調(diào)時閃爍中斷服務(wù)程序用于被調(diào)單元的閃爍顯示。調(diào)時程序用于調(diào)整分鐘、小時、星期、日、月、年,主要由主函數(shù)組成通過對相關(guān)子程序的調(diào)用,如圖所示。實現(xiàn)了對時間的設(shè)置和修改、LCD顯示數(shù)值等主要功能。相關(guān)的調(diào)整是靠對功能鍵的判斷來實現(xiàn)的。
第二部分 設(shè)計方案
2.1 總體設(shè)計方案說明
1.程序設(shè)計及調(diào)試
根據(jù)單片機課程設(shè)計內(nèi)容和要求,完成Protues仿真電路的設(shè)計和用Keil軟件編寫程序,并進(jìn)行仿真模擬調(diào)試。
2.硬件焊接及調(diào)試
根據(jù)仿真電路圖完成電路板的焊接,并進(jìn)行軟、硬件的調(diào)試,只到達(dá)到預(yù)期目的。
單片機課程設(shè)計總結(jié) 51單片機電子時鐘課程設(shè)計報告
單片機課程設(shè)計報告
3.后期處理
對設(shè)計過程進(jìn)行總結(jié),完成設(shè)計報告。(]
2.2 單片機系統(tǒng)方框圖
2.2 單片機系統(tǒng)流程圖
主流程圖
鍵盤掃描流程圖
1
單片機課程設(shè)計總結(jié) 51單片機電子時鐘課程設(shè)計報告
單片機課程設(shè)計報告
時鐘流程圖
第三部分 主要器件及簡介
3.1 主要器件
1. STC89C51單片機;
2.LCD1602液晶顯示屏;
3.2 主要器件簡介
1.STC89C51單片機簡介
STC89C51是采用8051核的ISP(In System
Programming)在系統(tǒng)可編程芯片,最高工作時鐘頻率
為80MHz,片內(nèi)含8K Bytes的可反復(fù)擦寫1000次的
Flash只讀程序存儲器,器件兼容標(biāo)準(zhǔn)MCS-51指令系
統(tǒng)及80C51引腳結(jié)構(gòu),芯片內(nèi)集成了通用8位中央處理器和ISP Flash存儲單元,具有在系統(tǒng)可編程(ISP)特性,配合PC端的控制程序即可將用戶的程序代碼下載進(jìn)單片機內(nèi)部,省去了購買通用編程器,而且速度更快。[]
2.LCD1602液晶顯示屏簡介
2
單片機課程設(shè)計總結(jié) 51單片機電子時鐘課程設(shè)計報告
單片機課程設(shè)計報告
LCD1602可以顯示2行16個字符,有8位數(shù)據(jù)總線D0—D7,和RS、R/W、EN三個控制端口,工作電壓為5V,并且?guī)в凶址麑Ρ榷日{(diào)節(jié)和背光。[)
LCD1602引腳說明如下表所示:
LCD液晶顯示器各引腳功能及結(jié)構(gòu)
VDD:電源正極,4.5V—5.5V,通常使用5V電壓;
VL:LCD對比度調(diào)節(jié)端,電壓調(diào)節(jié)范圍為0—5V。接正極時對比度最弱,接地電源時對比度最高,但對比度過高會產(chǎn)生“鬼影”,因此通常使用一個10K的電位器來調(diào)整對比度,或者直接串接一個電阻到地;
RS:MCU寫入數(shù)據(jù)或者指令選擇端。MCU要寫入指令時,使RS為低電平;MCU要寫入數(shù)據(jù)時,使RS為高電平;
R/W:讀寫控制端。R/W為高電平時,讀取數(shù)據(jù);R/W為低電平時,寫入數(shù)據(jù); EN:LCD模塊使能信號控制端。寫數(shù)據(jù)時,需要下降沿觸發(fā)模塊。
D0—D7:8為數(shù)據(jù)總線,三態(tài)雙向。如果MCU的I/O口資源緊張的話,該模塊也可以只使用4位數(shù)據(jù)線D4—D7接口傳送數(shù)據(jù)。
A:LED背光正極。需要背光時, A串接一個限流電阻接VDD, K接地。 K:LED背光地端。
3
單片機課程設(shè)計總結(jié) 51單片機電子時鐘課程設(shè)計報告
單片機課程設(shè)計報告
第四部分 系統(tǒng)硬件設(shè)計
4.1 最小系統(tǒng)
復(fù)位時單片機的初始化操作,只要給RST
引腳加上兩個機器周期以上的高電平信號,就
可以使STC89C51單片機復(fù)位。(]本次采用的是
12M晶振,按鈕復(fù)位電路。
4.2 LCD顯示電路
LCD顯示屏的D0到D7與單片機P0口相連,LCD顯示屏EN口與單片機P3.4口相連,RS與P3.5相連。通過滑動變阻器改變LCD顯示屏的顯示對比度。
4
單片機課程設(shè)計總結(jié) 51單片機電子時鐘課程設(shè)計報告
單片機課程設(shè)計報告
4.3 鍵盤輸入電路
本次設(shè)計采用獨立鍵盤,鍵盤按下時,相應(yīng)的I/O口電平由高變低,一次檢測按鍵是否被按下。[]4個獨立按鍵與單片機P3.0—P3.3口相連。
4.3 蜂鳴器和LED燈電路
蜂鳴器的作用為準(zhǔn)點報時產(chǎn)生報警聲,LED在秒鐘為偶數(shù)時或者功能鍵被按下時亮。蜂鳴器與單片機P2.2口相連,LED燈與單片機P2.3口相連。
5
單片機課程設(shè)計總結(jié) 51單片機電子時鐘課程設(shè)計報告
單片機課程設(shè)計報告
第五部分 仿真電路圖與仿真結(jié)果
用Keil和Protues進(jìn)行仿真調(diào)試,仿真結(jié)果完全達(dá)到預(yù)期目的。[]
第六部分 課程設(shè)計總結(jié)
本次單片機課程設(shè)計,在我和我的搭檔陳雅琴默契配合,以及鄒老師的指導(dǎo)和同學(xué)的幫助下順利完成了。在設(shè)計過程中,從仿真電路的設(shè)計,源程序的書寫和修改以及實物電路的焊接中都遇到了不少問題,但在我們的共同努力下解決了,并且從中學(xué)到了不少知識。我們在設(shè)計過程中還不斷提出自己的疑點以及新的想法,聯(lián)系實際應(yīng)用,將課本上學(xué)習(xí)的東西運用到實際中,這些都令我們受益匪淺。
課程設(shè)計需要很大的耐心,尤其是遇到困難的時候,這也是對我們的考驗。在設(shè)計過程中,我們遇到問題不是感到急躁,而是耐心地尋找解決的辦法,與老師、同學(xué)進(jìn)行交流討論,尋求最佳的解決辦法。
6
單片機課程設(shè)計總結(jié) 51單片機電子時鐘課程設(shè)計報告
單片機課程設(shè)計報告
總之,在此次的課程設(shè)計中,我們不僅動手、動腦,也學(xué)會了不少東西,同時,謝謝對我們的設(shè)計帶來建議、意見和幫助的老師和同學(xué)們!謝謝!
<mip-img src="http://p.cuntuba520.net/cpic/3e/62/5ebaaf255ecd810c06e5732ea1d9623e.jpg">
第七部分 參考文獻(xiàn)
[1]張毅剛。[)單片機原理及應(yīng)用(第二版)。北京:高等教育出版社。2004
[2]郭天祥。新概念51單片機C語言教程.北京:電子工業(yè)出版社。2007
[3]楊欣.電子設(shè)計從零開始.北京:清華大學(xué)出版社,2005
附錄A 實物圖
目的:
通過課程設(shè)計,主要達(dá)到以下目的:
1、使學(xué)生增進(jìn)對單片機的感性認(rèn)識,加深對單片機理論方面的理解。
2、使學(xué)生掌握單片機的內(nèi)部功能模塊的應(yīng)用,如定時器/計數(shù)器、中斷、片內(nèi)外存貯器、I/O口、串行口通訊等。
3、使學(xué)生了解和掌握單片機應(yīng)用系統(tǒng)的軟硬件設(shè)計過程、方法及實現(xiàn),為以后設(shè)計和實現(xiàn)單片機應(yīng)用系統(tǒng)打下良好基礎(chǔ)。
7
單片機課程設(shè)計總結(jié) 51單片機電子時鐘課程設(shè)計報告
單片機課程設(shè)計報告
void init() /*初始化函數(shù)*/
{
write_cod(0x38); /*1602液晶工作狀態(tài)定義*/ write_cod(0x0c);
write_cod(0x06);
write_cod(0x01);
TMOD=0x01; //定時器工作在方式1 ,16位 TH0=(65536-50000)/256; //50ms
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void write_cod(uchar num) /*1602寫指令函數(shù)*/ {
E=0;
RS=0;
RW=0;
P0=num;
delay(5);
E=1;
delay(5);
E=0;
}
void write_date(uchar date) /*1602寫數(shù)據(jù)函數(shù)*/ {
E=0;
RS=1;
RW=0;
P0=date;
delay(5);
E=1;
delay(5);
E=0;
}
void display(uchar add,uchar shu) /*顯示模塊 */ {
gao=shu/10;
di=shu%10;
write_cod(0x80+0x40+add); //0x40 第二行 +add
write_date(0x30+gao); //0x30 將數(shù)字轉(zhuǎn)換為字符 write_date(0x30+di);
}
8
三 > 《單片機課程設(shè)計》報告
機械與車輛學(xué)院
《單片機課程設(shè)計》報告
(2013-2014學(xué)年第一學(xué)期)
課程設(shè)計題目: 水塔水位控制系統(tǒng)
姓名:
學(xué)號:
班級:
指導(dǎo)老師: 職稱:
時間:
成績:
《單片機課程設(shè)計》考查評分表
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063K01Y8_1.jpg">
2
目錄
一、課程設(shè)計性質(zhì)和目的 ................................................................ 4
二、課程設(shè)計的內(nèi)容及要求 ............................................................ 4
1、硬件設(shè)計 ...................................................................................... 4
2、軟件設(shè)計 ...................................................................................... 5
3、功能要求: .................................................................................. 5
三、課程設(shè)計的進(jìn)度及安排 ............................................................ 5
四、設(shè)計所需設(shè)備及材料 ................................................................ 6
五、設(shè)計思路及原理分析 ................................................................ 7
六、流程圖及程序編寫 .................................................................... 7
(1)根據(jù)功能要求畫出控制程序流程圖。 .................................. 8
(2)根據(jù)控制程序流程圖編寫C51程序 ..................................... 8
七、調(diào)試運行 .................................................................................. 10
1、軟件測試: ................................................................................ 10
2、硬件測試: ................................................................................ 11
八、結(jié)果及分析 .............................................................................. 12
九、心得體會 .................................................................................. 13
十、參考文獻(xiàn) .................................................................................. 14
十一、致謝 ...................................................................................... 14
十二、附錄 ...................................................................................... 15
【1】整流器protel防真原理圖:................................................. 15
【2】數(shù)字時鐘 ................................................................................ 16
3
一、課程設(shè)計性質(zhì)和目的
單片機課程設(shè)計是《單片機原理與接口技術(shù)》課程與實驗結(jié)束后的一門綜合性實踐課。設(shè)計一種基于單片機水塔水位檢測控制系統(tǒng)。該系統(tǒng)能實現(xiàn)水位檢測、電機故障檢測、處理和報警等功能,實現(xiàn)超高、低警戒水位報警,超高警戒水位處理。介紹電路接口原理圖,給出相應(yīng)的軟件設(shè)計流程圖和匯編程序,并用
Proteus軟件仿真。所選題目《水塔水位控制》緊密結(jié)合所學(xué)的主要內(nèi)容,加深鞏固所學(xué)知識,同時對所學(xué)內(nèi)容進(jìn)行擴(kuò)展,有一定的深度和廣度,能充分發(fā)揮學(xué)生的能動性和想象力。通過電路設(shè)計、安裝、調(diào)試等一系列環(huán)節(jié)的實施,提高學(xué)生的單片機應(yīng)用系統(tǒng)的設(shè)計能力。
相信本次的設(shè)計一定能夠給老百姓的生活帶來方便,也一定會具有廣闊的市場前景,一定能夠使我們電子設(shè)計能力得到很好的鍛煉,使我們的理論和現(xiàn)實生活聯(lián)系起來!
二、課程設(shè)計的內(nèi)容及要求
1、硬件設(shè)計
(1)用80C51設(shè)計一個單片機最小控制系統(tǒng)。其中P1.0接水位下限傳感器,P1.1接水位上限傳感器,P1.2輸出經(jīng)三極管和電阻后接光電耦合器,通過繼電器控制水泵,P1.3輸出接LED,當(dāng)出現(xiàn)故障時LED閃爍;當(dāng)出現(xiàn)故障時報警。
(2)用塑料尺、導(dǎo)線等設(shè)計一個水塔水位傳感器。其中A電級置于水位10CM處,接5V電源的正極,B級置于水位15CM處,經(jīng)4.7K下拉電阻接單片機的P1.0口,C電級置于水位的20CM處,經(jīng)4.7K下拉電阻接單片機的P1.2口。
(3)設(shè)計一個單片機至水泵的控制電路。要求單片機與水泵之間用反相器、光電耦合器和繼電器控制,計算出LED限流電阻,接好繼電器的續(xù)流二極管。
4
2、軟件設(shè)計
(1)根據(jù)功能要求畫出控制程序流程圖。 (2)根據(jù)控制程序流程圖編寫C51程序
3、功能要求:
(1)水塔水位下降至下限水位時,啟動水泵,水塔水位上升至上限水位則關(guān)閉水泵。
(2)水塔水位在上、下限水位之間時,水泵保持原狀態(tài)。 (3)供水系統(tǒng)出現(xiàn)故障時,自動報警。
表1 水塔水位信號狀態(tài)表
<mip-img src="http://p.cuntuba520.net/cpic/32/08/53931148b7495ea2cd1f2a8e7f1a0832.jpg">
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063P3V14_0.jpg">
三、課程設(shè)計的進(jìn)度及安排
5
四、設(shè)計所需設(shè)備及材料
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063Kc460_0.jpg">
6
<mip-img src="http://p.cuntuba520.net/cpic/04/81/05656a95254010d2eb57f50c8eb58104.jpg">
五、設(shè)計思路及原理分析
水塔水位控制原理圖見圖1,圖中兩條虛線表示正常工作情況下水位升降的上下限,在正常供水時,水位應(yīng)控制在兩條虛線代表的水位之間。B測量水位下限,C測量水位上限,A接+5V,B、C接地。
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063K452W_0.jpg">
圖1 水塔水位檢測原理圖
水塔無水或水位低于下限水位時,B、C為斷開,B、C兩點電位為零(低電平“0” ),需要水泵供水,單片機輸出低電平,控制電機工作供水。水位上升到B點,B接通,B點電位變?yōu)楦唠娖健?”,C開關(guān)仍斷開,C點仍為低電平,維持現(xiàn)狀水泵繼續(xù)供水。當(dāng)水位上升到C點時,C接通。這時B、C均接通,B、C兩點都為高電平,表示水塔水位已滿,需水泵停止供水,單片機輸出高電平,電機斷電停止供水。水塔水位開始下降,水位在降到B點之前,B點電位為高、C點電位為低,單片機輸出控制電平維持不變,仍為高。當(dāng)水位降到B點以下,
B、C兩點電平都為低時,單片機輸出控制電平又變低,水泵供水。
六、流程圖及程序編寫
<mip-img src="http://p.cuntuba520.net/cpic/7a/37/4b252a0989b84930fba6a67b28d0377a.jpg">
7
(1)根據(jù)功能要求畫出控制程序流程圖。
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063J55E3_0.jpg">
(2)根據(jù)控制程序流程圖編寫C51程序
#include<reg51.h>
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
void delay0_2s(){
unsigned char i;
TMOD=0x01;
for(i=0;i<4;i++){
TH1=0x3C; 8
TL1=0xB0; TR1=1;
while(!TF1); TF1=0;
}
}
void delay_1s(){ unsigned char i; for(i=0;i<5;i++){ delay0_2s(); }
}
void main(){
P1=0xf0;
while(1){
P1_3=0;
if(P1_0==0)//B {
if(P1_1==0)//C {
P1_2=0; delay_1s(); }
else
{ P1_2=1;//電機 P1_3=1; delay0_2s(); P1_4=1; delay_1s(); }
}
else
{
9
} }} if(P1_1==1){//C } else delay_1s(); P1_2=1; delay_1s();
七、調(diào)試運行
1、軟件測試:
運用Protul軟件進(jìn)行仿真檢驗。在元件庫中找到所需要的元器件,把它們按照原理圖的構(gòu)想依次連接起來,反復(fù)檢查線路會不會出錯。待畫完圖,就可以開始仿真電路圖了。給單片機導(dǎo)入預(yù)先編程好的程序“.hex”文件,點擊仿真。仿真圖可以運行,但是電機在B,C都為低電平的情況下沒有運轉(zhuǎn)。說明電路有部分地方短路或者斷路了,觀察仿真圖中的電位情況也許可以找到問題的所在。經(jīng)過多次的檢查發(fā)現(xiàn),各點的電位并沒有像想象中的那樣有什么不妥,F(xiàn)在就要搞清楚仿真中的元器件的所有主要參數(shù)是否和實際的參數(shù)相符合。查看資料,對于繼電器,它本身的線圈電阻是在400歐左右,在查看仿真中的元器件的參數(shù),不難發(fā)現(xiàn)原始數(shù)據(jù)和實際相差很大,它給的是理想線圈,也就是沒有內(nèi)阻。這樣就如預(yù)期的那樣找到電機不轉(zhuǎn)的原因了。原始數(shù)據(jù)沒有進(jìn)行改變;查找資料,得知光電耦合器的發(fā)光二極管的壓降為1.15~1.5v,最大電流為60mA,電流傳輸比CTR為20~70%。通過已知的條件求出每條線路上所需要的電阻大小。對各各元器件的初參數(shù)設(shè)置完畢,啟動仿真,整體像想象中的那樣正常工作!軟件仿真結(jié)束,仿真圖里的數(shù)值引用到實際電路的焊接中。
10
2、硬件測試:
焊接完整體的板件,開始測試板子電路是否能夠完成所需要的功能。應(yīng)為電路的原版是根據(jù)仿真電路出來的,所以不一定能夠一次性就完成設(shè)計。 對于板子上的器件來說,有兩個是特別容易燒掉的,PNP三極管和4N25光電耦合器。因為它們的工作電壓較低和工作電流很小,所以要特別的注意。雖然已經(jīng)給了足夠的保護(hù)還是不能太掉以輕心要是燒了就沒有其他器件可以換了。
首先,測試光電耦左邊能否正常工作。把三極管的B極接于低電平,給予E極高電平,測試兩管腳之間的電壓降是多少。經(jīng)測試三極管正常工作,可是光電耦合器的1,2管腳的電壓異常偏高。斷去電源,用萬用表的測試端測試1,2管腳是否擊穿,發(fā)現(xiàn)并沒有完全短路,有可能是封裝的時候沒有裝好。
其次,測試光電耦合器右端是否能正常工作。給繼電器加上12v的電壓, 用導(dǎo)線短接光電耦合器的4,5號管腳,繼電器能發(fā)出啪啪聲,也就是說明光電耦合器右端能夠正常工作。
再次,對整塊板進(jìn)行調(diào)試。給光電耦合器兩邊電路都通上電,給三極管的B端輸入一個低電平,繼電器不工作。說明光電耦合器無法工作。應(yīng)當(dāng)更換光電耦合器;換完光電耦合器后的檢測。換完光電耦合器后進(jìn)行整塊板子的調(diào)試,給三極
11
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063H54104_1.jpg">
管B極一個低電平繼電器能夠工作。插到單片機上給一個周期性的低電平,繼電器能夠周期性的發(fā)出啪啪聲,整體調(diào)試通過
八、結(jié)果及分析
調(diào)試:
將光耦的第二引腳和第四引腳接地,PNP三極管的發(fā)射極接+5V電源。然后分別用光耦的第五引腳和+12V電源線接繼電器的線圈兩端,稍停片刻后,若能聽到吧嗒一聲,則證明光耦、繼電器能夠正常工作,然后進(jìn)行接銅片,用開發(fā)板防真,進(jìn)行水泵實驗,電路能夠?qū)崿F(xiàn)表一的真值表功能。
硬件電路如下:
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063I0VI_0.jpg">
12
九、心得體會
結(jié)束為期兩周的單片機課程設(shè)計,讓我加深了對單片機的理解,由單片機控制系統(tǒng)可以應(yīng)用到生活中的很多地方,解決生活中的一些簡單的用電子控制的問題,使我意識到了單片機的重要性,兩周以來,我們分別進(jìn)行了課程設(shè)計的硬件部分的電路焊接和軟件部分的電路圖的設(shè)計和原理圖的設(shè)計和制作,無論是硬件電路的焊接和軟件的設(shè)計和仿真都需要我們認(rèn)真的把每一部分的原理弄懂,并且要把他們連接起來,這個過程,要求我們要很有耐心和認(rèn)真的心態(tài)。由于以前對單片機的理解不夠深刻,使我在單片機課程設(shè)計的過程中遇到了很多困難,比如說protues的仿真過程中,在調(diào)試出問題后,我虛心地請教同學(xué),也得到了同學(xué)的熱心幫忙,真正讓我體會到了虛心使人進(jìn)步這句話的深刻含義。
13
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063I0VI_1.jpg">
十、參考文獻(xiàn)
[1] 王靜霞 主編,單片機應(yīng)用技術(shù),電子工業(yè)出版社,2009.
[2] 徐瑋 主編,C51單片機高效入門,機械工業(yè)出版社,2006.
[3] 張永楓 主編,單片機應(yīng)用實訓(xùn)教程,清華大學(xué)出版社,2008
[4] 李常慶 主編,數(shù)字電子技術(shù)第三版,機械工業(yè)出版社,2008
[5]楊素行 主編.模擬電子技術(shù)簡明教程,高等教育出版社,2010年 十一、致謝
感謝我們的吳明友老師,組員在這兩個星期以來對我的輔導(dǎo)和幫助,在我工作過程中對我的支持和配合。
14
十二、附錄
【1】整流器protel
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063Ia446_1.jpg">
防真原理圖:
【2】整流器protel防真波形圖:
<mip-img src="http://p.cuntuba520.net/cpic/11/34/f25de83a4e8226e5038209954fd83411.jpg">
<mip-img src="http://p.cuntuba520.net/cpic/58/6d/b3a3795075bb2da959abe7aeb1266d58.jpg">
15
【2】數(shù)字時鐘
#include<reg52.h>
#define uchar unsigned char //定義無字符變量
#define uint unsigned int//
uchar SMG_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //是數(shù)碼管的段選位
uchar SMG_wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; // 是數(shù)碼管的位選位
sbit k1=P3^0; //位定義P3.0為啟動按鈕
sbit k2=P3^1; //位定義P3.1復(fù)位按鈕
sbit k3=P3^2; //位定義P3.2停止按鈕
sbit d1=P0^0; //位定義P0.0為LED燈控制端
uint i,second,minute,n,x,b,c,a,flag1,flag2;
void delay(uchar i); //延時函數(shù)
void XSSHIZHONG(); //顯示數(shù)字時鐘
void DingShi(); //用于定時分鐘函數(shù)
void delay5ms(); //按鍵的消抖5ms
void ShiZhong(); //時鐘控制函數(shù)控制時鐘的啟動,復(fù)位,停止,設(shè)定設(shè)定的操作
void main()
{
TMOD=0x12; // 定時器1工作方式1和定時器0工作方式2 TH1=(65536-50000)/256; // 定時時間為50MS 設(shè)初值
TL1=(65536-50000)%256;
TR1=0; // 開定時器1
EA=1; // 開總中斷
ET1=1; // 開定時器T1允許位
EX1=1; // 開放外部中斷0允許位
16
IT1=1; // 置外部中斷為邊沿(下降沿4)觸發(fā)方式 P2=0x00; // P2口為段選
P1=0xff;
while(1)
{
}
void DingShiqing1() interrupt 3 //用定時器1 中斷號為3
{
TH1=(65536-50000)/256; //定時時間為50MS
TL1=(65536-50000)%256; //
i++; // } XSSHIZHONG(); ShiZhong(); // P1口為位選 if(i==2) // 100ms到,即0.1秒,即0.1秒加1 { i=0; n++; if(n==10) { n=0; second++; if(second==60) { second=0; minute++; if(minute==60) // 60分鐘到時,分鐘清零 minute=0; // 60秒到時,分鐘加1,秒鐘清零 //1000ms時n清零 }
17
} } }
void weidu1() interrupt 2 //外部中斷1 {
unsigned int z;
flag1=1;
b=second;
c=n;
a++;
if(a==60)
a=0;
for(z=0;z<40;z++)
DingShi();
}
void delay(uchar i)
{
unsigned char j,k;
for(k=0;k
22
四 > 單片機課程設(shè)計報告
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063I5DM_0.jpg">
單片機課程設(shè)計報告
萬年歷的設(shè)計
姓 名:學(xué) 號: 0915321028 班 級: 09自動化 指導(dǎo)教師:晏來成
基于51單片機的萬年歷
摘要:
電子萬年歷是一種非常廣泛日常計時工具,對現(xiàn)代社會越來越流行。它可以對年、月、日、周日、時、分、秒進(jìn)行計時,使用壽命長,誤差小。對于數(shù)字電子萬年歷采用直觀的數(shù)字顯示,可以同時顯示年、月、日、周日、時、分、秒和溫度等信息,還具有時間校準(zhǔn)等功能。該電路采用AT89S52單片機作為核心,功耗小,能在3V的低壓工作,電壓可選用3~5V電壓供電。
本設(shè)計是基于51系列的單片機進(jìn)行的電子萬年歷設(shè)計,可以顯示年月日時分秒及周信息,具有可調(diào)整日期和時間功能。在設(shè)計的同時對單片機的理論基礎(chǔ)和外圍擴(kuò)展知識進(jìn)行了比較全面準(zhǔn)備。萬年歷的設(shè)計過程在硬件與軟件方面進(jìn)行同步設(shè)計。硬件部分主要由AT89C52單片機,LCD顯示電路,以及調(diào)時按鍵電路等組成。在單片機的選擇上本人使用了AT89C52單片機,該單片機適合于許多較為復(fù)雜控制應(yīng)用場合。顯示器使用了1602液晶顯示,并且使用蜂鳴器實現(xiàn)了整點報警的功能,溫度測試的功能實現(xiàn)使用了DS18B20,
并實現(xiàn)了溫度過高或過低時的溫度報警。
軟件方面主要包括日歷程序、時間調(diào)整程序,顯示程序等。程序采用C語言編寫。所有程序編寫完成后,在KeilC51軟件中進(jìn)行調(diào)試,確定沒有問題后,在Proteus軟件中嵌入單片機內(nèi)進(jìn)行仿真,并最終實現(xiàn)基本要求。
綜上所述此萬年歷具有讀取方便、顯示直觀、功能多樣、電路簡潔、成本低廉等諸多優(yōu)點,符合電子儀器儀表的發(fā)展趨勢,具有廣闊的市場前景。
一、設(shè)計要求
基本要求:
1,8 個數(shù)碼管上顯示,顯示時間的格式為(假如當(dāng)前時間是19:32:20)“19-32-20”;
2,具有日歷功能;
③ 時間可以通過按鍵調(diào)整。
發(fā)揮部分:
④ 具有鬧鐘功能(可以設(shè)定多個)。
二:總體設(shè)計
電路設(shè)計框圖
<mip-img src="http://p.cuntuba520.net/cpic/04/d2/618ff9921ebddedff8d24c366996d204.jpg">
系統(tǒng)硬件概述
本電路是由AT89S52單片機為控制核心,具有在線編程功能,低功耗,能在3V超低壓工作;時鐘電路由單片機定時功能提供;溫度的采集由DS18B20構(gòu)成,它具有獨特的單線接口方式,DS18B20在與微處理器連接時僅需要一條口線即可實現(xiàn)微處理器與DS18B20的雙向通訊,使用時不需要額外的外圍電路。并且,其測溫范圍 -55℃~+125℃,固有測溫分辨率0.5℃;顯示部份使用1602液晶顯示,可完美地顯示年、月、日、周日、時、分、秒,且在整點時刻通過蜂鳴器實現(xiàn)響鈴。還可以實現(xiàn)溫度顯示,且當(dāng)判斷得溫度過高或過低時,通過液晶顯示及LED發(fā)光二極管完成報警。
單片機主控制模塊的設(shè)計
AT89S52單片機為40引腳雙列直插芯片,有四個I/O口P0,P1,P2,P3, MCS-51單片機共有4個8位的I/O口(P0、P1、P2、
P3),每一條I/O線都能獨立地作輸出或輸入。
單片機的最小系統(tǒng)如下圖所示,18引腳和19引腳接時鐘電路,XTAL1接外部晶振和微調(diào)電容的一端,在片內(nèi)它是振蕩器倒相放大器的輸入,XTAL2接外部晶振和微調(diào)電容的另一端,在片內(nèi)它是振蕩器倒相放大器的輸出.第9引腳為復(fù)位輸入端,接上電容,電阻及開關(guān)后夠上電復(fù)位電路,20引腳為接地端,40引腳為電源端.
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063H234U_1.jpg">
液晶顯示模塊的設(shè)計
LCD1602有16個引腳,其中VCC、VSS分別為電源正負(fù)極;VO為液晶偏壓信號輸入端,圖中W1可調(diào)節(jié)液晶明亮度; DB0—DB7 8位數(shù)據(jù)段;BLA、BLK背光源正負(fù)極; RS數(shù)據(jù)/命令選擇端;R/W讀寫選擇端;E使能端
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063H234U_0.jpg">
溫度采集模塊設(shè)計
采用數(shù)字式溫度傳感器DS18B20,它是數(shù)字式溫度傳感器,具有測量精度高,電路連接簡單特點,此類傳感器僅需要一條數(shù)據(jù)線進(jìn)行數(shù)據(jù)傳輸,使用P0.7與DS18B20的I/O口連接加一個上拉電阻,Vcc接電源,Vss接地。
PCB圖
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063G62D2_0.jpg">
三電子時鐘的軟件設(shè)計
系統(tǒng)軟件按鍵檢測流程圖
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063G62D2_1.jpg">
系統(tǒng)軟件定時器程序流程圖
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063G26032_0.jpg">
子程序的設(shè)計
DS18B20溫度子程序
void write_temp(uchar add,uchar dat)//向LCD寫溫度數(shù)據(jù),并指定顯示位置 {
uchar gw,sw,bw;
if(dat>=0&&dat<=128)
{
gw=dat%10;//取得個位數(shù)字
sw=dat%100/10;//取得十位數(shù)字
bw=dat/100 ;//取得百位數(shù)字
}
else
{
dat=256-dat;
gw=dat%10;//取得個位數(shù)字
sw=dat%100/10;//取得十位數(shù)字
bw=-3; //0x30-3表示為負(fù)號
}
write_1602com(er+add);//er是頭文件規(guī)定的值0x80+0x40
write_1602dat(0x30+bw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼 write_1602dat(0x30+sw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼 write_1602dat(0x30+gw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
write_1602dat(0xdf);//顯示溫度的小圓圈符號,0xdf是液晶屏字符庫的該符號地址碼
write_1602dat(0x43); //顯示"C"符號,0x43是液晶屏字符庫里大寫C的地址碼
}
1602子程序
void write_byte(uchar dat)//寫一個字節(jié)
{
ACC=dat;
RST=1;
for(a=8;a>0;a--)
{
IO=ACC0;
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
uchar read_byte()//讀一個字節(jié)
{
RST=1;
for(a=8;a>0;a--)
{
ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
return (ACC);
}
//----------------------------------------
void write_1302(uchar add,uchar dat)//向1302芯片寫函數(shù),指定寫入地址,數(shù)據(jù) {
RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
uchar read_1302(uchar add)//從1302讀數(shù)據(jù)函數(shù),指定讀取數(shù)據(jù)來源地址
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
uchar BCD_Decimal(uchar bcd)//BCD碼轉(zhuǎn)十進(jìn)制函數(shù),輸入BCD,返回十進(jìn)制 {
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
//--------------------------------------
void ds1302_init() //1302芯片初始化子函數(shù)(2010-01-07,12:00:00,week4) {
RST=0;
SCLK=0;
write_1302(0x8e,0x00); //允許寫,禁止寫保護(hù)
write_1302(0x80,0x00); //向DS1302內(nèi)寫秒寄存器80H寫入初始秒數(shù)據(jù)00
write_1302(0x82,0x00);//向DS1302內(nèi)寫分寄存器82H寫入初始分?jǐn)?shù)據(jù)00
write_1302(0x84,0x12);//向DS1302內(nèi)寫小時寄存器84H寫入初始小時數(shù)據(jù)12 write_1302(0x8a,0x01);//向DS1302內(nèi)寫周寄存器8aH寫入初始周數(shù)據(jù)4
write_1302(0x86,0x08);//向DS1302內(nèi)寫日期寄存器86H寫入初始日期數(shù)據(jù)07 write_1302(0x88,0x07);//向DS1302內(nèi)寫月份寄存器88H寫入初始月份數(shù)據(jù)01 write_1302(0x8c,0x10);//向DS1302內(nèi)寫年份寄存器8cH寫入初始年份數(shù)據(jù)10 write_1302(0x8e,0x80); //打開寫保護(hù)
}
時分秒顯示子函數(shù)
void write_sfm(uchar add,uchar dat)//向LCD寫時分秒,有顯示位置加、現(xiàn)示數(shù)據(jù),兩個參數(shù)
{
uchar gw,sw;
gw=dat%10;//取得個位數(shù)字
sw=dat/10;//取得十位數(shù)字
write_1602com(er+add);//er是頭文件規(guī)定的值0x80+0x40
write_1602dat(0x30+sw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
write_1602dat(0x30+gw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
}
//-------------------------------------
//年月日顯示子函數(shù)
void write_nyr(uchar add,uchar dat)//向LCD寫年月日,有顯示位置加數(shù)、顯示數(shù)據(jù),兩個參數(shù)
{
uchar gw,sw;
gw=dat%10;//取得個位數(shù)字
sw=dat/10;//取得十位數(shù)字
write_1602com(yh+add);//設(shè)定顯示位置為第一個位置+add
write_1602dat(0x30+sw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
write_1602dat(0x30+gw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
}
//-------------------------------------------
void write_week(uchar week)//寫星期函數(shù)
{
write_1602com(yh+0x0c);//星期字符的顯示位置
switch(week)
{
case 1:write_1602dat('M');//星期數(shù)為1時,顯示
write_1602dat('O');
write_1602dat('N');
break;
case 2:write_1602dat('T');//星期數(shù)據(jù)為2時顯示
write_1602dat('U');
write_1602dat('E');
break;
case 3:write_1602dat('W');//星期數(shù)據(jù)為3時顯示
write_1602dat('E');
write_1602dat('D');
break;
case 4:write_1602dat('T');//星期數(shù)據(jù)為4是顯示
write_1602dat('H');
write_1602dat('U');
break;
case 5:write_1602dat('F');//星期數(shù)據(jù)為5時顯示
write_1602dat('R');
write_1602dat('I');
break;
case 6:write_1602dat('S');//星期數(shù)據(jù)為6時顯示
write_1602dat('T');
write_1602dat('A');
break;
case 7:write_1602dat('S');//星期數(shù)據(jù)為7時顯示
write_1602dat('U');
write_1602dat('N');
break;
定時器0初始化程序
void init() //定時器、計數(shù)器設(shè)置函數(shù)
{
TMOD=0x11; //指定定時/計數(shù)器的工作方式為1
TH0=0; //定時器T0的高四位=0
TL0=0; //定時器T0的低四位=0
EA=1; //系統(tǒng)允許有開放的中斷
ET0=1; //允許T0中斷
TR0=1; //開啟中斷,啟動定時器
}
}
//****************鍵盤掃描有關(guān)函數(shù)**********************
void keyscan()
{
if(key1==0)//---------------key1為功能鍵(設(shè)置鍵)-------------------- {
delay(9);//延時,用于消抖動
if(key1==0)//延時后再次確認(rèn)按鍵按下
{
buzzer=0;//蜂鳴器短響一次
delay(20);
buzzer=1;
while(!key1);
key1n++;
if(key1n==12) key1n=1;//設(shè)置按鍵共有秒、分、時、星期、日、月、年、返回,8個功能循環(huán) switch(key1n) { case 1: TR0=0;//關(guān)閉定時器 //TR1=0; write_1602com(er+0x09);//設(shè)置按鍵按動一次,秒位置顯示光標(biāo) write_1602com(0x0f);//設(shè)置光標(biāo)為閃爍 temp=(miao)/10*16+(miao)%10;//秒數(shù)據(jù)寫入DS1302 write_1302(0x8e,0x00); write_1302(0x80,0x80|temp);//miao write_1302(0x8e,0x80); break; case 2: write_1602com(er+6);//按2次fen位置顯示光標(biāo) //write_1602com(0x0f); break; case 3: write_1602com(er+3);//按動3次,shi //write_1602com(0x0f); break; case 4: write_1602com(yh+0x0e);//按動4次,week //write_1602com(0x0f); break; case 5: write_1602com(yh+0x0a);//按動5次,ri //write_1602com(0x0f); break; case 6: write_1602com(yh+0x07);//按動6次,yue //write_1602com(0x0f); break; case 7: write_1602com(yh+0x04);//按動7次,nian //write_1602com(0x0f); break; case 8: write_1602com(er+1); write_1602dat(0x4d); write_1602com(er+1); break; case 9: write_1602com(er+1); write_1602dat(0x46); write_1602com(er+1); break; case 10:write_1602com(er+1); write_1602dat(0x53);
write_1602com(er+1);
break;
case 11:
write_1602com(er+1);
write_1602dat(0x20);
write_1602com(0x0c);//按動到第8次,設(shè)置光標(biāo)不閃爍
TR0=1;//打開定時器
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao數(shù)據(jù)寫入DS1302
write_1302(0x8e,0x80);
break;
}
}
}
//------------------------------加鍵key2---------------------------- if(key1n!=0)//當(dāng)key1按下以下。再按以下鍵才有效(按鍵次數(shù)不等于零) {
if(key2==0) //上調(diào)鍵
{
delay(10);
if(key2==0)
{
buzzer=0;//蜂鳴器短響一次
delay(20);
buzzer=1;
while(!key2);
switch(key1n)
{
case 1:miao++;//設(shè)置鍵按動1次,調(diào)秒
if(miao==60)
miao=0;//秒超過59,再加1,就歸零
write_sfm(0x08,miao);//令LCD在正確位置顯示"加"設(shè)定好的秒數(shù) temp=(miao)/10*16+(miao)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00); //允許寫,禁止寫保護(hù)
write_1302(0x80,temp); //向DS1302內(nèi)寫秒寄存器80H寫入調(diào)整后的秒數(shù)據(jù)BCD碼
write_1302(0x8e,0x80); //打開寫保護(hù)
write_1602com(er+0x09);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,光標(biāo)自動右移,所以要指定返回
//write_1602com(0x0b);
break;
case 2:fen++;
if(fen==60)
fen=0;
write_sfm(0x05,fen);//令LCD在正確位置顯示"加"設(shè)定好的分?jǐn)?shù)據(jù) temp=(fen)/10*16+(fen)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x82,temp);//向DS1302內(nèi)寫分寄存器82H寫入調(diào)整后的分?jǐn)?shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(er+6);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置
break;
case 3:shi++;
if(shi==24)
shi=0;
write_sfm(2,shi);//令LCD在正確的位置顯示"加"設(shè)定好的小時數(shù)據(jù) temp=(shi)/10*16+(shi)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x84,temp);//向DS1302內(nèi)寫小時寄存器84H寫入調(diào)整后的小時數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(er+3);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 4:week++;
if(week==8)
week=1;
write_1602com(yh+0x0C);//指定'加'后的周數(shù)據(jù)顯示位置
write_week(week);//指定周數(shù)據(jù)顯示內(nèi)容
temp=(week)/10*16+(week)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x8a,temp);//向DS1302內(nèi)寫周寄存器8aH寫入調(diào)整后的周數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(yh+0x0e);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 5:ri++;
switch(yue)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
if(ri>31) ri=1;
break;
case 2:
if(nian%4==0||nian%400==0)
{
if(ri>29) ri=1;
}
else
{
if(ri>28) ri=1;
}break;
case 4:case 6:case 9:case 11:
ri++;
if(ri>30) ri=1;
break;
}
write_nyr(9,ri);//令LCD在正確的位置顯示"加"設(shè)定好的日期數(shù)據(jù) temp=(ri)/10*16+(ri)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x86,temp);//向DS1302內(nèi)寫日期寄存器86H寫入調(diào)整后的日期數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(yh+10);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 6:yue++;
if(yue==13)
yue=1;
write_nyr(6,yue);//令LCD在正確的位置顯示"加"設(shè)定好的月份數(shù)據(jù) temp=(yue)/10*16+(yue)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x88,temp);//向DS1302內(nèi)寫月份寄存器88H寫入調(diào)整后的月份數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(yh+7);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 7:nian++;
if(nian==100)
nian=0;
write_nyr(3,nian);//令LCD在正確的位置顯示"加"設(shè)定好的年份數(shù)據(jù) temp=(nian)/10*16+(nian)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x8c,temp);//向DS1302內(nèi)寫年份寄存器8cH寫入調(diào)整后的年份數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(yh+4);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 8: write_1602com(er+9); //設(shè)置鬧鐘的秒定時
miao1++;
if(miao1==60)
miao1=0;
write_sfm(0x08,miao1);//令LCD在正確位置顯示"加"設(shè)定好秒的數(shù)據(jù)
write_1602com(er+9);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置
break;
case 9: write_1602com(er+6); //設(shè)置鬧鐘的分鐘定時
fen1++;
if(fen1==60)
fen1=0;
write_sfm(0x05,fen1);//令LCD在正確位置顯示"加"設(shè)定好的分?jǐn)?shù)據(jù)
write_1602com(er+6);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置
break;
case 10: write_1602com(er+3); //設(shè)置鬧鐘的小時定時
shi1++;
if(shi1==24)
shi1=0;
write_sfm(0x02,shi1);//令LCD在正確的位置顯示"加"設(shè)定好的小時數(shù)據(jù) write_1602com(er+3);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
}
}
}
//------------------減鍵key3,各句功能參照'加鍵'注釋--------------- if(key3==0)
{
delay(10);//調(diào)延時,消抖動
if(key3==0)
{
buzzer=0;//蜂鳴器短響一次
delay(20);
buzzer=1;
while(!key3);
switch(key1n)
{
case 1:miao--;
if(miao==-1)
miao=59;//秒數(shù)據(jù)減到-1時自動變成59
write_sfm(0x08,miao);//在LCD的正確位置顯示改變后新的秒數(shù) temp=(miao)/10*16+(miao)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00); //允許寫,禁止寫保護(hù)
write_1302(0x80,temp); //向DS1302內(nèi)寫秒寄存器80H寫入調(diào)整后的秒數(shù)據(jù)BCD碼
write_1302(0x8e,0x80); //打開寫保護(hù)
write_1602com(er+0x09);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置
//write_1602com(0x0b);
break;
case 2:fen--;
if(fen==-1)
fen=59;
write_sfm(5,fen);
temp=(fen)/10*16+(fen)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x82,temp);//向DS1302內(nèi)寫分寄存器82H寫入調(diào)整后的分?jǐn)?shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(er+6);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置
break;
case 3:shi--;
if(shi==-1)
shi=23;
write_sfm(2,shi);
temp=(shi)/10*16+(shi)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x84,temp);//向DS1302內(nèi)寫小時寄存器84H寫入調(diào)整后的小時數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(er+3);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 4:week--;
if(week==0)
week=7;
write_1602com(yh+0x0C);//指定'加'后的周數(shù)據(jù)顯示位置
write_week(week);//指定周數(shù)據(jù)顯示內(nèi)容
temp=(week)/10*16+(week)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x8a,temp);//向DS1302內(nèi)寫周寄存器8aH寫入調(diào)整后的周數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(yh+0x0e);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 5:ri--;
switch(yue)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
if(ri==0) ri=31;
break;
case 2: if(nian%4==0||nian%400==0)
{
if(ri==0) ri=29;
}
else
{
if(ri==0) ri=28;
}break;
case 4:case 6:case 9:case 11:
if(ri==0) ri=30;
break;
}
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x86,temp);//向DS1302內(nèi)寫日期寄存器86H寫入調(diào)整后的日期數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(yh+10);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 6:yue--;
if(yue==0)
yue=12;
write_nyr(6,yue);
temp=(yue)/10*16+(yue)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x88,temp);//向DS1302內(nèi)寫月份寄存器88H寫入調(diào)整后的月份數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(yh+7);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 7:nian--;
if(nian==-1)
nian=99;
write_nyr(3,nian);
temp=(nian)/10*16+(nian)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x8c,temp);//向DS1302內(nèi)寫年份寄存器8cH寫入調(diào)整后的年份數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(yh+4);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 8: write_1602com(er+9); //設(shè)置鬧鐘的秒定時
miao1--;
if(miao1==-1)
miao1=59;
write_sfm(0x08,miao1);//令LCD在正確位置顯示"加"設(shè)定好秒的數(shù)據(jù)
write_1602com(er+9);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置
break;
case 9: write_1602com(er+6); //設(shè)置鬧鐘的分鐘定時
fen1--;
if(fen1==-1)
fen1=59;
write_sfm(0x05,fen1);//令LCD在正確位置顯示"加"設(shè)定好的分?jǐn)?shù)據(jù)
write_1602com(er+6);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,
在這里是寫回原來的位置
break;
case 10: write_1602com(er+3); //設(shè)置鬧鐘的小時定時
shi1--;
if(shi1==-1)
shi1=23;
write_sfm(0x02,shi1);//令LCD在正確的位置顯示"加"設(shè)定好的小時數(shù)據(jù) write_1602com(er+3);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
}
}
}
}
}//*******************主函數(shù)**************************
//***************************************************
void main()
{
lcd_init(); //調(diào)用液晶屏初始化子函數(shù)
ds1302_init(); //調(diào)用DS1302時鐘的初始化子函數(shù)
init(); //調(diào)用定時計數(shù)器的設(shè)置子函數(shù)
led=0; //打開LCD的背光電源
buzzer=0;//蜂鳴器長響一次
delay(80);
buzzer=1;
while(1) //無限循環(huán)下面的語句:
{
keyscan(); //調(diào)用鍵盤掃描子函數(shù)
}
}/*************通過定時中斷實現(xiàn)定是獨處并顯示數(shù)據(jù)******************/
void timer0() interrupt 1 //取得并顯示日歷和時間
{
//Init_DS18B20();//溫度傳感器DS18b2初始化子函數(shù),在頭文件中
flag=ReadTemperature();//將18b2頭文件運行返回的函數(shù)結(jié)果送到變量FLAG中,用于
顯示
//讀取秒時分周日月年七個數(shù)據(jù)(DS1302的讀寄存器與寫寄存器不一樣):
miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));
//顯示溫度、秒、時、分?jǐn)?shù)據(jù):
write_temp(12,flag);//顯示溫度,從第二行第12個字符后開始顯示
write_sfm(8,miao);//秒,從第二行第8個字后開始顯示(調(diào)用時分秒顯示子函數(shù)) write_sfm(5,fen);//分,從第二行第5個字符后開始顯示
write_sfm(2,shi);//小時,從第二行第2個字符后開始顯示
//顯示日、月、年數(shù)據(jù):
write_nyr(9,ri);//日期,從第二行第9個字符后開始顯示
write_nyr(6,yue);//月份,從第二行第6個字符后開始顯示
write_nyr(3,nian);//年,從第二行第3個字符后開始顯示
write_week(week);
/***********整點報時程序************/
if(fen==0&&miao==0)
if(shi<22&&shi>6 )
{
buzzer=0;//蜂鳴器短響一次
delay(20);
buzzer=1;
}
/**************鬧鐘程序: 將暫停鍵按下停止蜂鳴********************/
if(shi1==shi&&fen1==fen&&miao==0)
{
clock=1;
}
if(clock==1)
{
buzzer=0;//蜂鳴器短響一次
delay(20);
buzzer=1;
}
if(CLO==0) /*按下p1.3停止蜂鳴*/
clock=0;
}
四:心得體會
編程其實是一件藝術(shù),自己在里面任意發(fā)揮,自主創(chuàng)新,實現(xiàn)自己的目的。編程的感覺是很美妙的,很能增強我們的自信心。編程又是十分重要的,生活中無處不見程序,各種自動控制都用到程序,很有用,自己把編程學(xué)好就能成為一個有技術(shù)的人,成功的人,所以要加強編程,在大學(xué)期間讓自己的代碼量達(dá)到一定的高度,從而產(chǎn)生從量變到質(zhì)變的效果,對自己的以后很有幫助。把編程當(dāng)成一個游戲來玩,和電腦直接對話,在千百次的調(diào)試中發(fā)現(xiàn)自己犯的錯誤,了解程序的執(zhí)行過程,意外發(fā)現(xiàn)一些自己不知道的東西,這是很有收獲的!時常編程,時常把自己想到的問題用程序來實現(xiàn),在學(xué)習(xí)期間我就不會寂寞,也會不斷肯定自己,不斷提高自己!
本次試驗使我對DS1302、DS18B20、單片機定時功能等有了更深的認(rèn)識。在反復(fù)調(diào)試的過程中更是鍛煉了我的耐心,以及培養(yǎng)了我對編程的強烈興趣。尤其是閏年、平年二月日期的顯示問題,此問題我最初根本就沒有考慮到,在最后才解決。雖然編寫過程中有參考其他程序,而且有些子程序(如DS1802、LCD)是直接調(diào)用的,但的的確確在理解的程度上完成了主程序。也因此覺得自己的實驗是對自己負(fù)責(zé)的,并非盲目COPY完成的,也使得自己的編程能力提高了一些,只是我還是比較習(xí)慣用C語言編程,匯編能力還有待加強哦,O(∩_∩)O~!相比硬件,我想我還是更喜歡編程滴,雖然有些糾結(jié),雖然自己現(xiàn)有的知識甚是缺乏,嘿嘿!所以,我今后定會更加努力的學(xué)習(xí)相關(guān)理論知識,并運用于實踐中,加油!~
五 > 單片機課程設(shè)計報告
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063G26032_1.jpg">
單片機課程設(shè)計報告
萬年歷的設(shè)計
姓 名:學(xué) 號: 0915321028 班 級: 09自動化 指導(dǎo)教師:晏來成
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
基于51單片機的萬年歷
摘要:
電子萬年歷是一種非常廣泛日常計時工具,對現(xiàn)代社會越來越流行。(]它可以對年、月、日、周日、時、分、秒進(jìn)行計時,使用壽命長,誤差小。對于數(shù)字電子萬年歷采用直觀的數(shù)字顯示,可以同時顯示年、月、日、周日、時、分、秒和溫度等信息,還具有時間校準(zhǔn)等功能。該電路采用AT89S52單片機作為核心,功耗小,能在3V的低壓工作,電壓可選用3~5V電壓供電。
本設(shè)計是基于51系列的單片機進(jìn)行的電子萬年歷設(shè)計,可以顯示年月日時分秒及周信息,具有可調(diào)整日期和時間功能。在設(shè)計的同時對單片機的理論基礎(chǔ)和外圍擴(kuò)展知識進(jìn)行了比較全面準(zhǔn)備。萬年歷的設(shè)計過程在硬件與軟件方面進(jìn)行同步設(shè)計。硬件部分主要由AT89C52單片機,LCD顯示電路,以及調(diào)時按鍵電路等組成。在單片機的選擇上本人使用了AT89C52單片機,該單片機適合于許多較為復(fù)雜控制應(yīng)用場合。顯示器使用了1602液晶顯示,并且使用蜂鳴器實現(xiàn)了整點報警的功能,溫度測試的功能實現(xiàn)使用了DS18B20,
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
并實現(xiàn)了溫度過高或過低時的溫度報警。[)
軟件方面主要包括日歷程序、時間調(diào)整程序,顯示程序等。程序采用C語言編寫。所有程序編寫完成后,在KeilC51軟件中進(jìn)行調(diào)試,確定沒有問題后,在Proteus軟件中嵌入單片機內(nèi)進(jìn)行仿真,并最終實現(xiàn)基本要求。
綜上所述此萬年歷具有讀取方便、顯示直觀、功能多樣、電路簡潔、成本低廉等諸多優(yōu)點,符合電子儀器儀表的發(fā)展趨勢,具有廣闊的市場前景。
一、設(shè)計要求
基本要求:
1,8 個數(shù)碼管上顯示,顯示時間的格式為(假如當(dāng)前時間是19:32:20)“19-32-20”;
2,具有日歷功能;
③ 時間可以通過按鍵調(diào)整。
發(fā)揮部分:
④ 具有鬧鐘功能(可以設(shè)定多個)。
二:總體設(shè)計
電路設(shè)計框圖
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063FG3b_1.jpg">
系統(tǒng)硬件概述
本電路是由AT89S52單片機為控制核心,具有在線編程功能,低功耗,能在3V超低壓工作;時鐘電路由單片機定時功能提供;溫度的采集由DS18B20構(gòu)成,它具有獨特的單線接口方式,DS18B20在與微處理器連接時僅需要一條口線即可實現(xiàn)微處理器與DS18B20的雙向通訊,使用時不需要額外的外圍電路。()并且,其測溫范圍 -55℃~+125℃,固有測溫分辨率0.5℃;顯示部份使用1602液晶顯示,可完美地顯示年、月、日、周日、時、分、秒,且在整點時刻通過蜂鳴器實現(xiàn)響鈴。還可以實現(xiàn)溫度顯示,且當(dāng)判斷得溫度過高或過低時,通過液晶顯示及LED發(fā)光二極管完成報警。
單片機主控制模塊的設(shè)計
AT89S52單片機為40引腳雙列直插芯片,有四個I/O口P0,P1,P2,P3, MCS-51單片機共有4個8位的I/O口(P0、P1、P2、
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
P3),每一條I/O線都能獨立地作輸出或輸入。()
單片機的最小系統(tǒng)如下圖所示,18引腳和19引腳接時鐘電路,XTAL1接外部晶振和微調(diào)電容的一端,在片內(nèi)它是振蕩器倒相放大器的輸入,XTAL2接外部晶振和微調(diào)電容的另一端,在片內(nèi)它是振蕩器倒相放大器的輸出.第9引腳為復(fù)位輸入端,接上電容,電阻及開關(guān)后夠上電復(fù)位電路,20引腳為接地端,40引腳為電源端.
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063F33346_1.jpg">
液晶顯示模塊的設(shè)計
LCD1602有16個引腳,其中VCC、VSS分別為電源正負(fù)極;VO為液晶偏壓信號輸入端,圖中W1可調(diào)節(jié)液晶明亮度; DB0—DB7 8位數(shù)據(jù)段;BLA、BLK背光源正負(fù)極; RS數(shù)據(jù)/命令選擇端;R/W讀寫選擇端;E使能端
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063FG3b_0.jpg">
溫度采集模塊設(shè)計
采用數(shù)字式溫度傳感器DS18B20,它是數(shù)字式溫度傳感器,具有測量精度高,電路連接簡單特點,,此類傳感器僅需要一條數(shù)據(jù)線進(jìn)行數(shù)據(jù)傳輸,使用P0.7與DS18B20的I/O口連接加一個上拉電阻,Vcc接電源,Vss接地。()
PCB圖
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063A91L8_1.jpg">
三電子時鐘的軟件設(shè)計
系統(tǒng)軟件按鍵檢測流程圖
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063F33346_0.jpg">
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
系統(tǒng)軟件定時器程序流程圖
<mip-img src="http://www.bigengculture.com/uploads/allimg/180511/063A91L8_0.jpg">
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
子程序的設(shè)計
DS18B20溫度子程序
void write_temp(uchar add,uchar dat)//向LCD寫溫度數(shù)據(jù),并指定顯示位置 {
uchar gw,sw,bw;
if(dat>=0&&dat<=128)
{
gw=dat%10;//取得個位數(shù)字
sw=dat%100/10;//取得十位數(shù)字
bw=dat/100 ;//取得百位數(shù)字
}
else
{
dat=256-dat;
gw=dat%10;//取得個位數(shù)字
sw=dat%100/10;//取得十位數(shù)字
bw=-3; //0x30-3表示為負(fù)號
}
write_1602com(er+add);//er是頭文件規(guī)定的值0x80+0x40
write_1602dat(0x30+bw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼 write_1602dat(0x30+sw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼 write_1602dat(0x30+gw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
write_1602dat(0xdf);//顯示溫度的小圓圈符號,0xdf是液晶屏字符庫的該符號地址碼
write_1602dat(0x43); //顯示"C"符號,0x43是液晶屏字符庫里大寫C的地址碼
}
1602子程序
void write_byte(uchar dat)//寫一個字節(jié)
{
ACC=dat;
RST=1;
for(a=8;a>0;a--)
{
IO=ACC0;
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
uchar read_byte()//讀一個字節(jié)
{
RST=1;
for(a=8;a>0;a--)
{
ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
return (ACC);
}
//----------------------------------------
void write_1302(uchar add,uchar dat)//向1302芯片寫函數(shù),指定寫入地址,數(shù)據(jù) {
RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
uchar read_1302(uchar add)//從1302讀數(shù)據(jù)函數(shù),指定讀取數(shù)據(jù)來源地址
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
uchar BCD_Decimal(uchar bcd)//BCD碼轉(zhuǎn)十進(jìn)制函數(shù),輸入BCD,返回十進(jìn)制 {
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
//--------------------------------------
void ds1302_init() //1302芯片初始化子函數(shù)(2010-01-07,12:00:00,week4) {
RST=0;
SCLK=0;
write_1302(0x8e,0x00); //允許寫,禁止寫保護(hù)
write_1302(0x80,0x00); //向DS1302內(nèi)寫秒寄存器80H寫入初始秒數(shù)據(jù)00
write_1302(0x82,0x00);//向DS1302內(nèi)寫分寄存器82H寫入初始分?jǐn)?shù)據(jù)00
write_1302(0x84,0x12);//向DS1302內(nèi)寫小時寄存器84H寫入初始小時數(shù)據(jù)12 write_1302(0x8a,0x01);//向DS1302內(nèi)寫周寄存器8aH寫入初始周數(shù)據(jù)4
write_1302(0x86,0x08);//向DS1302內(nèi)寫日期寄存器86H寫入初始日期數(shù)據(jù)07 write_1302(0x88,0x07);//向DS1302內(nèi)寫月份寄存器88H寫入初始月份數(shù)據(jù)01 write_1302(0x8c,0x10);//向DS1302內(nèi)寫年份寄存器8cH寫入初始年份數(shù)據(jù)10 write_1302(0x8e,0x80); //打開寫保護(hù)
}
時分秒顯示子函數(shù)
void write_sfm(uchar add,uchar dat)//向LCD寫時分秒,有顯示位置加、現(xiàn)示數(shù)據(jù),兩個參數(shù)
{
uchar gw,sw;
gw=dat%10;//取得個位數(shù)字
sw=dat/10;//取得十位數(shù)字
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
write_1602com(er+add);//er是頭文件規(guī)定的值0x80+0x40
write_1602dat(0x30+sw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
write_1602dat(0x30+gw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
}
//-------------------------------------
//年月日顯示子函數(shù)
void write_nyr(uchar add,uchar dat)//向LCD寫年月日,有顯示位置加數(shù)、顯示數(shù)據(jù),兩個參數(shù)
{
uchar gw,sw;
gw=dat%10;//取得個位數(shù)字
sw=dat/10;//取得十位數(shù)字
write_1602com(yh+add);//設(shè)定顯示位置為第一個位置+add
write_1602dat(0x30+sw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
write_1602dat(0x30+gw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
}
//-------------------------------------------
void write_week(uchar week)//寫星期函數(shù)
{
write_1602com(yh+0x0c);//星期字符的顯示位置
switch(week)
{
case 1:write_1602dat('M');//星期數(shù)為1時,顯示
write_1602dat('O');
write_1602dat('N');
break;
case 2:write_1602dat('T');//星期數(shù)據(jù)為2時顯示
write_1602dat('U');
write_1602dat('E');
break;
case 3:write_1602dat('W');//星期數(shù)據(jù)為3時顯示
write_1602dat('E');
write_1602dat('D');
break;
case 4:write_1602dat('T');//星期數(shù)據(jù)為4是顯示
write_1602dat('H');
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
write_1602dat('U');
break;
case 5:write_1602dat('F');//星期數(shù)據(jù)為5時顯示
write_1602dat('R');
write_1602dat('I');
break;
case 6:write_1602dat('S');//星期數(shù)據(jù)為6時顯示
write_1602dat('T');
write_1602dat('A');
break;
case 7:write_1602dat('S');//星期數(shù)據(jù)為7時顯示
write_1602dat('U');
write_1602dat('N');
break;
定時器0初始化程序
void init() //定時器、計數(shù)器設(shè)置函數(shù)
{
TMOD=0x11; //指定定時/計數(shù)器的工作方式為1
TH0=0; //定時器T0的高四位=0
TL0=0; //定時器T0的低四位=0
EA=1; //系統(tǒng)允許有開放的中斷
ET0=1; //允許T0中斷
TR0=1; //開啟中斷,啟動定時器
}
}
//****************鍵盤掃描有關(guān)函數(shù)**********************
void keyscan()
{
if(key1==0)//---------------key1為功能鍵(設(shè)置鍵)-------------------- {
delay(9);//延時,用于消抖動
if(key1==0)//延時后再次確認(rèn)按鍵按下
{
buzzer=0;//蜂鳴器短響一次
delay(20);
buzzer=1;
while(!key1);
key1n++;
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
if(key1n==12) key1n=1;//設(shè)置按鍵共有秒、分、時、星期、日、月、年、返回,8個功能循環(huán) switch(key1n) { case 1: TR0=0;//關(guān)閉定時器 //TR1=0; write_1602com(er+0x09);//設(shè)置按鍵按動一次,秒位置顯示光標(biāo) write_1602com(0x0f);//設(shè)置光標(biāo)為閃爍 temp=(miao)/10*16+(miao)%10;//秒數(shù)據(jù)寫入DS1302 write_1302(0x8e,0x00); write_1302(0x80,0x80|temp);//miao write_1302(0x8e,0x80); break; case 2: write_1602com(er+6);//按2次fen位置顯示光標(biāo) //write_1602com(0x0f); break; case 3: write_1602com(er+3);//按動3次,shi //write_1602com(0x0f); break; case 4: write_1602com(yh+0x0e);//按動4次,week //write_1602com(0x0f); break; case 5: write_1602com(yh+0x0a);//按動5次,ri //write_1602com(0x0f); break; case 6: write_1602com(yh+0x07);//按動6次,yue //write_1602com(0x0f); break; case 7: write_1602com(yh+0x04);//按動7次,nian //write_1602com(0x0f); break; case 8: write_1602com(er+1); write_1602dat(0x4d); write_1602com(er+1); break; case 9: write_1602com(er+1); write_1602dat(0x46); write_1602com(er+1); break; case 10:write_1602com(er+1); write_1602dat(0x53);
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
write_1602com(er+1);
break;
case 11:
write_1602com(er+1);
write_1602dat(0x20);
write_1602com(0x0c);//按動到第8次,設(shè)置光標(biāo)不閃爍
TR0=1;//打開定時器
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao數(shù)據(jù)寫入DS1302
write_1302(0x8e,0x80);
break;
}
}
}
//------------------------------加鍵key2---------------------------- if(key1n!=0)//當(dāng)key1按下以下。[)再按以下鍵才有效(按鍵次數(shù)不等于零) {
if(key2==0) //上調(diào)鍵
{
delay(10);
if(key2==0)
{
buzzer=0;//蜂鳴器短響一次
delay(20);
buzzer=1;
while(!key2);
switch(key1n)
{
case 1:miao++;//設(shè)置鍵按動1次,調(diào)秒
if(miao==60)
miao=0;//秒超過59,再加1,就歸零
write_sfm(0x08,miao);//令LCD在正確位置顯示"加"設(shè)定好的秒數(shù) temp=(miao)/10*16+(miao)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00); //允許寫,禁止寫保護(hù)
write_1302(0x80,temp); //向DS1302內(nèi)寫秒寄存器80H寫入調(diào)整后的秒數(shù)據(jù)BCD碼
write_1302(0x8e,0x80); //打開寫保護(hù)
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
write_1602com(er+0x09);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,光標(biāo)自動右移,所以要指定返回
//write_1602com(0x0b);
break;
case 2:fen++;
if(fen==60)
fen=0;
write_sfm(0x05,fen);//令LCD在正確位置顯示"加"設(shè)定好的分?jǐn)?shù)據(jù) temp=(fen)/10*16+(fen)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x82,temp);//向DS1302內(nèi)寫分寄存器82H寫入調(diào)整后的分?jǐn)?shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(er+6);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置
break;
case 3:shi++;
if(shi==24)
shi=0;
write_sfm(2,shi);//令LCD在正確的位置顯示"加"設(shè)定好的小時數(shù)據(jù) temp=(shi)/10*16+(shi)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x84,temp);//向DS1302內(nèi)寫小時寄存器84H寫入調(diào)整后的小時數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(er+3);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 4:week++;
if(week==8)
week=1;
write_1602com(yh+0x0C);//指定'加'后的周數(shù)據(jù)顯示位置
write_week(week);//指定周數(shù)據(jù)顯示內(nèi)容
temp=(week)/10*16+(week)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x8a,temp);//向DS1302內(nèi)寫周寄存器8aH寫入調(diào)整后的周數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(yh+0x0e);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 5:ri++;
switch(yue)
{
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
if(ri>31) ri=1;
break;
case 2:
if(nian%4==0||nian%400==0)
{
if(ri>29) ri=1;
}
else
{
if(ri>28) ri=1;
}break;
case 4:case 6:case 9:case 11:
ri++;
if(ri>30) ri=1;
break;
}
write_nyr(9,ri);//令LCD在正確的位置顯示"加"設(shè)定好的日期數(shù)據(jù) temp=(ri)/10*16+(ri)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x86,temp);//向DS1302內(nèi)寫日期寄存器86H寫入調(diào)整后的日期數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(yh+10);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 6:yue++;
if(yue==13)
yue=1;
write_nyr(6,yue);//令LCD在正確的位置顯示"加"設(shè)定好的月份數(shù)據(jù) temp=(yue)/10*16+(yue)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x88,temp);//向DS1302內(nèi)寫月份寄存器88H寫入調(diào)整后的月份數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(yh+7);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 7:nian++;
if(nian==100)
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
nian=0;
write_nyr(3,nian);//令LCD在正確的位置顯示"加"設(shè)定好的年份數(shù)據(jù) temp=(nian)/10*16+(nian)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x8c,temp);//向DS1302內(nèi)寫年份寄存器8cH寫入調(diào)整后的年份數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(yh+4);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 8: write_1602com(er+9); //設(shè)置鬧鐘的秒定時
miao1++;
if(miao1==60)
miao1=0;
write_sfm(0x08,miao1);//令LCD在正確位置顯示"加"設(shè)定好秒的數(shù)據(jù)
write_1602com(er+9);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置
break;
case 9: write_1602com(er+6); //設(shè)置鬧鐘的分鐘定時
fen1++;
if(fen1==60)
fen1=0;
write_sfm(0x05,fen1);//令LCD在正確位置顯示"加"設(shè)定好的分?jǐn)?shù)據(jù)
write_1602com(er+6);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置
break;
case 10: write_1602com(er+3); //設(shè)置鬧鐘的小時定時
shi1++;
if(shi1==24)
shi1=0;
write_sfm(0x02,shi1);//令LCD在正確的位置顯示"加"設(shè)定好的小時數(shù)據(jù) write_1602com(er+3);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
}
}
}
//------------------減鍵key3,各句功能參照'加鍵'注釋--------------- if(key3==0)
{
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
delay(10);//調(diào)延時,消抖動
if(key3==0)
{
buzzer=0;//蜂鳴器短響一次
delay(20);
buzzer=1;
while(!key3);
switch(key1n)
{
case 1:miao--;
if(miao==-1)
miao=59;//秒數(shù)據(jù)減到-1時自動變成59
write_sfm(0x08,miao);//在LCD的正確位置顯示改變后新的秒數(shù) temp=(miao)/10*16+(miao)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00); //允許寫,禁止寫保護(hù)
write_1302(0x80,temp); //向DS1302內(nèi)寫秒寄存器80H寫入調(diào)整后的秒數(shù)據(jù)BCD碼
write_1302(0x8e,0x80); //打開寫保護(hù)
write_1602com(er+0x09);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置
//write_1602com(0x0b);
break;
case 2:fen--;
if(fen==-1)
fen=59;
write_sfm(5,fen);
temp=(fen)/10*16+(fen)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x82,temp);//向DS1302內(nèi)寫分寄存器82H寫入調(diào)整后的分?jǐn)?shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(er+6);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置
break;
case 3:shi--;
if(shi==-1)
shi=23;
write_sfm(2,shi);
temp=(shi)/10*16+(shi)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x84,temp);//向DS1302內(nèi)寫小時寄存器84H寫入調(diào)整后的小時數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
write_1602com(er+3);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 4:week--;
if(week==0)
week=7;
write_1602com(yh+0x0C);//指定'加'后的周數(shù)據(jù)顯示位置
write_week(week);//指定周數(shù)據(jù)顯示內(nèi)容
temp=(week)/10*16+(week)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x8a,temp);//向DS1302內(nèi)寫周寄存器8aH寫入調(diào)整后的周數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(yh+0x0e);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 5:ri--;
switch(yue)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
if(ri==0) ri=31;
break;
case 2: if(nian%4==0||nian%400==0)
{
if(ri==0) ri=29;
}
else
{
if(ri==0) ri=28;
}break;
case 4:case 6:case 9:case 11:
if(ri==0) ri=30;
break;
}
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
write_1302(0x86,temp);//向DS1302內(nèi)寫日期寄存器86H寫入調(diào)整后的日期數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(yh+10);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 6:yue--;
if(yue==0)
yue=12;
write_nyr(6,yue);
temp=(yue)/10*16+(yue)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x88,temp);//向DS1302內(nèi)寫月份寄存器88H寫入調(diào)整后的月份數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(yh+7);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 7:nian--;
if(nian==-1)
nian=99;
write_nyr(3,nian);
temp=(nian)/10*16+(nian)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
write_1302(0x8c,temp);//向DS1302內(nèi)寫年份寄存器8cH寫入調(diào)整后的年份數(shù)據(jù)BCD碼
write_1302(0x8e,0x80);//打開寫保護(hù)
write_1602com(yh+4);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
case 8: write_1602com(er+9); //設(shè)置鬧鐘的秒定時
miao1--;
if(miao1==-1)
miao1=59;
write_sfm(0x08,miao1);//令LCD在正確位置顯示"加"設(shè)定好秒的數(shù)據(jù)
write_1602com(er+9);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置
break;
case 9: write_1602com(er+6); //設(shè)置鬧鐘的分鐘定時
fen1--;
if(fen1==-1)
fen1=59;
write_sfm(0x05,fen1);//令LCD在正確位置顯示"加"設(shè)定好的分?jǐn)?shù)據(jù)
write_1602com(er+6);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
在這里是寫回原來的位置
break;
case 10: write_1602com(er+3); //設(shè)置鬧鐘的小時定時
shi1--;
if(shi1==-1)
shi1=23;
write_sfm(0x02,shi1);//令LCD在正確的位置顯示"加"設(shè)定好的小時數(shù)據(jù) write_1602com(er+3);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
break;
}
}
}
}
}//*******************主函數(shù)**************************
//***************************************************
void main()
{
lcd_init(); //調(diào)用液晶屏初始化子函數(shù)
ds1302_init(); //調(diào)用DS1302時鐘的初始化子函數(shù)
init(); //調(diào)用定時計數(shù)器的設(shè)置子函數(shù)
led=0; //打開LCD的背光電源
buzzer=0;//蜂鳴器長響一次
delay(80);
buzzer=1;
while(1) //無限循環(huán)下面的語句:
{
keyscan(); //調(diào)用鍵盤掃描子函數(shù)
}
}/*************通過定時中斷實現(xiàn)定是獨處并顯示數(shù)據(jù)******************/
void timer0() interrupt 1 //取得并顯示日歷和時間
{
//Init_DS18B20();//溫度傳感器DS18b2初始化子函數(shù),在頭文件中
flag=ReadTemperature();//將18b2頭文件運行返回的函數(shù)結(jié)果送到變量FLAG中,用于
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
顯示
//讀取秒時分周日月年七個數(shù)據(jù)(DS1302的讀寄存器與寫寄存器不一樣):
miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));
//顯示溫度、秒、時、分?jǐn)?shù)據(jù):
write_temp(12,flag);//顯示溫度,從第二行第12個字符后開始顯示
write_sfm(8,miao);//秒,從第二行第8個字后開始顯示(調(diào)用時分秒顯示子函數(shù)) write_sfm(5,fen);//分,從第二行第5個字符后開始顯示
write_sfm(2,shi);//小時,從第二行第2個字符后開始顯示
//顯示日、月、年數(shù)據(jù):
write_nyr(9,ri);//日期,從第二行第9個字符后開始顯示
write_nyr(6,yue);//月份,從第二行第6個字符后開始顯示
write_nyr(3,nian);//年,從第二行第3個字符后開始顯示
write_week(week);
/***********整點報時程序************/
if(fen==0&&miao==0)
if(shi<22&&shi>6 )
{
buzzer=0;//蜂鳴器短響一次
delay(20);
buzzer=1;
}
/**************鬧鐘程序: 將暫停鍵按下停止蜂鳴********************/
if(shi1==shi&&fen1==fen&&miao==0)
{
clock=1;
}
if(clock==1)
{
buzzer=0;//蜂鳴器短響一次
delay(20);
buzzer=1;
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
}
if(CLO==0) /*按下p1.3停止蜂鳴*/
clock=0;
}
四:心得體會
編程其實是一件藝術(shù),自己在里面任意發(fā)揮,自主創(chuàng)新,實現(xiàn)自己的目的。[]編程的感覺是很美妙的,很能增強我們的自信心。編程又是十分重要的,生活中無處不見程序,各種自動控制都用到程序,很有用,自己把編程學(xué)好就能成為一個有技術(shù)的人,成功的人,所以要加強編程,在大學(xué)期間讓自己的代碼量達(dá)到一定的高度,從而產(chǎn)生從量變到質(zhì)變的效果,對自己的以后很有幫助。把編程當(dāng)成一個游戲來玩,和電腦直接對話,在千百次的調(diào)試中發(fā)現(xiàn)自己犯的錯誤,了解程序的執(zhí)行過程,意外發(fā)現(xiàn)一些自己不知道的東西,這是很有收獲的!時常編程,時常把自己想到的問題用程序來實現(xiàn),在學(xué)習(xí)期間我就不會寂寞,也會不斷肯定自己,不斷提高自己!
本次試驗使我對DS1302、DS18B20、單片機定時功能等有了更深的認(rèn)識。在反復(fù)調(diào)試的過程中更是鍛煉了我的耐心,以及培養(yǎng)了我對編程的強烈興趣。尤其是閏年、平年二月日期的顯示問題,此問題我最初根本就沒有考慮到,在最后才解決。雖然編寫過程中有參考其他程序,而且有些子程序(如DS1802、LCD)是直接調(diào)用的,但的的確確在理解的程度上完成了主程序。也因此覺得自己的實驗是對自己負(fù)責(zé)的,并非盲目COPY完成的,也使得自己的編程能力提高了一些,只是我還是比較習(xí)慣用C語言編程,匯編能力還有待加強哦,O(∩_∩)O~!相比硬件,我想我還是更喜歡編程滴,雖然有些糾結(jié),雖然自己現(xiàn)有的知識甚是缺乏,嘿嘿!所以,我今后定會更加努力的學(xué)習(xí)相關(guān)理論知識,并運用于實踐中,加油!~
單片機課程設(shè)計摘要 單片機課程設(shè)計報告
[)
本文編號:1872826
本文鏈接:http://sikaile.net/wenshubaike/mfmb/1872826.html