❶ 單片機的延時設置
for(i=2211;i>0;i--); //所做的事情是把i減一,並判斷其是否為零。。
下面是其反匯編的代碼:VC上的,單片機也是類似的(指令等等不同而已)。。。。
123: {
124: for(i=2211;i>0;i--);
004015F9 mov dword ptr [ebp-4],8A3h
00401600 jmp DelayMs+3Bh (0040160b)
00401602 mov ecx,dword ptr [ebp-4]
00401605 sub ecx,1
00401608 mov dword ptr [ebp-4],ecx
0040160B cmp dword ptr [ebp-4],0
0040160F jbe DelayMs+43h (00401613)
00401611 jmp DelayMs+32h (00401602)
125: }
一次循環就會執行以上的匯編,而這些匯編語句的指令周期是固定的,所以可以算出一次循環需要多少個機器周期(不同的MCU or CPU,以及不同的指令所用的機器周期都會不一樣,查datasheet可以知道)。。。
而機器周期和時鍾周期(系統時鍾)有必然的聯系。。不同的MCU也不一樣。比如51的機器周期=12×時鍾周期(但樓主用得應該不是51);也有的是機器周期=時鍾周期
所以,如果設機器周期=n個時鍾周期,
設而執行一次循環的匯編指令花m個機器周期;
時鍾周期 = 1 / 22118400;
for(i=2211;i>0;i--);所用時間則是:2211×m×n×(1/22118400)
如果m=10,n=1,則恰好是1MS。
也即:(22118400/1)/1000/10=2211
❷ pic單片機如何設置延時
一般來說有兩種方式;第一用定時器實現延時,第二用計時器實現延時。如果需要比較精準的延時一般用定時器延時,比如應用到PWM脈沖時間的延時,比如時間顯示等等,另一種計時器用於普通的延時,比如流水燈的亮暗延時等等
❸ 單片機怎麼設置延時一個小時
用定時器做最精確,用延時程序的話,誤差較大。以下用定時器來做一個。
#include<reg51.h>
#define uchar unsigned char
uchar sec,min,cnt;
sbit key=P1^0;
sbit led=P1^4;
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
cnt++;
if(cnt>20)
{
cnt=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59){min=0;TR0=0;led=0;}
}
}
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
while(1)
{
if(key==0)
{
while(key==0);
TR0=1;
}
}
}
❹ 51單片機的一個延時,我問下這個延時是具體怎麼執行延時的
需要延時的時候,在程序中帶參數調用DelayMs,參數傳遞給DelayMs的形式參數「unsigned char t」,t就有了數值。
「while(t--);」執行t個循環後退出,t個循環用了若干時間。
連續執行兩條「DelayUs2x(245);」,原理同第1,2步,也用了若干時間。
以上執行用的時間就是你延時的時間。
問題點:程序有失誤,DelayMs里的while(t--)後邊不能有分號,這樣t個循環才能作用到下邊的兩條「DelayUs2x(245);」
❺ 怎麼在單片機中時鍾延時兩秒
可以根據單片機的時鍾和指令執行時間延時
void
delay
(int
m)
{
while(m--)
{_NOP();}
}
也可以用單片機的定時器延時,設置timer的時鍾源,設置溢出計數,然後再中斷里處理。
如果延遲2秒,最好用定時中斷。
❻ 單片機,通過按鍵修改程序內的延時時間。
這個時間存儲在單片機內部,掉電不丟失,是完全可以,STC89C52有內部EEPROM,就保存這里,根本就不需要什麼外部器件。
只要定義一個變數,根本時間長短,定義成8位,或16位數。
按加和減按鍵時,就增加或減少這個變數,每次調節後就保存一次這個變數,即保存在EEPROM中,STC技術資料中有EEPROM讀寫例子程序。
然後開機後先讀出保存在EEPROM中的數。
外部中斷查詢這個時間也沒問題,其實就是由這個變數決定中斷的次數吧,從面改變延時的時間長短嗎。再用一個變數,對中斷計數,當這個計數值等於保存的變數值就是延時到。這樣,保存的變數值是可以調節的,也就調節了延時的時間了。
❼ 通過用按鍵調整單片機的延時時間
#include<reg51.h>
sbitkey=P1^0;
sbitled=P1^2;
voiddelay(unsignedcharx)
{
unsignedchari;
while(x--)for(i=0;i<120;i++);
}
main()
{
unsignedcharnn;
while(1)
{
if(key==0)
{
while(key==0);
nn++;
if(nn>250)nn=50;
}
led=0;
delay(nn);
led=1;
delay(nn);
}
}
❽ 如何用按鍵調整單片機的延時時間
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar key1,key2,key3; //定義三個按鍵的代號
uchar a,i,temp,temp1; //定義主體函數所用變數
uint x,y,z; //定義延時函數所用三個變數
void delay1(uint); //定義延時函數1
void delay2(uint); //定義流水燈大間隔所用延時函數
void keyscan(); //定義鍵盤掃描函數
void main()
{ TMOD=0x01; //為了保證及時掃描到鍵盤變動,只好開啟中斷了
TH0=(65536-500)/256;//中斷0.5ms開啟一次
TL0=(65536-500)%256;
EA=1;
ET0=1;
a=0xfe;
i=0;
temp1=1;
while(1)
{
P1=a;
temp=a<<1;
a=a>>7;
a=temp|a;
i=i+1;
delay1(100);
if(i==8)
{
i=0;
delay2(temp1);
}
}
}
void delay1(uint z)
{
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay2(uint temp1)
{
for(x=temp1;x>0;x--)
for(y=1100;y>0;y--);
}
void keyscan()
{
if(key1==0)
{
delay1(10); //鍵盤消抖
if(key1==0)
{
temp1=10;
while(!key1); //等待按鍵釋放
}
}
if(key2==0)
{
delay1(10); //鍵盤消抖
if(key1==0)
{
temp1=20;
while(!key2); //等待按鍵釋放
}
}
if(key3==0)
{
delay1(10); //鍵盤消抖
if(key3==0)
{
temp1=30;
while(!key3); //等待按鍵釋放
}
}
}
void T0_time() interrupt 1
{
TH0=(65536-500)/256; //重裝初值
TL0=(65536-500)%256;
keyscan();
}
我的proteus壞了,不能模擬,現手寫的,如果有問題可以再告訴我,我的QQ378773957,用的ATMEL51單片機
三個按所在的IO口我沒有進行位定義,你在開頭位定義一下應該就可以可以了
❾ 單片機 延遲一秒程序怎麼寫延遲2秒我是初學者,想請教一下。
你好!
你要先寫一個延時基準(50毫秒),在延時1秒就是做20次基準,2秒就是40個基準!
也可以用定時器,定時50毫秒,定時器中斷計數,計數20就是1秒,計數40次就是2秒(推薦用定時器!)
僅代表個人觀點,不喜勿噴,謝謝。