本实验使用使用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。
在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;
}
这就是本实验的全部内容了
完整代码和仿真程序可点击此处获取.
如果对你有帮助的话,一键三连支持下。