《51單片機 定時器時鐘.docx》由會員分享,可在線閱讀,更多相關(guān)《51單片機 定時器時鐘.docx(6頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、
實驗二 定時器和實時時鐘實驗
一、實驗目的a)數(shù)碼管動態(tài)顯示技術(shù)
b)定時器的應用c)按鍵功能定義
二、實驗實現(xiàn)的功能a)開機12個二極管同色燈依次點亮,通過按鍵選擇定時器功能或者實時時鐘 功能
b)當選擇實時時鐘功能時,用12個LED顯示小時,用數(shù)碼管顯示分和秒,時 間都由按鍵設(shè)定,同時具備復位功能c)當選擇定時器功能時,12個LED閃爍,然后通過按鍵設(shè)定分和秒的時間,啟 動定時器,當定時時間到,12個LED閃爍,同時具備復位功能。
三、系統(tǒng)硬件設(shè)計19
19
CHYBTAL
-=TEXT>
z
13
26 7T 云
R_
Tnu
f《8
2、
C TEXTS
C3
29
3D"
31~
>XTAL1
POIYADQ
PD.VAD1
PO^ADZ
XTAL2
P0^AD3
P0.4/AD*
PDSfADS
P0J&AD6
RJ8T
PQ
P2.VAS
P2^A10
PSEH
PZ3A11
ALE
P2.WA12
S
P2 夕A13
PZj&AU
P2.7M15
P1OTZ
pmaxD
p i irrz家
P3 1HXD
P3^IB1U
pu
P33TITT
P3.WT0
P1S
P3STT1
Pi
piAfr
3、inr
ph
P3.7/IF
U1
m.TES?:ST
10 ~TT
LEO-YELLOVU
4T8
SOD
R19
CT ? TEXTS-
LED-YEL10W「E
D11
D10
■OREEM
?TEKTs
R13
R16
R17 ■v=^
cTEXT>
R10 £CD e TEXT*
R9
D9
IE
^
4、T6l
四、系統(tǒng)軟件設(shè)計
#include #define uchar unsigned char
#define uint unsigned int #define N 10//0--F的共陰極字段碼表
ucharcodevalue[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0 X5E,0X79,0X71};
〃小時顯示uchar
tab[]=( 0x00,0x00,0xfe,0x3f,0xfc,0x3f,0xf8,0x3f,0xf0,0x3f,0xe0,0x3f
5、,0xc0,0x3f,0x80,0x3f,0x00,0x3f,0x00,0x38,0x00,0x30,0x00,0x20);
〃待顯示的4位緩沖uchar Num_Buffer[]=( 0,0,0,0};
char sec=0,min=0,hour=0,time=0,count=0;void delay(uint x) 〃延時函數(shù)
{
uchar i;
while(x—)
{for(i=0;i< 120;i++);
void display() 〃顯示函數(shù){
N um_Buffer [3 ]=min/10;Num_Buffer| 2]=min% 10;
Num_Buffer[
6、l ]=sec/10;Num_Buffer[O]=sec% 10;
P0=0XFE;P1 =codevalue[Num_Buffer[3]]; delay(N);
P0=0XFD;P1 =code value [Num_B offer [2]]; delay(N);
P0=0XFB;Pl=codevalue[Num_Buffer[l |]; delay(N);
P0=0XF7;P1 =codevalue[Num_Buffer[0]]; delay(N);
}uchar scan_key()//按鍵掃描函數(shù)
(uchar a=0x40,i,ptr=0,m; for(i=0;iv2;i
7、++)
P3=?a; delay(N);m=PO;
switch(m&OxeO)case OxcO: ptr=i*3+1; return ptr;
break;case OxaO: ptr=i*3+2;
return ptr;break;
case 0x60: ptr=i*3+3;return ptr; break; default:break;
a=a?l; }}
void shan()(
P2=0XB6;
P3=0X37; delay(8N);
P2=0X6D;
P3=0X2F; delay(8N);
P2=0XDB;
P3=OX1B;
delay(8N); }
8、 main()P1MO=OXFF;
Pl Ml =0X00;
TMOD=OX11;
TH0=-50000/256;
TL0=-50000%256;
TH 1 =-50000/256;
TLl=-50000%256;
EA=1;
ETO=1;
ET1 = 1;
while(l)
P1MO=OXFF;
Pl Ml =0X00;
TMOD=OX11;
TH0=-50000/256;
TL0=-50000%256;
TH 1 =-50000/256;
TLl=-50000%256;
EA=1;
ETO=1;
ET1 = 1;
while(l)
( uch
9、ar i,k;〃選擇定時器0,1,工作方式1
〃定時器0賦初值
〃定時器1賦初值
〃開總中斷
〃定時器。允許中斷
〃定時器1允許中斷
P0=0XFF;
shan();
k=scan_key();
if(k==l) 〃按鍵1按下,實現(xiàn)時鐘功能{
while(l)
{ P2=tab[2*hour]; 〃小時用 LED 顯示 P3=tab[2*hour+1];displayO;
k=scan_key();if(k==l) 〃按下1鍵設(shè)定小時
( delay(40N);hour++;
if(hour==12){
hour=0;P2=tab[0];
P3=tab[l];}
10、
)else if(k=2) 〃按下2鍵設(shè)定分
(delay (20N);
min++;if(min==60) min=0;
}else if(k==3) 〃按下3鍵設(shè)定秒
{delay (20N);
sec++;if(sec==60) sec=0;
)else if(k==4)〃按下4鍵啟動
(TRO=1;
}else if(k==5)//按下5鍵復位
TR0=0; hour=0; min=0;sec=O;
else if(k==6) 〃按下6鍵返回break;
}}
else if(k==2)//按鍵2按下,實現(xiàn)定時器功能(
while(l){
display
11、O;if(min==0&&sec==0)
{TR1=O;
P2=0;P3=0X83;
for(i=0;iv20;i++)( displayO;
}P2=0XFF;
P3=0XBF;for(i=0;i<20;i++)
(display();
})
k=scan_key();if(k==2) //按下2鍵設(shè)定分
{delay (20N);
min++;
if(min==60) min=0;)
else if(k=3) 〃按下3鍵設(shè)定秒(
delay(20N); sec++;
if(sec==60)sec=0;
else if(k==4)//按下4鍵啟動TR1=1;
12、else if(k==5)//按下5鍵復位 {TR1=O;
min=O; sec=O;}
else if(k==6) 〃按下 6 鍵返[Il break;)
}
) void timerO(void) interrupt 1 〃定時器 0 中斷(
TH0=-50000/256;
TL0=-50000%256;
count++;
if(count==20)
(count=0;
sec++;if(sec==60)
(sec=0;
min++;if(min==60)
(min=0;
hour++;if(hour==12)
hour=0;)
}
})
void ti
13、mer 1 (void) interrupt 3 〃定時器 1 中斷(
TH 1 =-50000/256;
TLl=-50000%256;
count++;
if(count==20)(
count=0;sec—;
if(sec