㈠ 如何用51單片機製作簡易電子鍾
我自己做的一個課程設計,程序運行已經成功了:
匯編程序如下:
ORG0000H
AJMPmain
ORG000BH;定時器0的中斷向量地址
AJMPTIME0;跳轉到真正的定時器程序處
ORG30H
main:
movdptr,#k1;
start:
MOVP0,#00H;中斷預處理程序
MOVP1,#00H
MOVP3,#00H;關所有燈
MOVR0,#00H;軟體計數器預清0
MOVR7,#00H
MOVR6,#00H
MOVTMOD,#00000001B;定時/計數器0工作於方式1
MOVTH0,#3CH
MOVTL0,#0B0H;即數15536
SETBEA;開總中斷允許
SETBET0;開定時/計數器0允許
SETBTR0;定時/計數器0開始運行
LOOP:;判斷時鍾進位程序
MOVA,R1
CJNEA,#60,LOOP1;R1等於60嗎?
MOVR1,#0
INCR2;R1等於60那麼R2加一,R1清0
MOVA,R2
CJNEA,#60,LOOP1;R2等於60嗎?
MOVR2,#0
INCR3;R2等於60那麼R3加一,R2清0
MOVA,R3
CJNEA,#24,LOOP1;R3等於24嗎?
MOVR3,#0
;R3等於24那麼R3清0
LOOP1:
mova,r2;如果分鍾顯示為0,報警
cjnea,#01H,LOOP2
mova,r1
cjnea,#00H,LOOP3
clrp2.0
LOOP3:
mova,r1;如果秒鍾顯示為1,取消報警
cjnea,#05H,LOOP2
setbp2.0
LOOP2:;顯示數據處理
MOVA,R1;取來8位二進制數
MOVB,#100
DIVAB;除以100
MOVA,B;取回余數
MOVB,#10
DIVAB;再除以10
MOVR4,A;商是十位數,存放到R4
MOVR5,B;余數是個位,存放到R5
MOV42H,R4
mOV41H,R5
;R1的BCD碼放入41-42H單元
MOVA,R2;取來8位二進制數
MOVB,#100
DIVAB;除以100
MOVA,B;取回余數
MOVB,#10
DIVAB;再除以10
MOVR4,A;商是十位數,存放到R4
MOVR5,B;余數是個位,存放到R5
MOV44H,R4
MOV43H,R5
;R2的BCD碼放入43-44H單元
MOVA,R3;取來8位二進制數
MOVB,#100
DIVAB;除以100
MOVA,B;取回余數
MOVB,#10
DIVAB;再除以10
MOVR4,A;商是十位數,存放到R4
MOVR5,B;余數是個位,存放到R5
MOV46H,R4
mov45H,R5
;R3的BCD碼放入45-46H單元
L1:
mova,41h
movca,@a+dptr
mov51h,a
mova,42h
movca,@a+dptr
mov52h,a
mova,43h
movca,@a+dptr
mov53h,a
mova,44h
movca,@a+dptr
mov54h,a
mova,45h
movca,@a+dptr
mov55h,a
mova,46h
movca,@a+dptr
mov56h,a;將顯示代碼送入51H--56H
display:;顯示程序
movp0,#0ffH;一
movp0,51H
movP1,#0feH
acalldelay1S
movp1,#0ffH
movp0,#0ffH;二
movp0,52h
movP1,#0fdH
acalldelay1S
movp1,#0ffH
movp0,#0ffH;三
movp0,53h
movP1,#0fbH
acalldelay1S
movp1,#0ffH
movp0,#0ffH;四
movp0,54h
movP1,#0f7H
acalldelay1S
movp1,#0ffH
movp0,#0ffH;五
movp0,55h
movP1,#0efH
acalldelay1S
movp1,#0ffH
movp0,#0ffH;六
movp0,56h
movP1,#0dfH
acalldelay1S
movp1,#0ffH
;將51H-56H數據顯示,
AJMPLOOP;工作處理程序
TIME0:;定時器0的中斷處理程序
INCR7
MOVA,R7
CJNEA,#20,T_RET;R7單元中的值到了20了嗎?
T_L1:
INCR1;到了20那麼R1+1
MOVR7,#0;清軟體計數器
T_RET:;二十分之一秒時的程序
incr6
mova,r6
cjner6,#3,T_over;調節時間的延遲時間
movr6,#0
jbp2.1,T_over1
mova,r2
adda,#1
cjnea,#60,T_tiao1
mova,#0
T_tiao1:
movr2,a
T_over1:
jbp2.2,T_over
mova,r3
adda,#1
cjnea,#24,T_tiao2
mova,#0
T_tiao2:
movr3,a
T_over:
MOVTH0,#3CH
MOVTL0,#0B0H;如果沒到一秒重置定時常數
reti
delay1s:MOV31H,#100
D1:MOV32H,#30
D2:DJNZ32H,D2
DJNZ31H,D1
RET
delay2s:MOV33H,#255
D3:MOV34H,#255
D4:DJNZ34H,D4
DJNZ33H,D3
RET
K1:db3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
㈡ 基於MCS-51單片機的數字時鍾系統設計
51單片機的PDF 89S52典型的51結構
主要性能
l 與MCS-51單片機產品兼容
l 8K位元組在系統可編程Flash存儲器
l 1000次擦寫周期
l 全靜態操作:0Hz~33Hz
l 三級加密程序存儲器
l 32個可編程I/O口線
l 三個16位定時器/計數器
l 八個中斷源
l 全雙工UART串列通道
l 低功耗空閑和掉電模式
l 掉電後中斷可喚醒
l 看門狗定時器
l 雙數據指針
l 掉電標識符
功能特性描述
AT89S52是一種低功耗、高性能CMOS8位微控制器,具有
8K 在系統可編程Flash 存儲器。使用Atmel 公司高密度非
易失性存儲器技術製造,與工業80C51 產品指令和引腳完
全兼容。片上Flash允許程序存儲器在系統可編程,亦適於
常規編程器。在單晶元上,擁有靈巧的8 位CPU 和在系統
可編程Flash,使得AT89S52為眾多嵌入式控制應用系統提
供高靈活、超有效的解決方案。
AT89S52具有以下標准功能: 8k位元組Flash,256位元組RAM,
32 位I/O 口線,看門狗定時器,2 個數據指針,三個16 位
定時器/計數器,一個6向量2級中斷結構,全雙工串列口,
片內晶振及時鍾電路。另外,AT89S52 可降至0Hz 靜態邏
輯操作,支持2種軟體可選擇節電模式。空閑模式下,CPU
停止工作,允許RAM、定時器/計數器、串口、中斷繼續工
作。掉電保護方式下,RAM內容被保存,振盪器被凍結,
單片機一切工作停止,直到下一個中斷或硬體復位為止。
R
8 位微控制器
8K 位元組在系統可編程
Flash
AT89S52
Rev. 1919-07/01
AT89S52
2
引腳結構
AT89S52
3
方框圖
引腳功能描述
AT89S52
4
VCC : 電源
GND: 地
P0 口:P0口是一個8位漏極開路的雙向I/O口。作為輸出口,每位能驅動8個TTL邏
輯電平。對P0埠寫「1」時,引腳用作高阻抗輸入。
當訪問外部程序和數據存儲器時,P0口也被作為低8位地址/數據復用。在這種模式下,
P0具有內部上拉電阻。
在flash編程時,P0口也用來接收指令位元組;在程序校驗時,輸出指令位元組。程序校驗
時,需要外部上拉電阻。
P1 口:P1 口是一個具有內部上拉電阻的8 位雙向I/O 口,p1 輸出緩沖器能驅動4 個
TTL 邏輯電平。對P1 埠寫「1」時,內部上拉電阻把埠拉高,此時可以作為輸入
口使用。作為輸入使用時,被外部拉低的引腳由於內部電阻的原因,將輸出電流(IIL)。
此外,P1.0和P1.2分別作定時器/計數器2的外部計數輸入(P1.0/T2)和時器/計數器2
的觸發輸入(P1.1/T2EX),具體如下表所示。
在flash編程和校驗時,P1口接收低8位地址位元組。
引腳號第二功能
P1.0 T2(定時器/計數器T2的外部計數輸入),時鍾輸出
P1.1 T2EX(定時器/計數器T2的捕捉/重載觸發信號和方向控制)
P1.5 MOSI(在系統編程用)
P1.6 MISO(在系統編程用)
P1.7 SCK(在系統編程用)
P2 口:P2 口是一個具有內部上拉電阻的8 位雙向I/O 口,P2 輸出緩沖器能驅動4 個
TTL 邏輯電平。對P2 埠寫「1」時,內部上拉電阻把埠拉高,此時可以作為輸入
口使用。作為輸入使用時,被外部拉低的引腳由於內部電阻的原因,將輸出電流(IIL)。
在訪問外部程序存儲器或用16位地址讀取外部數據存儲器(例如執行MOVX @DPTR)
時,P2 口送出高八位地址。在這種應用中,P2 口使用很強的內部上拉發送1。在使用
8位地址(如MOVX @RI)訪問外部數據存儲器時,P2口輸出P2鎖存器的內容。
在flash編程和校驗時,P2口也接收高8位地址位元組和一些控制信號。
P3 口:P3 口是一個具有內部上拉電阻的8 位雙向I/O 口,p2 輸出緩沖器能驅動4 個
TTL 邏輯電平。對P3 埠寫「1」時,內部上拉電阻把埠拉高,此時可以作為輸入
口使用。作為輸入使用時,被外部拉低的引腳由於內部電阻的原因,將輸出電流(IIL)。
P3口亦作為AT89S52特殊功能(第二功能)使用,如下表所示。
在flash編程和校驗時,P3口也接收一些控制信號。
AT89S52
5
引腳號第二功能
P3.0 RXD(串列輸入)
P3.1 TXD(串列輸出)
P3.2 INT0(外部中斷0)
P3.3 INT0(外部中斷0)
P3.4 T0(定時器0外部輸入)
P3.5 T1(定時器1外部輸入)
P3.6 WR(外部數據存儲器寫選通)
P3.7 RD(外部數據存儲器寫選通)
RST: 復位輸入。晶振工作時,RST腳持續2 個機器周期高電平將使單片機復位。看門
狗計時完成後,RST 腳輸出96 個晶振周期的高電平。特殊寄存器AUXR(地址8EH)上
的DISRTO位可以使此功能無效。DISRTO默認狀態下,復位高電平有效。
ALE/PROG:地址鎖存控制信號(ALE)是訪問外部程序存儲器時,鎖存低8 位地址
的輸出脈沖。在flash編程時,此引腳(PROG)也用作編程輸入脈沖。
在一般情況下,ALE 以晶振六分之一的固定頻率輸出脈沖,可用來作為外部定時器或
時鍾使用。然而,特別強調,在每次訪問外部數據存儲器時,ALE脈沖將會跳過。
如果需要,通過將地址為8EH的SFR的第0位置「1」,ALE操作將無效。這一位置「1」,
ALE 僅在執行MOVX 或MOVC指令時有效。否則,ALE 將被微弱拉高。這個ALE 使
能標志位(地址為8EH的SFR的第0位)的設置對微控制器處於外部執行模式下無效。
PSEN:外部程序存儲器選通信號(PSEN)是外部程序存儲器選通信號。
當AT89S52從外部程序存儲器執行外部代碼時,PSEN在每個機器周期被激活兩次,而
在訪問外部數據存儲器時,PSEN將不被激活。
EA/VPP:訪問外部程序存儲器控制信號。為使能從0000H 到FFFFH的外部程序存儲器
讀取指令,EA必須接GND。
為了執行內部程序指令,EA應該接VCC。
在flash編程期間,EA也接收12伏VPP電壓。
XTAL1:振盪器反相放大器和內部時鍾發生電路的輸入端。
XTAL2:振盪器反相放大器的輸出端。
AT89S52
6
表1 AT89S52 特殊寄存器映象及復位值
特殊功能寄存器
特殊功能寄存器(SFR)的地址空間映象如表1所示。
並不是所有的地址都被定義了。片上沒有定義的地址是不能用的。讀這些地址,一般將
得到一個隨機數據;寫入的數據將會無效。
用戶不應該給這些未定義的地址寫入數據「1」。由於這些寄存器在將來可能被賦予新的
功能,復位後,這些位都為「0」。
定時器2 寄存器:寄存器T2CON 和T2MOD 包含定時器2 的控制位和狀態位(如表2
和表3所示),寄存器對RCAP2H和RCAP2L是定時器2的捕捉/自動重載寄存器。
中斷寄存器:各中斷允許位在IE寄存器中,六個中斷源的兩個優先順序也可在IE中設置。
AT89S52
7
表2 T2CON:定時器/計數器2控制寄存器
T2CON 地址為0C8H 復位值:0000 0000B
位可定址
TF2 EXF2 RLCLK TCLK EXEN2 TR2
7 6 5 4 3 2 1 0
符號功能
TF2 定時器2 溢出標志位。必須軟體清「0」。RCLK=1 或TCLK=1 時,TF2
不用置位。
EXF2
定時器2 外部標志位。EXEN2=1 時,T2EX 上的負跳變而出現捕捉或重
載時,EXF2 會被硬體置位。定時器2 打開,EXF2=1 時,將引導CPU
執行定時器2 中斷程序。EXF2 必須如見清「0」。在向下/向上技術模式
(DCEN=1)下EXF2不能引起中斷。
RCLK
串列口接收數據時鍾標志位。若RCLK=1,串列口將使用定時器2 溢出
脈沖作為串列口工作模式1 和3 的串口接收時鍾;RCLK=0,將使用定
時器1計數溢出作為串口接收時鍾。
TCLK
串列口發送數據時鍾標志位。若TCLK=1,串列口將使用定時器2 溢出
脈沖作為串列口工作模式1 和3 的串口發送時鍾;TCLK=0,將使用定
時器1計數溢出作為串口發送時鍾。
EXEN2
定時器2外部允許標志位。當EXEN2=1時,如果定時器2沒有用作串列
時鍾,T2EX(P1.1)的負跳變見引起定時器2 捕捉和重載。若EXEN2
=0,定時器2將視T2EX端的信號無效
TR2 開始/停止控制定時器2。TR2=1,定時器2開始工作
定時器2 定時/計數選擇標志位。=0,定時; =1,外部事
件計數(下降沿觸發)
捕捉/重載選擇標志位。當EXEN2=1時, =1,T2EX出現負脈沖,
會引起捕捉操作;當定時器2溢出或EXEN2=1時T2EX出現負跳變,都
會出現自動重載操作。=0 將引起T2EX 的負脈沖。當RCKL=1
或TCKL=1時,此標志位無效,定時器2溢出時,強製做自動重載操作。
雙數據指針寄存器:為了更有利於訪問內部和外部數據存儲器,系統提供了兩路16位
數據指針寄存器:位於SFR中82H~83H的DP0和位於84H~85。特殊寄存器AUXR1
中DPS=0 選擇DP0;DPS=1 選擇DP1。用戶應該在訪問數據指針寄存器前先初始化
AT89S52
8
DPS至合理的值。
表3a AUXR:輔助寄存器
AUXR 地址:8EH 復位值:XXX00XX0B
不可位定址
- - - WDIDLE DISRTO - - DISALE
7 6 5 4 3 2 1 0
- 預留擴展用
DISALE ALE使能標志位
DISALE 操作方式
0 ALE 以1/6晶振頻率輸出信號
1 ALE 只有在執行MOVX 或MOVC指令時激活
DISRTO 復位輸出標志位
DISRTO
0 看門狗(WDT)定時結束,Reset 輸出高電平
1 Reset 只有輸入
WDIDLE 空閑模式下WDT使能標志位
WDIDLE
0 空閑模式下,WDT繼續計數
1 空閑模式下,WDT停止計數
掉電標志位:掉電標志位(POF)位於特殊寄存器PCON的第四位(PCON.4)。上電期
間POF置「1」。POF可以軟體控制使用與否,但不受復位影響。
表3b AUXR1:輔助寄存器1
AUXR1 地址:A2H 復位值:XXXXXXX0B
不可位定址
- - - - - - - DPS
7 6 5 4 3 2 1 0
- 預留擴展用
DPS 數據指針選擇位
DPS
0 選擇DPTR寄存器DP0L和DP0H
1 選擇DPTR寄存器DP1L和DP1H
AT89S52
9
存儲器結構
MCS-51器件有單獨的程序存儲器和數據存儲器。外部程序存儲器和數據存儲器都可以
64K定址。
程序存儲器:如果EA引腳接地,程序讀取只從外部存儲器開始。
對於89S52,如果EA 接VCC,程序讀寫先從內部存儲器(地址為0000H~1FFFH)開
始,接著從外部定址,定址地址為:2000H~FFFFH。
數據存儲器:AT89S52 有256 位元組片內數據存儲器。高128 位元組與特殊功能寄存器重
疊。也就是說高128位元組與特殊功能寄存器有相同的地址,而物理上是分開的。
當一條指令訪問高於7FH 的地址時,定址方式決定CPU 訪問高128 位元組RAM 還是特
殊功能寄存器空間。直接定址方式訪問特殊功能寄存器(SFR)。
例如,下面的直接定址指令訪問0A0H(P2口)存儲單元
MOV 0A0H , #data
使用間接定址方式訪問高128 位元組RAM。例如,下面的間接定址方式中,R0 內容為
0A0H,訪問的是地址0A0H的寄存器,而不是P2口(它的地址也是0A0H)。
MOV @R0 , #data
堆棧操作也是簡介定址方式。因此,高128位元組數據RAM也可用於堆棧空間。
看門狗定時器
WDT是一種需要軟體控制的復位方式。WDT 由13位計數器和特殊功能寄存器中的看
門狗定時器復位存儲器(WDTRST)構成。WDT 在默認情況下無法工作;為了激活
WDT,戶用必須往WDTRST 寄存器(地址:0A6H)中依次寫入01EH 和0E1H。當
WDT激活後,晶振工作,WDT在每個機器周期都會增加。WDT計時周期依賴於外部
時鍾頻率。除了復位(硬體復位或WDT溢出復位),沒有辦法停止WDT工作。當WDT
溢出,它將驅動RSR引腳一個高個電平輸出。
WDT的使用
為了激活WDT,用戶必須向WDTRST寄存器(地址為0A6H的SFR)依次寫入0E1H
和0E1H。當WDT激活後,用戶必須向WDTRST寫入01EH和0E1H喂狗來避免WDT
溢出。當計數達到8191(1FFFH)時,13 位計數器將會溢出,這將會復位器件。晶振正
常工作、WDT激活後,每一個機器周期WDT 都會增加。為了復位WDT,用戶必須向
WDTRST 寫入01EH 和0E1H(WDTRST 是只讀寄存器)。WDT 計數器不能讀或寫。
當WDT 計數器溢出時,將給RST 引腳產生一個復位脈沖輸出,這個復位脈沖持續96
個晶振周期(TOSC),其中TOSC=1/FOSC。為了很好地使用WDT,應該在一定時間
內周期性寫入那部分代碼,以避免WDT復位。
掉電和空閑方式下的WDT
在掉電模式下,晶振停止工作,這意味這WDT也停止了工作。在這種方式下,用戶不
必喂狗。有兩種方式可以離開掉電模式:硬體復位或通過一個激活的外部中斷。通過硬
件復位退出掉電模式後,用戶就應該給WDT 喂狗,就如同通常AT89S52 復位一樣。
通過中斷退出掉電模式的情形有很大的不同。中斷應持續拉低很長一段時間,使得晶振
AT89S52
10
穩定。當中斷拉高後,執行中斷服務程序。為了防止WDT在中斷保持低電平的時候復
位器件,WDT 直到中斷拉低後才開始工作。這就意味著WDT 應該在中斷服務程序中
復位。
為了確保在離開掉電模式最初的幾個狀態WDT不被溢出,最好在進入掉電模式前就復
位WDT。
在進入待機模式前,特殊寄存器AUXR的WDIDLE位用來決定WDT是否繼續計數。
默認狀態下,在待機模式下,WDIDLE=0,WDT繼續計數。為了防止WDT在待機模
式下復位AT89S52,用戶應該建立一個定時器,定時離開待機模式,喂狗,再重新進
入待機模式。
UART
在AT89S52 中,UART 的操作與AT89C51 和AT89C52 一樣。為了獲得更深入的關於
UART 的信息,可參考ATMEL 網站(http://www.atmel.com)。從這個主頁,選擇
「Procts」,然後選擇「8051-Architech Flash Microcontroller」,再選擇「Proct
Overview」即可。
定時器0 和定時器1
在AT89S52 中,定時器0 和定時器1 的操作與AT89C51 和AT89C52 一樣。為了獲得
更深入的關於UART 的信息,可參考ATMEL 網站(http://www.atmel.com)。從這個主
頁,選擇「Procts」,然後選擇「8051-Architech Flash Microcontroller」,再選擇「Proct
Overview」即可。
定時器2
定時器2是一個16位定時/計數器,它既可以做定時器,又可以做事件計數器。其工作
方式由特殊寄存器T2CON中的C/T2位選擇(如表2所示)。定時器2有三種工作模式:
捕捉方式、自動重載(向下或向上計數)和波特率發生器。如表3 所示,工作模式由
T2CON中的相關位選擇。定時器2 有2 個8位寄存器:TH2和TL2。在定時工作方式
中,每個機器周期,TL2 寄存器都會加1。由於一個機器周期由12 個晶振周期構成,
因此,計數頻率就是晶振頻率的1/12。
表3 定時器2工作模式
RCLK+TCLK CP/RL2 TR2 MODE
0 0 1 16位自動重載
0 1 1 16位捕捉
1 × 1 波特率發生器
× × 0 (不用)
在計數工作方式下,寄存器在相關外部輸入角T2 發生1 至0 的下降沿時增加1。在這
AT89S52
11
種方式下,每個機器周期的S5P2期間采樣外部輸入。一個機器周期采樣到高電平,而
下一個周期采樣到低電平,計數器將加1。在檢測到跳變的這個周期的S3P1 期間,新
的計數值出現在寄存器中。因為識別1-0的跳變需要2個機器周期(24個晶振周期),
所以,最大的計數頻率不高於晶振頻率的1/24。為了確保給定的電平在改變前采樣到
一次,電平應該至少在一個完整的機器周期內保持不變。
捕捉方式
在捕捉模式下,通過T2CON中的EXEN2來選擇兩種方式。如果EXEN2=0,定時器2
時一個16位定時/計數器,溢出時,對T2CON 的TF2標志置位,TF2引起中斷。如果
EXEN2=1,定時器2做相同的操作。除上述功能外,外部輸入T2EX引腳(P1.1)1至
0的下跳變也會使得TH2和TL2中的值分別捕捉到RCAP2H和RCAP2L中。除此之外,
T2EX 的跳變會引起T2CON 中的EXF2 置位。像TF2 一樣,T2EX 也會引起中斷。捕
捉模式如圖5所示。
圖5 定時器的捕捉模式
自動重載
當定時器2 工作於16 位自動重載模式,可對其編程實現向上計數或向下計數。這一功
能可以通過特殊寄存器T2MOD(見表4)中的DCEN(向下計數允許位)來實現。通
過復位,DCEN 被置為0,因此,定時器2 默認為向上計數。DCEN 設置後,定時器2
就可以取決於T2EX向上、向下計數。
如圖6 所示,DCEN=0 時,定時器2 自動計數。通過T2CON 中的EXEN2 位可以選擇
兩種方式。如果EXEN2=0,定時器2計數,計到0FFFFH後置位TF2溢出標志。計數
溢出也使得定時器寄存器重新從RCAP2H 和RCAP2L 中載入16 位值。定時器工作於
捕捉模式,RCAP2H和RCAP2L的值可以由軟體預設。如果EXEN2=1,計數溢出或在
外部T2EX(P1.1)引腳上的1到0的下跳變都會觸發16位重載。這個跳變也置位EXF2
中斷標志位。
如圖6所示,置位DCEN,允許定時器2向上或向下計數。在這種模式下,T2EX引腳
控制著計數的方向。T2EX上的一個邏輯1使得定時器2向上計數。定時器計到0FFFFH
AT89S52
12
溢出,並置位TF2。定時器的溢出也使得RCAP2H和RCAP2L中的16位值分別載入到
定時器存儲器TH2和TL2中。
T2EX 上的一個邏輯0 使得定時器2 向下計數。當TH2 和TL2 分別等於RCAP2H 和
RCAP2L中的值的時候,計數器下溢。計數器下溢,置位TF2,並將0FFFFH載入到定
時器存儲器中。
定時器2上溢或下溢,外部中斷標志位EXF2 被鎖死。在這種工作模式下,EXF2不能
觸發中斷。
圖6 定時器2重載模式(DCEN=0)
表4 T2MOD-定時器2控制寄存器
T2MOD 地址:0C9H 復位值:XXXXXX00B
不可位定址
- - - - - - T2OE DCEN
7 6 5 4 3 2 1 0
符號功能
- 無定義,預留擴展
T2OE 定時器2輸出允許位
DCEN 置1後,定時器2可配置成向上/向下計數
AT89S52
13
圖7 定時器2自動重載(DCEN=1)
圖8 定時器2 波特率發生器模式
AT89S52
14
波特率發生器
通過設置T2CON(見表2)中的TCLK或RCLK可選擇定時器2 作為波特率發生器。
如果定時器2作為發送或接收波特率發生器,定時器1可用作它用,發送和接收的波特
率可以不同。如圖8 所示,設置RCLK 和(或)TCLK 可以使定時器2 工作於波特率
產生模式。
波特率產生工作模式與自動重載模式相似,因此,TH2 的翻轉使得定時器2 寄存器重
載被軟體預置16位值的RCAP2H和RCAP2L中的值。
模式1和模式3的波特率由定時器2溢出速率決定,具體如下公式:
模式1和模式3波特率=
16
2溢出率定時器
定時器可設置成定時器,也可為計數器。在多數應用情況下,一般配置成定時方式
(CP/T2=0)。定時器2 用於定時器操作與波特率發生器有所不同,它在每一機器周期
(1/12晶振周期)都會增加;然而,作為波特率發生器,它在每一機器狀態(1/2晶振
周期)都會增加。波特率計算公式如下:
模式1和模式3的波特率=
)] 2 , 2 ( 65536 [ 32 L RCAP H RCAP - ′
晶振頻率*原文少半個括弧「(」
其中,(RCAP2H,RCAP2L)是RCAP2H和RCAP2L組成的16位無符號整數。
定時器2 作為波特率發生器,如圖8 所示。圖中僅僅在T2CON 中RCLK 或TCLK=1
才有效。特別強調,TH2的翻轉並不置位TF2,也不產生中斷; EXEN2置位後,T2EX
引腳上1~0的下跳變不會使(RCAP2H,RCAP2L)重載到(TH2,TL2)中。因此,
定時器2作為波特率發生器,T2EX也還可以作為一個額外的外部中斷。
定時器2處於波特率產生模式,TR2=1,定時器2正常工作。TH2或TL2不應該讀寫。
在這種模式下,定時器在每一狀態都會增加,讀或寫就不會准確。寄存器RCAP2可以
讀,但不能寫,因為寫可能和重載交迭,造成寫和重載錯誤。在讀寫定時器2 或RCAP2
寄存器時,應該關閉定時器(TR2清0)。
可編程時鍾輸出
如圖9 所示,可以通過編程在P1.0 引腳輸出一個占空比為50%的時鍾信號。這個引腳
除了常規的I/O 角外,還有兩種可選擇功能。它可以通過編程作為定時器/計數器2 的
外部時鍾輸入或占空比為50%的時鍾輸出。當工作頻率為16MHZ時,時鍾輸出頻率范
圍為61HZ到4HZ。
為了把定時器2配置成時鍾發生器,位C/T2(T2CON.1)必須清0,位T2OE(T2MOD.1)
必須置1。位TR2(T2CON.2)啟動、停止定時器。時鍾輸出頻率取決於晶振頻率和定
時器2捕捉寄存器(RCAP2H,RCAP2L)的重載值,如公式所示:
時鍾輸出頻率=
] 2 , 2 65536 [ 4 ) -(
晶振頻率
L RCAP H RCAP ′
在時鍾輸出模式下,定時器2不會產生中斷,這和定時器2用作波特率發生器一樣。定
AT89S52
15
時器2也可以同時用作波特率發生器和時鍾產生。不過,波特率和輸出時鍾頻率相互並
不獨立,它們都依賴於RCAP2H和RCAP2L。
圖9 定時器2時鍾輸出模式
中斷
AT89S52 有6個中斷源:兩個外部中斷(INT0 和INT1),三個定時中斷(定時器0、1、
2)和一個串列中斷。這些中斷如圖10所示
每個中斷源都可以通過置位或清除特殊寄存器IE 中的相關中斷允許控制位分別使得中
斷源有效或無效。IE還包括一個中斷允許總控制位EA,它能一次禁止所有中斷。
如表5所示,IE.6位是不可用的。對於AT89S52,IE.5位也是不能用的。用戶軟體不應
給這些位寫1。它們為AT89系列新產品預留。
定時器2可以被寄存器T2CON中的TF2和EXF2的或邏輯觸發。程序進入中斷服務後,
這些標志位都可以由硬體清0。實際上,中斷服務程序必須判定是否是TF2 或EXF2激
活中斷,標志位也必須由軟體清0。
定時器0和定時器1標志位TF0 和TF1在計數溢出的那個周期的S5P2被置位。它們的
值一直到下一個周期被電路捕捉下來。然而,定時器2 的標志位TF2 在計數溢出的那
個周期的S2P2被置位,在同一個周期被電路捕捉下來。
AT89S52
16
表4 中斷允許控制寄存器(IE)
(MSB) (LSB)
EA - ET2 ES ET1 EX1 ET0 EX0
中斷允許控制位=1,允許中斷
中斷允許控制位=0,禁止中斷
符號位地址功能
EA IE.7 中斷總允許控制位。EA=0,中斷總禁止;EA=1,各中斷由各
自的控制位設定
- IE.6 預留
ET2 IE.5 定時器2中斷允許控制位
ES IE.4 串列口中斷允許控制位
ET1 IE.3 定時器1中斷允許控制位
EX1 IE.2 外部中斷1允許控制位
ET0 IE.1 定時器0中斷允許控制位
EX0 IE.0 外部中斷1允許控制位
圖10 中斷源
AT89S52
17
晶振特性
如圖10 所示,AT89S52 單片機有一個用於構成內部振盪器的反相放大器,XTAL1 和
XTAL2 分別是放大器的輸入、輸出端。石英晶體和陶瓷諧振器都可以用來一起構成自
激振盪器。從外部時鍾源驅動器件的話,XTAL2 可以不接,而從XTAL1 接入,如圖
12 所示。由於外部時鍾信號經過二分頻觸發後作為外部時鍾電路輸入的,所以對外部
時鍾信號的占空比沒有其它要求,最長低電平持續時間和最少高電平持續時間等還是要
符合要求的。
圖11 內部振盪電路連接圖圖12 外部振盪電路連接圖
石英晶振C1,C2=30PF±10PF
陶瓷諧振器C1,C2=40PF±10PF
空閑模式
在空閑工作模式下,CPU 處於睡眠狀態,而所有片上外部設備保持激活狀態。這種狀
態可以通過軟體產生。在這種狀態下,片上RAM和特殊功能寄存器的內容保持不變。
空閑模式可以被任一個中斷或硬體復位終止。
由硬體復位終止空閑模式只需兩個機器周期有效復位信號,在這種情況下,片上硬體禁
止訪問內部RAM,而可以訪問埠引腳。空閑模式被硬體復位終止後,為了防止預想
不到的寫埠,激活空閑模式的那一條指令的下一條指令不應該是寫埠或外部存儲
器。
掉電模式
在掉電模式下,晶振停止工作,激活掉電模式的指令是最後一條執行指令。片上RAM
AT89S52
18
和特殊功能寄存器保持原值,直到掉電模式終止。掉電模式可以通過硬體復位和外部中
斷退出。復位重新定義了SFR 的值,但不改變片上RAM 的值。在VCC未恢復到正常
工作電壓時,硬體復位不能無效,並且應保持足夠長的時間以使晶振重新工作和初始化。
表6 空閑模式和掉電模式下的外部引腳狀態
模式程序存儲器ALE PSEN PORT0 PORT1 PORT2 PORT3
空閑內部1 1 數據數據數據數據
空閑外部1 1 浮空數據地址數據
掉電內部0 0 數據數據數據數據
掉電外部0 0 浮空數據數據數據
程序存儲器的加密位
AT89S52有三個加密位不可編程(U)和可編程獲得下表所示的功能。
表7 加密位保護模式
加密位1(LB1)編程後,EA 引腳的邏輯值被采樣,並在復位期間鎖存。如果器件復
位,而沒有復位,將鎖存一個隨機值,直到復位為止。為了器件功能正常,鎖存到的
EA值必須和這個引腳的當前邏輯電平一致。
Flash編程―並行模式
AT89S52 帶有用作編程的片上Flash 存儲器陣列。編程介面需要一個高電壓(12V)編
程使能信號,並且兼容常規的第三方*(原文:third-party,不知道對不對)Flash或EPROM
編程器。
AT89S52程序存儲陣列採用位元組式編程。
編程方法
對AT89S52編程之前,需根據Flash編程模式表和圖13、圖14對地址、數據和控制信
號設置。可採用下列步驟對AT89S52編程:
AT89S52
19
1.在地址線上輸入編程單元地址信號
2.在數據線上輸入正確的數據
3.激活相應的控制信號
4.把EA/Vpp升至12V
5.每給Flash寫入一個位元組或程序加密位時,都要給ALE/PROG一次脈沖。位元組寫周
期時自身定製的,典型值僅僅50us。改變地址、數據重復第1步到第5步,知道全
部文件結束。
Data Polling
AT89S52用Data Polling作為一個位元組寫周期結束的標志特徵。
㈢ 單片機的數字鍾設計 利用51單片機設計一個數字鍾,至少實現基本的時分秒功能,要有必要的程序、程序流程圖
這有一篇給你參考:基於51單片機的多功能數字鍾系統設計(免費下載)
地址:http://www.mcudata.com/Webmaster/51danpianji/2010/0819/4435.html
第1章 緒 論
第2章 MCS-51單片機的結構
第3章 電路的硬體設計
第4章 電路的軟體設計
第5章 結論與展望
5.1 結論
5.2 單片機的發展趨勢
㈣ 利用51單片機,4個數碼管設計一個計時器,要求在數碼管上顯示的數據從0開始每1秒鍾加1。
沒有定時器的不過有數字鍾的
你可以參考下
其中可有有用的
摘要
本題給出基於單片機的數字中的設計,設計由單片機作為核心控制器,通過頻率計數實現計時功能,將實時時間經由單片機輸出到顯示設備——數碼管上顯示出來,並通過鍵盤來實現啟動、停止、復位和調整時間的功能。
關鍵詞: 單片機、數字鍾、AT89S52、LED
1 引言
在單片機技術日趨成熟的今天,其靈活的硬體電路的設計和軟體的設計,讓單片機得到了廣泛的應用,幾乎是從小的電子產品,到大的工業控制,單片機都起到了舉足輕重的作用。單片機小的系統結構幾乎是所有具有可編程硬體的一個縮影,可謂是「麻雀雖小,五臟俱全」。
現在是一個知識爆炸的新時代。新產品、新技術層出不窮,電子技術的發展更是日新月異。可以毫不誇張的說,電子技術的應用無處不在,電子技術正在不斷地改變我們的生活,改變著我們的世界。在這快速發展的年代,時間對人們來說是越來越寶貴,在快節奏的生活時,人們一旦遇到重要的事情而忘記了時間,這將會帶來很大的損失,因此我們需要一個計時系統來提醒這些忙碌的人。 然而,隨著科技的發展和社會的進步,人們對時鍾的要求也越來越高,傳統的時鍾已不能滿足人們的需求。多功能數字鍾不管在性能上還是在樣式上都發生了質的變化,如電子鬧鍾、數字鬧鍾等等。 單片機在多功能數字鍾中的應用已是非常普遍的,基於單片機的數字鍾給人們帶來了極大的方便。
現今,高精度的計時工具大多數都使用了石英晶體振盪器,由於電子鍾,石英錶,石英鍾都採用了石英技術,因此走時精度高,穩定性好,使用方便,不需要經常調校,數字式電子鍾用集成電路計時,解碼代替機械式傳動,用LED顯示器代替指針顯示進而顯示時間,減小了計時誤差,這種表具有時,分,秒顯示時間的功能,還可以進行時和分的校對,片選的靈活性好。本文利用單片機實現數字時鍾計時功能的主要內容,其中AT89S52是核心元件同時採用數碼管動態顯示「時」,「分」,「秒」的現代計時裝置。與傳統機械表相比,它具有走時精確,顯示直觀等特點。它的計時周期為24小時,顯滿刻度為「23時59分59秒」,另外具有校時功能,斷電後有記憶功能,恢復供電時可實現計時同步等特點。
2 方案論證
2.1 方案一
數字鍾採用FPGA作為主控制器。由於FPGA具有強大的資源,使用方便靈活,易於進行功能擴展,特別是結合了EDA,可以達到很高的效率。此方案邏輯雖然簡單一點,但是一塊FPGA的價格很高,對於做電子鍾來說有一點浪費,而且FPGA比較難掌握,本設計中不作過多研究,也不採用此方案。
2.2 方案二
數字鍾由幾種邏輯功能不同的CMOS數字集成電路構成,共使用了10片數字集成電路,其原理圖如圖2.1所示。它是由秒信號發生器(時基電路)、小時分鍾計數器及解碼和驅動顯示電路3部分組成,其基本工作過程是:時基電路產生精確周期的脈沖信號,經過分頻器作用給後面的計數器輸送1HZ的秒信號,最後由計數器及驅動顯示單元按位驅動數碼管時間顯示,但是這樣設計的電路比較復雜,使用也不靈活,而且價格比較高,故不採用此方案。
圖2.1 方案二原理示意圖
2.3 方案三
AT89S52是一種低功耗、高性能CMOS 8位微控制器。使用Atmel公司高密度非易失性存儲器技術製造,與工業80C51產品指令和引腳完全兼容。片上Flash允許程序存儲器在系統可編程,亦適於常規編程器。在單晶元上,擁有靈巧的8位CPU和在系統可編程Flash,使得AT89S52為眾多嵌入式控制應用系統提供高靈活、有效的解決方案。它具有串列口,片內晶振及時鍾電路。另外,AT89S52可降至0Hz 靜態邏輯操作,支持2種軟體可選擇節電模式。空閑模式下,CPU停止工作,允許RAM、定時器/計數器、串口、中斷繼續工作。掉電保護方式下,RAM內容被保存,振盪器被凍結,單片機一切工作停止,直到下一個中斷或硬體復位為止。
基於AT89S52單片機來實現系統的控制,外圍電路比較簡單,成本比較低,此系統控制靈活能很好地滿足本課題的基本要求和擴展要求,因此選用該方案。其硬體框圖如圖2.2所示,原理圖見附錄圖6.1。
圖2.2 數字鍾硬體框圖
2.4 電路組成及工作原理
本文數字時鍾設計原理主要利用AT89S52單片機,由單片機的P0口控制數碼管的位顯示,P2口控制數碼管的段顯示,P1口與按鍵相接用於時間的校正。在設計中引入220V交流電經過整流、濾波後產生+5V電壓,用於給單片機及顯示電路提供工作電壓。
整個系統工作時,秒信號產生器是整個系統的時基信號,它直接決定計時系統的精度,將標准秒信號送入「秒計數器」,「秒計數器」採用60進制計數器,每累計60秒發出一個「分脈沖」信號,該信號將作為「分計數器」的時鍾脈沖。「分計數器」也採用60進制計數器,每累計60分鍾,發出一個「時脈沖」信號,該信號將被送到「時計數器」。「時計數器」採用24進制計時器,可實現對一天24小時的累計。顯示電路將「時」、「分」、「秒」計數器的輸出,通過六個七段LED顯示器顯示出來。校時電路是直接加一個脈沖信號到時計數器或者分計數器或者秒計數器來對「時」、「分」、「秒」顯示數字進行校對調整。在本設計中,24小時時鍾顯示、秒錶的設計和顯示都是依靠單片機中的定時器完成。使用定時器T0產生1s的中斷,在中斷程序中完成每一秒數字的變化,並在主程序中動態顯示該字元。其功能框圖如圖2.3所示。
圖2.3 秒錶外中斷的功能示意圖
數字鍾的電路設計主要功能是提供單片機和外部的LED顯示、273地址鎖存和片選以及外部存儲器2764的介面電路,此外還需要設計相關的LED驅動電路。
(1)電路原理和器件選擇
本實例相關的關鍵部分的器件名稱及其在數字鍾電路中的主要功能:
89S52:單片機,控制LED的數據顯示。
LED1--LED6:用於顯示單片機的數據,其中三個採用7段顯示用於顯示時、分、秒的十位,另三個採用8段顯示用於顯示時、分、秒的個位。
74LS273:鎖存器,LED顯示擴展電路中的段碼和位碼使用了兩片74LS273,上升沿鎖存。
74LS02:與非門,與單片機的讀寫信號一起使用,選中外部的74LS273,決定LED的欄位和字位的顯示內容。
7407:驅動門電路,提供數碼管顯示的驅動電流。
74LS04:非門,對單片機的片選信號取反,並和讀寫信號一起使用,決定74LS273的片選。
L1--L4:發光二極體,通過單片機的P1.4--P1.7控制,用以顯示秒錶和時鍾的時間變化。
BUZZER:揚聲器,在程序規定的情況下,發出聲音,提示計時完畢。
74LS373:地址鎖存器,將P0口的地址和數據分開,分別輸入到2764的數據和地址埠。
2764:EPROM,為單片機提供外部的程序存儲區。
開關K0、K1、K2分別調整秒、分、時。
按鍵RESET:在復位電路中,起到程序復位的作用。
按鍵PULSE:提供單脈沖,從而實現單片機對外部脈沖的計數功能,利用單脈沖實現相應位加1。
(2)地址分配和連接
P2.7:和寫信號一起組成字位口的片選信號,字位口的對應地址位8000H
P2.6:和寫信號一起組成欄位口的片選信號,欄位口的對應地址位4000H
D0--D7:單片機的數據匯流排,LED顯示的內容通過D0--D7數據線從單片機傳送到LED
P2.0--P2.5:單片機的P2口,和2764的高端地址線相連,決定2764中的存儲單元的地址。
P1.4--P1.7:單片機的P1口,和反光二極體L1--L4相連,通過單片機的P1.4--P1.7控制,用以顯示秒錶和時鍾的時間變化。
(3)功能簡介
LED顯示模塊與單片機的連接中,對LED顯示模塊的讀寫和字位、欄位通道的選擇是通過單片機的P2.6、P2.7口完成。其中,P2.6、P2.7口的片選信號需要和讀寫信號做一定的邏輯操作,以保證字位和欄位選擇的正確性。
外部存儲器2764是通過74LS373和單片機相連,並且通過P2口的相關信號線進行地址的分配。地址范圍為0000H--1FFFH。
3 各電路設計和論證
3.1電源電路設計
在各種電子設備中,直流穩壓電源是必不可少的組成部分,它不僅為系統提供多路電壓源,還直接影響到系統的技術指標和抗干擾性能。要想得到我們所要的+5V輸出電壓,就需將交流220V的電壓經過二極體全波整流、電容濾波、7805穩壓輸出穩定的5V直流電壓為整個電路提供電源。
圖3.1 電源電路圖
4個IN4004組成橋式整流電路,電容(104uf)用於濾波,LM7805將經過整流濾波的電壓穩定在5V輸出。
3.2 晶體振盪器
51系列單片機內部有一個時鍾電路(其核心時一個反相放大器),但並沒有形成時鍾的振盪信號,因此必須外接諧振器才能形成振盪。如何用這個內部放大器,可以根據不同的場合做出不同的選擇。這樣就對應了單片機時鍾產生的不同方式:若採用這個放大器,產生振盪即為內部方式;若採用外部振盪輸入,即為外部方式。
方案一、內部方式
如果在51單片機的XTAL1和XTAL2引腳之間外接晶體諧振器,便會產生自激振盪,即可在內部產生與外加晶體同頻率的振盪時鍾。
最常見的內部方式振盪圖如圖3.2所示。
圖3.2 晶體振盪電路
不同單片機最高工作頻率不一樣,如AT89C51的最高工作頻率為24MHZ,AT89S51的最高工作頻率可達33MHZ。由於製造工藝的改進,現在單片機的工作頻率范圍正向兩端延伸,可達40MHZ以上。振盪頻率越高表示單片機運行的速度越快,但同時對存儲器的速度和印刷電路板的要求也就越高。頻率太高有時反而會導致程序不好編寫(如延時程序)。一般來說,不建議使用很高頻率的晶體振盪器。51系列的單片機應用系統一般都選用頻率為6~12MHZ的晶振。
這個電路對C1、C2的值沒有嚴格的要求,但電容的大小多少會影響振盪器的穩定性、振盪器頻率的高低、起振的快速性等。一般外接晶體時,C1、C2的值通常選為20~100PF。
晶體振盪器是數字鍾的核心。振盪器的穩定度和頻率的精確度決定了數字鍾計時的准確程度,通常採用石英晶體構成振盪器電路。一般說來,振盪器的頻率越高,計時的精度也就越高。在此設計中,信號源提供1HZ秒脈沖,它是採用晶體分頻得到的。AT89S52單片機有一個用於構成內部振盪器的反相放大器,XTAL1和XTAL2分別是放大器的輸入、輸出端。石英晶體和陶瓷諧振器都可以用來一起構成自激振盪器。從外部時鍾源驅動器件,XTAL2可以不接,而從XTAL1接入,由於外部時鍾信號經過二分頻觸發後作為外部時鍾電路輸入的,所以對外部時鍾信號的占空比沒有其它要求,最長低電平持續時間和最少高電平持續時間等還是要符合要求的。反相放大器的輸入端為XTAL1,輸出端為XTAL2,兩端連接石英晶體及兩個電容形成穩定的自激振盪器。電容通常取30PF左右。振盪頻率范圍是1.2~12MHz。
晶體振盪器的振盪信號從XTAL2端輸出到片內的時鍾發生器上。時鍾發生器為二分頻器。向CPU提供兩相時鍾信號P1和P2。每個時鍾周期有兩個節拍(相)P1和P2,CPU就以兩相時鍾P1和P2為基本節拍指揮AT89S52單片機各部件協調工作。在本次設計中取石英晶體的振盪頻率為11.0592MHz。
另外在設計電路板時,晶振、電容等均應盡量靠近單片機晶元,以減小分布電容,進一步保證振盪器的穩定性。
方案二、外部方式
在較大規模的應用系統中可能會用到多個單片機,為保證各單片機之間時鍾信號的同步,應當引入唯一的公用外部脈沖信號作為各單片機的共同的振盪脈沖,也就是要採用外部方式,外部振盪信號直接引入XTAL1和XTAL2引腳。
由於HMOS、CHMOS單片機內部時鍾進入的引腳不同,因此外部振盪信號的接入方式也不一樣。所以不選用此方案。
3.3 校時電路
當數字鍾走時出現誤差時,需要校正時間。校時控制電路實現對「秒」、「分」、「時」的校準。其電路圖如圖3.3所示:
圖3.3 校時電路
3.4 解碼顯示電路
解碼電路的功能是將「秒」、「分」、「時」 計數器中每個計數器的輸出狀態(8421碼),翻譯成七段(或八段)數碼管能顯示十進制數所要求的電信號,然後再經數碼管把相應的數字顯示出來。解碼器採用74LS248解碼/驅動器。顯示器採用七段共陰極數碼管。顯示部分是整個電子時鍾最為重要的部分,共需要6位LED顯示器。採用動態顯示方式,所謂動態顯示方式是時間數字在LED上一個一個逐個顯示,它是通過位選端控制在哪個LED上顯示數字,由於這些LED數字顯示之間的時間非常的短,使的人眼看來它們是一起顯示時間數字的,並且動態顯示方式所用的介面少,節省了CPU的管腳。由於埠的問題以及動態顯示方式的優越性,在此設計的連接方式上採用共陰級接法。顯示器LED有段選和位選兩個埠,首先說段選端,它由LED八個埠構成,通過對這八個埠輸入的不同的二進制數據使得它的時間顯示也不同,從而可以得到我們所要的時間顯示和溫度。但對於二十個管腳的AT89S52來說,LED八個段選管腳太多,於是我選用2764晶元來擴展主晶元的管腳,74LS164是數據移位寄存器,還選用了74LS373作為數據緩存器。
選用器件時應注意解碼器和顯示器的匹配,包括兩個方面:一是功率匹配,即驅動功率要足夠大。因為數碼管工作電流較大,應選用驅動電流較大的解碼器或OC輸出解碼器。二是邏輯電平匹配。例如,共陰極型的LED數碼管採用高電平有效的解碼器。推薦使用的顯示解碼器有74LS48、74LS49、CC4511。
3.5 顯示電路結構及原理
(1)單片機中通常用七段LED構成 「8」 字型結構,另外,還有一個小數點發光二極體以顯示小數位!這種顯示器有共陰和共陽兩種!發光二極體的陽極連在一起的(公共端)稱為共陽極顯示器,陰極連在一起的稱為共陰極顯示器。
一位顯示器由8個發光二極體組成,其中,7個發光二極體構成字型「8」的各個筆劃,另一個發光二極體為小數點為。當在某段發光二極體上施加一定的正向電壓時,該段筆畫即亮;不加電壓則暗。為了保護各段LED不被損壞,需外加限流電阻。
在本設計中時、分、秒的十位採用七段顯示,個位採用八段顯示,使得更易於區分時、分、秒。
(2)LED顯示器介面及顯示方式
LED顯示器有靜態顯示方式和動態顯示方式兩種。靜態顯示就是當顯示器顯示某個字元時,相應的段恆定的導通或截止,直到顯示另一個字元為止。LED顯示器工作於靜態顯示方式時,各位的共陰極接地;若為共陽極則接+5V電源。每位的段選線分別與一個8位鎖存器的輸出口相連,顯示器中的各位相互獨立,而且各位的顯示字元一經確定,相應鎖存的輸出將維持不變。
正因為如此,靜態顯示器的亮度較高。這種顯示方式編程容易,管理也較簡單,但佔用I/O口線資源較多。因此,在顯示位數較多的情況下,一般都採用動態顯示方式。
由於所有6位段皆由一個I/O口控制,因此,在每一瞬間,6位LED會顯示相同的字元。要想每位顯示不同的字元,就必須採用掃描方法流點亮各位LED,即在每一瞬間只使某一位顯示字元。在此瞬間,段選控制I/O口輸出相應字元段選碼(字型碼),而位選則控制I/O口在該顯示位送入選通電平(因為LED為共陰,故應送低電平),以保證該位顯示相應字元。如此輪流,使每位分時顯示該位應顯示字元。
在多位LED顯示時,為了簡化電路,降低成本,將所有位的段選線並聯在一起,由一個8位I/O口控制。而共陰(共陽)極公共端分別由相應的I/O口線控制,實現各位的分時選通。
段選碼,位選碼每送入一次後延時2MS,因人的視覺暫留效應,給人看上去每個數碼管總在亮。
圖3.4 六位LED動態顯示電路
3.6 鍵盤部分
它是整個系統中最簡單的部分,根據功能要求,本系統共需三個按鍵:分別對時、分、秒進行控制。並採用獨立式按鍵。
按鍵按照結構原理可分為兩類,一類是觸點式開關按鍵,如機械式開關、導電橡膠式開關等;另一類是無觸點式開關按鍵,如電氣式按鍵,磁感應按鍵等。前者造價低後者壽命長。目前,微機系統中最常見的是觸點式開關按鍵。
按鍵按照介面原理可分為編碼鍵盤與非編碼鍵盤兩類,這兩類鍵盤的主要區別是識別鍵符及給出相應鍵碼的方法。編碼鍵盤主要是用硬體來實現對鍵的識別,非編碼鍵盤主要是由軟體來實現鍵盤的定義與識別。
全編碼鍵盤能夠由硬體邏輯自動提供與鍵對應的編碼,此外,一般還具有去抖動和多鍵、竄鍵保護電路。這種鍵盤使用方便,但需要較多的硬體,價格較貴,一般的單片機應用系統較少採用。非編碼鍵盤只簡單地提供行和列的矩陣,其它工作均由軟體完成。由於其經濟實用,較多地應用於單片機系統中。在本套設計中由於只需要幾個功能鍵,此時,可採用獨立式按鍵結構。
獨立式按鍵是直接用I/O口線構成的單個按鍵電路,其特點是每個按鍵單獨佔用一根I/O口線,每個按鍵的工作不會影響其它I/O口線的狀態。獨立式按鍵的典型應用如圖3.5 所示。
獨立式按鍵電路配置靈活,軟體結構簡單,但每個按鍵必須佔用一根I/O口線,因此,在按鍵較多時,I/O口線浪費較大,不宜採用。
圖3.5 獨立式按鍵結構圖
3.7 復位電路
復位時使CPU和系統中的其他功能部件都處於一個確定的初始狀態,復位後計算機就從這個狀態開始工作。在復位期間,CPU並沒有開始執行程序,是在做准備工作。
無論時在計算機剛上電時、斷電後、還是系統出現故障時都需要復位。
51單片機的復位條件靠外部電路實現。當時鍾電路工作時,只要在單片機的RESET引腳上持續出現2個TP以上的高電平就可以使單片機復位。但時間過短往往使復位部可靠。為了確保復位,RESET引腳上的高電平一般要維持大約10ms以上。
常見的復位電路有上電復位和按鍵復位電路。在此我們選用按鍵復位電路。
(1)上電復位電路
上電復位電路是利用電容充電來實現的。在接通電源的瞬間,RESET端的電位與VCC相同,都是+5V。隨著RC電路的充電,RESET的電位逐漸下降,只要保證RESET為高電平的時間大於10ms就能正常復位了。如圖3.6(1)所示。
圖3.6(1)上電復位電路
(2)按鍵復位電路
在單片機已經通電的情況下,只需要按下圖3.6(2)的K鍵也可以復位,此時VCC經過電阻Rs、Rk分壓,在RESET端產生一個復位高電平。
在圖3.6(2)的電路中,干擾容易竄入復位端,雖然在大多數情況下不會造成單片機的錯誤復位,但可能會引起內部某些寄存器的錯誤復位。這時可在RESET端接上一個去耦電容。
另外有些單片機應用系統中的外圍晶元也需要復位,如果這些復位端的復位電平要求和單片機的復位要求一致,則可以直接與之相連。常將RC電路接施密特電路後再接入單片機的復位端。這樣系統可以有多個復位端,以便保證外部晶元和單片機可靠地同步復位。
圖3.6(2) 按鍵復位電路
4 軟體設計
4.1 程序流程
程序整體設計:定時模塊,顯示模塊,時間調整模塊,狀態調整模塊。
(1)總體介紹:此部分主要介紹定時模塊,和顯示模塊。定時部分採用經典的定時器定時。它實現了數字鍾的主要部分和秒錶的主要部分,以及進行定時設置。顯示模塊是實現數字鍾的又一重要部分,其模塊的獨立程度直接影響到數字鍾的可視化程度。在此部分的設計中,設置專用顯示數據緩沖區,與分、時及其他數據緩沖區數據區別,在其中存放的是顯示段碼,而其他緩沖區存放的是時間數據。在顯示時,首先將時間十進制數據轉化為顯示段碼,然後送往數碼管顯示。顯示段碼採用動態掃描的方式。在要求改變顯示數據的類別時,只須改變指向數據緩沖區的指針所指向的十進制數據緩沖區即可。
(2)時間調整:時間調整有多種方式。一、可以直接進入相關狀態進行有關操作,二、將調整分兩步,先進入狀態,然後執行操作,這兩步分別由兩個鍵控制。方式一,比較直接,設計思想也比較簡單,但是,這種方式存在操作時間和控制鍵數目的矛盾。如果用比較少的鍵,那麼可能會在進入狀態後處於數據調整等待狀態,這樣會影響到顯示的掃描速度(顯示部分可以採用8279晶元來控制,可以解決此問題)。 當然在這種方式下,還可以使用多個狀態鍵,每個狀態鍵,完成一個對應數據的調整。如果採用二的方式,就不會出現這種情況。因為狀態的調整,與狀態的操作可以分別由兩個鍵控制,其狀態的調整數可以多達256個(理論上),操作的完成是這樣的,一鍵控制狀態的調整,一鍵控制數據的調整。以上兩種方式的實現都可以採用查詢和中斷的方式。兩種方式必須注意的問題是兩者進行相關操作的過程不能太長否則會影響顯示的掃描。利用查詢的方式,方法傳統,對此就不作過多的討論,以下是採用中斷的方式實現的數字鍾的一些討論和有關問題作的一些處理。基於以上的討論可以設計如下:將調整分為狀態調整和數據調整兩部分,每次進入中斷只執行一次操作,然後返回,這樣,就不必讓中斷處於調整等待狀態,這樣,可以使中斷的耗時很小。將定時器中斷的優先順序設置為最高級,那麼中斷的方式和查詢的方式一樣不會影響到時鍾的記數。
(3)中斷方式應注意的問題:
採用中斷的方式,最好將定時器中斷的優先順序設置為最高級,關於程序數據的穩定性應注意兩個問題:一、在低優先順序中斷響應時,應在入棧保護數據時禁止高優先順序的中斷響應。二、在入棧保護有關數據後,對中斷程序執行有影響的狀態位,寄存器,必須恢復為復位狀態的值。例如,在用到了十進制調整時,在中斷進入時,需將PSW中的AC,CY位清零,否則,十進制調整出錯。
(4)定時准確性的討論:
程序中定時器,一直處於運行狀態,也就是說定時器是理想運作的,其中斷程序每隔0.1秒執行一次,在理想狀態下,定時器定時是沒有系統誤差的,但由於定時器中斷溢出後,定時器從0開始計數,直到被重新置數,才開始正確定時,這樣中斷溢出到中斷響應到定時器被重新置數,其間消耗的時間就造成了定時器定時的誤差。如果在前述定時器不關的情況下,在中斷程序的一開始就給定時器置數,此時誤差最小,誤差大約為:每0.1秒,誤差7—12個機器周期。當然這是在定時器定時剛好為0.1秒時的情況,由以上分析,如果數字鍾設計為查詢的方式或是在中斷的方式下將定時器中斷設置為最高級,我們在定時值設置時,可以適當的扣除9個機器周期的時間值。但如果在中斷的情況下,沒有將定時器中斷設置為最高級,那就要視中斷程序的大小,在定時值設置時,扣除相應的時間值。
(5)軟體消抖:
消抖可以採用硬體(施密特觸發器)的方式如圖4.4所示,也可以採用軟體的方式。在此只討論軟體方式。軟體消抖有定時器定時,和利用延時子程序的方式。一,定時器定時消抖可以不影響顯示模塊掃描速度,其實現方法是:設置標志位,在定時器中斷中將其置位,然後在程序中查詢。將其中斷優先順序設置為低於時鍾定時中斷,那麼它就可以完全不影響時鍾定時。二,在採用延時子程序時,如果顯示模塊的掃描速度本來就不是很快,此時可能會影響到顯示的效果,一般情況下,每秒的掃描次數不應小於50次,否則,數碼的顯示會出現閃爍的情況。因此,延時子程序的延時時間應該小於20毫秒,如果採用定時器定時的方式,延時時間不影響時鍾。
如果,設計時採用的是中斷的方式來完成有關操作,同樣可以採用軟體的方式來消抖,其處理思想是:中斷不能連續執行,兩次之間有一定的時間間隔。
4.1.1 系統主程序流程圖
圖4.1 主程序流程圖
4.1.2 各子程序流程圖
圖4.2 時鍾調整子程序流程圖
希望可以幫到你.!
㈤ 51單片機做數字電子鍾
這么復雜的東西給這么少分 暈死了 你也太小氣了吧,分多的話還可能幫你動動腦
㈥ 51單片機簡易電子鍾設計。匯編語言編寫
KEYVALEQU 30H
KEYTMEQU 31H
KEYSCANEQU 32H
DATEQU 33H
SCANLEDEQU 39H
CLKEQU 77H
SECEQU 78H
MINEQU 79H
HOUREQU 7AH
PAUSEBIT 00H
DOTBIT 01H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR;50ms定時
ORG 001BH
LJMP T1ISR;掃描顯示
ORG 0030H
MAIN:
MOV SP,#5FH
MOV TMOD,#11H
MOV TH0,#03CH
MOV TL0,#0B0H
MOV TH1,#0ECH
MOV TL1,#078H
MOV KEYVAL,#0
MOV SCANLED,#0
MOV 33H,#10H
MOV 34H,#10H
MOV 35H,#10H
MOV 36H,#10H
MOV 37H,#10H
MOV 38H,#10H
MOV SEC,#0
MOV MIN,#0
MOV HOUR,#0
MOV CLK,#0
CLR PAUSE
SETB EA
SETB ET1
SETB TR1
LOOP:
LCALL KEYSEL
MOV A,KEYVAL
CJNE A,#0FFH,LOOP1
SJMP LOOP
LOOP1:
CJNE A,#10,LOOP2;「ON」啟動
SETB TR0
SETB ET0
SETB PAUSE
SJMP LOOP
LOOP2:
CJNE A,#11,LOOP3;「=」清零
MOV SEC,#0
MOV MIN,#0
MOV HOUR,#0
LCALL DISCHG
SJMP LOOP
LOOP3:
CJNE A,#15,LOOP4;「+」暫停
CLR TR0
CLR ET0
CLR PAUSE
SJMP LOOP
LOOP4:
CJNE A,#14,LOOP5;「-」清顯示暫停
MOV 33H,#10H
MOV 34H,#10H
MOV 35H,#10H
MOV 36H,#10H
MOV 37H,#10H
MOV 38H,#10H
CLR TR0
CLR ET0
CLR PAUSE
SJMP LOOP
LOOP5:
CJNE A,#10,LOOP6;數字鍵
LOOP6:
JC LOOP7
LJMP LOOP
LOOP7:
JNB PAUSE,LOOP8;暫停狀態可以輸入數字鍵
LJMP LOOP
LOOP8:
MOV 33H,34H
MOV 34H,35H
MOV 35H,36H
MOV 36H,37H
MOV 37H,38H
MOV 38H,KEYVAL
MOV A,33H
SWAP A
ORL A,34H
LCALL BCDH
MOV HOUR,A
MOV A,35H
SWAP A
ORL A,36H
LCALL BCDH
MOV MIN,A
MOV A,37H
SWAP A
ORL A,38H
LCALL BCDH
MOV SEC,A
LJMP LOOP
;------------------
;BCD轉換為十六進制
BCDH:
MOV B,#10H
DIV AB
MOV R7,B
MOV B,#10
MUL AB
ADD A,R7
RET
;------------------
;十六進制轉換為BCD
HBCD:
MOV B,#10
DIV AB
SWAP A
ORL A,B
RET
;------------------
KEYSEL:
MOVKEYVAL,#0
MOVKEYSCAN,#0EFH
LCALLGETKEY
MOVA,KEYTM
JZKEYS1
MOVKEYVAL,A
SJMPKEYRTN
KEYS1:
MOVKEYSCAN,#0DFH
LCALLGETKEY
MOVA,KEYTM
JZKEYS2
CLRC
ADDA,#4
MOVKEYVAL,A
SJMPKEYRTN
KEYS2:
MOVKEYSCAN,#0BFH
LCALLGETKEY
MOVA,KEYTM
JZKEYS3
CLRC
ADDA,#8
MOVKEYVAL,A
SJMPKEYRTN
KEYS3:
MOVKEYSCAN,#7FH
LCALLGETKEY
MOVA,KEYTM
JZKEYRTN
CLRC
ADDA,#12
MOVKEYVAL,A
KEYRTN:
LCALL CHGKEY
RET
;--------------------
GETKEY:
MOV KEYTM,#0
MOVA,KEYSCAN
MOVP3,A
NOP
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY
MOV R2,#10
LCALL DELAY
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY
MOVA,P3
ANLA,#0FH
MOVR7,A
SF:
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JNZSF
MOVA,R7
CJNEA,#0EH,NK1
MOVKEYTM,#1
SJMPNOKEY
NK1:
CJNEA,#0DH,NK2
MOVKEYTM,#2
SJMPNOKEY
NK2:
CJNEA,#0BH,NK3
MOVKEYTM,#3
SJMPNOKEY
NK3:
CJNEA,#07H,NOKEY
MOVKEYTM,#4
NOKEY:RET
;--------------------
DELAY:
MOV R3,#50
DELAY1:
MOV R4,#100
DJNZ R4,$
DJNZ R3,DELAY1
DJNZ R2,DELAY
RET
;--------------------
T0ISR:
PUSH ACC
CLR TR0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
INC CLK
MOV A,CLK
CJNE A,#20,T0ISRE
MOV CLK,#0
INC SEC
MOV A,SEC
CJNE A,#60,T0ISRE
MOV SEC,#0
INC MIN
MOV A,MIN
CJNE A,#60,T0ISRE
MOV MIN,#0
INC HOUR
MOV A,HOUR
CJNE A,#24,T0ISRE
MOV SEC,#0
MOV MIN,#0
MOV HOUR,#0
T0ISRE:
LCALL DISCHG
POP ACC
RETI
;--------------------
DISCHG:
MOV A,HOUR
LCALL HBCD
PUSH ACC
ANL A,#0FH
MOV 34H,A
POP ACC
ANL A,#0F0H
SWAP A
MOV 33H,A
MOV A,MIN
LCALL HBCD
PUSH ACC
ANL A,#0FH
MOV 36H,A
POP ACC
ANL A,#0F0H
SWAP A
MOV 35H,A
MOV A,SEC
LCALL HBCD
PUSH ACC
ANL A,#0FH
MOV 38H,A
POP ACC
ANL A,#0F0H
SWAP A
MOV 37H,A
RET
;--------------------
T1ISR:
PUSH ACC
CLR TR1
MOV TH1,#0ECH
MOV TL1,#78H
SETB TR1
MOV DPTR,#LEDTAB
T100:
MOV R0,#DAT
MOV A,SCANLED
ADD A,R0
MOV R0,A
MOV A,SCANLED
JNZ T101
MOV P2,#01H
CLR DOT
SJMP T1DIS
T101:
DEC A
JNZ T102
MOV P2,#02H
SETB DOT
SJMP T1DIS
T102:
DEC A
JNZ T103
MOV P2,#04H
CLR DOT
SJMP T1DIS
T103:
DEC A
JNZ T104
MOV P2,#08H
SETB DOT
SJMP T1DIS
T104:
DEC A
JNZ T105
MOV P2,#10H
CLR DOT
SJMP T1DIS
T105:
MOV P2,#20H
CLR DOT
T1DIS:
MOV A,@R0
MOVC A,@A+DPTR
JNB DOT,T1DIS1
ORL A,#01H
T1DIS1:
CPL A
MOV P0,A
INC SCANLED
MOV A,SCANLED
CJNE A,#6,T1END
MOV SCANLED,#0
T1END:
POP ACC
RETI
;--------------------
CHGKEY:
MOV A,KEYVAL
JZ KV16
DEC A
JNZ KV01
MOV KEYVAL,#7
RET
KV01:
DEC A
JNZ KV02
MOV KEYVAL,#4
RET
KV02:
DEC A
JNZ KV03
MOV KEYVAL,#1
RET
KV03:
DEC A
JNZ KV04
MOV KEYVAL,#10
RET
KV04:
DEC A
JNZ KV05
MOV KEYVAL,#8
RET
KV05:
DEC A
JNZ KV06
MOV KEYVAL,#5
RET
KV06:
DEC A
JNZ KV07
MOV KEYVAL,#2
RET
KV07:
DEC A
JNZ KV08
MOV KEYVAL,#0
RET
KV08:
DEC A
JNZ KV09
MOV KEYVAL,#9
RET
KV09:
DEC A
JNZ KV10
MOV KEYVAL,#6
RET
KV10:
DEC A
JNZ KV11
MOV KEYVAL,#3
RET
KV11:
DEC A
JNZ KV12
MOV KEYVAL,#11
RET
KV12:
DEC A
JNZ KV13
MOV KEYVAL,#12
RET
KV13:
DEC A
JNZ KV14
MOV KEYVAL,#13
RET
KV14:
DEC A
JNZ KV15
MOV KEYVAL,#14
RET
KV15:
DEC A
JNZ KV16
MOV KEYVAL,#15
RET
KV16:
MOV KEYVAL,#0FFH
RET
;--------------------
LEDTAB:DB 0FCH;"0"00H
DB 60H;"1"01H
DB 0DAH;"2"02H
DB 0F2H;"3"03H
DB 66H;"4"04H
DB 0B6H;"5"05H
DB 0BEH;"6"06H
DB 0E0H;"7"07H
DB 0FEH;"8"08H
DB 0F6H;"9"09H
DB 0EEH;"A"0AH
DB 3EH;"B"0BH
DB 9CH;"C"0CH
DB 7AH;"D"0DH
DB 9EH;"E"0EH
DB 8EH;"F"0FH
DB 00H;" "10H
;--------------------
END
㈦ 用51單片機設計一個電子鍾
巧了,國親無聊做了一個玩玩,給你看看把,其實電子鍾挺簡單的,下面是程序:
#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitch=P3^2;
sbitkey=P3^5;
sbitkey1=P3^4;
uchart0,numn,numy,numr,nums,numf,numm,sw,w,q,b,s,g,sw1,w1,q1,b1,s1,g1,rq,temp,x;
uintu;
voidinit();
voiddisplay(uchar,uchar,uchar,uchar,uchar,uchar);
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=70;y>0;y--);
}
voidmain()
{
init();
while(1)
{
if(rq==1)
{
if(rq==1)
display(sw,w,q,b,s,g);
}
elseif(rq==2)
{
if(rq==2)
display(sw1,w1,q1,b1,s1,g1);
}
elseif(rq==3)
{
if(rq==3)
display(w,w,w,w,w,w);
}
elseif(rq==4)
{
uchari;
temp=0x01;
for(i=0;i<8;i++)
{
P1=~temp;
delay(100);
temp<<=1;
}
temp=0x80;
for(i=0;i<8;i++)
{
P1=~temp;
delay(100);
temp>>=1;
}
temp=0x01;
for(i=0;i<8;i++)
{
P1=temp;
delay(100);
temp<<=1;
}
temp=0x7F;
for(i=0;i<8;i++)
{
P1=temp;
delay(100);
temp>>=1;
}
}
else
rq=1;
}
}
voidinit()
{
rq=1;
x=1;
nums=22;
numf=0;
numm=0;
numn=9;
numy=10;
numr=15;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
IT0=1;
IT0=2;
EA=1;
EX0=1;
EX1=1;
ET0=1;
TR0=1;
ET1=1;//IE=0x82//CPU開中斷,CT0開中斷
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if(key==0)
{
delay(50);
if(key==0)
{
x++;
while(key==0);
}
}
if(x==2&rq==1)
{
//P0=0xf3;
if(key1==0)
{
numf++;
while(key1==0);
}
}
elseif(x==3&rq==1)
{
//P0=0xfc;
if(key1==0)
{
nums++;
while(key1==0);
}
}
elseif(x==2&rq==2)
{
//P0=0xcf;
if(key1==0)
{
numr++;
while(key1==0);
}
}
elseif(x==3&rq==2)
{
//P0=0xf3;
if(key1==0)
{
numy++;
while(key1==0);
}
}
elseif(x==4&rq==2)
{
//P0=0xfc;
if(key1==0)
{
numn++;
while(key1==0);
}
}
else
{
x=1;
}
if(t0==20)
{
t0=0;
numm++;
}
if(numm==60)
{
numm=0;
numf++;
}
if(numf==60)
{
for(u=500;u>0;u--)
{
bell=0;
delay(1);
bell=1;
delay(1);
}
numf=0;
nums++;
}
if(nums==24)
{
nums=0;
numr++;
}
if(numr==30)
{
numr=0;
numy++;
}
if(numy==12)
{
numy=0;
numn++;
}
if(numn==100)
{
numn=0;
}
g=numm%10;
s=numm/10;
b=numf%10;
q=numf/10;
w=nums%10;
sw=nums/10;
g1=numr%10;
s1=numr/10;
b1=numy%10;
q1=numy/10;
w1=numn%10;
sw1=numn/10;
}
voidexert0()interrupt0
{
delay(50);
rq++;
while(ch==0);
}
voidt0int()interrupt3
{
TR1=0;
bell=!bell;
TH1=timer0h;
TL1=timer0l;
TR1=1;
}
voidexert1()interrupt2
{
rq=100;
}
voiddisplay(ucharsw,ucharw,ucharq,ucharb,uchars,ucharg)
{
P2=tab[sw];
P0=tabwe[0];
delay(5);
P0=0xff;
P2=tab[w];
P0=tabwe[1];
delay(5);
P0=0xff;
P2=tab[q];
P0=tabwe[2];
delay(5);
P0=0xff;
P2=tab[b];
P0=tabwe[3];
delay(5);
P0=0xff;
P2=tab[s];
P0=tabwe[4];
delay(5);
P0=0xff;
P2=tab[g];
P0=tabwe[5];
delay(5);
P0=0xff;
}
下面這個是電路圖,圖我沒有畫啊,不過我用模擬去做,應該跟電路圖差不多了,你可以參考下,可以實現流水燈,鬧鈴,日期,時間,等功能,上面給你的是按照你的要求,另外我懶得改了所以多了個功能就是可以看日期,你看上面的程序,第一個按鈕ch,按一下查看日期,再按一下查看溫度(被刪了,隨機現在是隨機顯示一個數字),再按一下是流水燈,再按一下又回到時間,另外兩個鍵key/key1;按key是選擇鎖定分還是時,如果你當前顯示的是日期的話就是順序鎖定日,月,年,按key1調整,圖上顯示的是22點00分09秒,就這樣了
設計方案的話..........呵呵,AT89S52+6個數碼管+11.0592晶振+2個30P電容+3個按鈕+1個10UF電容如圖連接,你自己去寫方案把,分數給那麼少,就只幫你那麼多了