第一篇:AVR單片機的時鐘設計(范文)
基于AVR單片機Mega16的時鐘設計報告
1摘 要
近年來隨著計算機在社會領域的滲透和大規(guī)模集成電路的發(fā)展,單片機的應用正在不斷地走向深入,由于它具有功能強,體積小,功耗低,價格便宜,工作可靠,使用方便等特點,因此越來越廣泛地應用各個領域.本文的電子鐘系統(tǒng)是以單片機(ATmega16)為核心,時鐘芯片、數(shù)碼管顯示驅(qū)動芯片等元器件組成。具體介紹應用Proteus的ISIS軟件進行單片機系統(tǒng)的電子鐘設計與仿真的實現(xiàn)方法。該方法既能準確驗證所設計的系統(tǒng)是否滿足技術要求,又能提高系統(tǒng)設計的效率和質(zhì)量,降低開發(fā)成本,具有推廣價值。
關鍵詞:單片機; 時鐘芯片 ;數(shù)碼管顯示驅(qū)動芯片 ;電子鐘
2引 言
單片機電子時鐘系統(tǒng)可以用多種技術手段實現(xiàn)。本文借助于Proteus仿真系統(tǒng)進行系統(tǒng)虛擬開發(fā)成功之后再進行實際操作,可以節(jié)約開發(fā)時間,降低開發(fā)成本,具有很大的靈活性和可擴展性。在國外有包括斯坦福、劍橋等在內(nèi)的幾千家高校將Proteus作為電子工程學位的教學和實驗平臺;在國內(nèi)也有眾多大學正在體驗Proteus的獨一無二的功能并申報大學計劃。該方法具有普遍意義。通過實際應用發(fā)現(xiàn),采用該方法可以大大簡化硬件電路測試和系統(tǒng)調(diào)試過程中電路板制作、元器件安裝、焊接等過程。很明顯,使用該方法可以提高開發(fā)效率、降低開發(fā)成本、提升開發(fā)…
AVR系列的單片機不僅具有良好的集成性能,而且都具備在線編程接口,其中的系列還具備仿真和下載功能;含有片內(nèi)看門狗電路、片內(nèi)程序FLASH、同步串行接口SPI;多數(shù)AVR單片機還內(nèi)嵌了A/D轉(zhuǎn)換器、EEPROM、模擬比較器、PWM定時計數(shù)器等多種功能;AVR單片機的I/O接口具有很強的驅(qū)動能力,灌人電流可直接驅(qū)動繼電器、LED等元件,從而省去驅(qū)動電路,節(jié)約系統(tǒng)成本。
3設計思路
利用單片機(ATmega16)制作簡易電子時鐘,由六個LED數(shù)碼管分別顯示小時十位、小時個位、分鐘十位、分鐘個位、秒鐘十位、秒鐘個位。6個PNP管分別控制六個數(shù)碼管的亮滅,此外還可以實現(xiàn)時間調(diào)整、等多種實用功能。整個設計分硬件和軟件兩大部分。硬件部分采用MEGA16單片機作為可編程芯片,字符液晶作為信號顯示;軟件部分利用C語言作為設計語言,對MEGA16進行編程實現(xiàn)各種功能。
硬件設計電路分解為單片機、晶體振蕩器和數(shù)碼管3個部分,其結(jié)構簡單,經(jīng)濟實惠。單片機內(nèi)部晶體振蕩器的外接電路。由兩個電容和晶體振蕩器構成,其電路如圖1所示。圖中X1和X2分別接MEGA16的兩個脈沖控制端,使得MEGA16的內(nèi)部脈沖電路為電子時鐘和整個系統(tǒng)時鐘提供脈沖。
圖1所示給出了采用單片機外加電源及晶體振蕩器構成最小單片機系統(tǒng)。配合單片機開發(fā)的設計、調(diào)試和下載,最終將時鐘信息從端口輸出到字符液晶顯示。
圖26位模式與單片機的端口相連。
4軟件設計及調(diào)試過程
軟件設計包括Proteus的ISIS軟件、Code Vision AVR編輯軟件和AVRStudio4調(diào)試。利用ISP將生成程序timer.cof 下載到目標板。其主要程序如下:
void display(void)// 6 位LED 數(shù)碼管動態(tài)掃描函數(shù)
{
PORTC = 0xff;
PORTA = led_7[dis_buff[posit]];
if(point_on &&(posit==2||posit==4))PORTA |= 0x80;
PORTC = position[posit];
if(++posit >=6)posit = 0;
}
// Timer 0 比較匹配中斷服務
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
display();// 調(diào)用LED 掃描顯示
if(++time_counter>=100)
{
time_counter = 0;
time_1s_ok = 1;
}
}
void time_to_disbuffer(void)// 時鐘時間送顯示緩沖區(qū)函數(shù)
{
char i,j=0;
for(i=0;i<=2;i++)
{
dis_buff[j++] = time[i] % 10;
dis_buff[j++] = time[i] / 10;
}
}
// INT0 中斷服務程序
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if(++time[2]>=24)time[2] = 0;
}
// INT1 中斷服務程序
interrupt [EXT_INT1] void ext_int1_isr(void)
{
if(++time[1]>=60)time[1]=0;
}
void main(void)
{
PORTA=0x00;// 顯示控制I/O 端口初始化
DDRA=0xFF;
PORTC=0x3F;
DDRC=0x3F;// T/C0 初始化
PORTA=0xFF;
DDRA=0xFF;
GICR|=0xC0;// 允許INT0、INT1 中斷
MCUCR=0x0A;// INT0、INT1 下降沿觸發(fā)
GIFR=0xC0;// 清除INT0、INT1 中斷標志位
TCCR0=0x0B;// 內(nèi)部時鐘,64 分頻(4M/64=62.5KHz),CTC 模式
TCNT0=0x00;
OCR0=0x7C;// OCR0 = 0x7C(124),(124+1)/62.5=2ms
TIMSK=0x02;// 允許T/C0 比較匹配中斷
time[2] = 14;time[1] = 01;time[0] = 55;// 設時間初值23:58:5
5posit = 0;
time_to_disbuffer();
#asm(“sei”)// 開放全局中斷
while(1)
{
if(time_1s_ok)// 1 秒到
{
time_1s_ok = 0;
point_on = ~point_on;
if(++time[0] >= 60)// 以下時間調(diào)整
{
time[0] = 0;
if(++time[1] >= 60)
{
time[1] = 0;
if(++time[2] >= 24)time[2] = 0;
}
} time_to_disbuffer();// 新調(diào)整好的時間送顯示緩沖區(qū)
5總結(jié)心得
這次設計報告培養(yǎng)了學生綜合運用所學知識,發(fā)現(xiàn),提出,分析和解決問題,鍛煉實踐能力的重要環(huán)節(jié),是對學生實際工作能力的具體訓練和考察過程.隨著科學技術發(fā)展的日新日異,單片機已經(jīng)成為當今計算機應用中空前活躍的領域,在生活中可以說得是無處不在。因此作為二十一世紀的大學來說掌握單片機的開發(fā)技術是十分重要的。
回顧起此次單片機設計,我仍感慨頗多,的確,從選題到定稿,從理論到仿真,在這些日子里,我學到很多很多的的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次設計使我懂得了理論與實際相結(jié)合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題,同時在設計的過程中發(fā)現(xiàn)了自己的不足之處,對以前所學過的知識理解得不夠深刻,掌握得不夠牢固,比如說不懂一些元器件的使用方法,對單片機匯編語言掌握得不好……通過這次課程設計之后,一定把以前所學過的知識重新溫故。
這次設計終于順利完成了,在設計中遇到了很多編程問題,最后在老師的辛勤指導下,終于游逆而解。同時,在老師那里我學得到很多實用的知識,在次我表示感謝!同時,對給過我?guī)椭乃型瑢W和各位指導老師再次表示忠心的感謝!
}結(jié)束語
單片機自20世紀70年代問世以來,以其極高的性能價格比,受到人們的重視和關注,應用很廣、發(fā)展很快。單片機體積小、重量輕、抗干擾能力強、環(huán)境要求不高、價格低廉、可靠性高、靈活性好、開發(fā)較為容易。尤其是AVR單片機可以用高級語言編程,極容易地實現(xiàn)系統(tǒng)移植,并且加快了軟件的開發(fā)過程。這次設計通過對它的學習、應用,以Mage16單片機為核心,輔以必要的電路,采用高級C語言編程,設汁了一個簡易的電子時鐘,由
4.5 V直流電源供電,通過數(shù)碼管能夠準確顯示時間。
第二篇:學avr單片機的建議
學avr單片機的建議
建議,(1)做工控首選PLC,實現(xiàn)簡單安全可靠開發(fā)周期很短,不用很系統(tǒng)的學,買一本教材看看就行了,選型也別挑花眼,就選西門子,不用一下就想學會所有的功能,簡單的起步,做項目的同時逐漸延伸。
(2)如果要學單片機,8位機就選avr,型號齊全,一個公司做的,資料統(tǒng)一,實現(xiàn)容易。編譯器就用icc avr7.22(不用破解,沒有bug),仿真軟件就用avr studio4.17(免費下載,最新版式4.18,需要注冊才能下載,我閑麻煩就用4.17),到的網(wǎng)站上免費下載。建議買兩本書《avr單片機c語言開發(fā)入門指導》清華大學出版社的,還有就是《avr單片機嵌入式原理與應用實踐》馬潮、北航。兩本書足以。第一本書主要介紹icc,其余的各種編譯器也做了詳細介紹,都是經(jīng)典之作(他的icc版本很低,你用7.22的話有些程序定義部分需要改動,還好icc有自動生成代碼框架的功能)。第二本書主要以cva編譯器為背景,里面的編程思路是國產(chǎn)教材的經(jīng)典(不用刻意學cva,主要看看編程思路)。-
到網(wǎng)上再下一個(10天學會avr單片機,葉大鵬老師講的,以icc為背景),真的10天就可以學會.然后最重要的就是到淘寶上買一個avr單片機實驗板100元左右的就不錯。到此你的avr全套學習和實驗系統(tǒng)就全了,很全別的東西都不需要了。
網(wǎng)絡上有關于個各種編譯器的好壞之爭,我覺得icc就很好,所有編譯器里最簡單好用的。gcc avr也很好(winavr),到百度里搜winavr,到他的官網(wǎng)下個最新的。網(wǎng)絡里有關于它的介紹總是很復雜(網(wǎng)絡里的gcc avr學習的帖子過時了),其實科技進步了,他也進步了,你用一個winavr+avr studio,就可以構造一個正版的免費的有固定ide界面的(用的avr studio界面)編譯系統(tǒng)和仿真系統(tǒng).最新的gcc是20100110版的,他升級很快,每個版本編程時有地方會不同,你在老版本下通過,到新版本下不一定通過,所以需要固定一個版本使用,并且要認真看看gcc avr的幫助文件(都是英文的,建議打印出來仔細看,這很重要,關于教材上的定義中斷的方式在2010下肯定不能用,所以需要看幫助里的中斷定義方面的改動和其余的勘誤說明)。我現(xiàn)在就用gcc做工程,暫時沒有發(fā)現(xiàn)有問題。
avr的介紹就到這里,還有就是要仔細看看你所用avr芯片的手冊,不管什么編譯器,他的頭文件里寄存器定義都和手冊里的寄存器名相同的,這很重要,否則教材上介紹的mega16,當你換用mega128時就不會用了,達到觸類旁通是我們的目標。到atmel網(wǎng)站里可以下載手冊和相關的開發(fā)說明。編譯器選擇要么icc要么gcc,不要用iar和別的。以我的經(jīng)驗從零到做項目需要3個月時間。
單片機就是個控制器和工具,如果要做工程靠他還不夠,你要經(jīng)常看看電路系統(tǒng)構成和強電、弱電、測控、數(shù)據(jù)信號傳輸方面的綜合知識,如果你要只停留在單片機方面就失敗了。還要會畫電路圖(就用altium designer winter09).好了,祝你早日精通單片機。
哦,對了,科技進步今非昔比,如果要學一種芯片何不學一種再先進一點的呢,比如arm的。切記:選擇一種芯片和編譯器把它學會,不要為別人的說法所動搖。
第三篇:基于單片機的時鐘控制器設計
時鐘控制器設計任務書
1.設計目的與要求
設計出一個用于數(shù)字時鐘的控制器,準確地理解有關要求,獨立完成系統(tǒng)設計,要求所設計的電路具有以下功能:
(1)顯示: 可以顯示時、分和秒
(2)調(diào)時功能:時(0-24)、分和秒(0-60)可以連續(xù)可調(diào)(3)時間日誤差< 2秒(4)增加整點報時功能(5)增加鬧鐘任意設定功能 2.設計內(nèi)容
(1)畫出電路原理圖,正確使用邏輯關系;(2)確定元器件及元件參數(shù);(3)進行電路模擬仿真;(4)SCH文件生成與打印輸出;(5)PCB文件生成與打印輸出; 3.編寫設計報告
寫出設計的全過程,附上有關資料和圖紙,有心得體會。4.答辯
在規(guī)定時間內(nèi),完成敘述并回答問題。
目錄
1.引言…………………………………………………………………………-1-2 總體設計方案………………………………………………………………-1-2.1 設計思路…………………………………………………………………-1-2.2 方案確立…………………………………………………………………-1-2.3 設計方框圖………………………………………………………………-2-3 設計原理分析………………………………………………………………-2-3.1 系統(tǒng)硬件電路設計 ……………………………………………………-2-3.2 主控器件AT89S51 ………………………………………………………-2-3.3 譯碼器74HC245 …………………………………………………………-3-3.4 顯示電路 …………………………………………………………………3-3.5 按鍵電路…………………………………………………………………-4-3.6 復位電路…………………………………………………………………-4-3.7 蜂鳴電路…………………………………………………………………-5-3.8 時鐘電路…………………………………………………………………-5-3.9 總體原理圖………………………………………………………………-5-3.10程序框圖…………………………………………………………………-5-4 結(jié)束語………………………………………………………………………-7-參考文獻………………………………………………………………………-8-附錄 1 電路總原理圖 ………………………………………………………-9-附錄 2 總程序………………………………………………………………-10-
基于單片機控制的時鐘控制器
摘要:本設計以Atmel公司的AT89S51單片機為控制系統(tǒng)的核心,模型采用單片機作為主控制器,以匯編語言為程序設計的基礎,設計的一個用兩個四位一體數(shù)碼管串口顯示的時鐘控制電路,包含了時鐘控制電路的基本功能:數(shù)碼顯示,時間調(diào)整,鬧鐘設定,秒表顯示等,按照二十四小時循環(huán),具有調(diào)節(jié)方便,簡單實用,可靠性強的優(yōu)點,有很高的利用價值。關鍵詞:單片機 AT89C51 74LS245 數(shù)碼管 引言
數(shù)字鐘是采用數(shù)字電路實現(xiàn)對時、分、秒及數(shù)字顯示的計時裝置,廣泛用于個人家庭、車站、碼頭、辦公室等公共場所,成為人們?nèi)粘I钪胁豢缮俚谋匦杵罚捎跀?shù)字集成電路的發(fā)展和石英晶體振蕩器的廣泛應用,使得數(shù)字鐘的精度,遠遠超過老式鐘表,鐘表的數(shù)字化給人們生產(chǎn)生活帶來了極大的方便,而且大大地擴展了鐘表原先的報時功能。諸如定時自動報警、按時自動打鈴、時間程序自動控制、定時廣播、自動起閉路燈、定時開關烘箱、通斷動力設備、甚至各種定時電氣的自動啟用等,所有這些,都是以鐘表數(shù)字化為基礎的。因此,研究數(shù)字鐘及擴大其應用,有著非常現(xiàn)實的意義。為了適應時代的潮流,本設計采用AT89S51單片機為核心,使得計時的精度有了很大的提高,而且調(diào)節(jié)也變的簡單實用,采用數(shù)字顯示也跟加的直觀方便。總體設計方案
2.1 設計思路
本設計采用AT89S51單片機為控制核心,產(chǎn)生精確的時鐘震蕩,來控制數(shù)碼管顯示電路來進行數(shù)碼顯示,外圍電路主要有復位電路,震蕩電路,按鍵電路,顯示電路,蜂鳴電路組成;復位電路可及時的對單片機進行復位,恢復到初始的狀態(tài),震蕩電路主要用于計數(shù),定時,產(chǎn)生合適的波特率,按鍵電路主要是給人們提供一個合適的人機對話的界面,方便人們進行實時的調(diào)節(jié),顯示電路主要用于數(shù)碼的顯示,蜂鳴電路用于鬧鈴設定等輔助功能。2.2 方案確立
本設計主要有包含了時鐘電路,按鍵掃描,顯示電路等幾個部分。由單片機實現(xiàn)時鐘功能單片機內(nèi)部具有定時器,可方便實現(xiàn)定時功能。按鍵電路:鍵盤分為矩陣式鍵盤掃描電路和獨立式按鍵電路。。矩陣式鍵盤電路,此類鍵盤是采用行列掃描方式,優(yōu)點是當按鍵較多時可以降低占用單片機的I/O口數(shù)目,缺點是電路復雜且會加大編程難度。獨立按鍵電路,每個鍵單獨占有一根I/O接口線,每個I/O口的工作狀態(tài)互不影響,此類鍵盤采用端口直接掃描方式。缺點是當按鍵較多時占用單片機的I/O數(shù)目較多,優(yōu)點是電路設計簡單,且編程極其容易。由于該系統(tǒng)采用了常規(guī)鐘表式的校對方式,用鍵較少,系統(tǒng)資源足夠用,故采用了獨立按鍵電路。顯示電路分為:靜態(tài)顯示法與動態(tài)顯示法,由于靜態(tài)顯示法需要數(shù)據(jù)鎖存器等硬件,接口復雜一些,又考慮到時鐘顯示只有6位,且系統(tǒng)沒有其它復雜的處理任務,所以決定采用動態(tài)顯示法。2.3 硬件設計方框圖
電路的設計以AT89S51單片機為核心,包含了按鍵電路,復位電路,震蕩電路,數(shù) 碼顯示電路,整點報時電路等一系列獨立環(huán)節(jié),下面介紹一下電路設計過程中的總體框圖,如圖1所示。
圖1 時鐘電路總體框圖 設計原理分析
用AT89S51單片機控制的數(shù)字時鐘電路,外接震蕩電路,按鍵電路,顯示電路,蜂鳴電路等:用單片機電路P0口來輸出7段碼數(shù)據(jù),P2.0~P2.5口作列掃描輸出;按鍵用P1口控制,分別用于調(diào)節(jié)時,分,以及秒表和鬧鐘的設定;P1.7口接5V的小蜂鳴器,用于按鍵發(fā)音以及定時提醒,整點報時提醒等;采用74HC245作為數(shù)碼管的段碼驅(qū)動,為了提供共陽LED數(shù)碼管的列掃描驅(qū)動電壓,用三極管8550做電源的驅(qū)動輸出;采用12MHZ晶振,可提高秒計時的精確性;在軟件設計方面,應完成時鐘控制電路的各項要求。
3.1 系統(tǒng)硬件電路設計
系統(tǒng)硬件電路主要組成:主控制器AT89S52、譯碼器74HC245、顯示電路、蜂鳴器電路,復位電路時鐘電路。3.2 主控器件AT89C51 AT89S51是一款低功耗,高性能CMOS 8位單片機,片內(nèi)含4k Bytes ISP(In-system programmable)的可反復擦寫1000次的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術制造,兼容標準MCS-51指令系統(tǒng)及80C51引腳結(jié)構,芯片內(nèi)集成了通用8位中央處理器和ISP Flash存儲單元,AT89S51在眾多嵌入式控制應用系統(tǒng)中得到廣泛應用。管腳如圖2所示。
圖2 DIP-40封裝89C51引腳圖
3.3譯碼器74LS245 74LS245是我們常用的芯片,用來驅(qū)動led或者其他的設備,它是8路同相三態(tài)雙向總線收發(fā)器,可雙向傳輸數(shù)據(jù)。74LS245還具有雙向三態(tài)功能,既可以輸出,也可以輸入數(shù)據(jù)。當89S51單片機的P0口總線負載達到或超過P0最大負載能力時,必須接入74LS245等總線驅(qū)動器。當片選端/CE低電平有效時,DIR=“0”,信號由 B 向 A 傳輸;(接收)DIR=“1”,信號由 A 向 B 傳輸;(發(fā)送)當CE為高電平時,A、B均為高阻態(tài)。P0口與74LS245輸入端相連,E端接地,保證數(shù)據(jù)線暢通。管腳如圖3所示。
圖3 74LS245管腳圖
3.4 顯示電路
LED顯示塊是由發(fā)光二極管顯示字段的顯示器件。這種顯示塊有共陰與共陽兩種結(jié)構。共陰極LED顯示塊的發(fā)光二極管陰極共地,當某個發(fā)光二極管的陽極為高電平時,發(fā)光二極管點亮。共陽極LED顯示塊的放光二極管陽極并接。顯示塊與單片機接口非常容易,只要將一個8位并行輸出口語顯示塊的發(fā)光二極管引腳相連即可(AT89S51需要加上拉電阻)。此次電路采用2個4位共陽LED數(shù)碼管,從P0口輸出段碼,列掃描用P2.0~P2.7來實現(xiàn)。如圖4所示。
圖4 74LS245驅(qū)動段碼顯示電路圖
3.5 按鍵電路
按鍵調(diào)節(jié)電路有四個獨立的按鍵接到P1口的P1.0—P1.3端口,控制著電路的調(diào)時,調(diào)分以及秒表功能和鬧鐘的設定。具體電路如下圖5所示。
圖5 按鍵電路圖
3.6 復位電路
AT89S51單片機的復位電路,如圖5所示中左邊電路。在RESET輸入端出現(xiàn)高電平時實現(xiàn)復位和初始化。在震蕩器運行的情況下,要實現(xiàn)復位操作,必須使RST引腳至少 保持兩個機器周期的高電平。在CPU在第二個機器周期內(nèi)執(zhí)行內(nèi)部復位操作,以后每一個機器周期重復一次,直至RST端電平變低復位期間不產(chǎn)生ALE信號。當RST引腳返回低電平以后,CPU從0地址開始執(zhí)行程序。3.7 蜂鳴電路
蜂鳴器是廣泛應用于各種電子產(chǎn)品的一種元器件,它用于提示、報警、音樂等許多應用場合。三極管8550作蜂鳴器的驅(qū)動,增加了蜂鳴器的驅(qū)動電流。蜂鳴器的正極性的一端接到三極管的集電極,另一端連接到地,三極管的基極由單片機的P1.7管腳控制,底電平時蜂鳴器響,高電平時不響。另外,蜂鳴器的聲音大小及音調(diào)可以通過調(diào)整P1.7管腳的置低時間及輸出的波形進行控制。蜂鳴器的連接電路的原理圖如圖5所示。3.8 時鐘電路
AT89S51內(nèi)部片內(nèi)有一個由反相放大器構成的振蕩電路,XTAL1和XTAL2分別為震蕩電路的輸入端和輸出端。時鐘可以由內(nèi)部方式產(chǎn)生或外部方式產(chǎn)生。在XTAL1和XTAL2引腳上外接定時元件,內(nèi)部震蕩電路就產(chǎn)生自己震蕩。定時元件通常采用石英晶體和電容組成的并聯(lián)諧振回路。外部方式的時鐘電路,XTAL1接地,XTAL2接外部振蕩器。一般要求輸入方波信號的頻率低于33Mhz。本文設計的系統(tǒng)采用的是內(nèi)部方式的時鐘電路。如圖6所示。
圖6 時鐘電路原理圖
3.9 總體原理圖
見附錄1 3.10程序框圖
主程序如圖7所示首先是初始化部分,主要是計時單元清零,中斷初始化,啟動定時器工作,然后是調(diào)用顯示子程序,接著是判斷有無按鍵。無按鍵則回到調(diào)用顯示子程序處;有按鍵,則執(zhí)行按鍵處理子程序,執(zhí)行完后回到調(diào)用顯示子程序處,重復循環(huán)。定時器T0中斷如圖8所示
圖7 主程序流程圖
圖8 中斷程序流程圖 結(jié)束語
三周實習很快就過去了,通過自行設計、焊接和調(diào)試一個單片機系統(tǒng),我熟悉了單片機基本的開發(fā)流程和單片機的深入學習。在完成這個設計的同時,我復習了書本上的許多相關內(nèi)容,受益匪淺。因此我在獲得理論知識的同時,實踐中也獲得了許多書本上沒有的東西。提高了調(diào)試以及查找并解決問題的能力,我深入了解了焊普通元件與電路元件的技巧、數(shù)字時鐘的工作原理及其它各電路元件的作用等。這些知識不僅在課堂上有效,對以后的學習工作有很大的指導意義,在日常生活中更是有著現(xiàn)實意義;也對自己的動手能力是個很大的鍛煉。實踐出真知,縱觀古今,所有發(fā)明創(chuàng)造無一不是在實踐中得到檢驗的。沒有足夠的動手能力,就奢談在未來的科研尤其是實驗研究中有所成就。最后,感謝老師對我們這次實習的辛勤指導和幫助。
參考文獻
[1] 李光飛,樓然苗,胡佳文編著.單片機課程設計實例指導.北京:北京航空航天大學出版社.2004 [2] 黃仁欣主編.單片機原理及應用技術.北京: 清華大學出版社.2005.[3] 高吉祥主編.電子技術基礎實驗與課程設計.北京:電子工業(yè)出版社.2002 [4] 肖玲妮.印刷電路板設計教程.[M].北京:清華大學出版社,2003.[5] 康華光.電子技術基礎.[M].北京;高等教育出版社,2006.[6] 余小平等.電子系統(tǒng)設計.[M].北京:北京航空航天大學出版社,2007.附錄1: 11 電路總原理圖
附錄2: 總程序
ORG 0000H LJMP START ORG 000BH LJMP INIT0 START: MOV 70H,#0 MOV 71H,#0 MOV 72H,#0 MOV 73H,#0 MOV 74H,#0 MOV 75H,#0 MOV 76H,#0 MOV 77H,#0 MOV 78H,#0 MOV 79H,#0 MOV 7AH,#0 MOV 7BH,#0 MOV 7CH,#0 MOV 7DH,#0 MOV 7EH,#0 MOV 72H,#0AH;對連字符進行裝值
MOV 75H,#0AH MOV 60H,#0 MOV 61H,#0 MOV 63H,#0 MOV 64H,#0 CLR P1.7 MOV TMOD,#01H;選擇定時器/計數(shù)器T0的方式1 MOV TL0,#0B0H;對低位賦初值 MOV TH0,#03CH;高位賦初值 SETB EA SETB ET0 SETB TR0 START1: LCALL SCAN LCALL KEYSCAN SJMP START1 DL1MS: MOV R6,#14H;延時1子程序 DL1: MOV R7,#19H DL2: DJNZ R7,DL2 DJNZ R6,DL1 RET DELAY: MOV R6,#10 D1: MOV R7,#30 DJNZ R7,$ DJNZ R6,D1 RET
DL20MS: ACALL SCAN;延時20ms子程序 ACALL SCAN ACALL SCAN RET
;整點報時將秒和分的單元與零比較 SCAN: MOV A,7EH;7F單元的內(nèi)容為0
CJNE A,79H,NEXT MOV A,7DH
CJNE A,7AH,NEXT SETB P1.7 AJMP NEXT1 NEXT: CLR P1.7 NEXT1:
MOV A,79H
CJNE A,#0,NEXT2 MOV A,78H
CJNE A,#0,NEXT2 SETB P1.7 LJMP NEXT3 NEXT2:CLR P1.7
;數(shù)碼管總顯示程序開始分兩部分
;校正時間和數(shù)碼管正常工作的顯示程序 NEXT3: MOV A,78H MOV B,#0AH
DIV AB;時間秒的十位送給A,時間秒的個位送B
MOV 71H,A;時間秒要顯示的十位
MOV 70H,B;時間秒要顯示的個位
MOV A,79H MOV B,#0AH
DIV AB;時間分的十位送給A,時間分的個位送B
MOV 74H,A;時間分要顯示的十位送地址
MOV 73H,B;時間分要顯示的個位送地址
MOV A,7AH MOV B,#0AH DIV AB;時間時的十位送給A,時間時的個位送B MOV 77H,A;時間時顯示的十位送地址
MOV 76H,B;時間時要顯示的個位送地址
MOV R1,#70H LCALL DL1MS JB P1.2,LAST HERE3:JNB P1.2,HERE3 INC 7EH MOV A,7EH
CJNE A,#3CH,LOOP3 MOV 7EH,#00H;調(diào)制鬧鈴的時間顯示 LOOP3: MOV DPTR,#TAB MOV R5,#0FEH MOV A,7DH MOV R3,#09H
MOV B,#10 SCAN1: MOV A,R5;數(shù)碼管正常工作的顯 DIV AB 示程序
MOV 64H,A MOV P2,A MOV 63H,B MOV A,@R1 MOV A,7EH MOV DPTR,#TAB
MOV B,#10 MOVC A,@A+DPTR;對字段表取值 DIV AB 顯示
MOV 61H,A MOV P0,A MOV 60H,B MOV A,R5 MOV P2,#0F7H LCALL DL1MS MOV A,60H INC R1 MOVC A,@A+DPTR MOV A,R5 MOV P0,A RL A LCALL DELAY MOV R5,A MOV P2,#0EFH DJNZ R3,SCAN1 MOV A,61H MOV P2,#00H MOVC A,@A+DPTR MOV P0,#00H MOV P0,A JB P1.3,QQ LCALL DELAY LCALL DL1MS MOV P2,#0DFH JB P1.3,QQ MOV P0,#40H HERE: JNB P1.3,HERE LCALL DELAY SJMP LOOP1 MOV P2,#0BFH
MOV A,63H QQ: LJMP LAST MOVC A,@A+DPTR LOOP1:JB P1.1,LOOP2 MOV P0,A LCALL DL1MS LCALL DELAY JB P1.1,LOOP2 MOV P2,#07FH HERE1:JNB P1.1,HERE1 MOV A,64H INC 7DH MOVC A,@A+DPTR MOV A,7DH
MOV P0,A CJNE A,#18H,LOOP2 LCALL DELAY MOV 7DH,#00H JB P1.3,LOOP4 LOOP2:JB P1.2,LOOP3 LCALL DL1MS 14 JB P1.3,LOOP4 HERE4:JNB P1.3,HERE4 LJMP LAST LOOP4:LJMP LOOP1 LAST: RET;“0~9”和“-”的字段表 TAB:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
;定時/計數(shù)器T0中斷程序 INIT0: PUSH ACC PUSH PSW CLR ET0 CLR TR0 MOV TL0,#0B0H MOV TH0,#03CH SETB TR0 INC 7BH MOV A,7BH CJNE A,#14H,OUTT0;50ms是否到20次,沒有到就繼續(xù)執(zhí)行50ms的延時
MOV 7BH,#00 INC 78H MOV A,78H CJNE A,#3CH,OUTT0;一秒的延時是否計到60次,沒有就繼續(xù)執(zhí)行
MOV 78H,#00 INC 79H MOV A,79H CJNE A,#3CH,OUTT0 MOV 79H,#00 INC 7AH MOV A,7AH CJNE A,#18H,OUTT0;60分鐘的延時是否計到24次,沒有就繼續(xù)執(zhí)行程序 MOV 7AH,#00 OUTT0: SETB ET0;啟動定時器T0 POP PSW POP ACC RETI;按鍵處理程序 KEYSCAN:CLR EA
JNB P1.0,KEYSCAN0;P1.0有按鍵按下則跳轉(zhuǎn)到子程序
JNB P1.1,KEYSCAN1;P1.1有按鍵按下則跳轉(zhuǎn)到子程序
JNB P1.2,KEYSCAN2;P1.2有按鍵按下則跳轉(zhuǎn)到子程序
KEYOUT: SETB EA RET
KEYSCAN0:LCALL DL20MS;20ms的延時消抖
JB P1.0,KEYOUT WAIT0: JNB P1.0,WAIT0;判斷按鍵是否松手,松手就往下執(zhí)行程序 INC 7CH MOV A,7CH CLR ET0 CLR TR0
CJNE A,#04H,KEYOUT;按下第一次和第二次對時、分選定
MOV 7CH,#00;按下第三次時就啟動計時
SETB ET0 SETB TR0 LJMP KEYOUT
KEYSCAN1:LCALL DL20MS;按鍵加一的程序
JB P1.1,KEYOUT WAIT1: JNB P1.1,WAIT1 MOV A,7CH
CJNE A,#03H,KSCAN11;如果功能鍵按下則對時加一調(diào)整 INC 78H MOV A,78H
CJNE A,#60,KEYOUT MOV 78H,#00 LJMP KEYOUT
KSCAN11: CJNE A,#02H,KSCAN12 INC 79H MOV A,79H
CJNE A,#60,KEYOUT;如果加到60則清零
MOV 79H,#00 LJMP KEYOUT KSCAN12:CJNE A,#01H,KEYOUT INC 7AH;如果功能鍵是按下第二次則對分進行加一調(diào)整
MOV A,7AH CJNE A,#18H,KEYOUT MOV 7AH,#00 LJMP KEYOUT KEYSCAN2:LCALL DL20MS;延時消抖程序 JB P1.2,KEYOUT WAIT2: JNB P1.2,WAIT2;判斷是否放開按鍵
MOV A,7CH;如果功能鍵是按下第一次對時進行減一 CJNE A,#03H,KSCAN22 DEC 78H MOV A,78H CJNE A,#00H,KEYOUT MOV 78H,#3BH LJMP KEYOUT KSCAN22:CJNE A,#02H,KSCAN23 DEC 79H MOV A,79H CJNE A,#00H,KEYOUT1 MOV 79H,#3BH LJMP KEYOUT KSCAN23:CJNE A,#01H,KEYOUT1 DEC 7AH MOV A,7AH;如果功能鍵是按下第二次則對分進行減一 CJNE A,#00H,KEYOUT1 MOV 7AH,#17H LJMP KEYOUT1 KEYOUT1: SETB EA RET END
第四篇:基于51單片機電子時鐘設計
基于51單片機的電子時鐘設計
摘要
本電子時鐘以STC89C52單片機作為主控芯片,采用DS12C887時鐘芯片,使用1602液晶作為顯示輸出。該時鐘走時精確,具有鬧鐘設置,以及可同時顯示時間、日期等多種功能。本文將詳細介紹該電子時鐘涉及到的一些基本原理,從硬件和軟件兩方面進行分析。
【關鍵詞】
STC89C52單片機
DS12C887時鐘芯片
1602液晶
蜂鳴器
目錄
一、緒論…………………………………………………………4
1.1 電子時鐘功能…………………………………………1.2設計方案………………………………………………4
二、硬件設計……………………………………………………4
2.151
2.2 單片機部分設計………………………………4
USB供電電路設計………………………………5
2.3 串行通信電路設計………………………………6
2.4DS12C887時鐘芯片電路的設計…………………6
2.51602LCD液晶屏顯示電路設計………………7
2.6
蜂鳴器電路設計………………………………8
2.7
按鍵調(diào)整電路設計…………………………8
三、軟件設計…………………………………………9
3.1 系統(tǒng)程序流程圖設計…………………………9
3.2程序設計……………………………………11
四、心得體會………………………………………………22 參考文獻……………………………………………………23
一、緒
論
1.1電子時鐘功能
(1)在1602液晶上顯示年、月、日、星期、時、分、秒,并且按秒實時更新顯示。(2)具有鬧鈴設定即到時報警功能,報警響起時按任意鍵可取消報警。
(3)能夠使用實驗板上的按鍵隨時調(diào)節(jié)各個參數(shù),四個有效鍵分別為功能選擇鍵、數(shù)值增大鍵、數(shù)值減小鍵和鬧鐘查看鍵。
(4)每次有鍵按下時,蜂鳴器都以短“滴”聲報警。
(5)利用DS12C887自身掉電可繼續(xù)走時的特性,該時鐘可實現(xiàn)斷電時間不停、再次上電時時間仍準確顯示在液晶上的功能。
1.2設計方案
DS12C887時鐘芯片+1602LCD液晶屏
DS12C887時鐘芯片功能豐富、價格適中,能夠自動產(chǎn)生世紀、年、月、日、時、分、秒等時間信息,其內(nèi)部含有世紀寄存器,從而利用硬件電路解決“千年”問題。DS12C887中自帶鋰電池,外部掉電時,其內(nèi)部時間信息還能保持10年之久。1602LCD液晶屏可以輸出2行,每行顯示16個字符。1602LCD液晶屏顯示清晰且不會閃爍,由于液晶屏是數(shù)字式的,因此和單片機系統(tǒng)的接口簡單,操作方便。
以STC89C52為主控芯片,DS12C887為時鐘芯片,1602LCD液晶屏作為顯示器。程序控制DS12C887時鐘芯片實現(xiàn)小時、分、秒和年、月、日的計時,并在1602LCD液晶屏上顯示出來。當時間走到程序所設定的時間時,蜂鳴器響起,起到鬧鐘功能。
二、硬
件
設
計
2.1 51單片機部分設計
單片機部分如圖2—1所示:
以STC89C52單片機為核心,選用12MHZ的晶振,由于晶振的頻率越高,單片機的運行速度就越快,考慮到單片機的運行速度快會導致對存儲器的要求就會變高,因此12MHZ為最佳選擇。外接電容的值雖然沒有嚴格的要求,但是外接電容的大小會影響振蕩器的頻率高低、振蕩器的穩(wěn)定性和起振的快速性,因此選用30pF的電容作為起振電容。復位電路為按鍵高電平復位,當按鍵按下,RES端為高電平,當高電平持續(xù)4us的時間單片機即復位。
2.2 USB供電電路設計
USB供電電路如下圖2—2所示:
該電子時鐘采用USB端口的方式為單片機供電,LPOW1為電源顯示燈,當按鍵S5按下,電源顯示燈LPOW1亮,表示給單片機供+5V電。
2.3 串行通信電路設計
串行通信電路如下圖2—3所示:
圖中通過MAX232進行RS—232電平與單片機TTL電平之間的轉(zhuǎn)換,從而為單片機和上位機之間通信提供通道。通信電路的目的就是讓通信雙方的電平匹配,單片機用的是TTL電平,上位機的串口用的是RS—232電平。TTL電平邏輯1的電壓范圍是+3.3V到+5V,邏輯0的電壓范圍是0到+3.3V;RS—232電平的邏輯1的電壓范圍是—15V到—5V,邏輯0的電壓范圍是+5V到+15V。MAX232可以把輸入的+5V電源電壓變換成為RS—232輸出電平所需的+10V電壓。所以采用此芯片接口的串行通信系統(tǒng)只需單一的+5V電源就可以了。對于沒有+12V電源的場合,其適應性更強,2.4 DS12C887時鐘芯片電路的設計
時鐘芯片電路如下圖2—4所示:
DS12C887時鐘芯片共需要13條信號線,分別是并行數(shù)據(jù)地址復用線AD0~AD7,CS,AS,R/W,DS和IRQ。
MOT—總線操作時序選擇端。它有兩種工作模式,當MOT接
VCC時,選用Motorola模式;當MOT接GND或懸空時,選用Intel模式。NC—空引腳。
AD0~AD7—復用地址數(shù)據(jù)總線。在總線周期的前半部分,出現(xiàn)在AD0~AD7上的是地址信息,可用以選通DS12C887內(nèi)的RAM,總線周期的后半部分出現(xiàn)在AD0~AD7上的是數(shù)據(jù)信息。GND,VCC—系統(tǒng)電源接入端。當
VCC輸入為+5V時,用戶可以訪問DS12C887內(nèi)RAM的輸入小于+4.25V時,禁止用戶對內(nèi)部RAM中的數(shù)據(jù),并可對其進行讀/寫操作;當
VCC進行讀/寫操作,此時用戶不能正確芯片內(nèi)的時間信息;當
VCC的輸入小于+3V時,DS12C887會自動的將電源切換到內(nèi)部自帶的鋰電池上,以保證內(nèi)部的電路能正常工作。
CS—芯片片選端。
AS—地址選通輸入端。在進行讀/寫操作時,AS的上升沿將AD0~AD7上出現(xiàn)的地址信息鎖存到DS12C887上,而下一個下降沿清除AD0~AD7上的地址信息,不論CS是否有效,DS12C887都將執(zhí)行該操作。
R/W—讀/寫輸入端。該引接腳有兩種工作模式,當MOT接
VCC時,R/W工作在Motorola模式。此時該引腳的作用是區(qū)分讀操作還是寫操作,R/W高電平時為讀操作,R/W為低電平時為寫操作;當MOT接GND時,該引腳工作在Intel模式,此時該引腳為寫允許輸入,此信號的上升沿鎖存數(shù)據(jù)。
DS—數(shù)據(jù)選擇或讀輸入腳。該引腳有兩種工作模式,當MOT接
VCC時,選用Motorola模式,此時,每個總線周期后一部分的DS為高電平,稱為數(shù)據(jù)選通。在讀操作中,DS的上升沿使DS12C887將內(nèi)部數(shù)據(jù)送往總線AD0~AD7上,以供外部讀取。在寫操作中,DS的下降沿將使總線AD0~AD7上的數(shù)據(jù)鎖存在DS12C887中。當MOT接GND時,選用Intel模式,此時該引腳是讀允許輸入引腳。
RESET—芯片復位引腳。
IRQ—中斷請求輸出。用作處理器的中斷申請輸入。只要引起中斷的狀態(tài)位置位,并且相應中斷使能位也置位,IRQ將一直保持低電平,處理器程序通常讀取C存儲器來清除IRQ引腳輸出,RESET引腳也會清除未處理的中斷。沒有中斷發(fā)生時,IRQ為高阻狀態(tài),可將多個中斷器件接到一條IRQ總線上,只要它們均為漏極開路輸出即可。IRQ引腳為漏極開路輸出,需要使用一個外接上拉電阻與SQW—方波輸出引腳。當供電電壓
VCC相連。
VCC大于4.25V時,SQW引腳可輸出方波。
2.5 1602LCD液晶屏顯示電路設計
1602LCD液晶屏顯示電路如下圖2—5所示:
1602液晶為5V電壓驅(qū)動,帶背光,可顯示2行,每行16個字符,不能顯示漢字,內(nèi)置含128個字符的ASCII字符集字庫,只有并行接口,無串行接口。接口說明如下:(1)液晶1,2端為電源;15,16為背光電源;為防止直接加5V電壓燒壞背光燈,在15腳串接一個1K?電阻用于限流。
(2)液晶3端為液晶對比度調(diào)節(jié)端,通過一個10K?電位器接地來調(diào)節(jié)液晶顯示對比度。首次使用時,在液晶上電狀態(tài)下,調(diào)節(jié)至液晶上面一行顯示出黑色小格為止。
(3)液晶4端為向液晶控制器寫數(shù)據(jù)/寫命令選擇端,接單片機的P3.5口。
(4)液晶5端為讀/寫選擇端,因為我們不從液晶讀取任何數(shù)據(jù),只向其寫入命令和顯示數(shù)據(jù),因此此端始終選擇為寫狀態(tài),即低電平接地。
(5)液晶6端為使能信號,是操作時必須的信號,接單片機的P3.4口。
2.6 蜂鳴器電路設計
蜂鳴器電路如下圖2—6所示:
蜂鳴器電路接在單片機的P2.3引腳上,當該引腳一個低電平,三極管導通,蜂鳴器發(fā)出聲音作為鬧鈴。
2.7 按鍵調(diào)整電路設計
按鍵調(diào)整電路如下圖2—7所示:
四個獨立鍵盤均采用查詢方式,將按鍵的一端接地,另一端各接一根輸入線直接與STC89C52的I/O口相連。當按鍵閉合時,相當于該I/O口通過按鍵與地相連,變成低電平,單片機通過檢測I/O口的電平狀態(tài),即可識別出按下的鍵。通過四個鍵實現(xiàn)參數(shù)的調(diào)節(jié),S1為功能選擇鍵,S2為數(shù)值增大鍵,S3為數(shù)值減小鍵,S4為鬧鐘查看鍵。
三、軟
件
設
計
3.1 系統(tǒng)程序流程圖設計
流程圖1:實驗主程序流程圖
流程圖2:定時中斷程序流程圖
流程圖3:調(diào)時功能流程圖
3.2 程序設計
#include
//延時函數(shù) {
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);} void di()
//蜂鳴器報警聲音 {
beep=0;
delay(100);
beep=1;} void
write_com(uchar com)
//寫液晶命令函數(shù)
{
rs=0;
lcden=0;
P0=com;
delay(3);
lcden=1;
delay(3);
lcden=0;} void write_data(uchar
data)
//寫液晶數(shù)據(jù)函數(shù) {
rs=1;
lcden=0;
P0=data;
delay(3);
lcden=1;
delay(3);
lcden=0;} void
init()
//初始化函數(shù) {
uchar
num;
EA=1;
//打開總中斷
EX1=1;
//開外部中斷1
IT1=1;
//設置負跳變沿觸發(fā)中斷
flag1=0;
//變量初始化
t0_num=0;
s1num=0;
week=1;
dula=0;
//關閉數(shù)碼管顯示
wela=0;
lcden=0;
rd=0;/*以下幾行在首次設置DS12C887時使用,以后不必再寫入
write_ds(0x0A,0x20);
//打開振蕩器
write_ds(0x0B,0x26);
//設置24小時模式,數(shù)據(jù)二進制格式,開啟鬧鈴中斷
set_time();
//設置上電默認時間
---------------*/
write_com(0x38);
//1602液晶初始化
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)
//寫入液晶固定部分顯示
{
write_data(table[num]);
delay(1);}
write_com(0x80+0x40);
for(num=0;num<11;num++)
{
write_data(table1[num]);
delay(1);
} } void write_sfm(uchar add,char data)
{ //1602液晶刷新時分秒函數(shù),4為時,7為分,10為秒
char
shi,ge;
shi=data/10;
ge=data%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);} void
write_nyr(uchar add,char
data)
{
//1602液晶刷新年月日函數(shù),3為年,6為月,9為日
char
shi,ge;
shi=data/10;
ge=data%10;
write_com(0x80+add);
write_data(0x30+shi);
write_data(0x30+ge);void
write_week(char we)
//寫液晶星期顯示函數(shù) {
write_com(0x80+12);
switch(we)
{
case 1:
write_data('M');delay(5);
write_data('O');delay(5);
write_data('N');
break;
case 2:
write_data('T');delay(5);
write_data('U');delay(5);
write_data('E');
break;
case 3:
write_data('W');delay(5);
write_data('E');delay(5);
write_data('D');
break;
case 4:
write_data('T');delay(5);
write_data('H');delay(5);
write_data('U');
break;
case 5:
write_data('F');delay(5);
write_data('R');delay(5);
write_data('I');
break;
case 6:
write_data('S');delay(5);
write_data('A');delay(5);
write_data('T');
break;
case 7:
write_data('S');delay(5);
write_data('U');delay(5);
write_data('N');
break;
} } void keyscan(){ if(flag_ri==1){
//這里用來取消鬧鐘報警,按任意鍵取消報警
if((s1==0)||(s2==0)||(s3==0)||(s4==0))
{
delay(5);
if((s1==0)||(s2==0)||(s3==0)||(s4==0))
{
while(!(s1&&s2&&s3&s&s4));di();
flag_ri=0;
//清除報警標志
}
}
}
if(s1==0)
//檢測s1
{
delay(5);
if(s1==0)
{
s1num++;
//記錄按下次數(shù)
if(flag1==1)
if(s1num==4)
s1num=1;
flag=1;
while(!s1);di();
switch(s1num)
{
//光標閃爍點定位
case 1: write_com(0x80+0x40+10);
write_com(0x0f);
break;
case 2: write_com(0x80+0x40+7);
break;
case 3: write_com(0x80+0x40+4);
break;
case 4: write_com(0x80+12);
break;
case 5: write_com(0x80+9);
break;
case 6: write_com(0x80+6);
break;
case 7: write_com(0x80+3);
break;
case 8: s1num=0;
write_com(0x0c);
flag=0;
write_ds(0,miao);
write_de(2,fen);
write_ds(4,shi);
write_ds(6,week);
write_ds(7,day);
write_ds(8,month);
write_ds(9,year);
break;
}
}
}
if(s1num!=0)
//只有當s1按下后,才檢測s2和s3
{
if(s2==0)
{
delay(1);
if(s2==0)
while(!s2);di();
switch(s1num)
{
//根據(jù)功能鍵次數(shù)調(diào)節(jié)相應數(shù)值
case 1: miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);
break;
case 2: fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
break;
case 3: shi++;
case 4:
case 5:
case 6:
case 7:
}
}
}
if(s3==0)
{
delay(1);
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
break;week++;
if(week==8)
week=1;
write_week(week);
write_com(0x80+12);
break;day++;
if(day==32)
day=1;
write_nyr(9,day);
write_com(0x80+9);
break;month++;
if(month==13)
month=1;
write_nyr(6,month);
write_com(0x80+6);
break;year++;
if(year==100)
year=0;
write_nyr(3,year);
write_com(0x80+3);
break;
if(s3==0)
{
while(!s3);di();
switch(s1num)
{
//根據(jù)功能鍵次數(shù)調(diào)節(jié)相應數(shù)值
case 1: miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
break;
case 2: fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
break;
case 3: shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
break;
case 4: week--;
if(week==0)
week=7;
write_week(week);
write_com(0x80+12);
break;
case 5: day--;
if(day==0)
day=31;
write_nyr(9,day);
write_com(0x80+9);
break;
case 6: month--;
if(month==0)
month=12;
write_nyr(6,month);
write_com(0x80+6);
break;
case 7: year--;
if(year==-1)
year=99;
write_nyr(3,year);
write_com(0x80+3);
break;
}
}
}
}
if(s4==0)
//檢測s4
{
delay(5);
if(s4==0)
{
flag1=~flag1;
while(!s4);di();
if(flag1==0)
{
//退出鬧鐘設置時保存數(shù)值
flag=0;
write_com(0x80+0x40);
write_data(' ');
write_data(' ');
write_com(0x0c);
write_ds(1,miao);
write_ds(3,fen);
write_ds(5,shi);
}
else
{
//進入鬧鐘設置
read_alarm();
//讀取原始數(shù)據(jù)
miao=amiao;
//重新賦值用以按鍵調(diào)節(jié)
fen=afen;
shi=ashi;
write_com(0x80+0x40);
write_data('R');
//顯示標志
write_data('i');
write_com(0x80+0x40+3);
write_sfm(4,ashi);
//送液晶顯示鬧鐘時間
write_sfm(7,afen);
write_sfm(10,amiao);
}
}
} } void write_ds(uchar add,uchar
data){
//寫12C887函數(shù)
dscs=0;
dsas=1;
dsds=1;
dsrw=1;
P0=add;
//先寫地址
dsas=0;
dsrw=0;
P0=data;
//再寫數(shù)據(jù)
dsrw=1;
dsas=1;
dscs=1;} uchar
read_ds(uchar add){
//讀12C887函數(shù)
uchar
ds_data;
dsas=1;
dsds=1;
dsrw=1;
dscs=0;
P0=add;
//先寫地址
dsas=0;
dsds=0;
P0=0xff;
ds_data=P0;
//再讀數(shù)據(jù)
dsds=1;
dsas=1;
dscs=1;
return ds_data;} /*---首次操作12C887時給予寄存器初始化-----void set_time(){
//首次上電初始化時間函數(shù)
write_ds(0,0);
write_ds(1,0);
write_ds(2,0);
write_ds(3,0);
write_ds(4,0);
write_ds(5,0);
write_ds(6,0);
write_ds(7,0);
write_ds(8,0);
write_ds(9,0);}----------------------*/
void
read-alarm(){
//讀取12C887鬧鐘值
amiao=read_ds(1);
afen=read_ds(3);
ashi=read_ds(5);} void main()
//主函數(shù) {
init();
//調(diào)用初始化函數(shù)
while(1)
{
keyscan();
//按鍵掃描
if(flag_ri==1)
//當鬧鐘中斷時進入這里
{
di();
delay(100);
di();
delay(500);
}
if(flag==0&&flag1==0)
//正常工作時進入這里
{
keyscan();
//按鍵掃描
year=read_ds(9);
//讀取12C887數(shù)據(jù)
month=read_ds(8);
day=read_ds(7);
week=read_ds(6);
shi=read_ds(4);
fen=read_ds(2);
miao=read_ds(0);
write_sfm(10,miao);
//送液晶顯示
write_sfm(7,fen);
write_sfm(4,shi);
write_week(week);
write_nyr(3,year);
write_nyr(6,month);
write_nyr(9,day);
}
} } void
exter()interrupt 2
//外部中斷1服務程序 {
uchar
c;
//進入中斷表示鬧鐘時間到
flag_ri=1;
//設置標志位,用于大程序中報警提示
c=read_ds(0x0c);
//讀取12C887的C寄存器表示響應了中斷 }
_______________________________________________________________________________ 以下為define.h源代碼:
_______________________________________________________________________________ #define uchar unsigned char #define uint unsigned int sbit dula=P2^6;sbit wela=P2^7;sbit rs=P3^5;sbit lcden=P3^4;sbit s1=P3^0;
//功能鍵 sbit s2=P3^1;
//增大鍵 sbit s3=P3^2;
//減小鍵 sbit s4=P3^6;
//鬧鐘查看鍵 sbit rd=P3^7;sbit beep=P2^3;
//蜂鳴器 sbit dscs=P1^4;sbit dsas=P1^5;sbit dsrw=P1^6;sbit dsds=P1^7;sbit dsirq=P3^3;bit flag1,flag_ri;
//定義兩個位變量
uchar count,s1num,flag,t0_num;
//其他變量定義 char miao,shi,fen,year,month,day,week,amiao,afen,ashi;uchar code
table[]=“201-
”;
//液晶固定顯示內(nèi)容 uchar code
table1[]=“
:
:
”;
void write_ds(uchar,uchar);
//函數(shù)申明 void set_alarm(uchar,uchar,uchar);void read_alarm();uchar read_ds(uchar);void set_time();
四、心
得
體
會
在本次電子時鐘設計中對單片機的內(nèi)部結(jié)構有了一定的了解,熟悉了各個引腳的功能,同時熟知了1602LCD液晶、DS12C887時鐘芯片的使用,以及各種電路的功能。
通過此次課程設計,無論是從軟件方面還是硬件方面,都進一步學習和鞏固了程序的總體設計和單片機的應用。在軟件方面,進一步熟悉了各條指令的功能及用法,定時、中斷的用法,更深一步學習了用C語言編寫實現(xiàn)電子時鐘的功能。在硬件方面,進一步熟悉并使用了keil軟件,在keil中編程,調(diào)試,運行;對電路的一些基本結(jié)構和設計有了更深一步的了解。在整個設計過程中,雖然出現(xiàn)了很多問題,有時確實叫人很心煩,但在發(fā)現(xiàn)問題后努力去解決,并獲得成功,這時會感到無比的快樂和具有成就感。只有自己動手去做,去應用,才能將學到的知識變成自己的。
程序不要光看不寫,一定要自己寫一次。最開始的時候,可能自己啥都不懂,這時可以抄人家的程序過來。但在抄的時候一定要看看每一句是干什么用的,來達到什么目的,運行后有什么后果,看明白了之后,就要自己寫一次。此時會發(fā)現(xiàn),原來看明白別人的程序很容易,但到自己寫的時候卻一句也寫不出來,這就是差距。
單片機提高重在實踐,想要學好單片機,軟件編程必不可少。但是熟悉硬件對于學好單片機也是非常重要的。如何學習好硬件,動手實踐是必不可少的。我們可以通過自己動手做一個自己的電子制作,通過完成它,以提高對一些芯片的了解和熟練運用。這樣我們就可以多了解一些芯片的結(jié)構。
我學習的目標是希望在若干年以后能夠獨立設計一個復雜的系統(tǒng),包括硬件電路和軟件部分??傊?,通過這次電子技術設計我學到了許多,似乎離自己的目標又近了一步。
參
考
文
獻
[1]郭天祥.51單片機C語言教程.電子工業(yè)出版社.2009 [2]譚浩強.C程序設計.清華大學出版社.1991 [3]孫育才 王榮興
孫華芳.ATMEL新型AT89S52系列單片機及其應用.清華大學出版社.2006 [4]謝維成.單片機原理及應用與51程序設計.清華大學出版社.2006
[5]鮑宏亞.MCS—51系列單片機應用系統(tǒng)設計及實用技術.中國宇航出版社.2005 [6]趙文博
劉文濤.單片機語言C51程序設計.人民郵電出版社.2006 [7]求是科技.8051系列單片機C程序設計.人民郵電出版社.2006
第五篇:基于單片機的時鐘控制器設計論文
單片機原理與應用技術課程設計報告
基于單片機控制的時鐘控制器
專業(yè)班級: _電氣XX班_ __ 姓
名:__ ___XXX__ ___ 時 間:2013/11/25~12/15 指導教師: XXXX XXX
2013年12月11日
基于單片機控制的時鐘控制器課程設計任務書
1。設計目的與要求
設計出一個基于單片機控制的時鐘控制器。通過向單片機輸入不同的指令可以實現(xiàn)24小時制時鐘的基本顯示和連續(xù)的調(diào)時,調(diào)分和調(diào)秒的功能,同時又擴展了整點報時功能。該電路硬件較為簡單、計時精度高、可控性好,可以隨時調(diào)整和設定時間,并且調(diào)時間的誤差小,操作簡單、通用性強。
(1)基本功能
<1>、顯示:可以顯示時、分和秒
<2>、調(diào)時功能:時(0-24)、分和秒(0-60)可以連續(xù)可調(diào)(2)性能:時間日誤差< 2秒(3)擴展功能 <1>.增加整點報時功能 <2>.增加鬧鐘任意設定功能 2.設計內(nèi)容
(1)畫出電路原理圖,正確使用邏輯關系;(2)確定元器件及元件參數(shù);(3)進行電路模擬仿真;(4)SCH文件生成與打印輸出; 3.編寫設計報告
寫出設計的全過程,附上有關資料和圖紙,有心得體會。4.答辯
在規(guī)定時間內(nèi),完成敘述并回答問題。
目錄
摘要...................................................................1 1.引言................................................................1 2.設計目的和要求......................................................1 3.總體設計方案........................................................1 3.1 方案設計要求.......................................................1 3.2 方案設計與論證.....................................................1 3.3 整體設計框圖.......................................................2 3.4 系統(tǒng)設計流程圖.....................................................2 4.設計原理分析........................................................3 4.1 外接晶振電路..................................................3 4.2 復位電路...........................................................3 4.3 數(shù)碼管顯示電路.....................................................3 4.4 鍵盤控制電路.......................................................4 4.5 Proteus仿真電路....................................................4 4.6 單片機程序的編寫...................................................5 4.7 電路的檢測.........................................................5 4.8 CAD電路的連接及PCB電路布線并做出電路板............................5 4.9 軟件與硬件的調(diào)試...................................................5 5.總結(jié)與體會..........................................................5 6.附錄................................................................5 6.1 CAD電路連接圖......................................................5 6.2 PCB電路布線圖......................................................6 6.3 時鐘控制器參考源程序...............................................6 7.參考文獻...........................................................13
基于單片機控制的時鐘控制器 班級:電氣115班 姓名:趙傳陽
摘要:近年來隨著計算機在社會領域的滲透和大規(guī)模集成電路的發(fā)展,單片機的應用不斷地走向深入,由于它具有功能強,體積小,功耗低,價格便宜,工作可靠,使用方便等特點。本次設計的時鐘控制器是以單片機(AT89C51)為核心,結(jié)合相關的元器件(3個2位共陽數(shù)碼管,一個發(fā)光二極管和一個蜂鳴器)和應用程序(在Proteus軟件和KEIL編譯軟件),構成相應的應用系統(tǒng)。
關鍵詞:單片機 AT89C51 共陽數(shù)碼管 發(fā)光二極管 蜂鳴器 Proteus軟件 KEIL編譯軟件 中斷
1.引言
隨著科技的發(fā)展,電子技術得到了飛速的發(fā)展,尤其是單片機的應用更為普遍。單片機的應用已深入眾多技術領域,從軍事、工業(yè)到家庭日常生活,單片機因體積小、功能強、價格低廉而得到廣泛應用。在此基礎上,越來越多各式各樣的時鐘也逐漸走進我們的生活,它們設計精巧、方便、耐用、美觀,深得各領域的厚愛。隨著科技的進步,基于單片機控制的時鐘控制器的出現(xiàn)則打破了人們對時鐘的傳統(tǒng)概念,因為數(shù)字時鐘不僅可以通過數(shù)字直觀地顯示出時間,還可以定時發(fā)出各種聲、光、電信號,以啟動各種設備實現(xiàn)實時控制、時間順序控制。該課程設計既有一般時鐘的基本顯示和調(diào)整功能,同時又增加了整點報時功能,復位功能及實時時鐘控制功能。
2.設計目的與要求
設計出一個基于單片機控制的時鐘控制器。通過向單片機輸入不同的指令可以實現(xiàn)24小時制時鐘的基本顯示和連續(xù)的調(diào)時,調(diào)分和調(diào)秒的功能,同時又擴展了整點報時功能。該電路硬件較為簡單、計時精度高、可控性好,可以隨時調(diào)整和設定時間,并且調(diào)時間的誤差小,操作簡單、通用性強。
在一個單片機應用系統(tǒng)中,時鐘有兩方面的含義:一是指為保障系統(tǒng)正常工作的基準振蕩定時信號,主要由晶振和外圍電路組成,晶振頻率的大小決定了單片機系統(tǒng)工作的快慢;二是指系統(tǒng)的標準定時時鐘,即定時時間。
本文主要介紹用單片機為核心部件的時鐘控制器,本設計由單片機AT89C51芯片和3個兩位一體的共陽極的數(shù)碼管為核心,輔以必要的電路,構成了一個單片機時鐘控制器?;疽螅?.顯示: 可以顯示時、分和秒
2.調(diào)時功能:時(0-24)、分和秒(0-60)可以連續(xù)可調(diào)并進行校準 3.能夠完成時間的顯示、定時鬧鐘、整點報時及復位功能
3.總體設計方案
3.1.方案設計要求
設計制作一個時鐘控制器,要求能實現(xiàn)基本走時,并以數(shù)字形式顯示時、分、秒,采用24小時制,能實現(xiàn)校時、校分連續(xù)可調(diào)、整點報時功能、復位功能以及鬧鐘任意設定功能。3.2方案設計與論證
方案一:采用各種純數(shù)字芯片實現(xiàn)數(shù)字時鐘的設計。優(yōu)點:各個模塊功能清晰,電路易于理解實現(xiàn)。缺點:各個模塊功能已定不能進行智能化調(diào)整,整體電路太龐大。
方案二:采用 FPGA模塊用硬件語言實現(xiàn)功能。優(yōu)點:運算速度快,走時精度高,算法簡單。缺點:成本高,大材小用。
方案三:采用單片機最小系統(tǒng)實現(xiàn)功能。優(yōu)點:電路簡單,能通過程序進行隨機調(diào)整并擴展功能,成本低,易于實現(xiàn)。缺點:走時有一定的誤差。
經(jīng)過綜合考慮成本問題以及電路實現(xiàn)問題,選擇第三種方案實現(xiàn)設計要求。3.3整體設計框圖
整體設計框圖如圖1所示:
4.設計原理分析
4.1外接晶振電路
晶振連接電路圖如圖3,以12MHZ晶振為基準。
圖3 外接晶振電路連接圖
XTAL1、XTAL2:XTAL1是片內(nèi)振蕩器的反相放大器輸入端,XTAL2則是輸出端,使用外部振蕩器時,外部振蕩信號應直接加到XTAL1,而XTAL2懸空。內(nèi)部方式時,時鐘發(fā)生器對振蕩脈沖二分頻,如晶振為12MHz,時鐘頻率就為6MHz。晶振的頻率可以在1MHz-24MHz內(nèi)選擇,一般選用12MHZ晶振,電容取30PF左右。4.2復位電路
常用復位電路圖如圖4:
圖4 復位電路連接圖
在振蕩器運行時,有兩個機器周期(24個振蕩周期)以上的高電平出現(xiàn)在此引:腳時,將使單片機復位,只要這個腳保持高電平,51芯片便循環(huán)復位。復位后P0-P3口均置1引腳表現(xiàn)為高電平,程序計數(shù)器和特殊功能寄存器SFR全部清零。4.3 數(shù)碼管顯示電路
二位一體共陽極數(shù)碼管電路連接圖如圖5,以PNP三極管為驅(qū)動。
圖5 數(shù)碼管顯示電路連接圖
4.4 鍵盤控制電路
鍵盤控制電路如圖6。
圖6 時鐘按鍵控制電路圖
通過S1、S2、S3和S4四個按鍵,對時間進行修改和鬧鐘的設置,S0控制鬧鐘的啟動和停止。按下S4鍵顯示鬧鐘,松開后顯示時間;按下S1鍵進入時間修改模式,再按S1鍵時間的時加1,按S3分加1,調(diào)整結(jié)束后按下S4恢復正常顯示;按下S2鍵進入鬧鐘修改模式,再按S3鍵鬧鐘的時加1,按S3分加1,調(diào)整結(jié)束后按下S4恢復正常顯示。在按鍵按下和放開時會出現(xiàn)抖動現(xiàn)象。通過延時程序,可以進行去抖動設計。4.5 Proteus仿真電路
整體電路連接圖如圖7:
圖7 整體電路連接圖
4.6 單片機程序的編寫
用KEIL編譯軟件進行程序的設計、編譯并生成可執(zhí)行文件。4.7 電路的檢測
電路連接完畢后,應用單片機程序燒錄工具進行程序燒錄,然后單擊運行按鈕進行仿真,檢測電路是否有誤。
4.8 CAD電路的連接及PCB電路布線并做出電路板
待仿真電路檢測無誤后,則通過CAD軟件進行電路圖的連接并對元件進行封裝,確定無誤后生成PCB圖進行電路的布線,之后做出電路板進行元件的焊接。4.9 軟件與硬件的調(diào)試
單片機應用系統(tǒng)的調(diào)試包括硬件和軟件兩部分,但是它們并不能完全分開。一般的方法是排除明顯的硬件故障,再進行綜合調(diào)試,排除可能的軟件或硬件故障。
軟件調(diào)試是指用仿真軟件進行仿真調(diào)試,驗證系統(tǒng)的各項功能;硬件調(diào)試即軟件調(diào)試成功后,將程序下載至AT89C51芯片中,用焊接好的電路來進行各項功能的驗證與檢測。
需要特別注意的是軟件調(diào)試與硬件調(diào)試的差異,軟件調(diào)試只是初步的估測,硬件的調(diào)試才是最真實的。
5總結(jié)與體會
經(jīng)過三周的實習設計,我設計的時鐘控制器實現(xiàn)了它最基本功能,三個星期的緊張實習,讓我獲益非淺,更加熟練的掌握了Proteus軟件、KEIL軟件及CAD軟件的應用,使我看到了自己專業(yè)知識的淺薄與不足。通過本次的課程設計,我對單片機這門課程有了更深的了解,單片機課程設計則是人生課程,我學到了很多課堂上無法學到的東西,懂得了學習的不容易,在以后的學習中我會更加努力的去學習和研究,以取得更好的成績。
6.附錄
6.1 CAD電路連線圖如圖8。
圖8 CAD電路連接圖
6.2 PCB電路布線圖如圖9。
圖9 PCB布線電路圖(注:未連線的端口用外接線連接)
6.3 時鐘控制器參考源程序
使用keil軟件編寫源程序 ORG 0000H LJMP START ORG 000BH LJMP TIME;********初始化********* START: MOV SP, #50H MOV 20H,#00H;定義秒
MOV 21H,#00H;定義分 MOV 22H,#00H;定義時
MSTOP1: MOV C,P1.3;P1.3為0時轉(zhuǎn)移 JNC MSTOP1 LCALL DELAY1;延時
MOV A,50H
INC 50H
CJNE A,#00H,HJ1
LJMP L0 HJ1: MOV C,P1.3 JNC MSTOP1 INC 22H;小時自加一 MOV A,22H CJNE A,#18H,GO12;MOV 22H,#00H;MOV 34H,#00H MOV 35H,#00H LJMP L0 L1: JB P1.1,L2;P1.1=1 MOV C,P1.1 JC L1 LCALL DELAY1;JC L1 MSTOP2: MOV C,P1.1 JNC MSTOP2 LCALL DELAY1;MOV C,P1.1 JNC MSTOP2 INC 21H;MOV A,21H CJNE A,#3CH,GO11;MOV 21H,#00H;MOV 32H,#00H MOV 33H,#00H LJMP L0 GO11: MOV B,#0AH DIV AB MOV 32H,B;MOV 33H,A;LJMP L0 GO12: MOV B,#0AH DIV AB MOV 34H,B;MOV 35H,A;LJMP L0 L2: JB P1.0,L0;P1.0 MOV C,P1.0 JC L2 LCALL DELAY1;MOV C,P1.0 JC L2 STOP1: MOV C,P1.0 JNC STOP1
小時計數(shù)循環(huán)
復位 時轉(zhuǎn)移 延時;P1.1=0時轉(zhuǎn)移 延時 分鐘加一 分鐘計數(shù)循環(huán) 復位 將A的低4位存入32單元 將A的高4位存入33單元 將A的低4位存入34單元 將A的高4位存入35單元=1時轉(zhuǎn)移 延時;P1.0=0時轉(zhuǎn)移
LCALL DELAY1;延時 MOV C,P1.0 JNC STOP1
MOV 50H,#00H LJMP MAIN;*******設置鬧鐘******* SETATIME:LCALL DISPLAY2;調(diào)用DISPLAY2顯示鬧鐘 N0: LCALL DISPLAY2 MM2: JB P1.2,N1;P1.2=1時轉(zhuǎn)移 MOV C,P1.2 JC MM2 LCALL DELAY1;JC MM2 MSTOP3: MOV C,P1.2 JNC MSTOP3 LCALL DELAY1;
LJMP N0 HJ2: MOV C,P1.2 JNC MSTOP3 INC 24H;MOV A,24H CJNE A,#24,GO22;MOV 24H,#00H;MOV 38H,#00H MOV 39H,#00H LJMP N0 N1: JB P1.1,N2;P1.1 MOV C,P1.1 JC N1 LCALL DELAY1;JC N1 MSTOP4: MOV C,P1.1 JNC MSTOP4 LCALL DELAY1;MOV C,P1.1 JNC MSTOP4 INC 23H;MOV A,23H CJNE A,#60,GO21;MOV 23H,#00H;MOV 36H,#00H MOV 37H,#00H LJMP N0 GO21: MOV B,#0AH DIV AB MOV 36H,B;MOV 37H,A;LJMP N0
延時 =0時轉(zhuǎn)移 延時 小時加一 小時計數(shù)循環(huán) 復位 =1時轉(zhuǎn)移 延時 =0時轉(zhuǎn)移 延時 分鐘加一 分鐘計數(shù)循環(huán) 復位 將A的低4位存入36單元 將A的高4位存入37單元
;P1.2 MOV A,50H INC 50H CJNE A,#00H,HJ2;P1.1
GO22: MOV B,#0AH DIV AB MOV 38H,B;將A的低4位存入38單元 MOV 39H,A;將A的高4位存入39單元 LJMP N0 N2: JB P1.0 ,N0;P1.0=1時轉(zhuǎn)移 MOV C,P1.0 JC N2 LCALL DELAY1;延時 MOV C,P1.0 JC N2 STOP2: MOV C,P1.0 JNC STOP2 LCALL DELAY1 MOV C,P1.0 JNC STOP2
MOV 50H,#00H LJMP MAIN;*******鬧鐘判斷***************** TIMEPRO: MOV A,21H MOV B,23H CJNE A,B,BK;判斷定時鬧鐘的分鐘 MOV A,22H MOV B,24H CJNE A,B,BK;判斷定時鬧鐘的小時 SETB 25H.0 MOV C,25H.0 LCALL TIMEOUT;調(diào)用TIMEOUT BK:RET;**************喇叭報警***************** TIMEOUT: X1: LCALL BZ;調(diào)用喇叭響應程序 CLR 25H.0;調(diào)用喇叭響應程序結(jié)束 LCALL DELAY;延時 CLR 25H.0 LJMP DISPLAY1 BZ:MOV C,25H.1 MOV P1.6,C CLR P1.7 MOV R7,#0FFH;喇叭響應時間 T2: MOV R6,#0FFH T3: DJNZ R6,T3 DJNZ R7,T2 SETB P1.7 RET;*************顯示鬧鐘時間************ LOOKATIME:LCALL DISPLAY2 MM: JNB P1.0,LOOKATIME LCALL DELAY1 LJMP MAIN DELAY1: MOV R4,#14H;時間延時
0
POP ACC RETI;********顯示子程序********** DISPLAY1: MOV R0,#30H MOV R3,#0FEH MOV A,R3 PLAY1: MOV P2,A MOV A,@R0;取要顯示的數(shù)據(jù) MOV DPTR,#DSEG1;指向字形段碼首地址 MOVC A,@A+DPTR CJNE R0,#34H,PA ORL A,#80H PA:CJNE R0,#32H,PB ORL A,#80H PB:CPL A;MOV P0,A;LCALL DL1 MOV P2,#0FFH MOV A,R3;RL A;JNB ACC.6,LD1 INC R0;MOV R3,A LJMP PLAY1 LD1: RET DISPLAY2: PUSH ACC;PUSH PSW MOV R0,#36H MOV R3,#0FBH MOV A,R3
PLAY2: MOV P2,A MOV A,@R0;MOV DPTR,#DSEG1;MOVC A,@A+DPTR CJNE R0,#38H,PP ORL A,#80H PP:CPL A;MOV P0,A;LCALL DL1;MOV P2,#0FFH MOV A,R3;RL A;JNB ACC.6,LD2 INC R0;MOV R3,A LJMP PLAY2;LD2: POP PSW POP ACC;RET;******DELAY*******
查表取字形段碼 指向P0口 判斷是否顯示到最低位 左移一位 緩沖器地址加一 保護現(xiàn)場 取要顯示的數(shù)據(jù) 指向字形段碼首地址 查表取字形段碼 指向P0口 調(diào)用DL1 判斷是否顯示到最低位左移一位 緩沖器地址加一 調(diào)用PLAY2 恢復現(xiàn)場
DL1: MOV R7,#20H DL: MOV R6,#20H DL6: DJNZ R6,$ DJNZ R7,DL RET DSEG1: DB 3FH,06H,5BH,4FH,66H;七段碼表 DB 6DH,7DH,07H,7FH,6FH END 7.參考文獻
[1].王建校,楊建國.51系列單片機及C51程序設計.北京:科學出版社, 2002.[2].吳金戊, 沈慶陽等.8051單片機實踐與應用.北京:清華大學出版社, 2002.[3].李建忠.單片機原理及應用(第二版).西安:西安電子科技大學出版社, 2008.2.[4].張毅剛.新編MCS-51單片機應用設計(第3版).哈爾濱: 哈爾濱工業(yè)大學出版社, 2006.10.[5].李學禮.基于Proteus的8051單片機實例教程.電子工業(yè)出版社出版時間, 2008.6.[6].百度文庫:http://wenku.baidu.com/view/a9243c18fad6195f312ba6d3.html