实验目的:
利用定时计数器控制LED灯周期性亮灭
实验器材:
Keil、protues
实验原理(给出硬件电路图):
实验原理:
- 定时器TMOD
2、定时器/计数器的工作方式
3、TF标志位
4、延时时间
5、TR0
实验步骤:
- 绘制protues中的原理图;
- 利用原理写汇编和C语言
程序代码及实验结果(含汇编语言代码和C语言代码):
C语言:
#include <reg52.h>
unsigned char num=0; //全局变量num
sbit led=P0^0;//p0.0口控制led灯
void main()
{
led=0;//led初始为亮
TMOD=0x01; //设置TMOD为0000 0001 ,使定时器工作在工作模式1,工作方式为16位计数器
TH0=(65536-50000)/256;//高四位,计算初值,x为需要的计数次数,定时器/计数器T0为工作方式1,则TH0=(65536-50000)/256;TL0=(65536-50000)%256
//0xFF00(16)=65280(10)
TL0=(65536-50000)%256; //低四位,延时50ms
EA = 1;//打开总中断允许
ET0 = 1;//定时器溢出,定时器T0允许中断,调用T0定时器的中断函数
TR0 =1;//启动T0立即开始计数
while(1)
{
if(num==1) //如果到了1次,说明到了50ms时间
{
led=~led; //让发光管状态取反,亮时转灭,灭时转亮
num=0;
}
}
}
void time()interrupt 1 //调用TO定时器的中断函数
{
TH0=(65536-50000)/256; //中断之后重新装载初值
TL0=(65536-50000)%256;
num++;
}
汇编语言:
ORG 0000H
START: MOV P0,#0xfe ;初始值为亮
MOV TMOD,#01H;设置TMOD为0000 0001 ,使定时器工作在工作模式1,工作方式为16位计数器
;设置初值,设置延时时间
MOV TL0,#0b0H
MOV TH0,#03CH
SETB EA ;打开总中断允许
SETB TR0; 启动T0立即开始计数
LOOP1: JBC TF0, LOOP2 ;判断TF0是否为0.为0则跳转,不为0则为顺序执行,
;TF=0为关闭中断溢出标志位,防止产生中断
SJMP LOOP1; TF不为0时,一直循环,直到TF=0
LOOP2: CPL P0.0;对灯的状态取反
MOV TL0,#0b0H;
MOV TH0,#03CH
SJMP LOOP1;
END