您好,欢迎来到爱问旅游网。
搜索
您的当前位置:首页基于pwm单片机可调方波及计频器

基于pwm单片机可调方波及计频器

来源:爱问旅游网


课程设计报告

设计题目 基于STC15单片机

的频率计及方波发生器设计

2016 年 1月 1日

基于STC15单片机的频率计及方波发生器设计

一.基础部分

1. 数字频率计设计要求:

1) 被测信号为正弦波或方波,频率范围为1Hz~5MHz; 2) 测量相对误差的绝对值不大于百分之一; 3) 门限电压2V-5V;

4) 测量数据刷新时间不大于2s,测量结果稳定。

2. 方波发生器设计要求:

1) 方波发生器可以分为低频和高频2个端口产生,频率范围1Hz-6MHz;

2) 通过不同按键实现频率的粗调和微调。

二.发挥部分

1) 频率计范围为 大于5MHz;

2) 测量相对误差的绝对值不大于 千分之一; 3) 增加脉冲信号占空比的测量功能。

设计思路 一.定时器的使用

(1)定时器控制寄存器(TCON)

TCON寄存器既参与中断控制又参与定时控制。现对其定时功能加以介绍。

其中有关定时的控制位共有4位:

F0和TF1——计数溢出标志位

当计数器计数溢出(计满)时,该位置“1”;使用查询方式时,此位作状态

位供查询,但应注意查询有效后应以软件方法及时将该位清“0”;使用中断

时,此位作中断标志位,在转向中断服务程序时由硬件自动清“0”。

R0和TR1——定时器运行控制位

TRO(TR1)=0 停止定时器/计数器工作

TRO(TR1)=1 启动定时器/计数器工作

(2)工作方式控制寄存器(TMOD)

TMOD寄存器是一个专用寄存器,用于设定两个定时器/计数器的工作方式。

但TMOD寄存器不能位寻址,只能用字节传送指令设置其内容。

(3)中断允许控制寄存器(IE)

EA——中断允许总控制位

ET0和ET1——定时/计数中断

定时器/计数器提供给用户使用的有:8位计数器TH和TL,以及有关的控制

位。这些内容只能以软件方法使用。

两个外部中断源和三个内部中断源。

每一个中断源都有一个中断申请标志位,但是串行口占有两个中断标志位。 一共有六个中断标志位。

(4)定时器/计数器对输入信号的要求

定时器/计数器的两个作用是用来精确的确定某一段时间间隔[13](作定时

器用)或累计外部输入的脉冲个数(作计数器用)。

当用作定时器时,在其输入端输入周期固定的脉冲,根据定时器/计数器中

累计(或事先设置)的脉冲个数,即可计算出所定时间的长度。

当C51内部的定时器/计数器被选择为定时器工作方式时,计数输入信号

是内部时钟脉冲,每个机器周期产生一个脉冲使计数器增1。因此,定时器/

数器的输入脉冲周期与机器周期一样,为振荡频率的1/12。当采用12MHz

的晶体时,计数频率为1MHz,输入脉冲的周期间隔为1μs[14]。由于定时

度决定于脉冲的周期,因此,当需要高精度的定时器时,应尽量选择频率较

晶体。

二.芯片资料

三.主要程序设计流程图

四.程序

#include //头文件设置

#define TIMS2 65336 //定时器2 #define TIMS1 15536 //定时器1

sfr TH2 =0xD6; //地址申明 sfr TL2 =0xD7;

sbit LED2 =P3^5; //按键申明 sbit KEY_BIG =P3^2; sbit KEY_SMALL=P3^3; sbit KEY_SWITCH_MODE = P5^4; sbit KEY_CHAGE_MODE =P5^5;

void delay_ms(unsigned char xms);

void DisPlay_Freq(unsigned long cnt);//函数申明 void Scan_Key(void);

void delay_10us(unsigned char xms); void delay_50us(unsigned char xms);

void DisPlay_PWM_WIDTH(unsigned long width); void Timer1Init(void); void Timer0Init(void);

////tab1:数值 tab2:段选

unsigned char code tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char code tab2[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

unsigned long Freq =0; unsigned int count0 =0;

unsigned int count1 =0; //参数定义 unsigned long Freq_Test=0;

unsigned long F_count=0; unsigned char time=0;

unsigned int CNT = 0;

unsigned char SWITCH_MODE_FLAG = 0;//按键调节切换标志 0:增 1:减 unsigned char CHAGE_MODE_FLAG = 0;//模式切换 unsigned char PWM_WIDTH = 50;//初始占空比 float Percent = 0;

//------------主函数 main() {

P2M1=0x00; P2M0=0x00; P0M1=0x00; P0M0=0x00; P1M1=0x00; P1M0=0x00; P3M1=0x00; P3M0=0x00; P4M1=0x00; P4M0=0x00; P5M1=0x00; P5M0=0x00;

Timer0Init(); //初始化定时器0 Timer1Init(); //初始化定时器1 EA=1; //打开总开关 ET0=1; //打开定时器0 ET1=1; //开启定时器1中断

CLK_DIV=0x00; //定时器2 16位自动重装载模式配置初始化 TL2=TIMS2;

TH2=TIMS2>>8;

AUXR|=0x10; //启动定时器2工作模式,不分频 IE2|=0x00; //禁止定时器2中断 EA=1; P_SW2|=0x80; //使能访问扩张SFR PWMCFG&=0xFB; //PWM输出初始化电平为低电平 PWM4CR=0x08; //PWM输出引脚为P4.4 PWMCR|=0x84; //使能增强型PWM波形发生器,PWM4输出使能 P_SW2 &=0x0F;

while(1)

{

LED2=0;

if(CHAGE_MODE_FLAG==0) { LED2=1; if(Freq>=1000) { P_SW2|=0x80; //使能访问扩张SFR PWMCKS=0x00; //PWM时钟为系统时钟/1 count0=((24000000/Freq-1));

PWMC=count0;//设置周期

PWM4T1=0x0000;//第一次翻转设置 Percent = (100-PWM_WIDTH)/100.0;

PWM4T2=(unsigned int)(Percent*(24000000/Freq)-1);//第二次翻转设置 P_SW2 &=~0x80; } if(Freq<1000)

P_SW2|=0x80;

PWMCKS=0x10; //PWM时钟源为定时器2的溢出脉冲 count1=((10000/Freq-1)); PWMC=count1; PWM4T1=0x0000; Percent = (100-PWM_WIDTH)/100.0; PWM4T2=(unsigned int)(Percent*(10000/Freq)-1); P_SW2 &=0x0F; } //-------------------按键设置-------------------------- if(SWITCH_MODE_FLAG==2) DisPlay_PWM_WIDTH(PWM_WIDTH); else DisPlay_Freq(Freq); } if(CHAGE_MODE_FLAG==1) { LED2=0; DisPlay_Freq(Freq_Test); } Scan_Key(); } }

//-------------延时----------------------

void delay_ms(unsigned char xms) { unsigned char i ,j,k; for(k=xms;k>0;k--) {

i = 24; j = 85; do { while (--j); }while (--i); } }

//-------------------频率显示-------------------- void DisPlay_Freq(unsigned long cnt) { unsigned char a1,a2,a3,a4,a5,a6,a7,a8; a1 = cnt/10000000; a2 = cnt/1000000%10; a3 = cnt/100000%10; a4 = cnt/10000%10; a5 = cnt/1000%10; a6 = cnt/100%10; a7 = cnt/10%10; a8 = cnt%10; P2=tab2[0]; P0=tab1[a1]; delay_ms(1); P2=tab2[1]; P0=tab1[a2]; delay_ms(1); P2=tab2[2]; P0=tab1[a3]; delay_ms(1); P2=tab2[3]; P0=tab1[a4]; delay_ms(1); P2=tab2[4];

}

P0=tab1[a5]; delay_ms(1); P2=tab2[5]; P0=tab1[a6]; delay_ms(1); P2=tab2[6]; P0=tab1[a7]; delay_ms(1); P2=tab2[7]; P0=tab1[a8]; delay_ms(1);

//--------占空比显示--------------

void DisPlay_PWM_WIDTH(unsigned long width) { unsigned char a1,a2,a3; a1 = width/100%10; a2 = width/10%10; a3 = width%10; P2=tab2[5]; P0=tab1[a1]; delay_ms(2); P2=tab2[6]; P0=tab1[a2]; delay_ms(2); P2=tab2[7]; P0=tab1[a3]; delay_ms(2); }

//粗调细调设置 void Scan_Key(void) { if(KEY_BIG==0) { while(!KEY_BIG); if(SWITCH_MODE_FLAG==0)

{ Freq=Freq+1000; if(Freq>6000000) { Freq=0; } } if(SWITCH_MODE_FLAG==1) { Freq=Freq-1000; if(Freq<=0) { Freq=0; } } if(SWITCH_MODE_FLAG==2) { PWM_WIDTH=PWM_WIDTH+1; if(PWM_WIDTH>=100) { PWM_WIDTH=1; } } } if(KEY_SMALL==0) { while(!KEY_SMALL); if(SWITCH_MODE_FLAG==0) { Freq=Freq+1; if(Freq>6000000) { Freq=0; } } if(SWITCH_MODE_FLAG==1) { Freq=Freq-1; if(Freq<=0) { Freq=0; } }

if(SWITCH_MODE_FLAG==2) { PWM_WIDTH=PWM_WIDTH-1; if(PWM_WIDTH<=0) { PWM_WIDTH=1; } } } if(KEY_SWITCH_MODE==0) { delay_ms(1); while(!KEY_SWITCH_MODE); SWITCH_MODE_FLAG++; if(SWITCH_MODE_FLAG>=3) SWITCH_MODE_FLAG = 0; } if(KEY_CHAGE_MODE==0) { while(!KEY_CHAGE_MODE); CHAGE_MODE_FLAG++; if(CHAGE_MODE_FLAG>=2) CHAGE_MODE_FLAG = 0; } }

//计数器0设置,记录溢出脉冲 void Timer0Init(void) { AUXR|=0x80; TMOD|=0x05; TL0=0x00; TH0=0x00; TF0=0; TR0=1; }

//定时器1开始,定时20毫秒,24MHZ void Timer1Init(void) { AUXR &= 0xBF; TMOD &= 0x0F;

TL1 = 0xC0; TH1 = 0x63; TF1 = 0; TR1 = 1; }

void InterruptTime0() interrupt 1 { CNT++; }

//定时器1循环50次,共计1秒 void InterruptTime1() interrupt 3 { time++; if(time==50) { F_count=(65535*CNT+(TL0+TH0*256)); Freq_Test=F_count; TH0=0x00; TL0=0x00; CNT=0; time=0; F_count=0; } }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- awee.cn 版权所有 湘ICP备2023022495号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务