打開軟件
1與其它等于其它,0與其它等于0
1或其它等于1,0或其它等于其它
TMOD=TMOD&0xF0;//0xF0=1111 0000進行與操作,高四位保持,低四位清零,高四位定時器1,低四位定時器0
TMOD=TMOD|0x01;//0x01=0000 0001進行或操作,高四位保持,低四位置0001
只配置了定時器0為16位定時器/計數器模式,不影響定時器1的配置TF0=0;//初始狀態TF0置0,只有當溢出時,單片機硬件自動置TF0為1,響應中斷時,硬件又自動置TF0為0
TR0=1;//配置定時器0時GATE已配置為0,TR0=1允許計時
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
定時器算配置好了,接下來配置中斷,給CPU信號說,來!到點兒了!先別忙那個了,干這個!
ET0=1;
EA=1;
PT0=0;
綜上,定時器0初始化函數代碼為:
之所以多1是因為65535是從0開始計數,如果從1開始計數,則是1到65536,而我們設置初始值,相當于從1開始計數而不是0,所以TL0=(65536-1000)%256,TH0=(65536-1000)/256
12MHz定時器時鐘為12T所以1T就是1MHz
void Timer0_Init()//定時器0初始化函數12MHz下配置的12T
{TMOD&=0xF0;//高四位保持,低四位清零,a=a&b簡寫為a&=bTMOD|=0x01;//高四位保持,低四位0001TL0=0X18;//低四位(65536-1000)%256設置1毫秒定時器TH0=0XFC;//高四位(65536-1000)/256設置1毫秒定時器TF0=0;//TF0初始化,溢出為1,平時為0TR0=1;//允許定時器開始計數//打開中斷ET0=1;EA=1;//設置優先級PT0=0;
}
定時器中斷配置好了,接下來是中斷后要干事情了,需要中斷函數
void Timer0_Routine() interrupt 1
{static unsigned int T0Count;//用于定時比65536微秒更長的時間比如1秒,設置一個變量TL0=0x18;//每次進入中斷函數后,初始化函數里的初始值會自動清0,如果不想下次從0開始計數則需要TH0=0xFC;//重新給TL0和TH0賦值T0Count++;//每進一次中斷是1毫秒,累加到T0Count中if(T0Count==1000)//1秒等于1000毫秒{T0Count=0;//先初始化清零//下來寫想要干的事兒,點燈等等}
}
不懂static可以跳轉到這里,希望可以幫助到你節約時間?
?51單片機學習之旅——C語言小知識-CSDN博客
下來把定時器0做模塊化
跳轉到這個鏈接:51單片機學習之旅——模塊化編程集_51單片機模版編程-CSDN博客
?跳轉到這個鏈接:51單片機學習之旅——模塊化編程集_51單片機模版編程-CSDN博客
下來做按鍵模塊化
?跳轉到這個鏈接:51單片機學習之旅——模塊化編程集_51單片機模版編程-CSDN博客?跳轉到這個鏈接:51單片機學習之旅——模塊化編程集_51單片機模版編程-CSDN博客
同理是delay模塊化,
?跳轉到這個鏈接:51單片機學習之旅——模塊化編程集_51單片機模版編程-CSDN博客
??跳轉到這個鏈接:51單片機學習之旅——模塊化編程集_51單片機模版編程-CSDN博客
下面是main.c文件內容:
#include <REGX52.H>
#include "timer0.h"
#include "key.h"
#include <INTRINS.H>//函數庫中有連續左移,右移函數unsigned char keynumber=0,ledmode=0;void main()
{P2=0xFE;//先讓最低位亮一個燈Timer0Init();//定時器0中斷初始化while(1){keynumber=key();//讀取按鍵if(keynumber)//按鍵1控制led燈的模式,0模式循環左移,1模式循環右移{if(keynumber==1){ledmode++;if(ledmode>=2){ledmode=0;}}}}
}void Timer0_Routine() interrupt 1{static unsigned int T0Count;TL0=0x18;TH0=0xFC;T0Count++;if(T0Count>=500){T0Count=0;if(ledmode==0){P2=_crol_(P2,1);//_crol_(待移項,需要左移left的位數),最高位與最低位相連成環,一直移}if(ledmode==1){P2=_cror_(P2,1);//_cror_(待移項,需要右移right的位數)}}}