定时器来输出波形是一种比较简单且准确的方式。但是即便是程序比较简单也依然会存在相应的问题。本次实验代码将主要以代码注释的形式来辅助理解。
要求:
使用定时器T0,采用方式2定时,在P1.0脚输出周期为400μs,占空比为4:1的矩形脉冲,要求在P1.0脚接有虚拟示波器,观察P1.0脚输出的矩形脉冲波形。
(默认晶振频率为12MHz)
知识补充:
1.
根据所要设定的时间,计算设置引脚的初值应该采用如下公式
t
=
(
2
n
−
X
)
12
f
t=(2^{n}-X) {12\over f}
t=(2n−X)f12
公式当中t代表要设置的定时时间,X代表初值,n代表你所用的方式当中对应的位数,f代表晶振(crystal oscillator)的频率一般设定为12.
补充:
方式0:n=13
方式1:n=16
方式2:n=8
2. 1 μ s = 1 × 1 0 − 6 s = 1 × 1 0 − 3 m s 1μs = 1 \times 10^{-6}s=1 \times 10^{-3}ms 1μs=1×10−6s=1×10−3ms
3.
有了周期的计算方式,我们要了解一下什么是占空比,占空比4:1的意思实际上就是高电平与低电平在一个周期内所占时间的比值。也就是说,一共有400μs那么320μs是高电平,80μs为低电平。
思路分析
这里要做的实际上就是一个简单的计时任务,但是表面上看存在的问题是方式二最大可以计时256μs而要求的是400μs,高电平的时间是320μs,是大于它的,无法计时。但是如果我们想深入一点,从中断的角度考虑,我们可以在中断以后对于现在周期的属性进行一个判断。从而得到答案。以此题为例,我们的计时周期设定为80μs,前四次进入中断我让它是高电平,第五次就让它是低电平就可以了。既然这样想到了,基本就解决了这道题。代码如下:
#include <reg51.h>
char t=0;//用于记录次数
sbit P1_0=P1^0;//P1的0口
void main(void)
{
TMOD=0x02;
TH0=0xb0;
TL0=0xb0;
P1_0=0;
EA=1;
ET0=1;
TR0=1;
while(1);//在此死循环等待中断
}
void timer1() interrupt 1//中断程序1意味着T0中断
{
//由于本题的中断时间是1:4所以单纯的去翻
t+=1;
P1_0=1;
if(t>=4)//不要仅凭眼睛看那个蓝灯不闪就说明错误,实际上频率过快,肉眼无法分辨
{
t=0;
TL0=0xb0;
P1_0=0;
}
else
{
TL0=0xb0;
}
}
要说明的是这里的0xb0也可以直接写作对应的十进制就是176.
利用proteus进行仿真,如果不知道如何将二者进行连接的话,可以查看如下连接讲述了两个软件的连接。
点我查看
Proteus电路图
元件名称:
接地:ground
电容:capacitor
电阻:RES
开关:BUTTON
示波器:下图红箭头位置第一个
晶振:CRYSTAL
点击运行后右击示波器选择最下面的选项(Digital Oscillorscope)即可查看波形
波形如下:
要注意的是右下角的第一个旋转开关是可以调节每个小方格的周期长度的。我设置的是0.4μs也就是400ms