一、实验项目:
定时计数器控制系统设计
二、实验目的:
本系统设计的目的是使学生掌握单片机的定时器技术。深刻理解单片机定时计数器系统的功能和运行原理,掌握单片机软硬件系统开发的技巧。具体要求用单片机的定时计数器0控制外接LED的闪烁,同时会灵活调节闪烁频率。要求在Proteus中设计出仿真硬件电路,在keil uvision中分别设计出汇编语言和C语言的源程序,然后用Proteus来进行整体系统仿真运行。
三、实验原理:
实验主要涉及单片机的定时器技术。单片机的定时器是一个重要的外设,可以用来计算时间,产生周期性的中断信号,实现精确定时等功能。定时器由定时器计数器、控制寄存器、预分频器等组成。
在本实验中,我们使用单片机的定时计数器0来控制外接LED的闪烁。定时计数器0的工作原理是通过定时器计数器来计数,当计数值达到设定值时,就会产生中断信号,通过中断处理程序来控制LED的亮灭。
具体的实现步骤如下:
1. 初始化定时器0,设置计数器初值、计数器自动重载值和预分频器值。
2. 启动定时器0,开始计数。
3. 等待定时器0计数器的值达到设定值,产生中断信号。
4. 中断处理程序中改变LED的状态,实现LED的闪烁效果。
5. 回到主程序,等待下一次中断信号的产生。
通过这样的实现方式,就可以控制外接LED的闪烁,并且可以灵活调节闪烁频率。同时,也可以通过设计不同的定时器计数器初值、计数器自动重载值和预分频器值来实现不同的闪烁频率。
四、硬件电路图:
五、C语言代码:
#include <reg51.h> //包含51单片机的头文件,用于定义AT89C51单片机的寄存器和端口
#define uchar unsigned char //定义两个无符号的字符型和整数型常量
#define uint unsigned int //uchar代表unsigned char,uint代表unsigned int
sbit led = P0^0; //选择引脚P0.0
uchar number = 0; //初始化number为0
void main()
{
TMOD = 0x00; //T0工作方式设置为0
TH0 = (8192-5000)/32; //5ms定时,设定初值
TL0 = (8192-5000)%32;
IE = 0x82; //允许T0中断
TR0 = 1; //启动T0定时器
while(1); //进入无限循环
}
void led_zhongduan() interrupt 1
{
TH0 = (8192-5000)/32; // 回复初值
TL0 = (8192-5000)%32;
number++; //number自增1
if(number == 200) //当number达到200时,间隔时间5ms*200=1s,将led状态取反,number重置为0
{ //1s开关一次led
led = ~led;
number=0;
}
}
六、汇编代码:
ORG 0000H
LJMP START ;转主程序
ORG 000BH ;T0的中断服务程序入口
LJMP TIME
ORG 0030H
START:MOV SP,#60H ; 设置堆栈的指针
MOV P0,#0FEH ; 关led
MOV R1,#00H ;软件计数器清零
MOV TMOD,#01H ;T0采用工作方式1
MOV TH0,#3CH ;设置初始值:2^16-50ms/1μs=65536-50000=15536=3CB0H
MOV TL0,#0B0H
SETB EA ; 开总中断允许
SETB ET0 ; 开T0中断允许
SETB TR0 ; 启动T0
LOOP:
AJMP LOOP ;循环等待
TIME:
PUSH PSW ;将PSW压入堆栈保护
INC R1 ;软件计数器加1
CJNE R1,#20,TIME_JMP
;软件计数器中的值是否为20,若是,继续执行,P0.0取反
;否则,转TIME_JMP。软件计数器定时50μm二十次 ,时间间隔20*50=1s
CPL P0.0 ;P0.0取反
MOV R1,#00H ;清空软件计数器
TIME_JMP:
MOV TH0,#3CH ; 重置计数器初值
MOV TL0,#0B0H
SETB TR0
POP PSW ; 恢复PSW
RETI ;中断返回
END