51微控制器內部定時器/計數器實驗

hi—ljl發表於2020-12-08

51微控制器內部定時器/計數器實驗

一、實驗內容
使用MCS-51內部定時/計數器,定時1秒鐘,CPU運用定時中斷方式,實現每1秒鐘輸出狀態發生一次反轉,即發光管每隔1秒鐘亮一次(P1.7接LED)。
根據實驗內容編寫一個程式,並在實驗儀器上除錯和驗證。
二、模擬圖
在這裡插入圖片描述
三、程式碼
C語言實現:

# include <reg52.h>
# include <intrins.h> 
# define uint unsigned int 
# define uchar unsigned char 

sbit LED=P1^0;
uchar t,temp;
void init();

void main()
{  
   t=0;
   
   init();
   while(1)
   {
	   if(t>=20)
	   { t=0;
		 LED=~LED ;
	   }
   }
	
}
void init()
{
// 定時器1
    TMOD=0x10;//設定定時器1 的工作方式
	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;  
	EA=1;//開總中斷
	ET1=1;//開定時器1 的中斷
	TR1=1;//啟動定時器1;
}
void timr1() interrupt 3
{
	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256; 
	t++;
}

彙編實現:

		TICK    EQU  10000    ; 10000 X 100US = 1S
		T100US  EQU  156      ; 100US時間常數(6M)
		C100US  EQU  30H     ; 100US記數單元
		LEDBUF  BIT  20H
		ORG 0000H
        LJMP START
        ORG 000BH
        LJMP  T0INT
        ORG 0030H

START:  MOV SP,   #60H
        MOV TMOD, #02H        ; 定時器0,方式2 
        MOV TH0, #T100US
        MOV TL0, #T100US
        MOV IE, #10000010B      ; EA=1, IT0 = 1
        SETB TR0               ; 開始定時
        CLR LEDBUF
        CLR P1.0
        MOV C100US, #27H      ;#HIGH(TICK)
        MOV C100US+1, #10H    ;#LOW(TICK)
LOOP:   MOV C, LEDBUF
        MOV P1.0, C
        SJMP LOOP

T0INT:  PUSH PSW
        MOV A, C100US+1
        JNZ GOON
        DEC C100US
GOON:   DEC C100US+1
	    MOV A, C100US
	    ORL A, C100US+1
	    JNZ EXIT             ; 100US 記數器不為0, 返回
	    MOV C100US, #27H     ; #HIGH(TICK)
	    MOV C100US+1, #10H   ; #LOW(TICK)
	    CPL LEDBUF          ; 100US 記數器為0, 重置記數器,取反LED
EXIT:   POP PSW
        RETI
        END

相關文章