- 相關(guān)推薦
四路多段定時(shí)開(kāi)關(guān)(一)
畢業(yè)設計(論文)任務(wù)書(shū)
專(zhuān)業(yè)(班): 02樓宇2 姓名: 羅艷華
課題名稱(chēng)、主要內容和基本要求
課題名稱(chēng):四路多段定時(shí)開(kāi)關(guān)
主要內容:
實(shí)現四路定時(shí)開(kāi)關(guān)控制,能在24小時(shí)內任意時(shí)間通斷,每路24小時(shí)內最多可執行六次開(kāi)與關(guān),并可控制輸出功率,單路控制功率不小于800W,掉電后數據不丟失。
基本要求:
完成Protel電路設計、單片機硬件系統設計、單片機程序設計、
電路焊接與調試全過(guò)程。制作出實(shí)物并能演示運行。
課題名稱(chēng):四路多段定時(shí)開(kāi)關(guān)
進(jìn)度安排
周次 工作內容 執行情況
6、7 學(xué)習電子系統的設計過(guò)程,明確課題內容,整體構思,查閱資料
8 復習單片機及相關(guān)知識、PROTEL使用
9、10 設計、繪制電路、采購元器件、制版
11 硬件組裝
12、13 程序設計與調試
14、15 撰寫(xiě)論文
摘要
單片計算機即單片微型計算機。(Single-Chip Microcomputer),是集CPU,RAM,ROM,定時(shí),計數和多種接接口于一體的微控制器。它體積小,成本低,功能強,廣泛應用于智能產(chǎn)品和工業(yè)自動(dòng)化上。而C語(yǔ)言已成為當前舉世公認的高效簡(jiǎn)潔又貼近硬件的編程語(yǔ)言之一。C語(yǔ)言現已成為專(zhuān)業(yè)化的單片機上的實(shí)用高級語(yǔ)言。而且由于開(kāi)發(fā)速度、軟件質(zhì)量結構化、可維護性方面的原因,使C語(yǔ)言漸漸有取代匯編的趨勢。這次畢業(yè)設計通過(guò)對C語(yǔ)言對單片機進(jìn)行編程的學(xué)習應用,從而達到學(xué)習、設計、開(kāi)發(fā)軟、硬件的能力。
前言
本文通過(guò)用對一個(gè)能實(shí)現定時(shí),時(shí)鐘,日歷顯示功能的時(shí)間系統的設計學(xué)習,文章主要介紹了時(shí)鐘芯片DS12C887。系統由AT89C52、七段LED數碼顯示器、按鍵、二極管、DS12C887、發(fā)光二極管等部份構成,能實(shí)現時(shí)鐘日歷的功能:能進(jìn)行年、月、日、時(shí)、分、秒的顯示、實(shí)現四路開(kāi)關(guān)定時(shí)輸出、時(shí)間的調整等功能。文章后附有硬件設備請單。由于本人水平水限,難免有疏落不足之處,敬請老師和同學(xué)能給與批評糾正。
目 錄
任務(wù)書(shū) 1
摘要 4
前言 4
第一章、硬件設計 7
1-1 硬件設計框圖 7
1-1-1鍵盤(pán)部分 7
1-1-2顯示及時(shí)鐘芯片部分 8
1-1-3繼電器輸出部分 9
1-2 系統硬件詳細設計圖 9
1-3 各芯片介紹 10
1-3-1 AT89C52單片機應用設計 10
1-2-2 DS12C887時(shí)鐘芯片 11
1-2-3 74C922N 17
1-2-4 SN74LS04N 18
1-2-5 ULN2003A 18
第二章、系統軟件設計 20
2-1 KEIL51軟件的應用 20
2-2 C語(yǔ)言編程單片機應用 21
2-3 程序 22
2-3-1 程序中地址分配 22
2-3-2 主程序 24
2-3-3 顯示程序 25
2-3-4 讀取鍵盤(pán)并換算成鍵值 26
2-3-5 外部中斷1 27
附 錄
結 論
參考文獻
第一章、硬件部分
1-1 硬件設計框圖
1-1-1鍵盤(pán)部分
圖注:鍵盤(pán)部分接線(xiàn)示意圖
如圖所示鍵盤(pán)與74C922芯片相連接,74C922為一鍵盤(pán)編碼器,其中第一路(S2-S5)鍵盤(pán)與74C922中的X1相連接,第二路鍵盤(pán)(S6-S9)與74C922中的X2相連接,第三路鍵盤(pán)(S10-S13)與X3相連接,第四路鍵盤(pán)(S14-S17)與X4相連接。而74C922中的Y1則與(S2、S6、S10、S14)相連接,Y2與(S3、S7、S11、S15)相連接,Y3與(S4、S8、S12、S16)相連接,Y4與(S5、S9、S13、S17)相連接。鍵盤(pán)產(chǎn)生的中斷與單片機中的P3.3腳相接,作為中斷1(INT1)。
電路板中共用到十七個(gè)鍵盤(pán),其中有十個(gè)為數字鍵,和六個(gè)功能鍵,左下角中的S1則是起到個(gè)復位作用。
1-1-2顯示及時(shí)鐘芯片部分
圖注:數碼顯示及DS12C887部分接線(xiàn)圖
這部分的主要功能就是通過(guò)單片機讀取時(shí)鐘芯片中的時(shí)間,再給七段數碼顯示器顯示出來(lái)。
首先講一下時(shí)鐘芯片與89C51的接線(xiàn),單片機89C52中P3.6(WR)腳與DS12C887時(shí)鐘芯片的15腳WR相接,單片機對時(shí)鐘芯片進(jìn)行寫(xiě)入數據,89C52的P3.7腳(RD)與DS12C887的17腳RD相接,單片機讀取時(shí)鐘芯片,DS12C887的AD0~AD7分別為89C52的P1.0~P1.7腳相連。DS12C887的IRQ腳時(shí)鐘更新中斷腳與P3.2相接,做為中斷0(INT0);DS12887的第14腳(AS)與89C52的30腳(ALE/PROG)相連,DS12887的24、18腳接VCC正電源,1、12并上13腳接地。89C52的20腳接地。
接著(zhù)就是七段數碼顯示器的接線(xiàn)了,顯示器的a、b、c、d、e、f分別接89C52的P2.0、P2.1、P2.2、P2.3、P2.4、P2.5、P2.6相接,顯示器的第3、8腳接SN7404N(反相器)再分別與P1.0、P1.1、P1.2、P1.3相接,第二個(gè)顯示器中的dp位接SN7404(反相器)后再與DS12887的SQW位相接,SQW位輸出2HZ的頻率使DP點(diǎn)亮。
1-1-3繼電器輸出部分
圖注:繼電器輸出部分接線(xiàn)圖
89C52中P3.0與ULN2003A的INT1端子接,輸出OUT1接繼電器K4相接。由此對應P3.1接INT2,輸出OUT2接K3,P3.2接INT3,輸出K2,P3.3接INT3,輸出OUT3接K1,再如圖P2.7接INT7,輸出OUT7與蜂鳴器相接。在制作電路板的過(guò)程中忘掉一個(gè)上拉電阻,位置是P2.7與正電源相接。
1-2 系統硬件詳細設計圖
實(shí)際焊接出的板子跟設計中的有些不一樣,最不一樣的還是鍵盤(pán)的排列,原來(lái)設計是4X4矩陣形排列,由于焊接的種種原因,于是改成了兩行八縱的排法,板子是通過(guò)我們利用Protel軟件進(jìn)行電路的設計,并不斷的去了解硬件的功能及咨詢(xún)老師,確定基本可能完全操作后,再進(jìn)行焊接。
注:焊接部份為自己焊做,但PBC板是拿出去外面制作。下圖為實(shí)際硬件焊接圖:
1-3 各芯片介紹
在設計中用到了許多芯片有以前接觸過(guò)的也有聽(tīng)都沒(méi)聽(tīng)過(guò)的,系統由AT89C52、SN74LS04N反相器、鍵盤(pán)解碼器74C922芯片、ULN2003A芯片、七段LED數碼顯示器、按鍵、二極管、DS12C887及發(fā)光二極管等組成。在本文中主要介紹幾種芯片AT89C52、SN74LS04N、74C922及DS12C887和ULN2003A芯片。
1-3-1 AT89C52單片機應用設計
AT89C52是一個(gè)低電壓,高性能CMOS 8位單片機,片內含8k bytes的可反復擦寫(xiě)的Flash只讀程序存儲器和256 bytes的隨機存取數據存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn),兼容標準MCS-51指令系統,片內置通用8位中央處理器和Flash存儲單元,功能強大的AT89C52單片機可為您提供許多較復雜系統控制應用場(chǎng)合。 AT89C52有40個(gè)引腳,32個(gè)外部雙向輸入/輸出(I/O)端口,同時(shí)內含2個(gè)外中斷口,3個(gè)16位可編程定時(shí)計數器,2個(gè)全雙工串行通信口,2個(gè)讀寫(xiě)口線(xiàn),AT89C52可以按照常規方法進(jìn)行編程,也可以在線(xiàn)編程。其將通用的微處理器和Flash存儲器結合在一起,特別是可反復擦寫(xiě)的Flash存儲器可有效地降低開(kāi)發(fā)成本。
主要功能特性:
· 兼容MCS51指令系統 · 8k可反復擦寫(xiě)(>1000次)Flash ROM
· 32個(gè)雙向I/O口 · 256x8bit內部RAM
· 3個(gè)16位可編程定時(shí)/計數器中斷 · 時(shí)鐘頻率0-24MHz
· 2個(gè)串行中斷 · 可編程UART串行通道
· 2個(gè)外部中斷源 · 共6個(gè)中斷源
· 2個(gè)讀寫(xiě)中斷口線(xiàn) · 3級加密位
· 低功耗空閑和掉電模式 · 軟件設置睡眠和喚醒功能
1-3-2 DS12C887時(shí)鐘芯片
DS12C887的特性:DS12C887實(shí)時(shí)時(shí)鐘芯片功能豐富,可以用來(lái)直接代替IBM PC上的時(shí)鐘日歷芯片DS12C887,同時(shí),它的管腳也和MC146818B、DS12887相兼容。
由于DS12C887能夠自動(dòng)產(chǎn)生世紀、年、月、日、時(shí)、分、秒等時(shí)間信息,其內部又增加了世紀寄存器,從而利用硬件電路解決子“千年”問(wèn)題; DS12C887中自帶有鋰電池,外部掉電時(shí),其內部時(shí)間信息還能夠保持10年之久;對于一天內的時(shí)間記錄,有12小時(shí)制和24小時(shí)制兩種模式。在12小時(shí)制模式中,用AM和PM區分上午和下午;時(shí)間的表示方法也有兩種,一種用二進(jìn)制數表示,一種是用BCD碼表示;DS12C887中帶有128字節 RAM,其中有11字節RAM用來(lái)存儲時(shí)間信息,4字節RAM用來(lái)存儲DS12C887的控制信息,稱(chēng)為控制寄存器,113字節通用RAM使用戶(hù)使用;此外用戶(hù)還可對DS12C887進(jìn)行編程以實(shí)現多種方波輸出,并可對其內部的三路中斷通過(guò)軟件進(jìn)行屏蔽。
DS12C887的引腳功能:DS12C887的引腳排列如圖1所示,各管腳的功能說(shuō)明如下:
GND、 VCC:直流電源,其中VCC接+5V輸入,GND接地,當VCC輸入為+5V時(shí),用戶(hù)可以訪(fǎng)問(wèn)DS12C887內RAM中的數據,并可對其進(jìn)行讀、寫(xiě)操作;當VCC的輸入小于+4.25V時(shí),禁止用戶(hù)對內部RAM進(jìn)行讀、寫(xiě)操作,此時(shí)用戶(hù)不能正確獲取芯片內的時(shí)間信息;當VCC的輸入小于+3V時(shí), DS12C887會(huì )自動(dòng)將電源發(fā)換到內部自帶的鋰電池上,以保證內部的電路能夠正常工作。
MOT:模式選擇腳,DA12C887有兩種工作模式,即Motorola模式和Intel模式,當MOT接VCC時(shí),選用的工作模式是Motorola模式,當MOT接GND時(shí),選用的是Intel模式。本文主要討論Intel模式。
SQW:方波輸出腳,當供電電壓VCC大于4.25V時(shí),SQW腳可進(jìn)行方波輸出,此時(shí)用戶(hù)可以通過(guò)對控制寄存器編程來(lái)得到13種方波信號的輸出。
AD0~AD7:復用地址數據總線(xiàn),該總線(xiàn)采用時(shí)分復用技術(shù),在總線(xiàn)周期的前半部分,出現在A(yíng)D0~AD7上的是地址信息,可用以選通DS12C887內的RAM,總線(xiàn)周期的后半部分出現在A(yíng)D0~AD7上的數據信息。
AS:地址選通輸入腳,在進(jìn)行讀寫(xiě)操作時(shí),AS的上升沿將AD0~AD7上出現的地址信息鎖存到DS12C887上,而下一個(gè)下降沿清除AD0~AD7上的地址信息,不論是否有效,DS12C887都將執行該操作。
DS/RD:數據選擇或讀輸入腳,該引腳有兩種工作模式,當MOT接VCC時(shí),選用Motorola工作模式,在這種工作模式中,每個(gè)總線(xiàn)周期的后一部分的DS為高電平,被稱(chēng)為數據選通。在讀操作中,DS的上升沿使DS12C887將內部數據送往總線(xiàn)AD0~AD7上,以供外部讀取。在寫(xiě)操作中,DS的下降沿將使總線(xiàn) AD0~AD7上的數據鎖存在DS12C887中;當MOT接GND時(shí),選用Intel工作模式,在該模式中,該引腳是讀允許輸入腳,即Read Enable。
R/W:讀/寫(xiě)輸入端,該管腳也有2種工作模式,當MOT接VCC時(shí),R/W工作在Motorola模式。此時(shí),該引腳的作用是區分進(jìn)行的是讀操作還是寫(xiě)操作,當R/W為高電平時(shí)為讀操作,R/W為低電平時(shí)為寫(xiě)操作;當MOT接GND時(shí),該腳工作在Intle模式,此時(shí)該作為寫(xiě)允許輸入,即Write Enable。
CS:片選輸入,低電平有效。
IRQ:中斷請求輸入,低電平有效,該腳有效對DS12C887內的時(shí)鐘、日歷和RAM中的內容沒(méi)有任何影響,僅對內部的控制寄存器有影響,在典型的應用中,RESET可以直接接VCC,這樣可以保證DS12C887在掉電時(shí),其內部控制寄存器不受影響。
DS12C887的地址分布
附圖1是DS12877的地址分布圖。所有的地址包括114字節通用RAM、10字節用于記錄時(shí)間、日歷、鬧鐘和RAM以及4字節的控制、狀態(tài)RAM。所有字節都可以在除以下的情況下直接讀寫(xiě)。
時(shí)間、日歷和鬧鐘的數據格式
地址 功能 十進(jìn)制范圍 范 圍
二進(jìn)制數據模式 BCD數據模式
0 秒 0-59 00-3B 00-59
1 秒鬧鐘 0-59 00-3B 00-59
2 分鐘 0-59 00-3B 00-59
3 分鐘鬧鐘 0-59 00-3B 00-59
4 小時(shí)(12進(jìn)制) 1-12 01-0CAM,81-8CPM 01-12AM,81-92PM
小時(shí)(24進(jìn)制) 0-23 00-17 00-23
5 時(shí)鬧鐘(12時(shí)制) 1-12 01-0CAM,81-8CPM 01-12AM,81-92PM
時(shí)鬧鐘(24時(shí)制) 0-23 00-17 00-23
6 星期(星期天=1) 1-7 00-07 00-07
7 日期 1-31 01-0F 1-31
8 月份 1-12 01-0C 1-12
9 年 0-99 00-63 00-99
DS12887有四個(gè)控制寄存器,它們可以在任何時(shí)候讀寫(xiě)。
寄存器A
最高位 最低位
BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
UIP DV2 DV1 DV0 RS3 RS2 RS1 RS0
UIP更新(UIP)位用來(lái)標志芯片是否即將進(jìn)行更新。當UIP位為1時(shí),更新即將開(kāi)始;當它為0時(shí),表示在至少244μs內芯片不會(huì )更新,此時(shí),時(shí)鐘、日歷和鬧鐘信息可以通過(guò)讀寫(xiě)相應的字節獲得和設置。UIP位為只讀位并且不受復位信號(RESET)的影響。通過(guò)把寄存器B中的SET位設置為1可以禁止更新并將UIP位清0。
DV0,DV1,DV2
這3位是用來(lái)開(kāi)關(guān)晶體振蕩器和復位分頻器。當[DV0 DV1 DV2]=[010]時(shí),晶體振蕩器開(kāi)啟并且保持時(shí)鐘運行;當[DV0 DV1 DV2]=[11X]時(shí),晶體振蕩器開(kāi)啟,但分頻保持復位狀態(tài)。
RS3,RS2,RS1,RS0作用:1.設置周期中斷允許位(PIE);2.設置方波輸出允許位(SQWE);3.兩位同時(shí)設置為有效并且設置頻率;4.全部禁止。周期性中斷率和方波中斷頻率表列出了可通過(guò)RS寄存器選擇的周期中斷的頻率和方波的頻率。這四個(gè)可讀寫(xiě)的位不受復位信號的影響。
最高位 最低位
BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
SET PIE AIE UIE SQWE DM 24/12 DSE
寄存器B
SET當SET=0,芯片更新正常進(jìn)行;當SET=1,芯片更新被禁止。SET位可讀寫(xiě),并不會(huì )受復位信號的影響。
PIE當PIE=0,禁止周期中斷輸出到IRQ;當PIE=1,允許周期中斷輸出到IRQ。
AIE當AIE=0,禁止鬧鐘中斷輸出到IRQ;當AIE=1,允許鬧鐘中斷輸出到IRQ。
UIE當UIE=0,禁止更新結束中斷輸出到IRQ;當UIE=1,允許更新結束中斷輸出到IRQ。此位在復位或設置SET為高時(shí)清0.
SQWE當SQWE=0,SQW腳為低;當SQWE=1,SQW輸出設定頻率的方波。
DMDM=0,BCDDM=1,二進(jìn)制,此位不受復位信號影響。
24/12此位為1,24時(shí)制;為0,12小時(shí)制
DSE夏令時(shí)允許標志。在四月的第一個(gè)星期日的1∶59∶59AM,時(shí)鐘調到3∶00∶00AM;在十月的最后一個(gè)星期日的1∶59∶59AM,時(shí)鐘調到1∶00∶00AM。
寄存器C
最高位 最低位
BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
IRQF PF AF UF 0 0 0 0
IRQF當有以下情況中的一種或幾種發(fā)生時(shí),中斷請求標志位(IRQF)置高;PF=PIE=1AF=AIE=1UF=UIE=1IRQF=PF·PIE+AF·AIE+UF·UIEIRQF-且為高IRQ腳輸出低。所有標志位在讀寄存器C或復位后清0。
PF 周期中斷標志。AF 鬧鐘中斷標志。UF 更新中斷標志。
BIT 0 THROUGH BIT3第0位到第3位無(wú)用,不能寫(xiě)入,只讀且讀出的值恒為0。
寄存器D
最高位 最低位
BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
VRT 0 0 0 0 0 0 0
VRT當VRT=0時(shí)表示內置電池能量耗盡,此時(shí)RAM中的數據的正確性就不能保證了。
BIT6 THROUGH BIT0第0位到第6位無(wú)用,只讀,且讀出的值恒為0。
2-2-3 74C922
我們采用專(zhuān)用鍵盤(pán)管理芯片74C922。74C922為CMOS工藝技術(shù)制造,工作電壓為3—15V,“二鍵鎖定”功能,編碼輸出為三芯輸出,可直接與微處理器數據線(xiàn)相連,內部振蕩器完成4×4矩形鍵盤(pán)掃描,有 按鍵時(shí),DA變高,通過(guò)非門(mén)接到AT89C51的INT1口,并且設INT0為邊沿觸發(fā)方式,當DA變高時(shí),經(jīng)過(guò)非門(mén)變?yōu)榈碗娖教儺a(chǎn)生INT1外部中斷,通知AT89C51從數據總線(xiàn)讀鍵值,判斷鍵值從而完成相應的散轉程序功能。
系統中共用了16個(gè)鍵盤(pán)按鈕形狀,當時(shí)圖紙設計時(shí)以矩陣型4X4行之安排,后由于板的大小和實(shí)際等問(wèn)題,便以每行八個(gè),排做兩行處理。
2-2-4 SN74LS04N
如下圖所示,SN74LS04N的引腳如下,7腳接地,14腳接VCC正電源,并且形象的體現出了SN74LS04N的作用,SN74LS04N作用就是反相器,SN74LS04N內部形成了六個(gè)非門(mén),分別是1與2、3與4、5與6、8與9、10與11、12與13構成六個(gè)非門(mén),起到一個(gè)反相的作用。
2-2-5 ULN2003A
ULN2003A是內含7個(gè)達林頓管的驅動(dòng)芯片,輸入電壓與TTL電平兼容。每個(gè)上達林頓管的集電極可吸收最大500mA的電流,耐壓30V,因此可以用來(lái)驅動(dòng)四相步進(jìn)電機。ULN2003A電路具有以下特點(diǎn): ●電流增益高(大于1000); ●帶負載能力強(輸出電流大于500mA); ●溫度范圍寬(-40~85℃); ●工作電壓高(大于50V)。 ULN2003電路主要用于如下領(lǐng)域: ●伺服電機; ●步進(jìn)電機; ●電磁閥; ●可控照明燈。
第二章、系統軟件設計
2-1 KEIL51軟件的應用
因此蘇老師購見(jiàn)意我用C語(yǔ)言進(jìn)行編程。還好時(shí)間尚早,我開(kāi)始利用空閑時(shí)間進(jìn)行C語(yǔ)言對單片機編程的學(xué)習。
首先我對KEIL51軟件進(jìn)行了學(xué)習,軟件是蘇老師發(fā)給我的,在平日的時(shí)間里就自己捉摸著(zhù)怎么用,在周日的時(shí)間我就回學(xué)校找蘇老師問(wèn)一周累積的問(wèn)題。KEIL51跟MEDWIN不同的是:KEIL51需要新建項目(new project),之后選擇單片機,這里難住了我好久,怎么選擇單片機的型號也沒(méi)選對,后來(lái)學(xué)校問(wèn)老師應選擇Ateml的AT89C51。這個(gè)就新建好了一個(gè)項目了。
新建一個(gè)程序文件(File-New),建好后保存新建的程序,如果是用C語(yǔ)言進(jìn)行編程的話(huà)擴展名應為(.c),如果是用匯編語(yǔ)言進(jìn)行編程的話(huà)擴展名應為(.a或.asm),建好保存該文件,然后還需要將程序加到項目中,如圖所示右鍵點(diǎn)擊Source Group1文件夾彈出菜單,選擇"Add File to Group 'Source Group 1'"就會(huì )彈出文件窗口,選擇剛剛保存的文件,按ADD按鈕,關(guān)閉文件窗,程序文件已加到項目中了。
用KEIL51進(jìn)得軟件調試,在硬件沒(méi)焊好的情況下,我都是直接用KEIL51進(jìn)行仿真調試。圖片由左到右分別編譯單個(gè)文件、是編譯當前項目及重新編譯。此鍵為停止編譯按鈕,這個(gè)鍵只有在點(diǎn)擊了前三個(gè)中的任一個(gè)后才會(huì )生效。這就是開(kāi)啟\關(guān)閉調試模式的按鈕,它也存在于菜單Debug-Start\Stop Debug Session中。為運行按鈕,當程序處于停止狀態(tài)時(shí)才有效。為模擬芯片的復位,程序回到最開(kāi)頭處執行。為停止按鈕,程序處于運行狀態(tài)時(shí)才有效。
后來(lái)硬件板焊好后就需要芯片燒寫(xiě)成HEX文件。
2-2 C語(yǔ)言編程單片機的學(xué)習
設計中所用到的運算符
關(guān)系和邏輯運算符 含義
> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
!= 不等于
&& 與
‖ 或
! 非
相對的優(yōu)先級:最高為!運算再進(jìn)行>=、<=運算,接著(zhù)運行==、!=運算,后&&運算,最后執行‖運算。
運算符 作用
+ 加法
- 減法
* 乘法
/ 除法
++ 自加
-- 自減
% 模運算(取整數除法的余數)
主要就介紹一些我所用到的語(yǔ)句。
在程序設計中,主要利用了C語(yǔ)言的if、switch及for語(yǔ)句。其中if、switch為條件語(yǔ)句,for是一個(gè)循環(huán)控制語(yǔ)句,在程序中更常用到的語(yǔ)句是break語(yǔ)句,在switch語(yǔ)句中,在case子句執行完畢后,通過(guò)break語(yǔ)句使控制立即跳出switch語(yǔ)句。在循環(huán)語(yǔ)句中,break語(yǔ)句的作用是在循環(huán)體中測試到應立即結束循環(huán)時(shí),使控制立即跳出循環(huán)結構,轉而執行循環(huán)語(yǔ)句后的語(yǔ)句。
2-3 程序
2-3-1 程序中地址分配
程序設計中的地址分布,由于DS12C887中前14個(gè)字節是10字節用于記錄時(shí)間、日歷、鬧鐘和RAM以及4字節的控制、狀態(tài)RAM。113字節通用RAM使用戶(hù)使用,我先計算了我的地址分布,從第14個(gè)字節開(kāi)始我用做存儲每路的開(kāi)關(guān)次數,每一路可設定每次開(kāi)關(guān)的時(shí)間(小時(shí)、分鐘、時(shí)長(cháng)及功率),時(shí)長(cháng)是以分鐘為單位,最高可設置為99分鐘。每一路開(kāi)關(guān)每一次均要用四個(gè)字節,通過(guò)計算四路開(kāi)關(guān)能在24小時(shí)內任意時(shí)間通斷,每路24小時(shí)內最多可執行六次開(kāi)與關(guān),下表為我設定計算我在編程時(shí)的地址分布表。
表:DS12C887地址分配情況
路數 次數 第一次 第二次 第三次 第四次 第五次 第六次
第一路 14 15-18 19-22 23-26 27-30 31-34 35-38
第二路 39 40-43 44-47 48-51 52-55 56-59 60-63
第三路 64 65-68 69-72 73-76 77-80 81-84 85-88
第四路 89 90-93 94-97 98-101 102-105 106-109 110-113
例如程序:
for(i=0;i<4;i++);i為判斷電路設計中的第幾路,
{
switch(i)
{
case(0):
out0=0;
break;
……
}
for(j=0;j<XBYTE[14+25*i];j++);j為每路開(kāi)關(guān)的開(kāi)關(guān)次數。
{
if(((XBYTE[15+j*4+25*i]<hour)||((XBYTE[15+j*4+25*i]==hour)&&(XBYTE[16+j*4+25*i]<=min)))
&&(((XBYTE[15+j*4+25*i]+(XBYTE[17+j*4+25*i])/60)>hour)||(((XBYTE[15+j*4+25*i]+(XBYTE[17+j*4+25*i])/60)==hour)&&((XBYTE[16+j*4+25*i]+(XBYTE[17+j*4+25*i])%60)>min))))
{
switch(i)
{
case(0):
out0=XBYTE[18+4*j];
break;
……
}
舉例在程序中設計第一路開(kāi)關(guān)開(kāi)關(guān)一次,即i=0,設定的開(kāi)關(guān)次數(一次)存放在外部RAM(DS12C887)第14個(gè)字節中,XBYTE[14]=1,j=0時(shí)循環(huán)一次,,如果讀取到第15個(gè)字節(小時(shí))中數值小于或等于系統時(shí)間小時(shí)(hour)&&(與運算符)第16個(gè)字節(分鐘)中數值小于或等于系統時(shí)間分鐘(min)&&第15個(gè)字節數值+第17個(gè)字節(時(shí)長(cháng))數值/60大于等于系統時(shí)間小時(shí)(hour)&&第16個(gè)字節數值+第17個(gè)字節數值%60大于系統時(shí)間分鐘(min),判斷條件如果為真的情況下,輸出第18個(gè)字節中設定的功率。
由于每路六次開(kāi)關(guān)共用25個(gè)字節,因此循環(huán)語(yǔ)句用判斷每路for (j=0; j< XBYTE[14+25*i];j++),每一路從14字節開(kāi)始,后循環(huán)語(yǔ)句即用14+25*路數。
2-3-2主程序(main)
主程序中主要設置了CPU的工作模式及中斷,T0為延時(shí)16ms;T1為顯示時(shí)間設置為0.512ms;T2設置為延時(shí)100ms;設置芯片的工作模式:給外部RAM中A寄存器中寫(xiě)入0x20內容(XBYTE[0x0a]=0x20),即是將A寄存器中DV1位置1”,查看上述所講DS12C887內容,[DV0 DV1 DV2]=[010]時(shí),晶體振蕩器開(kāi)啟并且保持時(shí)鐘運行;
將外部RAM中B寄存器中寫(xiě)入0x1E內容,即是將B寄存器中UIE、SQWE、DM、24/12位置“1”,即是使得時(shí)鐘芯片允許更新結束中斷輸出的IRQ;SQW輸出設定頻率的方波,采用二進(jìn)制,并且為24小時(shí)制。
主程序中還實(shí)現了通電時(shí)顯示SZPT,一段時(shí)間延時(shí)后,顯示0605(因為制做日期在五月份所以編程寫(xiě)入了0605),一段時(shí)間延時(shí)后,就讀取時(shí)間顯示小時(shí)和分鐘。之后就是一個(gè)while循環(huán)語(yǔ)句。
2-3-3顯示程序(display)
dis0=decode(d0); 此程序為解碼程序
dis1=decode(d1);
dis2=decode(d2);
dis3=decode(d3);
key0=d3;數碼顯示器4
key1=d2;數碼顯示器3
key2=d1;數碼顯示器2
key3=d0;數碼顯示器1
switch(d)
{
case(0):
return 0x40;
break;…………
}
程序用的是switch選擇語(yǔ)句,如果系統要顯示零的話(huà),返回數值為0x40。在設計中采用的是共陽(yáng)極的七段數碼顯示器,當該位置“1”顯示,在電路設計中,數碼顯示器又與SN74LS04芯片的一個(gè)非門(mén)相連,即該位為“0”時(shí),數碼管顯示,其返回值計算如下表:
段號
顯示數值 a
p2.0 b
p2.1 c
p2.2 d
p2.3 e
p2.4 f
p2.5 g
p2.6 十六進(jìn)制
p2值
0 0 0 0 0 0 0 1 40
1 1 0 0 1 1 1 1 79
2 0 0 1 0 0 1 0 24
3 0 0 0 0 1 1 0 30
4 1 0 0 1 1 0 0 19
5 0 1 0 0 1 0 0 12
6 0 1 0 0 0 0 0 02
7 0 0 0 1 1 1 1 78
8 0 0 0 0 0 0 0 00
9 0 0 0 0 1 0 0 10
P 0 0 1 1 0 0 0 0C
T 0 1 1 1 0 0 1 4E
A 0 0 0 1 0 0 0 08
E 0 1 1 0 0 0 0 06
D 1 0 0 0 0 1 0 21
U 1 0 0 0 0 0 1 41
off 1 1 1 1 1 1 1 7F
2-3-4讀取鍵盤(pán)并換算成鍵值(keytranslate)
這段程序的主要功能就是將雜亂無(wú)序的鍵盤(pán)使得有順序可循。由于電路板上鍵盤(pán)不是按順序排好的,因此通過(guò)編程當原來(lái)無(wú)序的鍵盤(pán)變得比較好操作。
case(0x0):
keyr=0;
break;
其具體程序對應的鍵盤(pán)值可看下表:
板上的順序 0 4 8 12 1 5 9 13
編程后順序 0 1 2 3 4 a b c
板上的順序 2 6 10 14 3 7 11 15
編程后順序 5 6 7 8 9 d e f
這段程序主要采用的是switch選擇語(yǔ)句。
2-3-5外部中斷1(key)
外部中斷1為鍵盤(pán)中斷,鍵進(jìn)行讀取。左圖為:鍵盤(pán)中斷一服務(wù)子程序圖
keya,其功能在于,按第一下顯示case(1): display (hour/10, hour%10, min/10,min%10);程序相同,按第二下顯示年份,第三下顯示為日期,第四下顯示為星期幾和秒。
Keyb,其功能在于,按下如果在SET為1并且0x0e不為0的情況下,如果條件key3<7為真的話(huà),那么第14個(gè)字節即為第四段數碼管的值,如果為假的情況下,蜂鳴器發(fā)聲,并且顯示“EAA0”;keyb==1 為真的情況下,顯示為“1,off,off,XBYTE[0x0e]”,當0x0e不為“0”的情況下,keyb=2的情況下,顯示為XBYTE[0x0f]及XBYTE[0x10]中的數值,若輸入數值又將顯示內容寫(xiě)入外部RAM中,語(yǔ)句如:XBYTE[4*l+0x0f]=key0*10+key1;XBYTE[4*l+0x10]=key2 *10 +key3;
Keyd,其功能在于,進(jìn)入設置和退出設置,當按下keyd鍵,顯示為PASD,如果如果條件“(key0==1)&&key1==2)&&(key2==3)&&(key3==4)”為真的情況下,SET置“1”,并顯示為“PASS”,即可以對系統進(jìn)行設置修改,如果為假蜂鳴器發(fā)聲,并顯示“EAA0”。當系統修改好后,再按下keyd鍵,顯示“0UEA”。
附錄
附表1設備清單:
序號 設備名稱(chēng) 型號 數量
1 整流器 1
2 電磁電容 104 6
3 電磁電容 20 2
4 極性電容 470uf 2
5 極性電容 22uf 1
6 三端穩壓器 7805 1
7 發(fā)光二極管 4
8 7段數碼顯示器 4
9 保險絲 1
10 繼電器 4
11 蜂鳴器 1
12 電阻 2.2K 8
13 電阻 4.7K 7
14 按鈕 17
15 時(shí)鐘芯片 DS12887 1
16 單片機 AT89C52 1
17 驅動(dòng)器 ULN2003A 1
18 反相器 SN7404N 1
19 鍵盤(pán)編碼器 74C922 1
20 晶振 6MHZ 1
附圖1:DS12C887地址分布圖
結論
對于這一次的專(zhuān)題,我覺(jué)得真的有感覺(jué)到設計的感覺(jué),跟實(shí)驗問(wèn)題有很不同的地方是我們可以自己構思功能,并且依據所要求的功能來(lái)設計自己的電路,完全要自己動(dòng)手,因此在對于系統的功能都很清楚了。通過(guò)這次對單片機硬件、DS12C887的硬件結構、單片機C程序設計的學(xué)習,真的感覺(jué)收獲不少,尤其是C語(yǔ)言的學(xué)習上,等于我利用了這次設計學(xué)習多了一門(mén)課程。如果事先就會(huì )C語(yǔ)言編程單片機我相信我能做的比目前好。
在開(kāi)始編程的時(shí)候,由于自己在學(xué)習單片機的時(shí)候學(xué)的不夠深,又由于設計安排在學(xué)完單片機一年以后的時(shí)候,忘的比較多,使得我總是不明白單片機如何讀取DS12C887時(shí)間芯片的數據,也不知該如何寫(xiě)入。后通過(guò)蘇老師指導方知將DS12C887芯片當做一個(gè)普通的外部RAM進(jìn)行讀寫(xiě)。
一開(kāi)始我們是用AT89C51進(jìn)行編程,遺憾的是我第一次編程完程序之后,我的電路板居然不能完全容納我的程序,竟然在implementation 時(shí)告訴我design is too large。后來(lái)經(jīng)過(guò)研究和老師指點(diǎn),我明白是我整個(gè)設計以及程序寫(xiě)了太多,導致容量不足。后來(lái)我們只有舍棄了AT89C51,改用了AT89C52芯片。實(shí)現了電路板一開(kāi)始要想要實(shí)現的功能。
盡管如此,作專(zhuān)題重要的并不在于結果,而是自己在整個(gè)活動(dòng)中的過(guò)程,經(jīng)過(guò)了這一次專(zhuān)題,我體會(huì )到從設計到實(shí)際做出來(lái)的過(guò)程,而且也將我所學(xué)過(guò)的單片機知識完完全全的復習了一遍,并且還學(xué)到了不少,我想這才是做專(zhuān)題的最終目的,以及我的最大的收獲。
參考文獻:
徐愛(ài)華主編.單片機應用技術(shù)教程.北京:機械工業(yè)出版社,2003.7
胡偉,季曉衡編著(zhù).單片機C程序設計及應用實(shí)例.人民郵電出版社
【四路多段定時(shí)開(kāi)關(guān)(一)】相關(guān)文章:
談京房解《易》的一段佚文03-06
護理干預在腰椎間盤(pán)突出癥伴外傷性胸椎多段骨折患者03-28
論聞一多詩(shī)歌創(chuàng )作的特色12-01
一種新型多DSP并行處理結構03-19
支持多業(yè)務(wù)QoS的多小區OFDMA資源分配算法03-07
基于GSM網(wǎng)絡(luò )的一機多號類(lèi)業(yè)務(wù)研究03-07
畢業(yè)論文的構段03-27
善的意志有多善?01-07