延時(shí)時(shí)間的計(jì)算與單片機(jī)的晶振頻率有關(guān)。若晶振頻率為12Mhz,那么單片機(jī)每震動(dòng)一次所需要的時(shí)間是1/12M s。那么再來看看單片機(jī)執(zhí)行一次自減所需要的振動(dòng)次數(shù)是96次,假如我們對(duì)時(shí)間要求不是特別精確的話,可以約等于100來計(jì)算?,F(xiàn)在通過上面兩個(gè)數(shù)據(jù)可以得出:單片機(jī)每執(zhí)行一次自減所需要的時(shí)間是1/12M *100(s),即1/120000 s,逆向計(jì)算一下,每1ms需要自減多少次?120次對(duì)吧。所以一個(gè)簡單的延時(shí)功能就誕生了,我們只需要自減120次,就可以延時(shí)1ms,如果我們要延時(shí)50ms呢,那就自減50*120=6000次。那么在程序上如何表達(dá)呢?我們可以用兩套for循環(huán)
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比久治網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式久治網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋久治地區(qū)。費(fèi)用合理售后完善,10年實(shí)體公司更值得信賴。
void delay(int i){
int x,y;
for(x=i;x0;x--){
for(y=120;y0;y--)
}
}
參數(shù) i 代表該函數(shù)延時(shí)多少ms
單片機(jī)的C語言關(guān)于延時(shí)函數(shù)主要有兩種
一種是用for循環(huán),通過單片機(jī)執(zhí)行空指令達(dá)到延時(shí)的目的
如:
for(i=0;i100;i++)
{
;
}
這個(gè)簡單的語句會(huì)執(zhí)行100次空指令
每一次指令的時(shí)間可以大概確定
因此這個(gè)是最簡單的延時(shí)函數(shù)
第二種是通過定時(shí)器的方式來實(shí)現(xiàn)
定時(shí)器是通過對(duì)單片機(jī)的晶振進(jìn)行計(jì)數(shù)
然后在定時(shí)器中斷服務(wù)函數(shù)里面實(shí)現(xiàn)定時(shí)時(shí)間的計(jì)算及設(shè)置
51單片機(jī)的定時(shí)器0中斷服務(wù)函數(shù)為
void
time0()
interrupt
1
{
...
}
定義一個(gè)延時(shí)xms毫秒的延時(shí)函數(shù)
void delay(unsigned int xms) // xms代表需要延時(shí)的毫秒數(shù)
{
unsigned int x,y;
for(x=xms;x》0;x--)
for(y=110;y》0;y--);
}
使用:
void Delay10us(uchar Ms)
{
uchar data i;
for(;Ms》0;Ms--)
for(i=26;i》0;i--);
}
i=[(延時(shí)值-1.75)*12/Ms-15]/4
擴(kuò)展資料
1、在C51中進(jìn)行精確的延時(shí)子程序設(shè)計(jì)時(shí),盡量不要或少在延時(shí)子程序中定義局部變量,所有的延時(shí)子程序中變量通過有參函數(shù)傳遞。
2、在延時(shí)子程序設(shè)計(jì)時(shí),采用do?while,結(jié)構(gòu)做循環(huán)體要比for結(jié)構(gòu)做循環(huán)體好。
3、在延時(shí)子程序設(shè)計(jì)時(shí),要進(jìn)行循環(huán)體嵌套時(shí),采用先內(nèi)循環(huán),再減減比先減減,再內(nèi)循環(huán)要好。
下面幾個(gè)是單片機(jī)的延時(shí)程序(包括asm和C程序,都是我在學(xué)單片機(jī)的過程中用到的),在單片機(jī)延時(shí)程序中應(yīng)考慮所使用的晶振的頻率,在51系列的單片機(jī)中我們常用的是11.0592MHz和12.0000MHz的晶振,而在AVR單片機(jī)上常用的有8.000MHz和4.000MH的晶振所以在網(wǎng)上查找程序時(shí)如果涉及到精確延時(shí)則應(yīng)該注意晶振的頻率是多大。
軟件延時(shí):(asm)
晶振12MHZ,延時(shí)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
定時(shí)器延時(shí):
晶振12MHZ,延時(shí)1s,定時(shí)器0工作方式為方式1
DELAY1:MOV
R7,#0AH
晶振12MHZ,延時(shí)0.5秒
AJMP
DELAY
DELAY2:MOV
R7,#14H
晶振12MHZ,延時(shí)1秒
DELAY:CLR
EX0
MOV
TMOD,#01H
;設(shè)置定時(shí)器的工作方式為方式1
MOV
TL0,#0B0H
;給定時(shí)器設(shè)置計(jì)數(shù)初始值
MOV
TH0,#3CH
SETB
TR0
;開啟定時(shí)器
HERE:JBC
TF0,NEXT1
SJMP
HERE
NEXT1:MOV
TL0,#0B0H
MOV
TH0,#3CH
DJNZ
R7,HERE
CLR
TR0
;定時(shí)器要軟件清零
SETB
EX0
RET
C語言延時(shí)程序:
10ms延時(shí)子程序(12MHZ)
void
delay10ms(void)
{
unsigned
char
i,j,k;
for(i=5;i0;i--)
for(j=4;j0;j--)
for(k=248;k0;k--);
}
1s延時(shí)子程序(12MHZ)
void
delay1s(void)
{
unsigned
char
h,i,j,k;
for(h=5;h0;h--)
for(i=4;i0;i--)
for(j=116;j0;j--)
for(k=214;k0;k--);
}
200ms延時(shí)子程序(12MHZ)
void
delay200ms(void)
{
unsigned
char
i,j,k;
for(i=5;i0;i--)
for(j=132;j0;j--)
for(k=150;k0;k--);
}
500ms延時(shí)子程序程序:
(12MHZ)
void
delay500ms(void)
{
unsigned
char
i,j,k;
for(i=15;i0;i--)
for(j=202;j0;j--)
for(k=81;k0;k--);
}
下面是用了8.0000MHZ的晶振的幾個(gè)延時(shí)程序(用定時(shí)0的工作模式1):
(1)延時(shí)0.9MS
void
delay_0_9ms(void)
{
TMOD=0x01;
/*定時(shí)器0工作在模式1下(16位計(jì)數(shù)器)*/
TH0=0xfd;
TL0=0xa8;
TR0=1;
/*啟動(dòng)定時(shí)器*/
while(TF0==0);
TR0=0;
}
(2)延時(shí)1MS
void
delay_1ms(void)
{
TMOD=0x01;
/*定時(shí)器0工作在模式1下(16位計(jì)數(shù)器)*/
TH0=0xfd;
TL0=0x65;
TR0=1;
/*啟動(dòng)定時(shí)器*/
while(TF0==0);
TR0=0;
}
(3)延時(shí)4.5ms
void
delay_4_5ms(void)
{
TMOD=0x01;
/*定時(shí)器0工作在模式1下(16位計(jì)數(shù)器)*/
TH0=0xf4;
TL0=0x48;
TR0=1;
/*啟動(dòng)定時(shí)器*/
while(TF0==0);
TR0=0;
}