一、实验目的与任务
实验目的:
1.掌握定时/计数器的中断法工作原理;
2.熟悉C51编程与调试方法。
任务:
1. 运行Keil开发环境,完成定时器软件编程;
2. 建立Proteus仿真模型;
3.完成系统仿真与调试。
二、实验内容
1. 利用片内定时器/计数器进行定时,定时间隔3s;
2. 选择I/O口接入发光二极管;
3. 使用AT89S51单片机的定时器/计数器T1控制LED每隔3秒点亮一次(即亮3秒,灭3秒,如此反复)。
三、实验内容
(1)软件实现:
实验步骤:
1.运行Keil uVision5 开发环境,按照“模块化单片机教学实验平台配套的实验指导书1.2.3 节”介绍的方法建立程esimlab6. uvproj,CPU 为AT89S51,包含启动文件STARTUP.A51。
2.输入源程序,在Keil uVision5 开发环境中,建立源程序esimlab6.c,将上述程序加入该程序文件。并将该文件加入工程esimlab6.uvproj。
3.设置工程esimlab6. uvproj 属性,将其晶振频率设置为12MHz,选择输出可执行文件(HEX 文件),仿真方式为“Use Simulator”。
4.构造(Build)工程esimlab6.uvproj。如果输入有误进行修改,直至构造正确,生成可执行程序 esimlab6.hex 为止。
(2)Proteus仿真:
实验步骤:
1.运行Proteus 开发环境,建立工程,新建原理图设计文件esimlab6. Pdsprj,参考图一。
图一 原理图实例
2.设置单片机属性,将其晶振频率设置为12MHz,载入KEIL生成的文件esimlab6.hex。
3.运行仿真并观察结果。
四、实验报告
main.c
#include <REGX51.H>
void Timer1_Init(void); //中断初始化函数
void main(){
Timer1_Init();//中断初始化
P1_5 = 0;
while(1){
}
}
void Timer1_Init(void) //1毫秒@12.000MHz
{
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
TL1 = 0x18; //设置定时初值
TH1 = 0xFC; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1;
EA = 1; //中断总允许
PT1 = 0;
}
void Timer1_Routine() interrupt 3 //定时器1中断函数
{
static unsigned int count1 = 0;
TL1 = 0x18; //设置定时初值
TH1 = 0xFC; //设置定时初值
count1++;
if(count1 == 3000){ //每三秒转换一次状态
count1 = 0;
P1_5 = ~P1_5;
}
}
TO、T1 都具有定时器和计数器两种工作模式,不论是工作在定时器模式还是计数器模式,实质都是对脉冲信号进行计数,只不过是计数信号的来源不同。计数器模式是对加在T0(P3.4)和T1(P3.5)两个引脚上的外部脉冲进行计数;而定时器模式是对单片机的系统时钟信号经片内12分频后的内部脉冲信号(脉冲信号周期=机器周期)计数。由于系统时钟频率是定值,所以可根据计数值计算出准确的定时时间。两个定时器/计数器属于增1计数器,即每对一个脉冲计数,则计数器赠1。