定時中斷對于初學者來說,相對還是比較難以把握的,不過根據本人十幾年的學習經驗,我知道這世界上的知識都是可以學會的,只要你有相應的基礎,覺得難都是因為不會才覺得難,這話不矛盾的,學習的過程就是掌握基礎的過程,基礎掌握了,那么再繼續學習,學會就只是時間上的問題了,這只是單純的強調基礎的重要性。學習需要的是有著充分的耐心和毅力,有了這些前提,我相信你肯定會發覺,這個過程其實是那么的美好。
#include《reg52》
sbitWEB1=P1^1;
sbitA=P1^0;
sbitL=P1^3;
sbitLED=P1^2;
voiddelay();
unsigned char codetable[]={
0X3F,0X06,0X5B,0X4F,0X66,
0x6d,0X7D,0X07,0X7F,0X6F,
0X77,0X7C,0X39,0X5E,0X79,
0X71};
int num=0;
int temp=0;
void main()
{
P0=0X00; //關閉點陣
L=0; //鎖存
P0=0XFF; // 關閉LED燈
LED=0; //鎖存
WEB1=1; //位選
P0=0XFE; //共有8個數碼管,打開第一個數碼管
WEB1=0; //鎖存
EA=1;//中斷總控制位,EA=1,CPU開放中斷
ET0=1;//定時中斷T0控制位,ET0=1,允許定時中斷0中斷
TMOD=0X01; //定時方式開啟1,即方式2
TH0=(65536-50000)/256;//給定時器T0高八位賦值 ,50000為50us,65536=2^16;
TL0=(65536-50000)%6; //給定時器T0低八位賦值
TR0=1; //啟動定時
while(1)
{
if(num==20) //中斷20次,即1秒,進入循環
{
if(temp==15)
temp=0 ;
A=1; //段選
P0=table[temp]; //一個數碼管有8個二極管,需要顯示的數字
A=0; //鎖存
//delay();
temp++;
num=0; //清0
}
}
}
voiddelay()
{
inta,b;
for(a=1500;a>=0;a--)
for(b=100;b>=0;b--);
}
voidexter0() interrupt 1//interrupt為中斷函數關鍵字,說明這個函數是中斷函數,中斷函數不用函數聲明
{//0表示51單片機的5個中斷源的第一個,即INT0,外部中斷0 ,1為定時中斷
TH0=(65536-50000)/256; //每一次中斷要給計數器賦值,因為計數器溢出后會清0
TL0=(65536-50000)%6;
num++;
}
|