上一章讲了蓝桥杯单片机如何输出PWM波
蓝桥杯单片机(六)PWM
这一章讲解蓝桥杯单片机开发板上的NE555方波发射器的频率测量,这也是近几年的考点。
首先看原理图:
由数电的知识:
NE555的周期T=0.7(Ra+Rb)C
频率f=1/T
图中R8为定值电阻,所以NE555的斜率主要由Rb3这个滑动变阻器决定。图中NE555的PWM波输出引脚为NET SIG,所以测量只需要将单片机随便一个GPIO与NET SIG相连,然后向按键扫描那样读取高低电平就行了。
由于比赛通常用超声波跳线帽来连接P34和NET SIG引脚,所以本次例程同样如此。
首先来看测量程序:
unsigned int high=0,low=0,highdata=0,lowdata=0;
void time0() interrupt 1
{
if(P34==1)
{
high++;
if(low !=0)
{
lowdata=low;
low=0;
}
}
else if(P34==0)
{
low++;
if(high !=0)
{
highdata=high;
high=0;
}
}
}
void Timer0Init(void) //20微秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x23; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
让定时器每20us进行测量P34口的电平,然后将对应的高低电平的时间保存起来,然后就可以计算周期和频率了。
计算公式:
**
高电平加低电平次数乘以20us就是周期
**
time=(1000000/((highdata+lowdata)*20));
当然定时器的时间越短越精确。
实验内容:使用P34引脚测量PWM频率,使用数码管显示出来。
代码如下:
#include<stc15f2k60s2.h>
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
void SMG_output(void);
void init(void);
void Delay1ms(void);
void Timer0Init(void);
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar SMG[8]={10,10,10,10,10,10,10,10};//初始显示10,全息数码管
uint high=0,low=0,highdata=0,lowdata=0;
uint time;
void main(void)
{
init();
Timer0Init();
EA=1;ET0=1;
while(1)
{
time=(1000000/((highdata+lowdata)*20));
SMG[3]=time/10000;
SMG[4]=time%10000/1000;
SMG[5]=time%1000/100;
SMG[6]=time%100/10;
SMG[7]=time%10;
SMG_output();
}
}
void time0() interrupt 1
{
if(P34==1)
{
high++;
if(low !=0)
{
lowdata=low;
low=0;
}
}
else if(P34==0)
{
low++;
if(high !=0)
{
highdata=high;
high=0;
}
}
}
void SMG_output(void)
{
uchar i;
for(i=0;i<8;i++)
{
P2=(P2&0X1F)|0Xc0;
P0=(1<<i);
P2=(P2&0X1F)|0Xe0;
P0=tab[SMG[i]];
Delay1ms();
}
P2=(P2&0X1F)|0Xc0;
P0=0Xff;
P2=(P2&0X1F)|0Xe0;
P0=0Xff;
}
void Timer0Init(void) //20微秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x23; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void init(void)
{
P2=(P2&0X1F)|0XA0;
P0=0X00;
P2=(P2&0X1F)|0X80;
P0=0Xff;
P2=(P2&0X1F)|0Xc0;
P0=0Xff;
P2=(P2&0X1F)|0Xe0;
P0=0Xff;
}
void Delay1ms(void) //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
最后效果如下:
调节滑动变阻器,频率发生改变。