A. 用51單片機編程:電子時鍾(設計電子時鍾,用51單片機編程)
如果有問題歡迎到我空間相關文章下留言 樂於回答~~
程序如下:
; 定義管腳
S_SET BIT P1.0 ;數字鍾秒控制位
M_SET BIT P1.1 ;分鍾控制位
H_SET BIT P1.2 ;小時控制位
SECOND EQU 30H
MINUTE EQU 31H
HOUR EQU 32H
ORG 00H
SJMP MAIN
ORG 0BH
LJMP INT_T0
MAIN: MOV DPTR,#TABLE
MOV HOUR,#0 ;初始化
MOV MINUTE,#0
MOV SECOND,#0
MOV R0,#0
MOV TMOD,#01H
MOV TH0,#3CH ; 設置初值(定時50毫秒)
MOV TL0,#0B0H
SETB TR0 ;啟動定時
SETB ET0
SETB EA
;*******************************************************************************
;判斷是否有控制鍵按下
A1: LCALL DISPLAY
JNB S_SET,S1
JNB M_SET,S2
JNB H_SET,S3
LJMP A1
S1: LCALL DELAY ;去抖動
JB S_SET,A1
INC SECOND ;秒值加1
MOV A,SECOND
CJNE A,#60,J0 ;判斷是否加到60秒
MOV SECOND,#0
LJMP K1
S2: LCALL DELAY
JB M_SET,A1
K1: INC MINUTE ;分鍾值加1
MOV A,MINUTE
CJNE A,#60,J1 ;判斷是否加到60分
MOV MINUTE,#0
LJMP K2
S3: LCALL DELAY
JB H_SET,A1
K2: INC HOUR ;小時值加1
MOV A,HOUR
CJNE A,#24,J2 ;判斷是否加到24小時
MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
LJMP A1
;****************************************************
;等待按鍵抬起
J0: JB S_SET,A1
LCALL DISPLAY
SJMP J0
J1: JB M_SET,A1
LCALL DISPLAY
SJMP J1
J2: JB H_SET,A1
LCALL DISPLAY
SJMP J2
;***********************************************
;定時器中斷服務程序,對秒,分鍾和小時的計數
INT_T0: MOV TH0,#3CH
MOV TL0,#0B0H
INC R0
MOV A,TCNT
CJNE A,#20,RETUNE ;計時1秒
INC SECOND
MOV R0,#0
MOV A,SECOND
CJNE A,#60,RETUNE
INC MINUTE
MOV SECOND,#0
MOV A,MINUTE
CJNE A,#60,RETUNE
INC HOUR
MOV MINUTE,#0
MOV A,HOUR
CJNE A,#24,RETUNE
MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
MOV R0,#0
RETUNE: RETI
;******************************************
;顯示控制子程序
DISPLAY: MOV A,SECOND ;顯示秒
MOV B,#10
DIV AB
CLR P3.6
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.6
MOV A,B
CLR P3.7
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.7
CLR P3.5
MOV P0,#40H ;顯示分隔符
LCALL DELAY
SETB P3.5
MOV A,MINUTE ;顯示分鍾
MOV B,#10
DIV AB
CLR P3.3
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.3
MOV A,B
CLR P3.4
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.4
CLR P3.2
MOV P0,#40H ;顯示分隔符
LCALL DELAY
SETB P3.2
MOV A,HOUR ;顯示小時
MOV B,#10
DIV AB
CLR P3.0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.0
MOV A,B
CLR P3.1
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.1
RET
TABLE: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
DELAY: MOV R6,#5
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
END
這里的程序沒用38解碼器,若要用則顯示子程序要改
如 要顯示秒,程序如下
DISPLAY: MOV A,SECOND ;顯示秒
MOV B,#10
DIV AB
MOV R7,#60H
ORG A,R7
MOV P0,A
LCALL DELAY
MOV A,B
MOV R7,#70H
ORL A,R7
MOV P0,A
LCALL DELAY
其他的一樣這樣改
B. 51單片機製作一個具有鬧鍾功能的24小時的電子鍾,利用按鍵可以調整時間。
有一個4*4矩陣鍵盤的時鍾:
C. 關於用51單片機做一個電子時鍾的問題
程序中好像還沒有自動加時的部分,並且按鍵處理還沒有消抖措施
不多說了,上程序,俺剛剛為你編寫的,測試的時候使用的埠和你的不一樣
在我的開發板上測試成功後,按照你的板子埠做了修改
如果你直接復制到你的程序中不能使用,檢查及更改一下埠即可
如果滿意記得採納哦,若有疑問可以隨時向我提問
/***************************************************************************/
//#include<stdio.h>
#include<reg51.h>
sbit p20=P2^0; sbit p21=P2^1; sbit led=P2^7;
char dis_2[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管顯示編碼
unsigned int h,m,s,t,n;
/***************************************************************************/
void delay(char hs)//延時函數
{char hk;for(;hs>0;hs--){for(hk=100;hk>0;hk--);}}
/***************************************************************************/
void XS(unsigned int xh,unsigned int xs) //顯示子函數
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10;
d3=(xh/1)%10; d4=(xh/10)%10;
P0=dis_2[d1]; P1=0x08; delay(10); P1=0x00;//秒個位
P0=dis_2[d2]; P1=0x04; delay(10); P1=0x00;//秒十位
P0=0x7f; P1=0x04; delay(10); P1=0x00;//小數點
P0=dis_2[d3]; P1=0x02; delay(10); P1=0x00;//時個位
P0=dis_2[d4]; P1=0x01; delay(10); P1=0x00;//時十位
}
/***************************************************************************/
void main(void)
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;//定時器初始化
while(1)//主循環
{
if(p20==0){delay(10);if(p20==0){h++;if(h>23){h=0;}}while(!p20){XS(h,m);}}
if(p21==0){delay(10);if(p21==0){m++;if(m>59){m=0;}}while(!p21){XS(h,m);}}
XS(h,m);//調用數碼管顯示函數
}
}
/***************************************************************************/
void int1() interrupt 1 //定時器中斷
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;t++;
if(t>500){t=0;led=~led;}//LED閃爍
if(n>1000){n=0;s++;}//如果達到一秒,秒加一
if(s>59){s=0;m++;}//如果達到一分,分加一
if(m>59){m=0;h++;}//如果達到一小時,小時加一
if(h>23){h=0;}//如果達到24小時,小時清零
}
/***************************************************************************/
D. 下面是51單片機30秒倒計時程序,怎麼把它改成24小時倒計時程序,別的不變,十分感謝
#include "reg51.h"
sbit start=P3^2; //外部中斷0引腳 開始
sbit rst=P3^3; //外部中斷1引腳 復位
sbit breakk=P3^4;
sbit led=P3^5;
sbit beep=P3^7;
sbit P30=P3^0;
sbit P31=P3^1;
unsigned char code anma[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff
};
char time=24;//【原來的30s改為24小時】
char flag_t=0; // 1秒輔助計時
char now=0; // 0停止 1 計時 2報警 3復位
unsigned int temp=0;//【添加此行】// 【定義一個16位臨時變數】
unsigned char g=0,s=3,i=0;
void delay(unsigned int n)
{
while(--n);
}
void t0_srv() interrupt 1 using 1
{
TH0=0X3C;
TL0=0XB0;
flag_t++;
if(flag_t>=20){ //20*50ms=1s
flag_t=0;
temp++; //【添加此行】
if(temp>=3600)//1小時=3600s //【添加此行】
{
temp=0;//【添加此行】
time--;
if(time<=0){
beep=0;
led=0;
TR0=0;
now=2;
time=0;
}
}
}
}
void button_start() interrupt 0 using 1 //外部中斷0
{
delay(1500);
if(start==0) {
now=1;
TR0=1;
}
else return;
while(start==0);
delay(1500);
}
void button_rst() interrupt 2 using 1
{
delay(1500);
if(rst==0) {
TR0=0;
time=24;//【原為time=30;】
i=0;
led=1;
beep=1;
now=0;
}
else return;
while(rst==0);
delay(1500);
}
void disp()
{
g=time%10;
s=time/10;
g=anma[g];
s=anma[s];
P1=g;
P31=0;
delay(250);
P31=1;
P1=s;
P30=0;
delay(250);
P30=1;
//
}
void key()
{
if(breakk==0)delay(1500);
else return;
if(breakk==0) {
if(now==1){
i++;
if(i%2)TR0=0;
if(!(i%2))TR0=1;
}
}
else return;
while(breakk==0);
delay(1500);
}
main()
{
TMOD=0X01;//定時器0工作在方式1,
EA=1;
IT0=1;
ET0=1;
TH0=0X3C;//在12M 晶振下,定時時間為50ms
TL0=0XB0;
EX0=1;
EX1=1;
//TR0=1;
while(1){
disp();
key();
}
}
E. 利用51系列單片機設計一個24小時制電子時鍾
鍾的時、分、秒數值分別通過P0、P1、P2埠輸出(以壓縮BCD碼的
F. 誰能告訴我51單片機簡單的led數碼管時鍾程序 24小時制的(c語言版的)
#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar shi,fen,miao;
uchar time;
void delay(uint x)
{
uint y;
for(;x>0;x--)
{
for(y=0;y<124;y++);
}
}
void display(uchar shi,uchar fen,uchar miao)
{
P2=0; //位碼
P0=(tab[shi/10]); //段碼
delay(2);
P2=1;
P0=(tab[shi%10]);
delay(2);
P2=2; //位碼
P0=0x40; //段碼
delay(2);
P2=3; //位碼
P0=(tab[fen/10]); //段碼
delay(2);
P2=4;
P0=(tab[fen%10]);
delay(2);
P2=5; //位碼
P0=0x40; //段碼
delay(2);
P2=6; //位碼
P0=(tab[miao/10]); //段碼
delay(2);
P2=7;
P0=(tab[miao%10]);
delay(2);
}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(time==20)
{
time=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
display(shi,fen,miao);
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
}
/*還有什麼不明白繼續追加*/
G. 基於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作為一個位元組寫周期結束的標志特徵。
H. 51單片機做數字電子鍾
這么復雜的東西給這么少分 暈死了 你也太小氣了吧,分多的話還可能幫你動動腦