c语言控制51单片机模拟实验 定时器/计数器、外部中断实验


本实验使用使用c语言在Keil uVision 4软件编程,使用Proteus软件模拟单片机运行,掌握单片机使用定时器、计数器和外部中断的方法。51单片机设置晶振频率为11.0592MHz。将keil生成的.hex程序导入到Proteus的单片机中便可以仿真运行。

实验目的

掌握8051单片机内部定时器/计数器、外部中断的使用方法。

实验内容

1、定时器

任务
按电路原理图接线,P1.1接一个LED灯(输出0时灯亮,输出1时灯灭),用51单片机内部定时器T0定时,使LED灯亮1秒钟,灭1秒钟,重复循环;
定时实验原理图
在Proteus软件中进行连接。
在这里插入图片描述

编写程序如下

#include<reg51.h>
char i=100;
sbit a=P1^1; //以a替代P1.1口

void main()
{
	TMOD=0x01;  //设置工作方式,开启定时器
	TH0=0xdc; 
	TL0=0x00; //TH0和TL0用于确定时长,此处设置为10ms
	a=0;     
	EA=1; //允许中断
	ET0=1;//T0中断
	TR0=1;//启动T0
	while(1);
}

void timer0() interrupt 1  //中断函数,定时器运行到TH0时中断,开始运行此部分程序
{
	TH0=0xdc;//初始化定时器
	TL0=0x00;
	i--;//10毫秒重复100次为1秒。
	if(i<=0)   //重复100次后,改变灯状态,重置i,继续计时
	{
		a=~a; 
		i=100;
	}
}

该程序最终不会准确的为1秒。因为程序运行的时间会使计时有误差。

2、计数器

任务
按电路原理图接线,设置8051单片机内部计数器1工作于计数模式,按方式2工作,对T1引脚手动输入的单脉冲进行计数,并将计数值从P1口输出在LED灯上显示出来。要求计数器初值为0,即TL1=0x00。
原理图2在Proteus软件中绘制如图所示
在这里插入图片描述

问题
方式二计数中断必须在计满后才能中断,因此TL需为0xff。实验要求无法满足。
因此我使用了两种不同的方法完成该实验,都使用了计数器,但不都使用中断方法。两种方法分别满足使用中断和TL1=0x00的要求。

方法1

方法使用了中断的方法,但是以方式二计数中断必须在计满后才能中断,因此TL需为0xff。
程序如下

#include<reg51.h>
unsigned char A;
void main()
{
	TMOD=0x60;   //开启计数器,设置T1方式2
	TH1=0xff;
	TL1=0xff;//按下即可中断
	EA=1;//允许中断
	ET1=1;//T1中断
	TR1=1;//T1启动
    P1=0x00;
	A=0x00;
	while(1);
} 

void T1_int(void) interrupt 3
{
	A=A++; //A用于计数
	P1=~A;
}

方法2

#include<reg51.h>

void main()
{
	TMOD=0x60;   //T1方式2
	TH1=0x00;
	TL1=0x00;
	TR1=1;
    P1=0x00;
	while(1)
	{
		P1=~TL1;//输出与计数器计数一致
	};
}

外部中断

任务
按电路原理图接线,通过手动向8051单片机的管脚输入单脉冲,
申请中断。每中断一次,P1口依次输出0x55、0xaa、0x55、0xaa……,P1口接8个LED灯,显示结果;
在这里插入图片描述
绘制模拟电路图如下
在这里插入图片描述
程序如下

#include<reg51.h>

void main()
{
	EA=1;//开启中断
	EX0=1;//开启外部中断
	IT0=1;//启动外部中断
	P1=0x55;//设置输出
	while(1);
}		   
void int0() interrupt 0 using 0
{
	EX0=0;
	P1=~P1; 
	EX0=1;
}

这就是本实验的全部内容了
完整代码和仿真程序可点击此处获取.
如果对你有帮助的话,一键三连支持下。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

feiGeorge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值