⑴ 利用51單片機定時器編寫一個C語言程序,實現一個發光二極體定時亮、滅,要求亮一秒、滅一秒交替閃爍不
利用51單片機定時器編寫一個C語言程序,實現一個發光二極體定時亮、滅,
要求亮一秒、滅一秒交替閃爍不止。最好有硬體電路簡圖
電路與程序如下:
晶振頻率,採用 12MHz。
定時器 0,定時 8ms。
中斷 125 次,即為一秒。令 IO 介面取反即可。
⑵ 單片機定時器/計數器程序,如果想讓定時器T1工作在方式0 那麼應該是TMOD=;如果讓T1工作在方式1,那
TMOD高四位是負責定時器1的操作,低4位負責定時器0的操作。
而每個四位中的M1和M0負責控制定時器工作方式,其中
M1M0 = 00, 定時器工作在方式0
M1M0 = 01,方式1
M1M0 = 10,方式2
M1M0 = 11,這種設置只對定時器0有效,表示定時器0工作方式
因此,T1工作在方式0,TMOD = 00000000;
T1工作在方式1,TMOD = 00010000;
⑶ MCS-51單片機,利用定時計數器設計一個程序,匯編語言,最好有注釋,很簡單的就可以
ORG
0000H
JMP
BEGIN
ORG
0030H
TABLE:
;
共陰極數碼管顯示代碼表
DB
3FH,06H,5BH,4FH,66H
;01234
DB
6DH,7DH,07H,7FH,6fh
;56789
DELAY:
MOV
R5,#20
LOOP4:
MOV
R6,#50H
;延時20X20ms
LOOP5:
MOV
R7,#100
DJNZ
R7,$
DJNZ
R6,LOOP5
DJNZ
R5,LOOP4
RET
;---------------------------------------
BEGIN:
MOV
P2,#0FFH
;P2口置高電平,准備接收信號
MOV
R4,#0
MOV
A,R4
;R4位標志值送A寄存器
AGAIN:
MOV
DPTR,#TABLE
MOVC
A,@A+DPTR
MOV
P1,A
LOOP1:
MOV
A,P3
;
接收p3口的搶答信號
CPL
A
JZ
LOOP1
LOOP2:
RRC
A
;有人搶答信號則逐次移動判斷哪一位搶答
INC
R4
JNC
LOOP2
;********************
MOV
A,R4
MOVC
A,@A+DPTR
;找到相應位顯示代碼
MOV
P1,A
LEDDIS:
MOV
A,#0FFH
CLR
C
LEDDIS1:
RLC
A
DJNZ
R4,LEDDIS1
MOV
P0,A
LOOP3:
JNB
P2.2,BEGIN
;若主持人按下復位信號鍵,則轉向主程序
CPL
P2.0
;若沒按復位信號鍵,則通過p2.2口給出高低信號驅動蜂鳴器
LCALL
DELAY
;調用延時子程序
SJMP
LOOP3
;p2.2口反復間隔0.4s變化,驅動蜂鳴器
END
⑷ 單片機定時計數器程序運行過程
程序運行到這里就死循環了,
while
(1)
{
led2
=
0;
}
後邊的代碼是無緣運行的。
程序運行首先從地址0000H開始,跳轉到主程序入口也就是main()那裡開始,所以真正有意義的運行第一條是:
=
0x01;
依次往下執行,到TR0=1;開始定時器開始計數,根據你的賦值,計數到50000之後,定時器0溢出,開始申請中斷,進入中斷服務程序
void
intt0()
interrupt
1
using
2
執行完中斷後返回到主程序,你現在的情況是在while(1)那個死循環之中。
你說的那個while(1)後邊的{
}里邊的程序在執行完TR0=1之後就執行了,並一直在執行到中斷開始。中斷結束後又一直執行下去,一直反復如此。
⑸ 單片機定時/計數器實驗--脈沖計數器
這是個簡易頻率計,程序如下:
;---------------------------------
ORG0000H
JMPSTART
ORG000BH
JMPT0_INT
;---------------------------------
START:
MOVTMOD,#51H;/*01010001T1計數,T0定時*/
MOVTH0,#HIGH(65536-50000);50ms@12MHz
MOVTL0,#LOW(65536-50000)
MOVTH1,#0
MOVTL1,#0
SETBTR0
SETBTR1
SETBET0
SETBEA
MOVR7,#20
SJMP$
;---------------------------------
T0_INT:;50ms執行一次
MOVTL0,#LOW(65536-50000);重新寫入初始值
MOVTH0,#HIGH(65536-50000);50ms@12MHz
DJNZR7,T0_END
MOVR7,#20
MOVP1,TL1
MOVP2,TH1
MOVTL1,#0
MOVTH1,#0
T0_END:
RETI
;---------------------------------
用PROTEUS模擬如下圖。
圖中信號的頻率是5000Hz,顯示的是16進制,這是題目中要求的形式。
⑹ 51單片機中斷/定時器/計數器
89C51/52的中斷系統有5個中斷源 ,2個優先順序,可實現二級中斷嵌套 。
1、(P3.2)可由IT0(TCON.0)選擇其為低電平有效還是下降沿有效。當CPU檢測到P3.2引腳上出現有效的中斷信號時,中斷標志IE0(TCON.1)置1,向CPU申請中斷。
2、(P3.3)可由IT1(TCON.2)選擇其為低電平有效還是下降沿有效。當CPU檢測到P3.3引腳上出現有效的中斷信號時,中斷標志IE1(TCON.3)置1,向CPU申請中斷。
3、TF0(TCON.5),片內定時/計數器T0溢出中斷請求標志。當定時/計數器T0發生溢出時,置位TF0,並向CPU申請中斷。
4、TF1(TCON.7),片內定時/計數器T1溢出中斷請求標志。當定時/計數器T1發生溢出時,置位TF1,並向CPU申請中斷。
5、RI(SCON.0)或TI(SCON.1),串列口中斷請求標志。當串列口接收完一幀串列數據時置位RI或當串列口發送完一幀串列數據時置位TI,向CPU申請中斷。
IE寄存器:
中斷允許控制寄存器分為兩層結構,第一級結構為中斷允許總控制EA,只有當EA處於中斷允許狀態,中斷源中斷請求才能夠得到允許;當EA處於不允許狀態時,無論IE寄存器中其他位處於什麼狀態,中斷源中斷請求都不會得到允許。第二級結構為5個中斷允許控制位,分別對應5個中斷源的中斷請求,當對應中斷允許控制位為1時,中斷源中斷請求得到允許。
EX0:外部中斷0允許位。EX0=1,允許外部中斷0中斷;EX0=0,禁止外部中斷0中斷。當EX0=1( SETB EX0 )時,同時單片機P3.2引腳上出現中斷信號時,單片機中斷主程序的執行而「飛」往中斷服務子程序,執行完後通過中斷返回指令RET 動返回主程序。當EX0=0( CLR EX0)時,即使單片機P3.2引腳上出現中斷信程序也不會從主程序「飛」 出去執行,因為此時單片機的CPU相當於被「堵上了耳朵」,根本接收不到P3.2引腳上的中斷信號,但是這並不表示這個信號不存在。如果單片機的CPU有空查一下TCON中的IE0位,若為1就說明有中斷信號出現過。
ET0:T0溢出中斷允許位。ET0=1,允許T0中斷;ET0=0,禁止T0中斷。
EX1:外部中斷1允許位。EX1=1,允許外部中斷1中斷;EX1=0,禁止外部中斷1中斷。當EX1=1( SETB EX1)時,並且外部P3.3引腳上出現中斷信號時,單片機CPU會中斷主程序而去執行相應的中斷服務子程序;當EX1=0( CLR EX1)時使外部P3.3引腳上即使出現中斷信號,單片機的CPU也不能中斷主程序轉而去行中斷服務子程序。 [3] 因此,可以這樣認為,EX0和EX1是決定CPU能否感覺到外部引腳P3.2P3.3上的中斷信號的控制位。
ET1:T1溢出中斷允許位。ET1=1,允許T1中斷;ET1=0,禁止T1中斷。
ES:串列中斷允許位。ES=1,允許串列口中斷;ES=0,禁止串列口中斷。
EA:中斷總允許位。EA=1,CPU開放中斷;EA=0,CPU禁止所有的中斷請求。總允許EA好比一個總開關。EA就相當於每家水管的總閘,如果總閘不開,各個龍頭即使開了也不會有水;反過來,如果總閘開了而各個分閘沒開也不會有水,所當我們想讓P3.2和P3.3引腳上的信號能夠中斷主程序則必須將EA位設置為0(CLR EA)。
TCON寄存器:
各位的標識如下:
TF1:定時器1溢出標志位。當定時器1計滿溢出時,由硬體使TF1置1,並且申請中斷,進入中斷服務程序,有硬體自動清0 ,在查詢方式下用軟體清0.
TR1:定時器運行控制位,TR1置1是開啟定時器1,TR1置0時關閉定時器1.
TF0:定時器0溢出標志位。當定時器0計滿溢出時,由硬體使TF0置1,並且申請中斷,進入中斷服務程序,有硬體自動清0 ,在查詢方式下用軟體清0.
TR0:定時器運行控制位,TR0置1是開啟定時器0,TR0置0時關閉定時器0.
IE1:外部中斷1請求標志位。
IT1:外部中斷1觸發方式選擇位。當IT1置0時,為低電平觸發;當IT1置1時,為下降沿觸發。
IE0:外部中斷0請求標志位。
IT0:外部中斷0觸發方式選擇位。當IT0置0時,為低電平觸發;當IT0置1時,為下降沿觸發。
51單片機外部中斷響應條件:
1、中斷源有中斷請求;
2、中斷源的中斷允許位為1(設置IE寄存器相關位);
3、CPU開中斷(設置IE寄存器開中斷,即EA=1)
CPU時序的有關知識:
振盪周期:為單片機提供定時信號的振盪源的周期(晶振周期或外加振盪周期)
狀態周期:2個振盪周期為1個狀態周期,用S表示。
機器周期:1個機器周期含6個狀態周期,12個振盪周期。
指令周期:完成1條指令所佔用的全部時間,它以機器周期為單位。
定時器的其他知識點:
1、51單片機有兩組定時器/計數器,因為既可以定時,又可以計數,故稱之為定時器/計數器。
2、定時器/計數器和單片機的CPU是相互獨立的。定時器/計數器工作的過程是自動完成的,不需要CPU的參與。
3、51單片機中的定時器/計數器是根據機器內部的時鍾或者是外部的脈沖信號對寄存器中的數據加1。
4、有了定時器/計數器之後,可以增加單片機的效率,一些簡單的重復加1的工作可以交給定時器/計數器處理。CPU轉而處理一些復雜的事情。同時可以實現精確定時作用。
與定時器/計數器有關的寄存器:
1、TMOD寄存器
2、TCON寄存器
3、IE寄存器
4、THx/TL寄存器
工作方式寄存器TMOD:
工作方式寄存器TMOD用於設置定時/計數器的工作方式,低四位用於T0,高四位用於T1。其格式如下:
M1M0:工作方式設置位。定時/計數器有四種工作方式。一般我們廳方式1和方式2:
控制寄存器TCON:
TCON的低4位用於控制外部中斷,已在前面介紹。TCON的高4位用於控制定時/計數器的啟動和中斷申請。其格式如下:
TF1(TCON.7):T1溢出中斷請求標志位。T1計數溢出時由硬體自動置TF1為1。CPU響應中斷後TF1由硬體自動清0。T1工作時,CPU可隨時查詢TF1的狀態。所以,TF1可用作查詢測試的標志。TF1也可以用軟體置1或清0,同硬體置1或清0的效果一樣。
TR1(TCON.6):T1運行控制位。TR1置1時,T1開始工作;TR1置0時,T1停止工作。TR1由軟體置1或清0。所以,用軟體可控制定時/計數器的啟動與停止。
TF0(TCON.5):T0溢出中斷請求標志位,其功能與TF1類同。
TR0(TCON.4):T0運行控制位,其功能與TR1類同。
IE中斷開關寄存器:
用於開啟cpu中斷和對應的中斷位。
THx和TL定時/計數存儲寄存器:
THx存儲高8位數據,TLx存儲低8位數據。
定時器/計算器初值計數公式:
計數個數與計數初值的關系為:X=2^n-N
N是需要計數的值;n與設置定時器/計數器的工作方式有關(可能為8、13、16);X是需要設置在THx和TLx的初值。
使用定時器/計算器的初始化流程:
1、對TMOD賦值,以確定T0和T1的工作方式。
2、計算初值,並將其寫入TH0、TL0或TH1、TL1。
3、中斷方式選擇,則對EA賦值,開放定時器中斷。
4、使TR0或TR1置位,啟動定時/計數器定時或計數。
⑺ MCS—51單片機定時/計數器實驗 編程 求程序
按照圖示,應該用P1.7向T1送入計數脈沖
送去4000個,即達到了1s
下列程序,在PROTEUS中模擬通過
;---------------------------------
ORG
0000H
JMP
START
ORG
000BH
JMP
T0_INT
ORG
001BH
JMP
T1_INT
ORG
0030H
START:MOV
SP,#60H
MOV
TMOD,#52H
;T1計數方式1;
T0定時方式2
MOV
TH0,
#(256-250)
;T0定時250us@12MHz
MOV
TL0,
#(256-250)
;
SETB
TR0;
MOV
TH1,
#(65536-4000)
/
256
;T1計數4000
MOV
TL1,
#(65536-4000)
MOD
256
;即1s
SETB
TR1;
SETB
ET0;
SETB
ET1;
SETB
EA;
MOV
R2,
#3
WAIT:
SJMP
WAIT
;等待中斷
;----------------------------------
T0_INT:
;T0方式2,不用重新送初始值.
CLR
P1.7
;向T1送計數脈沖.
NOP
SETB
P1.7
RETI
;----------------------------------
T1_INT:
;每當收到4000個脈沖,即1s中斷一次.
MOV
TL1,
#(65536-4000)
MOD
256
;重新送入初始值.
MOV
TH1,
#(65536-4000)/256
;T1計數4000
CLR
P1.0
DJNZ
R2,
T1_END
SETB
P1.0
MOV
R2,
#3
T1_END:
RETI
;----------------------------------
END
⑻ 51單片機定時器初始化程序的基本步驟
1.設置工作方式即TMOD的值
2.計算初值寫TH TL的值
3.開啟定時器中斷和總中斷
4.啟動定時器。
⑼ 簡述8051單片機定時計數器編程的基本步驟
設置定時計數器的工作方式。
給定時器賦初始值:THx 和TLx;
允許定時器中斷;
允許全局中斷;
啟動定製器;
中斷函數編寫(這個是目的,定時計數最終要干什麼?)