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