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
评论(0)
您还未登录,请登录后发表或查看评论