延時程序(包括asm和C程序,都是我在學單片機的過程中用到的),在單片機延時程序中應(yīng)考慮所使用的晶振的頻率,在51系列的單片機中我們常用的是11.0592MHz和12.0000MHz的晶振,而在AVR單片機上常用的有8.000MHz和4.000MH的晶振所以在網(wǎng)上查找程序時如果涉及到精確延時則應(yīng)該注意晶振的頻率是多大。
海州網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),海州網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為海州數(shù)千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的海州做網(wǎng)站的公司定做!
軟件延時:(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 ;設(shè)置定時器的工作方式為方式1
MOV TL0,#0B0H ;給定時器設(shè)置計數(shù)初始值
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;i0;i--)
for(j=4;j0;j--)
for(k=248;k0;k--);
}
1s延時子程序(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延時子程序(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延時子程序程序: (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的晶振的幾個延時程序(用定時0的工作模式1):
(1)延時0.9MS
void delay_0_9ms(void)
{
TMOD=0x01; /*定時器0工作在模式1下(16位計數(shù)器)*/
TH0=0xfd;
TL0=0xa8;
TR0=1; /*啟動定時器*/
while(TF0==0);
TR0=0;
}
(2)延時1MS
void delay_1ms(void)
{
TMOD=0x01; /*定時器0工作在模式1下(16位計數(shù)器)*/
TH0=0xfd;
TL0=0x65;
TR0=1; /*啟動定時器*/
while(TF0==0);
TR0=0;
}
(3)延時4.5ms
void delay_4_5ms(void)
{
TMOD=0x01; /*定時器0工作在模式1下(16位計數(shù)器)*/
TH0=0xf4;
TL0=0x48;
TR0=1; /*啟動定時器*/
while(TF0==0);
TR0=0;
}
額?延時指的是什么?你可以調(diào)用時間的函數(shù),通過輸入值來減少或者增加時間。但是增加或者減少時間的按鍵必須是同樣的
其實這是不太精準的延時程序,其實質(zhì)就是for循環(huán),就是讓處理器不停地做遞減或遞加運算,從而達到延時的目的。至于延時時間,完全是更具經(jīng)驗的得到的。
如果對時間要求不精確,用軟延時即可。
#includereg52.h
#define uchar unsigned char
#define uint unsigned int
sbit s=P1^0;
sbit led=P1^1;
void delayms(uint i) //1ms延時程序
{
uchar j;
for(;i0;i--)
{
for(j=0;j125;j++)//如果延時時間誤差較大,可按比例改變125這個數(shù)
//取值范圍0-255,數(shù)值越大,延時越長
{;}
}
}
void delay1s(uint i) //1s延時程序
{
for(;i0;i--){delay1ms(1000);}
}
void main()
{
led=0;
while(1)
{
if (s==0)
{
delayms(20);
if (s==0);{delay1s(60);led=1; }
}
if(led==1){delay1s(1800);led=0; }
}
}
如果對時間要求精確,則要用到定時器,還要確保電路外接有晶振,并已知晶振頻率
#includereg52.h ?//引用庫文件
void delay() //延時函數(shù)
{
unsigned char i,j; ?//定義兩個變量,用于空循環(huán)
for(i=0;i200;i++)
for(j=0;j200;j++)
?;
}
unsigned char flag;
void main()
{
unsigned char i;
flag=1;
EA=1; ? //開放總中斷
EX0=1; ?//允許使用外中斷
IT0=1; ?//選擇負跳變來觸發(fā)外中斷
while(1) ? //用于反復(fù)循環(huán)
{
for(i=0;i8;i++) ?
{
?P1=~(1i); ? ?
delay(); ?//調(diào)用延時函數(shù)
?while(flag!=1);
}
i=0;
? //
}
}
/**************************************************************
函數(shù)功能:外中斷T0的中斷服務(wù)程序
**************************************************************/
void int0(void) interrupt 0 using 0 //外中斷0的中斷編號為0
{
flag=~flag;
}
仿真圖:
樓主的采納率好低?。〞r間久了,估計給你回答的人會變少),不過我還是希望樓主能采納
不要用系統(tǒng)提供的getchar或者scanf這類輸入函數(shù)
而是去調(diào)用系統(tǒng)api,來獲取按鍵的按下抬起狀態(tài)
這樣在識別到按下時,就可以自行控制執(zhí)行動作的周期,不會出現(xiàn)第一次的停滯
網(wǎng)站標題:c語言按鍵延時函數(shù),c語言延時函數(shù)怎么寫
瀏覽地址:http://jinyejixie.com/article2/hsidic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、定制網(wǎng)站、電子商務(wù)、網(wǎng)站導(dǎo)航、標簽優(yōu)化、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)