單片機如何确定延時時間?希望我的程序能對大家的實驗起到幫助,我來為大家科普一下關于單片機如何确定延時時間?以下内容希望對你有幫助!
希望我的程序能對大家的實驗起到幫助。
#define uchar unsigned char
uchar a=0,b=0,i=0;
//**********定時中斷T1***中斷服務函數
void Timer1_int(void) interrupt 3 using 1
{
i ;
if(i==20)
{
i=0;
if(a==1)
b ;
}
}
TMOD=0X00;//設置為定時器1(T1)工作于方式0
TH1=0X3C;//高4位
TL1=0XB0;//低4位
TF1=0;//T1溢出标志位
ET1=1;TI中斷開關
EA=1;//中斷總開關
while(1)
if(a==1)
{
TR1=1;//啟動定時器
switch(b)
{
case 0:P2=0x7F;break; //0111 1111 P2.7
case 1:P2=0XFF;P1=0x7F;break; //0111 1111 P1.7
case 2:P1=0xBF;break; //1011 1111 P1.6
case 3:P1=0xFF;P4=0x7F;break; //0111 1111 p4.7
case 4:P4=0xBF; break; //1011 1111 p4.6
default:P4=0xFF;b=0;
}
}
TMOD=0X00首先設置為定時器1(T1)工作于方式0
定時時間:t=(2^(16)-定時器的初始值)*系統時鐘周期*12^(1-T1x12)
即當T1x12=0時系統為12分頻計數脈沖周期系統時鐘周期的12倍(12MHz時1個計數脈沖周期時間為t=1us)
當設置定時時間為50ms時:定時器的初始值T=2^(16)-50*(10^3)=15536。15536轉換為16進制後為3CB0(h).設置定時器的初始值的方法TH1為高4位(TH1=0X3C),TL1為低4位(TL1=0XB0)。
每當定時器的值從15536(定時器的初始值)加到65536( 2^(16) )時會溢出,這時TF1=1,然後定時器從15536重新開始加。
中斷服務函數:中斷服務函數中for循環讓定時器循環20次,每次循環時間為50ms,即定時時間為t=50*20=1000ms=1s.中斷服務函數執行延時1s後b 配合switch語句完成循環點亮LED燈
if語句:當TR1=1時才啟動定時器,開始定時。當開關按下後(a=1),TR1=1啟動定時器,同時執行switch語句,開始時b=0,先執行P2=0x7F;定時1s後,b=1,同時執行switch語句中的:P2=0XFF;P1=0x7F;定時1s後,b=2,之後依次循環。如果TR1=1在if語句前即TR1=1放在if語句外面時,因為TR1=1時是開啟定時器,當a!=1時,定時器也在計時,所以這裡第一個燈亮和第二個燈亮之間不是1s。
switch語句也可以換成if語句嵌套使用,這裡我建議用switch語句,switch語句在這裡相比于if語句的嵌套使用更簡單明了。
15單片機外部中斷流水燈 15單片機延時1s的計算方法——查詢方式
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!