Ⅰ 單片機定時和計數原理的循環
單片機的定時器是用內部時鍾信號,計脈沖的個數,
計數器是計外面的脈沖個數,
定時器用的脈沖頻率是晶振頻率的1/12.當計數個數達到一定值後,產生溢出,產生一個中斷信號.
而計數器用的脈沖外面的脈沖,從io輸入,當計數個數達到一定值後,產生溢出,產生一個中斷信號.
兩者工作原理差不多.都是計數
,用的信號來源不同.
Ⅱ 51單片機再循環中多次使用定時器計數器,會佔用很多資源嗎
使用定時器佔用資源是最少的,用中斷來控制蜂鳴器發生相對於用延時程序來做,佔用資源少而且不受外部條件限制。
Ⅲ 怎樣用單片機定時器設計0到9秒的循環程序
#define uint unsigned int
#define uchar unsigned char
#include <reg52.h>
uint i;
uchar code TAB[]=[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main(void)
{
TMOD=0x22; /*定時器0設置為工作方式2,基準定時(256-6)/1M=0.25ms*/
TH0 =6; //賦T0的預置值6,溢出4000次就是1秒鍾
TL0 =6;
ET0=1; //打開定時器0中斷
EA=1; //打開總中斷
TR0=1; //啟動定時器
while(1) //程序循環
{
P3=TAB[(i)];//p3送數
}
}
//定時器0中斷
void timer0(void) interrupt 1 using 1
{
static uint t; //注意t的范圍,這里涉及到C51變數取值范圍這個知識點
t++;
if(t==4000) //T0的預置值6,溢出4000次就是1秒鍾,晶振12MHz
{
t=0;
i++;
i=i%10;
}
}
Ⅳ 單片機定時器
一個定時器裡面多一些標志量,標志量大小表示不同的定時,就可以當很多定時器來用啊。建議看一些實時操作系統方面的書籍,就可以解決用循環語句會大量佔用CPU的時間。
Ⅳ 51單片機定時器的使用
51單片機定時器的GATE=1時,用外部INT0啟動定時器,當INT0=0時,
定時器T1會停止計數,這個時候讀取T1的值是可以計算出高電平的寬度的。
Ⅵ 單片機 定時器使用
你是剛學習單片機嗎?
對於Ljmp和Ajmp
只是定址范圍稍有區別
前者為長轉移指令
後者是絕對轉移指令,後者范圍轉移范圍在同一個2K位元組空間以內,一般沒有太大的區別。程序寫的較短較密的用後一個就可以。
還有哦
你的程序中有幾個錯誤
T0的入口地址可是000Bh
堆棧指針是C51中已經定義好的專用指針,用於暫存一些有用變數中的內容
20次循環為14h
還有中斷返回返回到等待區就好,表示繼續執行同樣的程序,這樣才能循環1S的方波
建議你可以看看你的教材
上面應該都有介紹的。
《單片機原理及應用教程》
第2版
機械工業出版社
這本書是我學過的教材,我覺得挺實用的,你可以參考一下上面107頁的程序。
下面是我給你改過的程序
可以參考一下哦!
ORG
0000H
AJMP
MAIN
ORG
000BH
AJMP
PART1
ORG
0030H
MAIN:
MOV
TMOD,#01H
MOV
TH0,#3CH
MOV
TL0,#0B0H
MOV
R7,#0AH
MOV
IE,#82H;這個和你的按位啟動是一樣效果
SETB
TR0
SJMP
$
PART1:
MOV
TH0,#3CH
MOV
TL0,#0B0H
DJNZ
R7,FANHUI
CPL
P1.0
MOV
R7,#0AH
FANHUI:
RETI
end
其實堆棧指針在51系列中已經定義好了一段區域,最多用於子程序中,例如你在主程序中用了寄存器R1,而且其值在你主程序的其他位置還有用,而且你需要用到一個跳轉指令在子程序中進行操作,怕在子程序中也要用到R1,那麼先用堆棧將R1的值暫存起來,等完成子程序得時候再退棧,這樣原來的R1中的值將不會被破壞。這里還要注意哦,堆棧是順序操作的,它是後進先出原則哦,這個你可以參考一下C語言。
Ⅶ 單片機定時器原理及使用
這里通俗的說下C51單片機的定時器的工作原理,C51單片機的定時器是由計數器構成的,所計量的時間是通過計算固定周期的脈沖個數的累計獲得的,通過設置定時器的工作模式,可以由16位(高、低兩個8位)寄存器模式或其他位數的寄存器模式來計數,以16位計數模式來討論,那就是無論那種工作模式只有當計數用的寄存器的各個位全部置1,也就是滿值後下一個計數脈沖進入時使寄存器產生溢出,而這個溢出才會使計數產生中斷從而完成一次定時控制,因此,如果我們想產生某個時長的定時,那麼我需要將這個時長根據單片機運行的時鍾頻率、周期等等相關因素換算成需要計數的個數,進而在這個滿值的16位寄存器中扣除需要計數的個數,啟動運行後當計數值補充滿了寄存器就完成了一次計時,而一個16位寄存器滿值為2的16次方=65536,假如一個計數脈沖的周期為1us,那麼滿值後就會耗時65536us,假如我們需要計時36us,那麼我們只需要為寄存器賦值65500就可以了,這里需要注意的是,因為C51單片機的寄存器是8位的,我們需要將這個65500拆分出高8位數據裝入THx中計算方法為THx=65500/256,再計算出低8位數據裝入TLx中,THx=65500%256。
Ⅷ 51單片機怎樣用定時器做兩個輸出循環交替
這個不難,用1個全局變數作為交替標識,我沒在家上,這里沒U4,沒法給你寫全,我隨便寫一段,你自己多琢磨就明白了
unsigned char i; //這個是全局變數
void main()
{
i=0;
while(1)
{
}
}
//你可以設定定時器累加時間到3秒執行一次,這里我就不細寫了
//比方30毫秒加一,到3000毫秒就是3秒的意思
void init0() interropt 1 //這里是定時器0的中斷,至於定時時間設置,你就自己設置吧
{ //假設P11是1個燈,P12也是個燈,0是開燈
ET0=0; //關掉
if(i==0)
{
P11=0; //假設P11是1個燈,0是開燈
Delay(10); //假設這里是延時10秒,這樣,P11就這個燈就開了1秒
P11=1; //這里P11關燈
}
else
{
P12=0; 如果i不是等於0,那麼開的就是第二個燈
Delay(8); 此處延時8秒,當然你也可以用定時器1來定時,無非就是多個標識變數
P12=1;
}
i=~i; //把標識取反
TH0=XXX; //此處請自己設置時間
TL0=XXX; //此處請自己設置時間
ET0=1; //打開定時器
}
Ⅸ 51單片機定時器定時 2秒燈亮 3秒燈滅,如此循環
如果想實現無限循環那就採用死循環方式,可以無限的循環如while(1){};然後設定定時器定時時間為1s(此值需要根據單片機確定是否可以設定這么大),其次,設定一個變數對時間進行計數,根據計數情況做出相應的改變,程序可以這樣設定:
unsigned
char
gucledstatus
=
0x00;
//全局變數,表示燈當前的狀態
0為滅,1為亮
volatile
unsigned
int
gustimecnt;
//全局變數對時間計數
int
main()
{
//增加定時器初始化並開放中斷
while(1)
{
if(gucledstatus
==
0x01)
//當前為亮狀態
{
if(gustimecnt
>=
7200)
//兩個小時時間到
{
gustimecnt
=
0x00;
//清零
gucledstatus
=
0x00;
//燈為滅狀態
//此處加程序代碼,控制燈為滅的狀態
}
else
{
//此處加程序代碼,控制燈為亮的狀態,此處會重復執行,可以進行控制
}
}
else
if(gucledstatus
==
0x00)
//燈為滅的狀態
{
if(gustimecnt
>=
3600)
//1個小時
{
gustimecnt
=
0x00;
gucledstatus
=
0x01;
//亮狀態
//增加程序代碼,控制燈亮
}
else
{
//增加程序代碼,控制燈滅,此處會重復執行,可以進行控制
}
}
}
return
0;
}
在中斷函數中,對gustimecnt進行遞增即可!
Ⅹ 怎麼用51單片機定時1個小時 好像是循環,具體匯編程序是怎樣的
開啟定時器作為時間基準,
然後再設置幾個軟體計數器,
比如,你設定定時器每隔10毫秒中斷一次,
軟體計數器a加1,當a數值=100時,就已經定時1秒了,
軟體計數器b這時+1,當b數值=60時,就已經定時1分了,
軟體計數器c這時+1,當c數值=60時,就已經定時1小時了。
就是這樣累積的定時,
明白?