产生方波程序

合集下载

单片机产生可调方波(c语言)

单片机产生可调方波(c语言)

用单片机产生频率可调的方波信号。

输出方波的频率范围为1Hz-200Hz,频率误差比小于0.5%。

要求用“增加”、“减小”2个按钮改变方波给定频率,按钮每按下一次,给定频率改变的步进步长为1Hz,当按钮持续按下的时间超过2秒后,给定频率以10 次/秒的速度连续增加(减少),输出方波的频率要求在数码管上显示。

用输出方波控制一个发光二极管的显示,用示波器观察方波波形。

开机默认输出频率为5Hz。

3.5.1模块1:系统设计(1)分析任务要求,写出系统整体设计思路任务分析:方波信号的产生实质上就是在定时器溢出中断次数达到规定次数时,将输出I/O管脚的状态取反。

由于频率范围最高为200Hz,即每个周期为5ms(占空比1:1,即高电平2.5ms,低电平2.5 ms),因此,定时器可以工作在8位自动装载的工作模式。

涉及以下几个方面的问题:按键的扫描、功能键的处理、计时功能以及数码管动态扫描显示等。

问题的难点在按键连续按下超过2S的计时问题,如何实现计时功能。

系统的整体思路:主程序在初始化变量和寄存器之后,扫描按键,根据按键的情况执行相应的功能,然后在数码显示频率的值,显示完成后再回到按键扫描,如此反复执行。

中断程序负责方波的产生、按键连续按下超过2S后频率值以10Hz/s递增(递减)。

(2)选择单片机型号和所需外围器件型号,设计单片机硬件电路原理图采用MCS51系列单片机At89S51作为主控制器,外围电路器件包括数码管驱动、独立式键盘、方波脉冲输出以及发光二极管的显示等。

数码管驱动采用2个四联共阴极数码管显示,由于单片机驱动能力有限,采用74HC244作为数码管的驱动。

在74HC244的7段码输出线上串联100欧姆电阻起限流作用。

独立式按键使用上提拉电路与电源连接,在没有键按下时,输出高电平。

发光二极管串联500欧姆电阻再接到电源上,当输入为低电平时,发光二极管导通发光。

图3-14 方波信号发生器的硬件电路原理图(3)分析软件任务要求,写出程序设计思路,分配单片机内部资源,画出程序流程图软件任务要求包括按键扫描、定时器的控制、按键连续按下的判断和计时、数码管的动态显示。

产生方波脉冲和周期性方波信号【matlab源码】

产生方波脉冲和周期性方波信号【matlab源码】

毕业论文(设计)
题目
学院学院
专业
学生姓名
学号年级级指导教师
教务处制表
matlab产生方波脉冲和周期性方波信号
一、程序说明
本团队长期从事matlab编程与仿真工作,擅长各类毕业设计、数据处理、图表绘制、理论分析等,程序代做、数据分析
具体信息联系
二、程序示例
周期性矩形波(方波)信号:在MATLAB中用square函数来表示,其调用形式为
y=square(t,DUTY)
其作用类似于sin(t),用以产生一个时长为t、幅值为±1的周期性方波信号,其中的DUTY参数表示占空比,即在信号的一个周期中正值所占的百分比。

例如频率为30Hz的周期性方波信号的 MATLAB 参考程序如下:t=-2*pi/100:pi/1024:2*pi/100;
y=square(2*pi*30*t,50);
plot(t,y);
grid
ylim([-1.5 1.5])
矩形脉冲信号:在MATLAB中用rectpuls函数来表示,其调用形式为
y=rectpuls(t,width)
用以产生一个幅值为1,宽度为width,相对于t=0点左右对称的矩形波信号,该函数的横坐标范围由向量t决定,是以t=0为中心向左右各展开width/2的范围,width的默认值为1。

例:画宽为2的矩形脉冲信号的MATLAB源程序如下:
width=2;
t=-2:0.001:3;
ft=rectpuls(t,width); plot(t,ft);
grid on;
ylim([-0.5 1.5])。

51单片机和dac0832输出方波、矩形波和正弦波由液晶1602显示的c语言程序

51单片机和dac0832输出方波、矩形波和正弦波由液晶1602显示的c语言程序

显示频率,幅度可调,可产生四种波形,正弦波,方波,锯齿波,三角波,希望你能喜欢,给你发了一张效果图,喜欢的话别忘了采纳我的回答啊#include<>#define uchar unsigned char#define uint unsigned int#define DAdata P0 //DA数据端口sbit DA_S1= P2^0; // 控制DAC0832的8位输入寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存sbit DA_S2= P2^1; // 控制DAC0832的8位DAC寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存sbit key= P3^2;uchar wavecount; //'抽点'计数uchar THtemp,TLtemp;//传递频率的中间变量uchar judge=1; //在方波输出函数中用于简单判别作用uchar waveform; //当其为0、1、2时,分别代表三种波uchar code freq_unit[3]={10,50,200}; //三种波的频率单位uchar idata wavefreq[3]={1,1,1}; //给每种波定义一个数组单元,用于存放单位频率的个数uchar code lcd_hang1[]={"Sine Wave " "Triangle Wave " "Square Wave " "Select Wave: " "press key! "};uchar idata lcd_hang2[16]={"f= Hz "};uchar code waveTH[]={0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xec,0xf6,0xf9,0xfb,0xfc,0xfc,0xfd,0xfd,0xfd,0xfe};uchar code waveTL[]={0x06,0x8a,0x10,0x4e,0x78,0x93,0xa8,0xb3,0xbe,0xc6, //正弦波频率调整中间值0xac,0xde,0x48,0x7a,0x99,0xaf,0xbb,0xc8,0xd0,0xde, //三角波频率调整中间值0x88,0x50,0x90,0x32,0x34,0xbe,0x4a,0xa3,0xe5,0x2c};/******************************************************************** *****************************/uchar code triangle_tab[]={ //每隔数字8,采取一次0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68 ,0x70,0x78,0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0xe0,0xe8, 0xf0,0xf8,0xff,0xf8,0xf0,0xe8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x98,0x90,0 x88,0x80,0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10 ,0x08,0x00};uchar code sine_tab[256]={//输出电压从0到最大值(正弦波1/4部分)0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8, 0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0x e1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0 xfe,0xff,0xff,0xff,0xff,0xff,0xff,//输出电压从最大值到0(正弦波1/4部分)0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6, 0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4, 0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 , 0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,//输出电压从0到最小值(正弦波1/4部分)0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57, 0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20 ,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02 ,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,//输出电压从最小值到0(正弦波1/4部分)0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x0 7,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b ,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};void delay(uchar z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void triangle_out() //三角波输出{DAdata=triangle_tab[wavecount++];if(wavecount>64) wavecount=0;DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器void sine_out() //正弦波输出{DAdata=sine_tab[wavecount++];DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器}void square_out() //方波输出{judge=~judge;if(judge==1) DAdata=0xff;else DAdata=0x00;DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器}/************1602液晶的相关函数*************/#define lcd_ports P1sbit rs=P2^2;sbit rw=P2^3;sbit lcden=P2^4;void write_com(uchar com){rs=0; //置零,表示写指令lcden=0;lcd_ports=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date){rs=1; //置1,表示写数据(在指令所指的地方写数据)lcden=0;lcd_ports=date;delay(5);lcden=1;delay(5);lcden=0;void disp_lcd(uchar addr,uchar *temp1){uchar num;write_com(addr);delay(1); //延时一会儿for(num=0;num<16;num++){write_date(temp1[num]);//或者这样写write_date(*(temp1+num));delay(1);}}void init_lcd(){//uchar num;lcden=0; //可有可无rw=0; //初始化一定要设置为零,表示写数据write_com(0x38); //使液晶显示点阵,为下面做准备write_com(0x0c); //初始设置write_com(0x06); //初始设置write_com(0x01); //清零write_com(0x80); //使指针指向第一行第一格disp_lcd(0x80,&lcd_hang1[3*16]); //在第一行显示disp_lcd(0xc0,&lcd_hang1[4*16]); //在第二行显示}/********************1602液晶函数声明结束*********************/ void main(){uchar i=0;DA_S2=0; //使DAC寄存器处于直通状态DAdata=0;DA_S1=1; //关闭8位输入寄存器init_lcd();waveform=0;TMOD=0x01; //设置定时器0为16位工作方式IT0=1; //设置外部中断0为下降沿触发ET0=1; //开定时器中断EX0=1;EA=1;while(1){//DAout(0xff); //可输出TTL波形//DAout(0x80);//T_temp=32;}}void timer0() interrupt 1{TH0=THtemp;TL0=TLtemp;if(waveform==0) sine_out();else if(waveform==1) triangle_out();else if(waveform==2) square_out();}void key_int0() interrupt 0{uchar keytemp;uint total_freq; //总频率EA=0; TR0=0; //关总中断与定时器delay(5); //延时够吗if(key==0) //确实有按键按下而引发中断{keytemp=P3&0xf0; //获取P3口高四位的值switch(keytemp){case 0xe0: //选择波形waveform++;if(waveform>2) waveform=0;break;case 0xd0: //频率按规定单位依次增加wavefreq[waveform]++;if(wavefreq[waveform]>10) wavefreq[waveform]=1; // /*这边要用“>10”,因为它比“=11”可靠break;case 0xb0: //频率按规定单位依次衰减wavefreq[waveform]--;if(wavefreq[waveform]<1) wavefreq[waveform]=10; //这边要用“<1”,因为它比“=0”可靠性更高break;case 0x70: //TTL输出DA_S2=1; //使DAC寄存器关闭break;}THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]; //方括号中选取第几个数后,并把该值赋给T_tempTLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)];total_freq= wavefreq[waveform] * freq_unit[waveform]; //求输出频率(个数*单位)lcd_hang2[5]=total_freq%10+0x30; //在液晶中显示个位,(0x30 在液晶显示中表示数字0)total_freq/=10; lcd_hang2[4]=total_freq%10+0x30; //在液晶中显示时十位total_freq/=10; lcd_hang2[3]=total_freq%10+0x30; //在液晶中显示时百位total_freq/=10; lcd_hang2[2]=total_freq%10+0x30; //在液晶中显示时千位disp_lcd(0x80,&lcd_hang1[waveform*16]); //在第一行显示disp_lcd(0xc0,lcd_hang2); //在第二行显示}wavecount=0; //'抽点'计数清零while(!key);EA=1; TR0=1; //开启总中断与定时器}。

方波发生器程序

方波发生器程序

#include<reg52.h>#define uchar unsigned char;#define uint unsigned int;sbit shuzhi=P2^5; //数值加sbit jia100=P2^6; //加100sbit jian100=P2^7; //减100sbit queding=P3^0; //确定按钮sbit led0=P2^0; //数码管位选sbit led1=P2^1;sbit led2=P2^2;sbit led3=P2^3;sbit led4=P2^4;sbit D1=P3^7; //方波输出uint led_js,ms_js,hz,da,js_50us,f_js,ys; double f,fnum;uchar temp,weix;uchar led_data[5],table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void T1_data() //初始化T1,定时1ms {TH1=(65536-1000)/256;TL1=(65536-1000)%256;}void T0_data() //初始化T0,定时50us{TH0=0xce;TL0=0xce;}void led5(unsigned int da) //取出各位数{led_data[0]=da/10000;led_data[1]=(da%10000)/1000;led_data[2]=(da%1000)/100;led_data[3]=(da%100)/10;led_data[4]=da%10;}void delay(unsigned int ys) //用于消抖的延时子程序{unsigned int i,j;for(i=ys;i>0;i--)for(j=120;j>0;j--);}void main(){hz=1;D1=1;f_js=0;ms_js=0;led_js=0;js_50us=0;weix=4;led0=1;led1=1;led2=1;led3=1;led4=1;TMOD=0x12; //T0工作于方式2,用于频率控制;T1工作于方式1,用于数码管显示T0_data();T1_data();TR0=1;TR1=1;ET0=1;ET1=1; //开定时中断IT0=1;IT1=1;EX0=1;EX1=1; //开外部中断EA=1;while(1){if(ms_js>=10){ms_js=0;led5(hz);}f=(double)hz; //转换成浮点数fnum=10000.0/f; //求出50us溢出数f_js=(int)fnum; //取整if(fnum+0.5>=f_js+1) //四舍五入{f_js=f_js+1;}if(js_50us>=f_js) //半个周期到{js_50us=0;D1=!D1; //对前次结果取反}}}void timer1() interrupt 3 //定时器T1中断服务程序{T1_data();led0=1;led1=1;led2=1;led3=1;led4=1;temp=led_data[led_js];P1=table[temp]; //点亮数码管段switch(led_js) //选择数码管位{case 0:led0=0;break;case 1:led1=0;break;case 2:led2=0;break;case 3:led3=0;break;case 4:led4=0;break;default:break;}led_js++;if(led_js==5)led_js=0;ms_js++;}void timer0() interrupt 1 //定时器T0中断服务程序{js_50us++;}void int0() interrupt 0 //外部中断0中断服务程序{led0=1;led1=1;led2=1;led3=1;led4=1;switch(weix) //点亮已经选择的数码管位{case 0:led0=0;break;case 1:led1=0;break;case 2:led2=0;break;case 3:led3=0;break;case 4:led4=0;break;default:break;}while(1){while(!shuzhi||!queding); //等待按键弹起while(shuzhi&&queding); //等待按键按下delay(100); //延时消抖while(shuzhi&&queding); //再次判断按键是否真的按下if(!shuzhi) //如果数值加按下,{led_data[weix]++; //则相应位加一if(led_data[weix]>9)led_data[weix]=0;}hz=led_data[0]*10000+led_data[1]*1000+led_data[2]*100+ led_data[3]*10+led_data[4];if(hz>10000)hz=0;led5(hz);P1=table[led_data[weix]];if(!queding) //如果确定键按下{js_50us=0;break;} //则退出while(1)循环}weix--; //每中断一次,所调节的数码管位循环向左移一位if(weix<0)weix=4;}void int1() interrupt 2 //外部中断1服务程序{led0=1;led1=1;led2=0;led3=1;led4=1; //关闭除百位以外的其他数码管while(1){while(!jia100||!jian100||!queding); //检测是否按键已经弹起while(jia100&&jian100&&queding); //检测按键是否被按下delay(100); //延时消抖while(jia100&&jian100&&queding); //再次检测按键是否真的被按下if(jia100==0) //如果加100键被按下{hz=hz+100; //则自加100if(hz>10000)hz=10000;}if(jian100==0){if(hz<100)hz=0;elsehz=hz-100;}led5(hz);P1=table[led_data[2]];if(queding==0){js_50us=0;break;}}}。

用单片机进行方波发生器的设计

用单片机进行方波发生器的设计

用单片机进行方波发生器的设计方波发生器是一种产生具有固定频率和振幅的方波信号的电路或设备。

它可以广泛应用于通信、计算机、测量、控制等领域。

在本文中,我们将详细介绍如何使用单片机进行方波发生器的设计。

设计一个单片机方波发生器可以分为以下几个步骤:步骤一:选择单片机型号和开发工具选择一个适合的单片机型号是设计方波发生器的第一步。

目前市场上常见的单片机有MCS-51系列、AVR系列、STM32系列等。

根据需求选择适合的型号。

步骤二:确定方波的频率和振幅方波发生器的设计需要明确所需的方波频率和振幅。

频率指的是方波信号的周期性,单位为赫兹(Hz);振幅指的是方波信号的最大值和最小值之间的差值,单位为伏特(V)。

根据实际需求确定频率和振幅的数值。

步骤三:编写单片机程序在单片机方波发生器的设计中,需要编写相应的程序代码。

在编写代码之前,需要了解所选单片机的编程语言、开发工具和编程接口,以便正确地编写和调试程序。

在编写程序时,需要利用单片机的定时器/计数器功能。

通过配置定时器的工作模式、时钟源和计数值,可以生成一定频率的脉冲信号。

然后利用IO口输出脉冲信号,并通过电路将脉冲信号转换成方波信号。

具体的代码实现细节根据所选单片机型号和开发工具而定,可以参考相关的单片机开发文档和教程。

以下是一个使用STM32单片机的例子:#include "stm32f10x.h"void delay(uint32_t n)for(uint32_t i=0;i<n;i++);}int main(void)GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_TimeBaseStructure.TIM_Prescaler = 72-1;TIM_TimeBaseStructure.TIM_Period = 1000-1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 500-1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init(TIM2, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM2, ENABLE);TIM_Cmd(TIM2, ENABLE);while(1)}}步骤四:电路设计和调试完成单片机程序编写后,需要进行相应的电路设计和调试工作。

用STC15W404AS单片机的方波发生器程序

用STC15W404AS单片机的方波发生器程序

/**************************************************** 方波发生器程序朱铮南编写** 单片机STC15W404AS 方波输出端P1.1 时钟频率20MHz ** F<80KHz 占空比80%--20%** F>80KHz 占空比50%** 占空比分辨率:1%** 方波频率分辨率:** 0--999Hz 1Hz** 1KHz--9.99KHz 0.01KHz** 10KHz--99.9KHz 0.1KHz** 100KHz--200KHz 1KHz** 设定的频率和占空比保存在EEPROM,不会丢失** 频率保存在第一扇区,占空比保存在第二扇区** 外部中断0--3,分别用于频率增减和占空比增减**************************************************/#include <STC15W.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longulong freq; //Hz,输出方波频率uchar duty; //%,占空比sbit int0 = P3^2; //输出频率增sbit int1 = P3^3; //输出频率减sbit int2 = P3^6; //输出占空比增sbit int3 = P3^7; //输出占空比减sbit D7 = P1^5; //1602数据线sbit D6 = P1^4;sbit D5 = P1^3;sbit D4 = P1^2;sbit RS = P5^4; //1602数据/命令选择端sbit EN = P5^5; //1602使能信号端//RW接地uchar table0[ ]="F: 0000 Hz";uchar table1[ ]="D: 00 %";/**************************************************** 延时1ms**************************************************/void delay1ms(uchar x) //@20.000MHz{uchar i,j;do{i = 113;j = 20;do{while (--i);} while (--j);} while (--x);}/**************************************************** 向LCD1602写指令或数据**************************************************/void lcd_write(uchar com,date) //com=0则写指令,com=1则写数据{delay1ms(3);RS = com;EN = 1;D7 = date>>7;D6 = date>>6 & 0x1;D5 = date>>5 & 0x1;D4 = date>>4 & 0x1;EN = 0; //RW=0,EN从1跳到0时LCD1602执行写入delay1ms(3);EN = 1;D7 = date>>3 & 0x1;D6 = date>>2 & 0x1;D5 = date>>1 & 0x1;D4 = date & 0x1;EN = 0;}/**************************************************** LCD1602初始化**************************************************/void lcd_init(void){lcd_write(0,0x28);EN=1; //四线时没有这两行会乱码EN=0;lcd_write(0,0x28);lcd_write(0,0x28);lcd_write(0,0x0c); //显示开,无光标}/************************************************** ** LCD1602显示**************************************************/ void lcd_display(void){uchar i;if(freq<=9){table0[3]=freq+'0';table0[4]=' ';table0[5]='H';table0[6]='z';table0[7]=' ';table0[8]=' ';table0[9]=' ';table0[10]=' ';}else{if(freq<=99){table0[3]=freq/10+'0';table0[4]=freq%10+'0';table0[5]=' ';table0[6]='H';table0[7]='z';table0[8]=' ';table0[9]=' ';table0[10]=' ';}else{if(freq<=999){table0[3]=freq/100+'0';table0[4]=freq%100/10+'0';table0[5]=freq%10+'0';table0[6]=' ';table0[7]='H';table0[8]='z';table0[9]=' ';table0[10]=' ';}else{table0[7]=' ';table0[8]='K';table0[9]='H';table0[10]='z';if(freq<=9999){table0[3]=freq/1000+'0';table0[4]='.';table0[5]=freq%1000/100+'0';table0[6]=freq%100/10+'0';}else{if(freq<=99999){table0[3]=freq/10000+'0';table0[4]=freq%10000/1000+'0';table0[5]='.';table0[6]=freq%1000/100+'0';}else{table0[3]=freq/100000+'0';table0[4]=freq%100000/10000+'0';table0[5]=freq%10000/1000+'0';table0[6]=' ';table0[7]='K';table0[8]='H';table0[9]='z';table0[10]=' ';}}}}}table1[3]=duty/10+'0';table1[4]=duty%10+'0';lcd_write(0,0x00|0x80); //指定第一行的位置for(i=0;i<11;i++) lcd_write(1,table0[i]); //写入第一行lcd_write(0,0x40|0x80); //指定第二行的位置for(i=0;i<7;i++) lcd_write(1,table1[i]); //写入第二行}/************************************************** ** 频率写入EEPROM**************************************************/ void f_write(ulong dat){uchar i;IAP_CMD=3; //擦除命令IAP_ADDRL=0x0000; //擦除扇区的地址IAP_ADDRH=0x0000>>8;IAP_TRIG=0x5A; //激活命令IAP_TRIG=0xA5;IAP_CMD=2; //写入命令for(i=0;i<3;i++){switch (i){case 2:IAP_DA TA=dat;break; //要写入的数据case 1:IAP_DA TA=dat>>8;break;case 0:IAP_DA TA=dat>>16;}IAP_ADDRL=0x0000+i; //写入的地址IAP_ADDRH=(0x0000+i)>>8;IAP_TRIG=0x5A; //激活命令IAP_TRIG=0xA5;}}/************************************************** ** 从EEPROM读出频率**************************************************/ void f_read(void){uchar i;IAP_CMD=1; //读出命令for(i=0;i<3;i++){IAP_ADDRL=0x0000+i; //写入的地址IAP_ADDRH=(0x0000+i)>>8;IAP_TRIG=0x5A; //激活命令IAP_TRIG=0xA5;_nop_();freq=freq<<8|IAP_DA TA; //将读出的数据存入频率}}/************************************************** ** 占空比写入EEPROM**************************************************/ void d_write(uchar dat){IAP_CMD=3; //擦除命令IAP_ADDRL=0x0200; //擦除扇区的地址IAP_ADDRH=0x0200>>8;IAP_TRIG=0x5A; //激活命令IAP_TRIG=0xA5;IAP_CMD=2; //写入命令IAP_DATA=dat; //要写入的数据IAP_ADDRL=0x0200; //写入的地址IAP_ADDRH=0x0200>>8;IAP_TRIG=0x5A; //激活命令IAP_TRIG=0xA5;}/************************************************** ** 从EEPROM读出占空比**************************************************/ void d_read(void){IAP_CMD=1; //读出命令IAP_ADDRL=0x0200; //读出的地址IAP_ADDRH=0x0200>>8;IAP_TRIG=0x5A; //激活命令IAP_TRIG=0xA5;_nop_();duty=IAP_DATA; //将读出的数据存入占空比}/**************************************************** 初始化定时器0**************************************************/void init_time0(uchar i) //@20MHz1T{AUXR |= 0x80; //定时器0时钟工作在1T模式TMOD &= 0xF0; //设置定时器0工作在16位自动重载模式switch (i){case 1: //20MHz{TL0 = 0xFF;TH0 = 0xFF;}break;case 2: //2MHz{TL0 = 0xF6;TH0 = 0xFF;}break;case 3: //200KHz{TL0 = 0x9C;TH0 = 0xFF;}break;case 4: //20KHz{TL0 = 0x18;TH0 = 0xFC;}}TR0 = 1; //定时器0开始计时}/**************************************************** 主函数**************************************************/void main(void){ulong S_freq; //PCA计数源频率ulong cycle; //输出方波的周期uint plus; //输出方波的正半周uint minus; //输出方波的负半周uint V; //存放正负半周的临时变量bit j=1; //输出方波的正负半周标志uchar k; //传递给初始化定时器0函数的实参lcd_init(); //1602初始化EA=1; //中断总开关开CMOD=0x04; //PCA计数源选定为定时器0的溢出IT0=1; //外部中断0下降沿触发IT1=1; //外部中断1下降沿触发EX0=1; //允许外部中断0EX1=1; //允许外部中断1INT_CLKO|=0x30; //允许外部中断2、3IAP_CONTR=0x82; //允许对EEPROM读写d_read(); //从EEPROM读出占空比f_read(); //从EEPROM读出频率if(freq>80000)duty=50;lcd_write(0,0x01); //清屏lcd_display(); //显示//选择定时器0的溢出频率,保证输出方波周期在65535内if(freq>=306){k=1;S_freq=20000000;}if(freq<306 && freq>=31){k=2;S_freq=2000000;}if(freq<31 && freq>=4){k=3;S_freq=200000;}if(freq<4){k=4;S_freq=20000;}init_time0(k); //初始化定时器0cycle=S_freq/freq; //输出方波周期plus=cycle*duty/100; //计算正半周值。

如何产生方波matlab

如何产生方波matlab

如何产生方波matlab方波是一种具有正负交替的矩形波,是非常广泛用于电子、通信和控制领域中的一种波形。

对于某些学科来说,如电学和电子学等,方波也是一个十分重要的基本信号。

在Matlab中,产生方波可以采用sin函数和急轩波函数实现。

下面就让我们一起来看一下具体的制作过程吧。

制作方波的步骤如下:1.首先,打开Matlab软件,创建一个新的M文件。

2.定义一个变量,如n,表示生成方波的坐标轴范围,一般可以在0到4π之间取值。

3.定义一个变量,如freq,表示方波的频率,即在一个周期中包含的完整波形的数量。

4.定义一个变量,如amp,表示方波的振幅,即波形的峰值大小。

5.定义一个变量,如phase,表示方波的相位,即波形的偏移量。

6.利用sin函数,生成一个横坐标为n、纵坐标为1的正弦波。

7.通过将正弦波的所有正数部分取绝对值,再通过将其所有负数部分取绝对值,并减去1,将该波形转换成方波形式。

8.将生成的方波图形通过“plot”功能绘制到屏幕上。

9.添加图例和定制图形属性样式等必要的功能。

下面是一段Matlab程序示范,来说明如何实现产生方波:%% 首先,定义坐标轴的范围nn=0:0.1:4*pi;%% 定义产生方波的基本参数frequency=1; %% 频率为1,即一个完整波形在2pi秒内完成amplitude=1; %% 设置默认振幅为1phase=0; %% 设置默认相位为0%% 产生正弦波sin_wave=amplitude*sin(2*pi*frequency*n+phase);%% 通过将正弦波中的所有正数部分取绝对值,再通过将其所有负数部分取绝对值,并减去1,将其转换为方波square_wave=amplitude*(2*(sin_wave>=0)-1);%% 绘制方波图形plot(n,square_wave,'b');title('产生方波');xlabel('时间/秒');ylabel('电压/伏特');执行上述代码后,就可以在Matlab中成功产生一个方波了。

AD9833程序,信号发生器,正弦波,方波,三角波输出程序

AD9833程序,信号发生器,正弦波,方波,三角波输出程序
write_ad9833_d16(frequence_MSB); //H14 频率寄存器1为
write_ad9d9833_d16(0x2800); /**设置FSELECT位为0,设置FSELECT位为1,即使用频率寄存器1的值,芯片进入工作状态,频率寄存器1输出波形**/
write_ad9833_d16(0x93E3); //L14选择频率寄存器1的低14位输入
write_ad9833_d16(0x8001); //H14 频率寄存器1为2KHz
write_ad9833_d16(0x2000); //设置FSELECT位为0,芯片进入工作状态,频率寄存器0输出1KHz正弦波形
Phs_data=Phase|0xC000;
/*****************************************************************************/
if(frequence_SFR==0) //把数据设置到设置频率寄存器0
write_ad9833_d16(0x0100); //复位AD9833,即RESET位为1
write_ad9833_d16(0x2100); //选择数据一次写入,B28位和RESET位为1
write_ad9833_d16(frequence_LSB); //L14,选择频率寄存器1的低14位输入
frequence_LSB=frequence_LSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位
frequence_MSB=frequence_hex>>14; //frequence_hex高16位送给frequence_HSB
frequence_MSB=frequence_MSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档