/*
利用定時器控制LED的開關。
*/
# include & ltreg52.h & gt
sbit?led=p1^2;
作廢?Init_Timer1(void)
{
TMOD?|=?0x 10;
th 1 = 0x 00;/*?初始化?價值?*/
TL 1 = 0x 00;
EA = 1;/*?中斷?啟用?*/
et 1 = 1;?/*?啟用?timer1?打斷?*/
tr 1 = 1;
}
主()
{
init _ timer 1();
while(1);
}
作廢?Timer1_isr(void)?打斷?3?使用?1
{
th 1 = 0x 00;/*?初始化?價值?*/
TL 1 = 0x 00;
LED = ~ LED
}
我給妳壹個用定時器做的時鐘程序。
/*
1,按鍵調整當時時間。
2.按鍵調整計時時間。
3、計時時間到接力吸。
*8位數碼管顯示?時間格式格式?12-08-00?馬克12: 08: 00。
P30?用了幾個小時?添加1操作
P31?用於小時減1運算。
P32?幾分鐘?添加1操作
P33?用於從分鐘數中減去1。
*/
#包含?& ltreg52.h & gt
sbit?key1=p3^0;
sbit?key2=p3^1;
sbit?key3=p3^2;
sbit?key4=p3^3;
sbit?led=p1^2;
代碼?未簽名?夏爾?tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x 90 };?
//* * *楊數碼管?0-9
未簽名?夏爾?StrTab[8];//定義緩沖區
未簽名?夏爾?分鐘=30,小時=12,秒;//定義並初始化值?12:30:00
作廢?延遲(無符號?int?Cnt)//延遲功能
{
while(-CNT);
}
作廢?Displaypro(無效)
{
StrTab[0]= tab[小時/10];//顯示正常時間
StrTab[1]= tab[hour % 10];
StrTab[2]= 0x BF;
StrTab[3]= tab[分鐘/10];
StrTab[4]= tab[分鐘% 10];
StrTab[5]= 0x BF;
StrTab[6]= tab[秒/10];
StrTab[7]= tab[秒% 10];
}
Main()//主函數
{
TMOD?| = 0x 01;//定時器0?10ms?在?12M?水晶?用於計時
TH0 = 0xd8
TL0 = 0xf0
ET0 = 1;
TR0 = 1;
TMOD?| = 0x 10;?//定時器1用於動態掃描。
th 1 = 0x F8;
TL 1 = 0xf 0;
et 1 = 1;
tr 1 = 1;
EA?=1;
display pro();
While(1)//主循環
{
/////////////////////////////////////////////////////////////////
如果(!KEY1)?//按下1鍵,搖動行動。
{
延時(10000);
如果(!KEY1)
{
hour++;if(hour = = 24)hour = 0;?//正常時間?幾個小時?加1
display pro();
}
}
////////////////////////////////////////////////////////////////
如果(!KEY2)?//按2鍵搖壹搖,行動。
{
延時(10000);
如果(!按鍵2)
{
小時-;if(hour = = 0)hour = 23;?//正常時間?小時減去1
display pro();
}
}
////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
如果(!KEY3)?//鍵進行搖動和動作
{
延時(10000);
如果(!按鍵3)
{
分鐘++;if(minute = = 59)minute = 0;//除以加1
display pro();
}
}
/////////////////////////////////////////////////////////////////
如果(!KEY4)?//鍵進行搖動和動作
{
延時(10000);
如果(!按鍵4)
{
分鐘-;if(minute = = 0)minute = 59;//負1
display pro();
}
}
}
}
////////////////////////////////////////////////////////////////
/********************************/
/*定時中斷1*/
/********************************/
作廢?time1_isr(void)?打斷?3?使用?0//定時器1用於動態掃描。
{
靜電?未簽名?夏爾?num
th 1 = 0x F8;//重新輸入初始值
TL 1 = 0xf 0;
切換?(數字){
案子?0:P2 = 0x Fe;P0 = StrTab[7-num];打破;?//分別調用緩沖區的值進行掃描。
案子?1:P2 = 0x FD;P0 = StrTab[7-num];打破;
案子?2:P2 = 0x FB;P0 = StrTab[7-num];打破;
案子?3:P2 = 0xf 7;P0 = StrTab[7-num];打破;
案子?4:P2 = 0x ef;P0 = StrTab[7-num];打破;
案子?5:P2 = 0x df;P0 = StrTab[7-num];打破;
案子?6:P2 = 0x BF;P0 = StrTab[7-num];打破;
案子?7:P2 = 0x7F;P0 = StrTab[7-num];打破;
默認:break
}
num++;?//掃描8次,用8個數碼管。
如果(數量==8)
num = 0;
}
//////////////////////////////////////////////////////////////////
/********************************/
/*定時中斷0*/
/********************************/
作廢?tim(void)?打斷?1?使用?1
{
靜電?未簽名?夏爾?數數;//定義內部靜態變量
TH0 = 0xd8//重新賦值
TL0 = 0xf0
count++;
切換?(計數)
{
案子?0:
案子?20:
案子?40:
案子?60:
案子?80:Displaypro()。?//定期調用顯示處理。
打破;
案子?50:LED=!LED?//半秒?LED閃爍
打破;
默認:break
}
如果?(計數==100)
{
count = 0;
第二個++;//秒加1
if(秒==60)
{
秒= 0;
分鐘++;?//除以加1
if(分鐘==60)
{
分鐘= 0;
hour++;//加上1
if(小時==24)
小時= 0;
}
}
}?
}
給妳另壹個計數器功能
/*
1.程序目的:利用外部中斷學習計數?這裏用100計數和2位數碼管?
2.硬件要求:數碼管和晶體振蕩器12M。
*/
#包含?& ltreg52.h & gt
代碼?未簽名?夏爾?tab[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x 90 };?
//* * *楊數碼管?0-9?
未簽名?夏爾?Dis _ Shiwei//定義十位數
未簽名?夏爾?Dis _ Gewei?//定義位
作廢?延遲(無符號?int?cnt)
{
while(-CNT);
}
主()
{
EA = 1;//斷開全局連接
EX0 = 1;//外部中斷0開啟
IT0 = 1;//邊沿觸發器
while(1)
{
P0 = Dis _ Shiwei//顯示十位數
P2 = 0x FD;
延遲(300);//短暫延遲
P0 = Dis _ Gewei?//顯示單位
P2 = 0x Fe;
延遲(300);
}
}
/********************************/
/*定時中斷*/
/********************************/
作廢?INT0_ISR(void)?打斷?0?使用?1
{
靜電?未簽名?夏爾?第二;//定義壹個靜態變量,退出程序後內容不變。
第二個++;//加上1
if(秒==100)
秒= 0;
dis _ Shiwei = tab[秒/10];//十位數顯示值處理
dis _ Gewei = tab[秒% 10];?//位顯示處理
}