基于STC15单片机的频率计及方波发生器设计.docx
《基于STC15单片机的频率计及方波发生器设计.docx》由会员分享,可在线阅读,更多相关《基于STC15单片机的频率计及方波发生器设计.docx(30页珍藏版)》请在冰豆网上搜索。
基于STC15单片机的频率计及方波发生器设计
课程设计论文
课题:
基于STC15单片机的频率计及方波发生器设计
基于STC15单片机的频率计及方波发生器设计
基于STC15单片机的频率计及方波发生器设计
一、设计要求
一)基础部分
1.数字频率计设计要求:
1)被测信号为正弦波或方波,频率围为1Hz~5MHz;
2)测量相对误差的绝对值不大于百分之一;
3)门限电压2V-5V;
4)测量数据刷新时间不大于2s,测量结果稳定。
2.方波发生器设计要求:
1)方波发生器可以分为低频和高频2个端口产生,频率围1Hz-6MHz;
2)通过不同按键实现频率的粗调和微调。
二)发挥部分
1.频率计围为大于5MHz;
2.测量相对误差的绝对值不大于千分之一;
3.增加脉冲信号占空比的测量功能。
二、课程设计的意义与目的
1.在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要。
2.在通信技术中,波形的发生和频率的控制是最基本的要求,也是通信技术的基础,因此设计波形的发生与控制器就显得尤为重要。
3.单片机数字频率计与可调方波发生器,具有可靠性高、体积小、价格低、功能全,广泛应用与各种职能仪器中,能使在测量过程的控制中达到自动化,省掉很多繁琐的人工操作,同时也提高了测试精度。
4.其次,课程设计以学生自主学习为主,是课堂容的扩展和延伸,巩固前序教学容,提升学生设计能力,使学生掌握小规模单片机系统的软硬件设计,培养学生的自主学习能力,自主学习掌握单片机相关的新知识,自主解决问题的能力。
三、方案设计
单片机数字频率计与可调方波发生器程序设计流程图
四、硬件设计原理图:
五、硬件设计实物图:
六、程序框架:
USER:
用户区main
Driver:
驱动区keypwmdigital(数码管)
Apply:
应用区measure(测量)
Sys:
系统区globaldelayusart
七、功能说明:
开机后默认进入方波发生器状态,输出引脚为P3.7,此时K2切换粗调细调,K4,K4分别为粗调和细调模式下的增加、减少频率按钮;
按下K1,此时切换为频率计测量,P3.4为测量输入口,注意和测量信号之间的共地。
测量围为1Hz-8MHz,精度误差稳定达到千分之一,附误差分析。
可以用P3.7产生方波给P3.4测量,两个函数从机器上电开始就一直运行,互不干扰。
八、测量:
低频测量:
高频测量:
九、误差分析:
第一次误差分析:
小结:
频率计可以突破5M,平均误差为千分之二。
第二次误差分析:
由于不能稳定达到千分之一的测量设计误差值,并且从上图的测试表中得到误差满足线性关系,因此加入补偿值,第二次误差测试如下:
由上图可知,低频、中频、高频部分误差分别万分之五、万分之一、万分之二,整体平均误差为0.00030759,即万分之三,大幅度超过课程设计要求的误差值。
十:
实现功能情况表:
数字频率计设计要求
课程设计要求
实现情况
结论
1.被测信号为正弦波或方波,频率围为1Hz~5MHz;
频率测量围为1Hz~8MHz
完成,并且大幅度超过设计要求
2.测量相对误差的绝对值不大于百分之一;
测量相对误差的绝对值为万分之三
完成,并且大幅度超过设计要求
3.门限电压2V-5V;
门限电压2V-5V
完成
4.测量数据刷新时间不大于2s,测量结果稳定;
测量数据刷新时间为1s,测量结果稳定
完成,并且大幅度超过设计要求
方波发生器设计要求
课程设计要求
实现情况
结论
1.方波发生器可以分为低频和高频2个端口产生,频率围1Hz-6MHz;
方波发生器可以产生70Hz~8MHz频率围的方波
完成,基本满足设计要求
2.通过不同按键实现频率的粗调和微调。
可通过不同按键实现频率的粗调和微调
完成
发挥部分
课程设计要求
实现情况
结论
1.频率计围为大于5MHz;
频率计测量围上限为8MHz
完成
2.测量相对误差的绝对值不大于千分之一;
测量相对误差的绝对值为万分之三
完成,并且大幅度超过设计要求
3.增加脉冲信号占空比的测量功能。
能完成500Hz以的测量功能
未完成
自行发挥部分
1.方波发生器可调占空比输出,调节围为5%~100%
完成,通过按键调节
2.方波发生器和频率计可同时运行
完成,通过按键切换
十一、心得与体会
十二、参考资料
十三、附录:
附录一:
源程序
Main主函数:
#include"STC15Fxxxx.H"
#include"global.h"
#include"measure.h"
#include"pwm.h"
#include"key.h"
#include"delay.h"
#include"Digital.h"
voidmain()
{
while
(1)
{
PWM_Work();//打开测量功能函数
}
}
按键扫描函数
#include"global.h"
#include"delay.h"
#include"key.h"
UINT8KEY_Scan(UINT8mode)
{
staticUINT8key_up=1;//按键按松开标志
if(mode)key_up=1;//支持连按mode=1的时候连按,mode=0时不支持连按
if(key_up&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))
{
Delay10ms();//去抖动
key_up=0;
if(KEY1==0){while(!
KEY1);returnKEY1_PRES;}//当key1按下,返回KEY1_PRES的值
elseif(KEY2==0){while(!
KEY2);returnKEY2_PRES;}//当key2按下,返回KEY2_PRES的值
elseif(KEY3==0){while(!
KEY3);returnKEY3_PRES;}//当key3按下,返回KEY3_PRES的值
elseif(KEY4==0){while(!
KEY4);returnKEY4_PRES;}//当key4按下,返回KEY4_PRES的值
}elseif(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)key_up=1;
return0;
}
数码管显示相关函数:
#include"global.h"
#include"digital.h"
#include"STC15Fxxxx.H"
UINT8codeLedChar[]={//段码
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};
UINT8LedBuff[8]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF//数码管显示缓存区
};
voidDigital_Init()
{
P0M0=P0M1=P1M0=P1M1=P2M0=P2M1=P3M0=P3M1=0;//配置IO口模式
Timer2Init();//定时器2初始化
IE2|=0x04;//开启定时器2中断
EA=1;//开启总中断
}
voidDigital_New(UINT32num)//数码管显示数值的更新函数
{
LedBuff[0]=LedChar[num%10];
LedBuff[1]=LedChar[num/10%10];
LedBuff[2]=LedChar[num/100%10];
LedBuff[3]=LedChar[num/1000%10];
LedBuff[4]=LedChar[num/10000%10];
LedBuff[5]=LedChar[num/100000%10];
LedBuff[6]=LedChar[num/1000000%10];
LedBuff[7]=LedChar[num/10000000%10];
}
voidTimer2Init(void)//1毫秒33.1776MHz
{
AUXR&=0xFB;//定时器时钟12T模式
T2L=0x33;//设置定时初值
T2H=0xF5;//设置定时初值
AUXR|=0x10;//定时器2开始计时
}
voidInterruptTime2()interrupt12//数码管显示的更新
{
staticUINT8i=0;
P0=0xFF;//关闭残影
switch(i)
{//动态扫描显示
case0:
P2=0x01;i++;P0=LedBuff[0];break;
case1:
P2=0x02;i++;P0=LedBuff[1];break;
case2:
P2=0x04;i++;P0=LedBuff[2];break;
case3:
P2=0x08;i++;P0=LedBuff[3];break;
case4:
P2=0x10;i++;P0=LedBuff[4];break;
case5:
P2=0x20;i++;P0=LedBuff[5];break;
case6:
P2=0x40;i++;P0=LedBuff[6];break;
case7:
P2=0x80;i=0;P0=LedBuff[7];break;
default:
break;
}
}
PWM发生器函数:
#include"global.h"
#include"STC15Fxxxx.H"
#include"pwm.h"
#include"key.h"
#include"digital.h"
#include"intrins.h"
#include"measure.h"
#include"delay.h"
voidDigital_Init(void);
voidDigital_New(UINT32num);
sbitBELL=P4^5;
#defineTick0.08179L//时间片长度
#defineLTick0.30864L//16分频后的时间片长度
#definestepH5000//粗调步进值
#definestepL100//细调步进值
#definestepD5//占空比步进值
doublefreq=50000;//PWM波频率
UINT32Duty=50;//定义占空比50%
//计算,根据PWM频率计算出15位增强型PWM发生器装载值
doubleCalculate(doublen)
{
doublei;
BELL=0;
if(n<=150