|
發布時間: 2019-2-21 16:18
正文摘要:/********************************************************************************** * 【程序功能】: 數碼管模擬數字時鐘顯示 &nbs ... |
yuduan66 發表于 2019-2-25 10:16 for(a=100; a>0; a--)//小括號里第一個表達式為給變量賦初值,第二個為判斷標準。若為真,則執行下面 //花括號的指令,否則將跳過大括弧中的指令,第三句為更改變量值的指令。 { //執行順序1--2--{ }--3--2--{ }--3循環100次a不大于0了,不滿足判斷標準,跳出循環。 //通常用for循環做延時。就像你在路邊等人,原地打轉渡步熬時間。 } |
| 想請問一下,這個 for(a=100;a>0;a--)起什么作用呢,我在程序中將這行去掉之后,再燒到板上,沒有發現差異,麻煩各位高手幫忙看看,謝謝! |
|
首先看的是TMOD=0x02,這是通過定時器模式寄存器將定時器設置成8位自動重載計數器。8位的計數器最高能計數256次。 接下來,就要有一個計數的容器,這個容器就是TL0,樓主程序里寫的TL0=0x06,這個意思就是將TL0預先裝了一個0x06的值,那么它就不用從0開始計數,而是從0x06開始計數,它只要再計250次就會滿值溢出,溢出后會產生一個溢出中斷,就是TF0,此時TF0就被置1,會向單片機發送中斷請求。 在接下來就是TH0,TH0它在8位自動重載計數器里的作用就是用來裝預置數的,每次TL0計數溢出后,單片機就會自動將TH0里的值賦值給TL0,讓TL0重新工作計數。 tcount==4000就是在T0的定時中斷里計4000次中斷。 假如你的51單片機晶振頻率是12M,那么你的機器周期就是12M/12=1微秒,你的定時器中斷的時間就是250*1=250微秒=0.25毫秒。計4000次就是4000*0.25=1000毫秒=1秒。 然后回看你的程序中斷里,每計4000次,second++;每計60次second,minute++;每計60次minute,hour++;計24次hour,則hour歸零,重新計時。 |
本帖最后由 ahshmj 于 2019-2-22 14:08 編輯 kissme 發表于 2019-2-21 18:52 理解的完全正確!************************* 前面沒有仔細看,又看看才發覺:應該是0x06,不是0x60。256-6=250;250us*4000=1s |
我來總結一下,樓上的說得都對,樓下的繼續補充……![]() |
|
51的資料,樓主需要好好研究一下。 時間是要計算的。 程序只是具體實現過程。 |
| 從程序上看,定時器中斷4000次為1秒,即定時器中斷間隔時間少于1/4000秒(0.25MS),不知晶振為多少?可以定時器設置軟件計算一下,就知道TH=0x06。 |
|
void main(void) { unsigned int a; TMOD=0x02;//T0工作在模式2,8位自動重裝計數器 TH0=0x06; //這個定時器賦值0x06是依據什么呢? TL0=0x06; //初值預裝6,每12個時鐘(1個機器周期1us)+1,加滿8位寄存器并且 //溢出需要250個機器周期,就是定時250us TR0=1; ET0=1; EA=1 void t0(void) interrupt 1 using 0 { tcount++; if(tcount==4000)//這個地方為什么要賦值4000???? { //==這不是賦值,是測試值4000,250us*4000不就是1秒嗎? tcount=0; second++; |
|
1.賦值0X60的根據是:八位計數器最多計數0-256.裝入初值0X60,也就是96,讓定時器從96計數到255溢出用時0.25毫秒。 2.定時器溢出4000次,4000*0.25為一秒時間。 我自己的理解。。不對的話 樓下補充,,謝謝 ![]() |