基于STC15单片机的频率计及方波发生器设计Word下载.docx
《基于STC15单片机的频率计及方波发生器设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于STC15单片机的频率计及方波发生器设计Word下载.docx(30页珍藏版)》请在冰豆网上搜索。
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.通过不同按键实现频率的粗调和微调。
可通过不同按键实现频率的粗调和微调
发挥部分
频率计测量围上限为8MHz
能完成500Hz以的测量功能
未完成
自行发挥部分
1.方波发生器可调占空比输出,调节围为5%~100%
完成,通过按键调节
2.方波发生器和频率计可同时运行
完成,通过按键切换
十一、心得与体会
十二、参考资料
十三、附录:
附录一:
源程序
Main主函数:
#include"
STC15Fxxxx.H"
global.h"
measure.h"
pwm.h"
key.h"
delay.h"
Digital.h"
voidmain()
{
while
(1)
{
PWM_Work();
//打开测量功能函数
}
}
按键扫描函数
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;
数码管显示相关函数:
digital.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;
P0=LedBuff[1];
case2:
P2=0x04;
P0=LedBuff[2];
case3:
P2=0x08;
P0=LedBuff[3];
case4:
P2=0x10;
P0=LedBuff[4];
case5:
P2=0x20;
P0=LedBuff[5];
case6:
P2=0x40;
P0=LedBuff[6];
case7:
P2=0x80;
i=0;
P0=LedBuff[7];
default:
PWM发生器函数:
intrins.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