① 單片機延時程序怎麼寫是根據什麼原理寫的有什麼方法嗎
1、比較死板的方法是自己寫一個delay函數,裡面用for,while等做一些循環,下面是1ms的延時函數
void
delay1ms(void)
{
unsigned
char
i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++);
}
具體演算法是//(3j+2)*i=(3×33+2)×10=1010(us),但精確度不高,如果想准確點可以調節相應的參數用示波器來實
現,上面的函數適用於程序簡單,對時間性要求不高,如:點led燈,單個按鍵操作等等。
2,就是用定時器中斷裡面設定標志位來產生延時的方法,比如你可以把定時器設定為每1ms進一次中斷,在中斷裡面
把一個標志位(如flag)置一
當你需要1ms延時的時候你可以先初始化定時器,然後查詢標志位是否置一,置一則執行if後面的語句,即if(fla{};
當你需要10ms延時時,你可以把flag設置為uchar,中斷裡面flag++;外面查詢用if(10==flag){};
以此類推,上面的方法精確度高適用地方。
② 設單片機系統採用6M晶振,寫出用定時器1方式2實現1ms的延時程序
6M晶振,方式2定時1mS的時間太長,不能直接實現,(最大定時應該是512uS)下面是500uS定時示常式序,可在中斷函數中計數每2次得1S。
void Timer1Init(void) //500微秒@6.000MHz
{
AUXR &= 0xBF; //定時器時鍾12T模式
TMOD &= 0x0F; //設置定時器模式
TMOD |= 0x20; //設置定時器模式
TL1 = 0x06; //設置定時初值
TH1 = 0x06; //設置定時重載值
TF1 = 0; //清除TF1標志
TR1 = 1; //定時器1開始計時
}
③ 如何使用51單片機的定時器寫一個精確延時1ms的延時子函數。
要是精確延時的話,最好用匯編程序,每一條指令都能算出時間,哈
④ 單片機延時1ms問題
首先,不知道你的晶振頻率是多少,然後不知道你使用的是哪種類型的單片機。
我根據KEILC的測試:for循環這個語句是雙周期指令2個機器周期,j=0;j<33;j++。這有三步單周期指令,每次三個機器周期。。。所以時間是(3j+2) 乘以循環次數i。就是時間微秒
上述指令在12MHZ的晶振頻率,AT89S52的單片機測試情況下為0.0001060秒。也就是1MS
⑤ 51單片機中,定時器怎麼做延時函數用,比如說,要精確延時1s,該怎麼寫
unsigned long TimeTickCount;//1ms計時器
void Timer0Configuration();
void Delay1ms(unsigned int a);
void main()
{
while(1)
{
Delay1ms(1000);//1s延時;
}
}
void Delay1ms(unsigned int a)//0~65535
{
unsigned long b;//0~0xffffffff
b = TimeTickCount;//記下及時器初始值
while((TimeTickCount-b<a)||(0xffffffff+TimeTickCount-b<a));
//當計數器未溢出只須用 計數器實時變化的值-其初始值
//當計數器溢出則須用 計時器上限值+計數器實時變化的值-其初始值
}
void Timer1Configuration()
{
TMOD=0X10;//選擇為定時器模式,工作方式1。
TH1=0Xfc; //給定時器賦初值,定時1000us
TL1=0X18;
ET1=1;//打開定時器1中斷允許
EA=1;//打開總中斷
TR1=1;//打開定時器
}
void interrupt_timer1() interrupt 3 //1000us
{
TH1 = 0xfc; //重裝
TL1 = 0x18;
TimeTickCount++;//1000us計時器
}
⑥ 51單片機c語言延時函數 Void delay 1ms(unsigned int ms){un
C程序中可使用不同類型的變數來進行延時設計。經實驗測試,使用unsigned char類型具有比unsigned int更優化的代碼,在使用時應該使用unsigned char作為延時變數。 以某晶振為12MHz的單片機為例,晶振為12MHz即一個機器周期為1us。
void delay_ms(unsigned int ms_number) // ms延時函數 (AT89C51 @ 11.0592MHz)
{
unsigned int i;
unsigned char j;
for(i=0;i<ms;i++)
{
for(j=0;j<200;j++);
for(j=0;j<102;j++);
}
}
void Delay()
{
unsigned char a,b,c;
for(a=0;a<?;a++)
for(b=0;b<?;b++)
for(c=0;c<?;c++);
}
void delay_ms(unsigned int ms)
{
unsigned int i;
unsigned char j;
for(i=0;i<ms;i++)
{
for(j=0;j<200;j++);
for(j=0;j<102;j++);
}
}
拓展資料
C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。
⑦ 請幫忙在51系列單片機系統中,編寫一個延時1ms的子程序。謝謝。。
1、首先,在電腦中打開keil軟體,創建好工程,然後添加c文件,如下圖所示。
⑧ c編程時,51單片機怎麼用定時器寫一個延時1ms的子函數
好辦
用C51,方式一
void delay(unsigned int T) //T的單位取微秒
{
signed int cnt; //這里用符號數的相反數 就是2^16-n的原碼,也可以定義無符號數自己換成2^16-n
cnt=-(fosec*1.0/12)*T; // fosec的單位MHz
TMOD=0x01;
TH0=(unsigned char)(cnt>>8);
TL0=(unsigned char)cnt;
TR0=1;
while(!TF0);
TR0=0;
TF0=0;//加這句是為了可以循環使用
}
⑨ 51單片機中,寫個延時函數,延時1ms,該怎麼寫,為什麼
用匯編語言寫可以精確計算,但有時想拼出整數的ms或10ms也不容易,計算方法如下圖說明:
而C語言靠經驗和實驗得來的,如下面程序
如果不準(與晶振頻率有關),調K的值,,軟體模擬查看,直到大致准確,想更精確用定時器
void delay(unsigned char i)//延時程序
{
unsigned chari,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
⑩ C51單片機,誰幫我寫個1ms的延時
void delay(uint i) //調用子程序所需時間)
{
uchar j,k;
for (j=i; j>0; j--)
for(k=0;k<30;k++);
}
在程序調用函數就可以得到1ms的程序,具體調用如下:
delay(10); //延時1.011ms