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