基于STC15单片机的频率计及方波发生器设计_第1页
基于STC15单片机的频率计及方波发生器设计_第2页
基于STC15单片机的频率计及方波发生器设计_第3页
基于STC15单片机的频率计及方波发生器设计_第4页
基于STC15单片机的频率计及方波发生器设计_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

..学习.资料.课程设计论文课题:基于STC15单片机的频率计及方波发生器设计目录基于STC15单片机的频率计及方波发生器设计TOC\o"1-5"\h\z一、设计要求 2一)基础部分 2二)发挥部分 3二、课程设计的意义与目的 3三、方案设计 4单片机数字频率计与可调方波发生器程序设计流程图 4\o"CurrentDocument"四、硬件设计原理图: 6\o"CurrentDocument"五、硬件设计实物图: 6\o"CurrentDocument"六、程序框架: 7\o"CurrentDocument"七、功能说明: 7\o"CurrentDocument"八、测量: 8低频测量: 8高频测量: 8九、误差分析: 9\o"CurrentDocument"第一次误差分析: 9第二次误差分析: 9\o"CurrentDocument"十:实现功能情况表: 10\o"CurrentDocument"十一、心得与体会 11\o"CurrentDocument"十二、参考资料 11十三、附录: 11\o"CurrentDocument"Main主函数: 11按键扫描函数 12数码管显示相关函数: 12\o"CurrentDocument"PWM发生器函数: 14频率计测量功能相关函数: 20延时函数: 26基于STC15单片机的频率计及方波发生器设计一、设计要求一)基础部分数字频率计设计要求:1)被测信号为正弦波或方波,频率围为1Hz〜5MHz;2)测量相对误差的绝对值不大于百分之一;3)门限电压2V-5V;4)测量数据刷新时间不大于2s,测量结果稳定。方波发生器设计要求:1)方波发生器可以分为低频和高频2个端口产生,频率围1Hz-6MHz;2)通过不同按键实现频率的粗调和微调。二)发挥部分频率计围为大于5MHz;测量相对误差的绝对值不大于千分之一;增加脉冲信号占空比的测量功能。二、课程设计的意义与目的.在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要。.在通信技术中,波形的发生和频率的控制是最基本的要求,也是通信技术的基础,因此设计波形的发生与控制器就显得尤为重要。.单片机数字频率计与可调方波发生器,具有可靠性高、体积小、价格低、功能全,广泛应用与各种职能仪器中,能使在测量过程的控制中达到自动化,省掉很多繁琐的人工操作,同时也提高了测试精度。.其次,课程设计以学生自主学习为主,是课堂容的扩展和延伸,巩固前序教学容,提升学生设计能力,使学生掌握小规模单片机系统的软硬件设计,培养学生的自主学习能力,自主学习掌握单片机相关的新知识,自主解决问题的能力。三、方案设计单片机数字频率计与可调方波发生器程序设计流程图..学习.资料.四、硬件设计原理图:P。口E立排阻蜂呜器模块8个数码管模块CH3如串口通信模块五、硬件设计实物图:io5WIEWSSB&L曰*1-«20lFI(bll六、程序框架:Project ▼4xTarget1日Target1日…ruserl由“阂maimxz日…rDriver|,“国key.c:电…理pwm.c:由…因Digital.c日-豳Apply由…国massure.c白…、sys;・…口global.h日…用delay.c…目intriris.hj…@delay.h;…目global.h由…因usart.c国内…⑨ {>n*USER:用户区mainDriver:耳驱动区Driver:耳驱动区keypwmdigital(数码管)Apply:应用区 measure(测量)Sys:系统区Sys:系统区globaldelayusart七、功能说明:开机后默认进入方波发生器状态,输出引脚为P3.7,此时K2切换粗调细调,K4,K4分别为粗调和细调模式下的增加、减少频率按钮;按下K1,此时切换为频率计测量,P3.4为测量输入口,注意和测量信号之间的共地。测量围为1Hz-8MHz,精度误差稳定达到千分之一,附误差分析。可以用P3.7产生方波给P3.4测量,两个函数从机器上电开始就一直运行,互不干扰。八、测量:低频测量:高频测量:REMOVEundoAutosetModeFitScreenACPriorily九、误差分析:第一次误差分析:ABCDEG输入值实测值1天差输入值实测值、口昧差5004990.00210000009977000.00237006980.002857150000014963710.0024199008980.002222200000019950100.0024951100109S0.001818250000024941400.002344130012970.00230830000002992S420.002386150014960.002667350000034915000.002429170016960.002353400000039990000.00025190018950.002632450000044888300.002482210020950.002381500000049873230.002535230022940.002609550000054864240.002468低频平均误差"0.002385600000059848720.00252150000498800.0024650000064S3S950.002478100000997550.00245700000069S17620.0026051500001496240.002507750000074813170.0024912000001995120.00244800000079791160.0026112500002493620.002552高频平均误差0.0023213000002992830.002393500003491450.0024434000003990020.0024954500004489060.0024315000004987660.002468中频平均误差0.002458小结:频率计可以突破5乂,平均误差为千分之二。第二次误差分析:由于不能稳定达到千分之一的测量设计误差值,并且从上图的测试表中得到误差满足线性关系,因此加入补偿值,第二次误差测试如下:

输入靖实恻值真差值输入值宴物」值误差值5004990.002100000D9999000.000110009990.0011&OOOOD14997370.OOOL75150015000200000019996100.000195200019990.0005250000D24996520.000139250024990.0004300000029gg5750.000103300029990.000333333350000034994100.000169350034990.000285714400000D39991620.000214000399S0.0005450000D44987310.Q002S245004498D.000444444500000D49987340.000253500049990.0002550000D54985470.000264低频平均误差0.000566349600000059932400.00029350000499930.00014650000D64977470.000347LOODOO999910.00009700000D69972870.000388L50DOO1499920.00005333750000074976650.000311200000199976D.00012000800000D79961380.00048325000024997SD.00008000高频平均误差0.0002483000002999740.000086673500003499910.00002571400000399988D.00003000450000449SS90.00024667500000499898D.00020400中频平均误差0.000103433由上图可知,低频、中频、高频部分误差分别万分之五、万分之一、万分之二,整体平均误差为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;}elseif(KEY2==0){while(!KEY2);returnKEY2_PRES;}elseif(KEY3==0){while(!KEY3);returnKEY3_PRES; }elseif(KEY4==0){while(!KEY4);returnKEY4_PRES; }〃当keyl按下,返回KEY1.〃当key2按下,返回KEY2.〃当key3按下,返回KEY3.〃当key4按下,返回KEY4.PRES的值PRES的值PRES的值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口模式//定时器2//定时器2初始化//开启定时器2中断//开启总中断//数码管显示数值的更新函数IE2|=0x04;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;P2=0x02;i++;P0=LedBuff[1];break;P2=0x04;i++;P0=LedBuff[2];break;P2=0x08;i++;P0=LedBuff[3];break;P2=0x10;i++;P0=LedBuff[4];break;P2=0x20;i++;P0=LedBuff[5];break;P2=0x40;i++;P0=LedBuff[6];break;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=P4A5;#defineTick0.08179L//时间片长度#defineLTick0.30864L//16分频后的时间片长度#definestepH5000//粗调步进值#definestepL100//细调步进值#definestepD5//占空比步进值doublefreq=50000;//PWM波频率UINT32Duty=50;//定义占空比50%〃计算,根据PWM频率计算出15位增强型PWM发生器装载值doubleCalculate(doublen){doublei;BELL=0;if(n<=1500){(1/n)/Tick得出装载值i=(1/n)/LTick; //(1/n)(1/n)/Tick得出装载值if(n<=70){n=70;freq=70;BELL=1;Delay100ms();BELL=0;i=(1/n)/LTick; 〃(1/n)算出相应频率的周期,(1/n)/Tick得出装载值returni;}returni;}elseif(n>=8000000) //上限{n=8000000;freq=8000000;BELL=1;Delay100ms();BELL=0;}i=(1/n)/Tick; 〃(1/n)算出相应频率的周期,(1/n)/Tick得出装载值returni;}voidPWM_Init(UINT32fre){doubletempi; //Calculate返回给tempi赋值给PWMC寄存器freq=fre;tempi=Calculate(freq);P3M0=P3M1=0x00; 〃要输出PWM波形的引脚要配置为准双向或者强推挽输出,这里设置为准双向输出P4Mi=0x00;P4M0=0x20;PIN_SW2|=0x80; 〃使能访问XSFRPWMCFG=0x00; 〃配置PWM的输出初始电平为低电平if(fre>i500){PWMCKS=0x00; 〃选择PWM的时钟为Fosc/(0+1)}elseif(fre<=i500){PWMCKS=0x0F;}PWMC=tempi; 〃设置PWM周期PWM2T1=0x0000; 〃设置PWM2第1次反转的PWM计数PWM2T2=temp1*Duty/100; 〃设置PWM2第2次反转的PWM计数〃占空比为(PWM2T2-PWM2T1)/PWMCPWM2CR=0x00; 〃选择PWM2输出到P3.7,不使能PWM2中断PWMCR=0x01; 〃使能PWM信号输出PWMCR|=0x80; 〃使能PWM模块〃关闭访问〃关闭访问XSFR//功能大体同上,为粗调细调改变频率时使用PIN_SW2&=~0x80;}voidPWM_Adjust(UINT32fre,UINT8duty){doubletemp2;if(fre<=1500){doubletemp2;freq=fre;temp2=Calculate(fre);PIN_SW2|=0x80;PWMCR=0x00;_nop_();_nop_();PWMCKS=0x0F;PWMC=temp2;PWM2T1=0x0000;PWM2T2=temp2*duty/100;PWMCR=0x01;PWMCR|=0x80;PIN_SW2&=~0x80;}elseif(fre>1500){freq=fre;temp2=Calculate(fre);PIN_SW2|=0x80;PWMCR=0x00;_nop_();_nop_();PWMCKS=0x00;PWMC=temp2;PWM2T1=0x0000;PWM2T2=temp2*duty/100;PWMCR=0x01;PWMCR|=0x80;PIN_SW2&=~0x80;〃使能访问XSFR//关闭模块〃选择PWM的时钟为Fosc/(0+1)〃设置PWM周期〃设置PWM2第1次反转的PWM计数〃设置PWM2第2次反转的PWM计数//占空比为(PWM2T2-PWM2T1)/PWMC〃使能PWM信号输出〃使能PWM模块〃使能访问XSFR//关闭模块〃选择PWM的时钟为Fosc/(0+1)〃设置PWM周期〃设置PWM2第1次反转的PWM计数〃设置PWM2第2次反转的PWM计数//占空比为(PWM2T2-PWM2T1)/PWMC〃使能PWM信号输出〃使能PWM模块}}..学习.资料.UINT8PWM_KeyConl(){staticUINT8k=0,swch=0;UINT8key_value;key_value=KEY_Scan(0);if(key_value==1){//Close_PWM();P35=1;MeasureH_Work();}elseif(key_value==2){P34=~P34;swch=k;k++;if(k==3)k=0;//当第一个按键按下〃关闭PWM发生器功能//频率计开始工作//当按键2按下,切换粗、细调//判定粗调、细调状态变量if(swch==0)Digital_New(freq);if(key_value==4)//加频率(细){freq=freq+stepL;PWM_Adjust(freq,Duty);return1;}elseif(key_value==3) //减频率(细){if(stepL>freq){freq=70;PWM_Adjust(freq,Duty);return1;}else{freq=freq-stepL;PWM_Adjust(freq,Duty);〃在原有频率基础上加10Hz//更新上面的调整结果//更新完成//更新上面的调整结果〃在原有频率基础上减10Hz//更新上面的调整结果..学习.资料.return1;//更新完成}}elseif(swch==1){Digital_New(freq);if(key_value==4)//加频率(粗){freq=freq+stepH;PWM_Adjust(freq,Duty);return1;}elseif(key_value==3) //减频率(粗){if(stepH>freq){freq=70;PWM_Adjust(freq,Duty);return1;}else{freq=freq-stepH;PWM_Adjust(freq,Duty);return1;}}}elseif(swch==2){Digital_New(Duty);if(key_value==4)//占空比{Duty=Duty+stepD;if(Duty>=100){Duty=100;BELL=1;Delay100ms();BELL=0;}PWM_Adjust(freq,Duty);〃在原有频率基础上加1000Hz//更新上面的调整结果//更新完成//更新上面的调整结果〃在原有频率基础上减1000Hz//更新上面的调整结果//更新完成//更新上面的调整结果//更新完成return//更新完成}elseif(key_value==3){Duty=Duty-stepD;if(Duty<=5){Duty=5;BELL=1;Delay100ms();BELL=0;}//更新上面的调整结果//更新上面的调整结果//更新完成return2;}}return0;}voidPWM_Work(){charflag=0;Digital_Init();Digital_New(freq);PWM_Init(freq);while(1){flag=PWM_KeyConl();if(flag==1){Digital_New(freq);}elseif(flag==2){Digital_New(Duty);}}}voidClose_PWM(){Digital_New(0);PIN_SW2|=0x80;PWMCR=0x00;//判断这个值是否已经调节了频率//初始化数码管//初始化数码管显示数值〃初始化PWM//键控//显示//显示//关闭数码管显示〃使能访问XSFR〃关闭15位增强型PWM发生器}}..学习.资料.PIN_SW2&=~0x80;〃关闭访问XSFR频率计测量功能相关函数:#include"measure.h"#include"STC15Fxxxx.H#include"digital.h"#include"key.h"#include"pwm.h"voidPWM_Work(void);〃〃〃〃〃〃〃〃〃〃〃〃以下函数功能只能实现低频测量0-700内外部中断)〃〃〃〃〃〃〃/〃〃〃〃〃/*UINT32countL=0;UINT32frequency=0;UINT8FLAG=0;UINT8i=0;voidMeasureL_Init(){Timer1InitL(); 〃此定时器用于更新频率,1S一次Digital_Init(); //数码管初始化INT_CLKO|=0x20; 〃使能INT3中断ET1=1; //开启定时器1中断EA=1;}voidMeasureL_Work(){MeasureL_Init();while(1){if(FLAG==1){Digital_New(frequency);FLAG=0;}}}..学习.资料.voidTimer1InitL(void){

//20毫秒33.1776MHzAUXR&=0xBF;〃定时器时钟12T模式TMOD&=0x0F;

//设置定时器模式//设置定时初值//设置定时初值//设置定时初值//设置定时初值〃清除TF1标志//定时器1开始计时TH1=0x28;TF1=0;TR1=1;voidINT2_interrupt()interrupt11{countL++;}voidTimer1_interruptL()interrupt3{i++;if(i==50) //1s到{frequency=countL;countL=0;i=0;FLAG=1;}}*/////////////////////////以下函数高低频都可精确测量(计数器)///////////////////////TOC\o"1-5"\h\z〃计数器模式下T0的输入为P34。 ////用到的资源: ////测频率:计数器0及中断、定时器1及中断、定时器2及中断(数码管显示) ////测占空比:定时器0及中断、定时器1及中断、外部中断1、定时器2及中断(数码管显示)/////////////////////////////////////////////////////////////////////////////////////UINT8S=0; //(测频/占空)切换的变量UINT16n=0;UINT32countH=0;UINT32frequency=0;doubleZKB=0; //占空比UINT8time=0;#defineTtick0.08179L 〃选用33177600Hz的晶振,Ttick为(1/33177600)voidMeasureH_Work(){chari=0;UINT8key_value;MeasureH_Init();while(1){key_value=KEY_Scan(0);if(key_value==1){P35=0;Close_MeasureH();PWM_Work();}if(key_value==3){S=i;i++;if(i==2) i=0;if(S==0){//关闭上一个状态EX1=0;//开启新的状态Digital_Init();Count0Init();Timer1InitH();EA=1;ET0=1;ET1=1;P35=1;}if(S==1){//关闭上一个状态TR0=0;n=0;//开启新的状态INT1=1;IT1=1;EX1=1;Timer0Init();//关闭测量功能〃开启PWM发生功能//按键3切换测量占空比和频率的功能//切换占空比/频率状态变量//关闭测量占空比的中断//数码管初始化//计数器0初始化//定时器1初始化//计数器0中断//开启定时器1中断//关闭计数器0//次数清零〃开启INT1的外部中断//下降沿触发//开启外部中断1〃只初始化T0的参数,不开启定时器0P35=0;}}}voidClose_MeasureH(void) //关闭测量功能{TR0=0;ET0=0;TR1=0;ET1=0;EX1=0;}//定时器0用于统计低电平的时间//1T33.1776MHz〃定时器时钟//1T33.1776MHz〃定时器时钟1T模式//设置定时器模式//设置定时器模式//设置定时初值//设置定时初值〃清除TF0标志//定时器0开始计时{AUXR|=0x80;TMOD&=0xF0;TMOD|=0x01;TL0=0x00;TH0=0x00;TF0=0;//TR0=1;}//计数器0用于记录脉冲个数voidCount0Init(void){AUXR|=0x80; //系统时钟不分频TMOD|=0x04; //定时器0工作在计数状态TMOD|=0x01;TL0=0x00;TH0=0x00;TF0=0; //清空标志位TR0=1; //开启计数器0}//定时器1用于给数码管更新数据的时间和脉冲的记录的时间提供时间基数。voidTimer1InitH(void)//20毫秒33.1776MHz〃定时器时钟〃定时器时钟12T模式//设置定时器模式AUXR&=0xBF;TMOD&=0x0F;TL1=0x00; //设置定时初值TH1=0x28; //设置定时初值TF1=0; 〃清除TF1标志TR1=1; //定时器1开始计时}〃用于记录1S溢出次数voidInterruptTime0()interrupt1{n++;TL0=0x00;TH0=0x00;}//用于更新数码管数据并让计数器初始化voidInterruptTime1()interrupt3{UINT8a,b;time++;if(S==0){if(time==50)//1s{a=TL0; //确保精准度b=TH0; //确保精准度countH=65535*n+(a+b*256); //记录脉冲数countH=(countH*0.0015)+countH;//补偿值frequency=countH;Digital_New(frequency);TH0=0x00;//令T0重新计数TL0=0x00;n=0;time=0;countH=0;}}else{if(time==50) //显示占空比{Digital_New(ZKB);

ZKB=0;time=0;countH=0;voidInterruptInt1()interrupt2staticUINT8z=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论