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

下载本文档

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

文档简介

1、课程设计论文课题:基于STC15单片机的频率计及方波发生器设计目录基于STC15单片机的频率计及方波发生器设计一、设计要求3一)基础部分3二) 发挥部分3二、课程设计的意义与目的3三、方案设计4单片机数字频率计与可调方波发生器程序设计流程图4四、硬件设计原理图:6五、硬件设计实物图:6六、程序框架:7七、功能说明:7八、测量:8低频测量:8高频测量:8九、误差分析:9第一次误差分析:9第二次误差分析:9十:实现功能情况表:10十一、心得与体会11十二、参考资料11十三、附录:11Main主函数:11按键扫描函数12数码管显示相关函数:12PWM发生器函数:14频率计测量功能相关函数:20延时函

2、数:26基于STC15单片机的频率计及方波发生器设计一、设计要求一)基础部分1. 数字频率计设计要求:1)被测信号为正弦波或方波,频率范围为1Hz5MHz;2)测量相对误差的绝对值不大于百分之一;3)门限电压2V-5V;4)测量数据刷新时间不大于2s,测量结果稳定。2. 方波发生器设计要求:1)方波发生器可以分为低频和高频2个端口产生,频率范围1Hz-6MHz;2)通过不同按键实现频率的粗调和微调。二) 发挥部分1. 频率计范围为 大于5MHz;2. 测量相对误差的绝对值不大于 千分之一;3. 增加脉冲信号占空比的测量功能。二、课程设计的意义与目的1.在电子技术中,频率是最基本的参数之一,并且

3、与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要。2.在通信技术中,波形的发生和频率的控制是最基本的要求,也是通信技术的基础,因此设计波形的发生与控制器就显得尤为重要。3.单片机数字频率计与可调方波发生器,具有可靠性高、体积小、价格低、功能全,广泛应用与各种职能仪器中,能使在测量过程的控制中达到自动化,省掉很多繁琐的人工操作,同时也提高了测试精度。4.其次,课程设计以学生自主学习为主,是课堂内容的扩展和延伸,巩固前序教学内容,提升学生设计能力,使学生掌握小规模单片机系统的软硬件设计,培养学生的自主学习能力,自主学习掌握单片机相关的新知识,自主解决问题的能力。三、

4、方案设计单片机数字频率计与可调方波发生器程序设计流程图频率数值增1000Hz.运用实时扫描函数,扫描当前输入频率,读取当前频率数值进入数码管显示程序,将读取数值翻译为数码管所能输出的数值将程序所翻译数值显示KEY3/KEY4输出所产生的方波频率数值增10Hz.频率数值减10Hz.KEY3/KEY4=1?KEY3=1?=1?实时扫描占空比切换粗,细调频率数值增1000Hz.进入数码管显示程序,将输出方波频率数值翻译为数码管所能输出的数值,在数码管显示开始进入方波发生程序进入频率计数器函数KEY1=1?初始化变量扫描KEY2,swit=0/1.四、硬件设计原理图:五、硬件设计实物图:六、程序框架:

5、USER:用户区 mainDriver:驱动区 key pwm digital(数码管)Apply:应用区 measure(测量)Sys:系统区 global delay usart七、功能说明:开机后默认进入方波发生器状态,输出引脚为P3.7,此时K2切换粗调细调,K4,K4分别为粗调和细调模式下的增加、减少频率按钮;按下K1,此时切换为频率计测量 ,P3.4为测量输入口,注意和测量信号之间的共地。测量范围为1Hz-8MHz,精度误差稳定达到千分之一,附误差分析。 可以用P3.7产生方波给P3.4测量,两个函数从机器上电开始就一直运行,互不干扰。八、测量:低频测量:高频测量:九、误差分析:第

6、一次误差分析:小结:频率计可以突破5M,平均误差为千分之二。第二次误差分析:由于不能稳定达到千分之一的测量设计误差值,并且从上图的测试表中得到误差满足线性关系,因此加入补偿值,第二次误差测试如下:由上图可知,低频、中频、高频部分误差分别万分之五、万分之一、万分之二,整体平均误差为0.00030759,即万分之三,大幅度超过课程设计要求的误差值。十:实现功能情况表:数字频率计设计要求课程设计要求实现情况结论1.被测信号为正弦波或方波,频率范围为1Hz5MHz;频率测量范围为1Hz8MHz完成,并且大幅度超过设计要求2.测量相对误差的绝对值不大于百分之一;测量相对误差的绝对值为万分之三完成,并且大

7、幅度超过设计要求3.门限电压2V-5V;门限电压2V-5V完成4.测量数据刷新时间不大于2s,测量结果稳定;测量数据刷新时间为1s,测量结果稳定完成,并且大幅度超过设计要求方波发生器设计要求课程设计要求实现情况结论1.方波发生器可以分为低频和高频2个端口产生,频率范围1Hz-6MHz;方波发生器可以产生70Hz8MHz频率范围的方波完成,基本满足设计要求2.通过不同按键实现频率的粗调和微调。可通过不同按键实现频率的粗调和微调完成发挥部分课程设计要求实现情况结论1. 频率计范围为 大于5MHz;频率计测量范围上限为8MHz完成2. 测量相对误差的绝对值不大于 千分之一;测量相对误差的绝对值为万分

8、之三完成,并且大幅度超过设计要求3. 增加脉冲信号占空比的测量功能。能完成500Hz以内的测量功能未完成自行发挥部分1.方波发生器可调占空比输出,调节范围为5%100%完成,通过按键调节2.方波发生器和频率计可同时运行完成,通过按键切换十一、心得与体会十二、参考资料十三、附录:附录一:源程序Main主函数:#include "STC15Fxxxx.H"#include "global.h"#include "measure.h"#include "pwm.h"#include "key.h"#i

9、nclude "delay.h"#include "Digital.h"void main()while(1)PWM_Work();/打开测量功能函数按键扫描函数#include "global.h"#include "delay.h"#include "key.h"UINT8 KEY_Scan(UINT8 mode)static UINT8 key_up=1; /按键按松开标志if(mode)key_up=1; /支持连按 mode=1的时候连按,mode=0时不支持连按if(key_up&a

10、mp;&(KEY1=0|KEY2=0|KEY3=0|KEY4=0)Delay10ms(); /去抖动key_up=0;if(KEY1=0) while(!KEY1);return KEY1_PRES; /当key1按下,返回KEY1_PRES的值 else if(KEY2=0) while(!KEY2);return KEY2_PRES; /当key2按下,返回KEY2_PRES的值else if(KEY3=0)while(!KEY3);return KEY3_PRES; /当key3按下,返回KEY3_PRES的值else if(KEY4=0)while(!KEY4);return

11、KEY4_PRES; /当key4按下,返回KEY4_PRES的值else if(KEY1=1&&KEY2=1&&KEY3=1&&KEY4=1)key_up=1; return 0;数码管显示相关函数:#include "global.h"#include "digital.h"#include "STC15Fxxxx.H"UINT8 code LedChar= /段码0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0

12、x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E;UINT8 LedBuff8=0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF /数码管显示缓存区;void Digital_Init()P0M0=P0M1=P1M0=P1M1=P2M0=P2M1=P3M0=P3M1=0;/配置IO口模式Timer2Init();/定时器2初始化IE2 |= 0x04;/开启定时器2中断EA = 1;/开启总中断void Digital_New(UINT32 num)/数码管显示数值的更新函数LedBuff0 = LedCharnum%10;LedB

13、uff1 = LedCharnum/10%10;LedBuff2 = LedCharnum/100%10;LedBuff3 = LedCharnum/1000%10;LedBuff4 = LedCharnum/10000%10;LedBuff5 = LedCharnum/100000%10;LedBuff6 = LedCharnum/1000000%10;LedBuff7 = LedCharnum/10000000%10;void Timer2Init(void)/1毫秒33.1776MHzAUXR &= 0xFB;/定时器时钟12T模式T2L = 0x33;/设置定时初值T2H =

14、0xF5;/设置定时初值AUXR |= 0x10;/定时器2开始计时void InterruptTime2() interrupt 12 /数码管显示的更新 static UINT8 i = 0; P0 = 0xFF;/关闭残影 switch(i) /动态扫描显示 case 0: P2=0x01; i+; P0=LedBuff0;break; case 1: P2=0x02; i+; P0=LedBuff1;break; case 2: P2=0x04; i+; P0=LedBuff2;break; case 3: P2=0x08; i+; P0=LedBuff3;break; case 4:

15、 P2=0x10; i+; P0=LedBuff4;break; case 5: P2=0x20; i+; P0=LedBuff5;break; case 6: P2=0x40; i+; P0=LedBuff6;break; case 7: P2=0x80; i=0; P0=LedBuff7;break; default:break; PWM发生器函数:#include "global.h"#include "STC15Fxxxx.H"#include "pwm.h"#include "key.h"#include

16、 "digital.h"#include "intrins.h"#include "measure.h"#include "delay.h"void Digital_Init(void);void Digital_New(UINT32 num);sbit BELL = P45;#define Tick 0.0000000301408179L/时间片长度#define LTick 0.0000004822530864L /16分频后的时间片长度#define stepH 5000 /粗调步进值#define step

17、L 100/细调步进值#define stepD5/占空比步进值double freq = 50000;/PWM波频率UINT32 Duty = 50;/定义占空比50%/计算,根据PWM频率计算出15位增强型PWM发生器装载值double Calculate(double n)double i;BELL=0;if(n<=1500) 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)算出相应频率的周

18、期,(1/n)/Tick得出装载值return i;return i;else if(n>=8000000) /上限n=8000000;freq=8000000;BELL=1;Delay100ms();BELL=0;i= (1/n)/Tick; /(1/n)算出相应频率的周期,(1/n)/Tick得出装载值return i; void PWM_Init(UINT32 fre)double temp1;/ Calculate返回给temp1赋值给PWMC寄存器freq = fre;temp1= Calculate(freq); P3M0=P3M1 = 0x00;/要输出PWM波形的引脚要配

19、置为准双向或者强推挽输出,这里设置为准双向输出P4M1=0x00;P4M0=0x20; PIN_SW2 |= 0x80; /使能访问XSFR PWMCFG = 0x00; /配置PWM的输出初始电平为低电平if(fre>1500) PWMCKS = 0x00; /选择PWM的时钟为Fosc/(0+1) else if(fre<=1500)PWMCKS = 0x0F; PWMC = temp1; /设置PWM周期 PWM2T1 = 0x0000; /设置PWM2第1次反转的PWM计数 PWM2T2 =temp1 * Duty / 100; /设置PWM2第2次反转的PWM计数 /占空

20、比为(PWM2T2-PWM2T1)/PWMC PWM2CR = 0x00; /选择PWM2输出到P3.7,不使能PWM2中断 PWMCR = 0x01; /使能PWM信号输出 PWMCR |= 0x80; /使能PWM模块 PIN_SW2 &= 0x80;/关闭访问XSFRvoid PWM_Adjust(UINT32 fre,UINT8 duty) /功能大体同上,为粗调细调改变频率时使用double temp2;if(fre<=1500)double temp2;freq = fre;temp2= Calculate(fre);PIN_SW2 |= 0x80; /使能访问XSF

21、R PWMCR = 0x00;/关闭模块_nop_(); _nop_(); PWMCKS = 0x0F; /选择PWM的时钟为Fosc/(0+1) PWMC = temp2; /设置PWM周期 PWM2T1 = 0x0000; /设置PWM2第1次反转的PWM计数 PWM2T2 =temp2 * duty / 100; /设置PWM2第2次反转的PWM计数 /占空比为(PWM2T2-PWM2T1)/PWMC PWMCR = 0x01; /使能PWM信号输出 PWMCR |= 0x80; /使能PWM模块 PIN_SW2 &= 0x80;else if(fre>1500)freq

22、= fre;temp2= Calculate(fre);PIN_SW2 |= 0x80; /使能访问XSFR PWMCR = 0x00;/关闭模块_nop_(); _nop_(); PWMCKS = 0x00; /选择PWM的时钟为Fosc/(0+1) PWMC = temp2; /设置PWM周期 PWM2T1 = 0x0000; /设置PWM2第1次反转的PWM计数 PWM2T2 =temp2 * duty / 100; /设置PWM2第2次反转的PWM计数 /占空比为(PWM2T2-PWM2T1)/PWMC PWMCR = 0x01; /使能PWM信号输出 PWMCR |= 0x80; /

23、使能PWM模块 PIN_SW2 &= 0x80;UINT8 PWM_KeyConl()static UINT8 k=0,swch=0;UINT8 key_value;key_value=KEY_Scan(0); if(key_value=1) /当第一个按键按下 /Close_PWM(); /关闭PWM发生器功能P35=1;MeasureH_Work(); /频率计开始工作 else if(key_value=2) /当按键2按下,切换粗、细调 P34=P34;swch = k; /判定粗调、细调状态变量k+;if(k=3) k=0;if(swch=0)Digital_New(freq

24、);if(key_value=4) /加频率(细)freq = freq+stepL; /在原有频率基础上加10HzPWM_Adjust(freq,Duty); /更新上面的调整结果return 1; /更新完成else if(key_value=3) /减频率(细)if(stepL>freq)freq = 70;PWM_Adjust(freq,Duty); /更新上面的调整结果return 1;else freq = freq-stepL; /在原有频率基础上减10HzPWM_Adjust(freq,Duty); /更新上面的调整结果return 1; /更新完成 else if(sw

25、ch=1)Digital_New(freq);if(key_value=4) /加频率(粗)freq = freq+stepH; /在原有频率基础上加1000HzPWM_Adjust(freq,Duty); /更新上面的调整结果return 1; /更新完成else if(key_value=3) /减频率(粗)if(stepH>freq)freq = 70;PWM_Adjust(freq,Duty); /更新上面的调整结果return 1;elsefreq = freq-stepH; /在原有频率基础上减1000HzPWM_Adjust(freq,Duty); /更新上面的调整结果re

26、turn 1; /更新完成else if(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); /更新上面的调整结果return 2; /更新完成else if(key_value=3)Duty = Duty-stepD;if(Duty<=5)Duty=5;BELL=1;Delay100ms();BELL=0; PWM_Adjust(freq,Duty); /更新上

27、面的调整结果return 2; /更新完成return 0;void PWM_Work()char flag=0;/判断这个值是否已经调节了频率Digital_Init();/初始化数码管Digital_New(freq);/初始化数码管显示数值PWM_Init(freq);/初始化PWMwhile(1)flag=PWM_KeyConl(); /键控if(flag=1)Digital_New(freq);/显示else if(flag=2)Digital_New(Duty);/显示void Close_PWM()Digital_New(0); /关闭数码管显示PIN_SW2 |= 0x80;

28、/使能访问XSFRPWMCR = 0x00; /关闭15位增强型PWM发生器PIN_SW2 &= 0x80; /关闭访问XSFR频率计测量功能相关函数:#include "measure.h"#include "STC15Fxxxx.H"#include "digital.h"#include "key.h"#include "pwm.h"void PWM_Work(void);/以下函数功能只能实现低频测量0-700K(外部中断)/*UINT32 countL = 0;UINT32 f

29、requency = 0;UINT8 FLAG = 0;UINT8 i=0;void MeasureL_Init()Timer1InitL(); /此定时器用于更新频率,1S一次Digital_Init(); /数码管初始化INT_CLKO |= 0x20; /使能INT3中断ET1 = 1;/开启定时器1中断EA = 1;void MeasureL_Work()MeasureL_Init();while(1)if(FLAG=1)Digital_New(frequency);FLAG=0;void Timer1InitL(void)/20毫秒33.1776MHzAUXR &= 0xBF

30、;/定时器时钟12T模式TMOD &= 0x0F;/设置定时器模式TL1 = 0x00;/设置定时初值TH1 = 0x28;/设置定时初值TF1 = 0;/清除TF1标志TR1 = 1;/定时器1开始计时 void INT2_interrupt() interrupt 11countL+; void Timer1_interruptL() interrupt 3i+;if(i=50)/1s到frequency = countL;countL = 0;i=0;FLAG=1; */以下函数高低频都可精确测量(计数器)/计数器模式下T0的输入为P34。 /用到的资源: /测频率:计数器0及中

31、断、定时器1及中断、定时器2及中断(数码管显示) /测占空比:定时器0及中断、定时器1及中断、外部中断1、定时器2及中断(数码管显示) /UINT8 S=0;/(测频/占空)切换的变量UINT16 n=0;UINT32 countH=0;UINT32 frequency=0;double ZKB=0; /占空比UINT8 time=0;#define Ttick 0.0000000301408179L /选用33177600Hz的晶振,Ttick为(1/33177600)void MeasureH_Work()char i=0;UINT8 key_value;MeasureH_Init();w

32、hile(1)key_value=KEY_Scan(0);if(key_value=1)P35=0;Close_MeasureH(); /关闭测量功能PWM_Work(); /开启PWM发生功能if(key_value=3) /按键3切换测量占空比和频率的功能S=i; /切换 占空比/频率 状态变量i+;if(i=2)i=0;if(S=0)/关闭上一个状态EX1=0; /关闭测量占空比的中断/开启新的状态Digital_Init();/数码管初始化Count0Init();/计数器0初始化Timer1InitH();/定时器1初始化EA=1; ET0=1;/计数器0中断ET1=1; /开启定时

33、器1中断P35=1;if(S=1)/关闭上一个状态TR0 = 0;/关闭计数器0n=0;/次数清零 /开启新的状态INT1 = 1;/开启INT1的外部中断IT1 = 1; /下降沿触发EX1 = 1;/开启外部中断1Timer0Init();/只初始化T0的参数,不开启定时器0P35=0; void Close_MeasureH(void)/关闭测量功能TR0=0; ET0=0;TR1=0;ET1=0;EX1 = 0;/定时器0用于统计低电平的时间void Timer0Init(void)/1T33.1776MHzAUXR |= 0x80;/定时器时钟1T模式TMOD &= 0xF0

34、;/设置定时器模式TMOD |= 0x01;/设置定时器模式TL0 = 0x00;/设置定时初值TH0 = 0x00;/设置定时初值TF0 = 0;/清除TF0标志/TR0 = 1;/定时器0开始计时/计数器0用于记录脉冲个数void Count0Init(void)AUXR|=0x80;/系统时钟不分频TMOD|=0x04;/定时器0工作在计数状态TMOD|=0x01;TL0=0x00;TH0=0x00;TF0=0;/清空标志位TR0=1; /开启计数器0/定时器1用于给数码管更新数据的时间和脉冲的记录的时间提供时间基数。void Timer1InitH(void)/20毫秒33.1776M

35、HzAUXR &= 0xBF;/定时器时钟12T模式TMOD &= 0x0F;/设置定时器模式TL1 = 0x00;/设置定时初值TH1 = 0x28;/设置定时初值TF1 = 0;/清除TF1标志TR1 = 1;/定时器1开始计时/用于记录1S溢出次数void InterruptTime0() interrupt 1n+; TL0=0x00;TH0=0x00; /用于更新数码管数据并让计数器初始化void InterruptTime1() interrupt 3UINT8 a,b;time+;if(S=0)if(time=50) /1sa=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; void

温馨提示

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

评论

0/150

提交评论