|
寫出此主題主要是因?yàn)楸救酥氨粚W(xué)校教的編程方式殘害,所以思量很久,還是想發(fā)出此貼,共和大家一起討論話不多少,直接進(jìn)入正題。
拿一個(gè)最簡(jiǎn)單得例子,在學(xué)校我們寫的最簡(jiǎn)單得51單片機(jī)的程序肯定都是點(diǎn)亮一個(gè)LED了,那么讓LED閃爍可用用的都是亮一下LED,然后延時(shí)一下,然后在滅LED,然后再延時(shí),循環(huán)往復(fù),達(dá)到延時(shí)的功能。
程序如下:
void delay(uint m) //延時(shí)程序
{
uint i,j;
for(i=110;i>0;i--)
for(j=m;j>0;j--);
}
void main()
{
while(1);
{
LED = 0;
delay(500);
LED = 1;
delay(500);
}
}
這里對(duì)于單個(gè)模塊來說是沒有問題的,但是一旦幾個(gè)模塊組合在一起,時(shí)間就不對(duì)了,然后延時(shí)還會(huì)影響到其他程序的運(yùn)行,所以,在主循環(huán)里。我們應(yīng)當(dāng)盡量去減少使用延時(shí)的情況。需要延時(shí)我們應(yīng)當(dāng)采用主循環(huán)計(jì)數(shù)的方式去實(shí)現(xiàn),那么在這里,我們就應(yīng)當(dāng)設(shè)定一個(gè)基準(zhǔn),也就是主循環(huán)應(yīng)當(dāng)多久跑一次呢?有人會(huì)問:主循環(huán)的時(shí)間我們還能設(shè)定?在這里其實(shí)我們說的是,主循環(huán)在跑,但是真正我們執(zhí)行的功能函數(shù)時(shí)間我們是可以設(shè)定的,話不多說先看程序:
void main()
{
TMOD=0x01;//定時(shí)器工作在方式
TH0=(65536-50000)/256;//初值是15536,定時(shí)50ms
TL0=(65536-50000)%256;
TR0=1;//開始計(jì)數(shù)
TF0 = 0;//溢出標(biāo)志清零
while(1)//主循環(huán)
{
if(TF0)//50ms到了
{
TF0 = 0;//清零
TH0=(65536-50000)/256;//重新賦初值
TL0=(65536-50000)%256;
V_TempData++;//計(jì)數(shù)加加
if(V_TempData >= 10)//500ms到了
{
V_TempData = 0;//清零
P_LEDPort ^= 1; //異或取反
}
}
}
}
在這里,我們簡(jiǎn)單的描述了一下,將功能函數(shù)設(shè)定為50ms跑一次,那么跑十次,就是500ms了,此時(shí)再將LED的狀態(tài)反轉(zhuǎn)一下,就可以達(dá)到閃爍的小伙了,這里只用到了一個(gè)功能,如果增加一個(gè)功能,比如讓蜂鳴器響1秒鐘然后滅一秒,就只需要增加一個(gè)計(jì)數(shù)就好了,然后和上面的LED一樣操作就好了,但是如果使用延時(shí),這是不是就會(huì)麻煩很多呢?
整個(gè)工程和仿真就放在下面附件吧!
樓主初次寫此類文章,不到之處請(qǐng)諒解!
還請(qǐng)大家有意見評(píng)論處指出來討論下!哈哈哈
全部資料51hei下載地址:
2_定時(shí)器0查詢法使LED閃爍.zip
(70.38 KB, 下載次數(shù): 3)
2020-4-1 14:58 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|