❶ 用C語言寫一個KEILC51的延時1秒程序,急
keilc51好像也是用C編程,
一般延遲程序就是增加系統負載比如:
int i,j;
yanchi()
{
for(i=0;i<1000;i++)
for(j=0;j<1000;j++)
;
}
這樣就可以達到延遲的目的,具體參數你可以隨便設。
❷ 單片機延時c語言程序怎麼寫
在單片機編程中,實現延時功能可以通過多種方式,其中C語言是一種常用的選擇。一種基本的延時函數使用了循環結構,例如以下代碼:
void delay()
{
uint i;
for(i=0;i<20000;i++);
}
這里,`20000`是一個預定義的值,用於控制延時的長度。要計算這個函數的具體延時時間,可以將其轉換為十六進制形式,即 `4E20`。接著將高位元組 `4E` 乘以 `6` 得到 `468D`,再將 `468D` 加上 `2` 得到 `470D`,然後 `470D` 乘以 `32D`(即 `20H` 的十進製表示 `32`),結果為 `15040`。這意味著該延時函數將執行 `15040` 個周期,假設單片機使用 `12MHz` 的晶振頻率,延時時間為 `15.04ms`。
為了設定指定的延時長度,可以使用上述公式來確定參數。例如,要實現 `125ms` 的延時,首先將低位元組設置為 `200D`(即 `C8`),然後通過計算得出 `(高低節*6)+2` 的總延遲時間為 `625us`。通過除法和取整,得到 `104`,將其轉換為十六進製得到 `68H`。將高位元組和低位元組組合起來,得到定值 `68C8HEX`,並將其代入函數中,如下所示:
void delay()
{
uint i;
for(i=0;i<0x68C8;i++);
}
如果將 `68C8HEX` 轉換為十進制,則得到 `26824`,代入後函數代碼變為:
void delay()
{
uint i;
for(i=0;i<0x26824;i++);
}
在C語言中,也可以嵌入匯編代碼來實現更精確的延時。單片機通常會提供多個定時器選項,可以在定時器中斷服務程序中實現延時。例如,使用定時器工作方式2,可以實現自動重新裝載計數器,實現更精確的延時,甚至達到納秒級的精度。盡管C語言可能不是實現精確延時的最佳選擇,但通過使用定時器結合C語言編程,仍然可以實現可接受的延時效果。
實現精確延時的關鍵在於選擇合適的單片機、配置合適的定時器以及適當選擇延時演算法。在某些特殊應用中,如溫度檢測等需要快速響應的場景,可能需要考慮使用其他方法進行延時。在這些情況下,通常會採用循環結構(如 `while` 循環)來實現延時,其延時時間取決於循環體內代碼的執行次數。盡管這種方法的延時精度不如使用定時器精確,但在沒有其他選擇時,仍然是一個可行的方案。
❸ 怎麼用C語言寫可以調節的延時程序,請大俠幫忙
延時程序(包括asm和C程序,都是我在學單片機的過程中用到的),在單片機延時程序中應考慮所使用的晶振的頻率,在51系列的單片機中我們常用的是11.0592MHz和12.0000MHz的晶振,而在AVR單片機上常用的有8.000MHz和4.000MH的晶振所以在網上查找程序時如果涉及到精確延時則應該注意晶振的頻率是多大。
軟體延時:(asm)
晶振12MHZ,延時1秒
程序如下:
DELAY:MOV 72H,#100
LOOP3:MOV 71H,#100
LOOP1:MOV 70H,#47
LOOP0:DJNZ 70H,LOOP0
NOP
DJNZ 71H,LOOP1
MOV 70H,#46
LOOP2:DJNZ 70H,LOOP2
NOP
DJNZ 72H,LOOP3
MOV 70H,#48
LOOP4:DJNZ 70H,LOOP4
定時器延時:
晶振12MHZ,延時1s,定時器0工作方式為方式1
DELAY1:MOV R7,#0AH ;;晶振12MHZ,延時0.5秒
AJMP DELAY
DELAY2:MOV R7,#14H ;;晶振12MHZ,延時1秒
DELAY:CLR EX0
MOV TMOD,#01H ;設置定時器的工作方式為方式1
MOV TL0,#0B0H ;給定時器設置計數初始值
MOV TH0,#3CH
SETB TR0 ;開啟定時器
HERE:JBC TF0,NEXT1
SJMP HERE
NEXT1:MOV TL0,#0B0H
MOV TH0,#3CH
DJNZ R7,HERE
CLR TR0 ;定時器要軟體清零
SETB EX0
RET
C語言延時程序:
10ms延時子程序(12MHZ)
void delay10ms(void)
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=4;j>0;j--)
for(k=248;k>0;k--);
}
1s延時子程序(12MHZ)
void delay1s(void)
{
unsigned char h,i,j,k;
for(h=5;h>0;h--)
for(i=4;i>0;i--)
for(j=116;j>0;j--)
for(k=214;k>0;k--);
}
200ms延時子程序(12MHZ)
void delay200ms(void)
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=132;j>0;j--)
for(k=150;k>0;k--);
}
500ms延時子程序程序: (12MHZ)
void delay500ms(void)
{
unsigned char i,j,k;
for(i=15;i>0;i--)
for(j=202;j>0;j--)
for(k=81;k>0;k--);
}
下面是用了8.0000MHZ的晶振的幾個延時程序(用定時0的工作模式1):
(1)延時0.9MS
void delay_0_9ms(void)
{
TMOD=0x01; /*定時器0工作在模式1下(16位計數器)*/
TH0=0xfd;
TL0=0xa8;
TR0=1; /*啟動定時器*/
while(TF0==0);
TR0=0;
}
(2)延時1MS
void delay_1ms(void)
{
TMOD=0x01; /*定時器0工作在模式1下(16位計數器)*/
TH0=0xfd;
TL0=0x65;
TR0=1; /*啟動定時器*/
while(TF0==0);
TR0=0;
}
(3)延時4.5ms
void delay_4_5ms(void)
{
TMOD=0x01; /*定時器0工作在模式1下(16位計數器)*/
TH0=0xf4;
TL0=0x48;
TR0=1; /*啟動定時器*/
while(TF0==0);
TR0=0;
}
❹ 單片機 延遲一秒程序怎麼寫延遲2秒我是初學者,想請教一下。
可以根據單片機的時鍾和指令執行時間延時
void delay (int m)
{
while(m--) {_NOP();}
}
也可以用單片機的定時器延時,設置timer的時鍾源,設置溢出計數,然後再中斷里處理。
如果延遲2秒,最好用定時中斷。