while(1)
{
delayms(250);
.......
.......
}調用延時函數給他傳遞一個250的參數、
當第一次執行時
ms=250,
執行250--時,此時執行:
for(i
=
0;
i
<
120;
i++);
直到i>=250時候才接下來執行
ms--(即249--);
也就是說
250每次自減
1
都要執行
120次
i++;
如果你把120
改成300
只是掃描時間變長了,也就是延時的更長了,可能第一個LED點亮時間比較長,影響了你的正常看現象。你等一段時間可能就會流動了。這個就是設置的問題。
Ⅱ 單片機LED延時原理問題
這個是延時程序,你通過keil編譯調試中,會看到其匯編代碼;
當帶入的參數=1時,你單步執行匯編代碼,直至 ret,然後你看看都執行了哪些指令,並把所消耗的指令周期累加起來,大致就10個機器周期,而當單片機晶振為12MHz時,則一個機器周期約為 1uS,那麼就是從進入這個延時程序到返回,所經歷的時間正好是10uS;
Ⅲ 單片機LED燈閃爍延遲程序
int main(void)
{
while(1)
{
D3=0;
yanshi();
D3=1;
yanshi();
}
}
注意單片機程序是從main函數開始執行的,注意單片機主函數內部不加while大循環,程序會一直往下執行,直到RAM溢出產生錯誤為止程序將跑飛,所以主程序內部一定要加大循環,上面的格式是經過無數工程師的驗證,主函數的書寫格式。
Ⅳ 51單片機用c語言怎麼寫延時函數
延時時間的計算與單片機的晶振頻率有關。若晶振頻率為12Mhz,那麼單片機每震動一次所需要的時間是1/12M s。那麼再來看看單片機執行一次自減所需要的振動次數是96次,假如我們對時間要求不是特別精確的話,可以約等於100來計算。現在通過上面兩個數據可以得出:單片機每執行一次自減所需要的時間是1/12M *100(s),即1/120000 s,逆向計算一下,每1ms需要自減多少次?120次對吧。所以一個簡單的延時功能就誕生了,我們只需要自減120次,就可以延時1ms,如果我們要延時50ms呢,那就自減50*120=6000次。那麼在程序上如何表達呢?我們可以用兩套for循環
void delay(int i){
int x,y;
for(x=i;x>0;x--){
for(y=120;y>0;y--)
}
}
參數 i 代表該函數延時多少ms
Ⅳ 單片機流水燈C語言程序(8個燈,依次點亮每個燈,延時500MS)
單片機流水燈C語言程序的源代碼如下:
#include //51系列單片機定義文件
#define uchar unsigned char //定義無符號字元
#define uint unsigned int //定義無符號整數
void delay(uint); //聲明延時函數
void main(void)
{
uint i;
uchar temp;
while(1)
{
temp=0x01;
for(i=0;i<8;i++) //8個流水燈逐個閃動
{
P1=~temp;
delay(100); //調用延時函數
temp<<=1;
}
temp=0x80;
for(i=0;i<8;i++) //8個流水燈反向逐個閃動
{
P1=~temp;
delay(100); //調用延時函數
temp>>=1;
}
temp=0xFE;
for(i=0;i<8;i++) //8個流水燈依次全部點亮
{
P1=temp;
delay(100); //調用延時函數
temp<<=1;
}
temp=0x7F;
for(i=0;i<8;i++) //8個流水燈依次反向全部點亮
{
P1=temp;
delay(100); //調用延時函數
temp>>=1;
}
void delay(uint t) //定義延時函數
{
register uint bt;
for(;t;t--)
for(bt=0;bt<255;bt++);
}
(5)單片機燈延時函數擴展閱讀
51單片機流水燈的源代碼如下
#include<reg51.h>
#include<intrins.h>
voiddelay(inta)
{
inti;
while(a--)for(i=0;i<110;i++);
}
main()
{
inti;
while(1)
{
P0=0xfe;
for(i=0;i<8;i++)
{
P0=_crol_(P0,1);
delay(500);
}
}
}
Ⅵ 51單片機 延時函數
delay(u16i)
{
while(i--);//這里就是當i減1不為0時一直做減1運算,知道i為0跳出循環。
}
想當於:
delay(u16i)
{
while(i--)
{
;
}
}
Ⅶ 單片機C語言編程關於延時函數
單片機的C語言關於延時函數主要有兩種
一種是用for循環,通過單片機執行空指令達到延時的目的
如:
for(i=0;i<100;i++)
{
;
}
這個簡單的語句會執行100次空指令
每一次指令的時間可以大概確定
因此這個是最簡單的延時函數
第二種是通過定時器的方式來實現
定時器是通過對單片機的晶振進行計數
然後在定時器中斷服務函數裡面實現定時時間的計算及設置
51單片機的定時器0中斷服務函數為
void
time0()
interrupt
1
{
...
}