实验(六):定时器实验

一、实验目的与任务

        实验目的:

                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,参考图一。

实验(六):定时器实验_第1张图片 图一 原理图实例

        2.设置单片机属性,将其晶振频率设置为12MHz,载入KEIL生成的文件esimlab6.hex。

        3.运行仿真并观察结果。

四、实验报告

main.c

#include 

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 都具有定时器和计数器两种工作模式,不论是工作在定时器模式还是计数器模式,实质都是对脉冲信号进行计数,只不过是计数信号的来源不同。计数器模式是对加在T0P3.4)和T1P3.5)两个引脚上的外部脉冲进行计数;而定时器模式是对单片机的系统时钟信号经片内12分频后的内部脉冲信号(脉冲信号周期=机器周期)计数。由于系统时钟频率是定值,所以可根据计数值计算出准确的定时时间。两个定时器/计数器属于增1计数器,即每对一个脉冲计数,则计数器赠1 

你可能感兴趣的:(单片机,单片机,嵌入式硬件,开发语言,proteus)