51单片机制作的波形发生器

合集下载

基于51单片机的波形发生器设计

基于51单片机的波形发生器设计

课题要求:目录:1、系统总体设计方案规划与选定…………………………………2、硬件设计…………………………………………………………3、软件设计………………………………………………………….4、调试……………………………………………………………….5、新增功能及实现方法……………………………………………6、总结与体会………………………………………………………7、参考文献…………………………………………………………8、附录(源程序代码、电路图等)………………………………一. 系统总体设计方案规划与选定本次设计采用AT89C51单片机为核心,通过与8279芯片和38译码器、锁存器的配合实现对键盘状态的检测和LED 显示的控制,通过D/A 转换器和运算放大器以及示波器实现对波形的输出,并且在8位LED 显示器上显示波形类型的代号、幅值、频率。

键盘为4*8键盘,通过键盘摁键实现对波形种类、幅值、频率等的调节。

图1. 总体方案结构框图二.硬件设计硬件的选择对于功能的实现非常重要,我们要了解芯片的功能、性能,根据题目要求选择合适的芯片。

(一)硬件介绍1.单片机选择AT89C51。

AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM ,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。

同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。

空闲方式停止CPU的工作,但允许RAM ,定时/计数器,串行通信口及中断系统继续工作。

掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。

AT89C51具有优良的性能,符合题目的要求。

图2. AT89C51引脚图引脚说明:P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P0口的管脚第一次写1时,被定义为高阻输入。

基于51单片机的波形发生器的设计讲解

基于51单片机的波形发生器的设计讲解

目录1 引言 (1)1.1 题目要求及分析 (1)1.1.1 示意图 (1)1.2 设计要求 (1)2 波形发生器系统设计方案 (2)2.1 方案的设计思路 (2)2.2 设计框图及系统介绍 (2)2.3 选择合适的设计方案 (2)3 主要硬件电路及器件介绍 (4)3.1 80C51单片机 (4)3.2 DAC0832 (5)3.3 数码显示管 (6)4 系统的硬件设计 (8)4.1 硬件原理框图 (8)4.2 89C51系统设计 (8)4.3 时钟电路 (9)4.4 复位电路 (9)4.5 键盘接口电路 (10)4.7 数模转换器 (11)5 系统软件设计 (12)5.1 流程图: (12)5.2 产生波形图 (12)5.2.1 正弦波 (12)5.2.2 三角波 (13)5.2.3 方波 (14)6 结论 (16)主要参考文献 (17)致谢....................................................... 错误!未定义书签。

1引言1.1题目要求及分析题目:基于51单片机的波形发生器设计,即由51单片机控制产生正弦波、方波、三角波等的多种波形。

1.1.1示意图图1:系统流程示意图1.2设计要求(1) 系统具有产生正弦波、三角波、方波三种周期性波形的功能。

(2) 用键盘控制上述三种波形(同周期)的生成,以及由基波和它的谐波(5次以下)线性组合的波形。

(3) 系统具有存储波形功能。

(4) 系统输出波形的频率范围为1Hz~1MHz,重复频率可调,频率步进间隔≤100Hz,非正弦波的频率按照10次谐波来计算。

(5) 系统输出波形幅度范围0~5V。

(6) 系统具有显示输出波形的类型、重复频率和幅度的功能。

2波形发生器系统设计方案设计并制作一个波形信号发生器,能够产生正弦波、方波、三角波的波形,其中不使用DDS和一些专用的波形产生芯片。

并让系统的频率范围在1Hz~1MHZ可调节,在频率范围在1HZ~10KHz时,步进小于或等于10Hz,在频率范围在10KHz~1MHz时,步进小于或等于100Hz,并且电压在0~5V范围,能够实时的显示波形的类型、频率和幅值。

基于51单片机的示波器

基于51单片机的示波器

51单片机波形发生器(本程序适用)其中独立按键1、2、3、4按下时会产生四个不同波形(矩形、三角波、梯形波、正弦波)主函数:Main.c#include <reg52.h>#include "i2c.h"#define AddWr 0x90 //写数据地址#define AddRd 0x91 //读数据地址/*unsigned char code tab[]={0,25,50,75,100,125,150,175,200,225,250 //表格数值越多,波形越平滑};*/unsigned char code tab1[]={0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250};unsigned char code juchi[64]={0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,12 1,125,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,23 5,239,243,247,251,255};unsigned char code sin[64]={135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,2 43,237,230,222,213,204,193,182,170,158,146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,1 02,114,128};unsigned char code sanjiao[64]={0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64, 56,48,40,32,24,16,8,0};unsigned char code tixing[64]={0,13,26,39,52,65,78,91,104,117,130,143,156,169,182,195,208,221,234,247,247,247,247,247,247, 247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,242,229,216,203,190,177,164,151,138,125,112,99,86,73,60,47,34,2 1,8};unsigned char code juxing[64]={255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,25 5,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};extern bit ack;bit WriteDAC(unsigned char dat,unsigned char num);/*------------------------------------------------主程序------------------------------------------------*/main(){unsigned char i;while (1) //主循环{// for(i=0;i<26;i++)// WriteDAC(tab1[i],1);while(P1==0xff){for(i=0;i<64;i++)WriteDAC(juxing[i]*6/10,1);if(P1!=0xff)break;}while(P1==0xfe){for(i=0;i<64;i++)WriteDAC(tixing[i]*6/10,1);if(P1!=0xfe)break;}while(P1==0xfd){for(i=0;i<64;i++)WriteDAC(sanjiao[i]*6/10,1);if(P1!=0xfd)break;}while(P1==0xfb){for(i=0;i<64;i++)WriteDAC(sin[i]*6/10,1);if(P1!=0xfb)break;}while(P1==0xf7){for(i=0;i<64;i++)WriteDAC(juchi[i]*6/10,1);if(P1!=0xf7)break;}}}/*------------------------------------------------写入DA转换数值输入参数:dat 表示需要转换的DA数值,范围是0-255 ------------------------------------------------*/bit WriteDAC(unsigned char dat,unsigned char num) { unsigned char i;Start_I2c(); //启动总线SendByte(AddWr); //发送器件地址if(ack==0)return(0);SendByte(0x40); //发送器件子地址if(ack==0)return(0);for(i=0;i<num;i++){SendByte(dat); //发送数据if(ack==0)return(0);}Stop_I2c();}IIC协议:IIC.C#include "i2c.h"#define _Nop() _nop_() //定义空指令bit ack; //应答标志位sbit SDA=P2^1;sbit SCL=P2^0;/*------------------------------------------------启动总线------------------------------------------------*/void Start_I2c(){SDA=1; //发送起始条件的数据信号_Nop();SCL=1;_Nop(); //起始条件建立时间大于4.7us,延时_Nop();_Nop();_Nop();_Nop();SDA=0; //发送起始信号_Nop(); //起始条件锁定时间大于4μ_Nop();_Nop();_Nop();_Nop();SCL=0; //钳住I2C总线,准备发送或接收数据_Nop();_Nop();}/*------------------------------------------------结束总线------------------------------------------------*/void Stop_I2c(){SDA=0; //发送结束条件的数据信号_Nop(); //发送结束条件的时钟信号SCL=1; //结束条件建立时间大于4μ_Nop();_Nop();_Nop();_Nop();_Nop();SDA=1; //发送I2C总线结束信号_Nop();_Nop();_Nop();}/*----------------------------------------------------------------字节数据传送函数函数原型: void SendByte(unsigned char c);功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使ack=0 假)发送数据正常,ack=1; ack=0表示被控器无应答或损坏。

51单片机——增强型PWM,使用自带PWM发生器

51单片机——增强型PWM,使用自带PWM发生器

51单片机——增强型PWM,使用自带PWM发生器0. 序之前用定时器做了模拟PWM输出,得到的1k左右波形还行,到10k往上波形就特别难看,又是跳变又是长短不一。

后来在参考手册上面看到stc15w4k系列自带pwm波形发生器,于是整了好久写出来了。

今天因为业务需求要改代码,回头一看,好家伙,都不知道自己写的啥了。

看了一会儿想起来,于是有了此文。

1. 简介如图,如下介绍,他直接把PWM输出到IO口上面,我使用的是这两个,于是就用了PWM3和PWM2_2两个。

2. 分析占坑,今天还要重构代码,改很多东西,暂时不分析了(2021.6.2)。

3. 代码代码比较简单,我是照着这个写的,XDM自己去瞅瞅啊,我当时看了一早上才看明白。

1.#include <STC15.H> //52头文件2.#include <PWM.H>3.4.u8 Tcount=0; //一个PWM周期内的:周期计数,占空比,方向5.sbit PWM = P2^1;//PWM4口6.sbit PWM2 = P2^7; //PWM2口7.sbit NPWM1 =P5^4; //关闭PWM异常口8.sbit NPWM2 =P5^4; //关闭PWM异常口9.void setPWMWide(u8 Wide); //设置脉宽10.11.#define CYCLE 0x800L//5khz //定义PWM周期(最大值为32767)12.#define DUTY1 20 //定义占空比为20%13.#define DUTY2 30 //定义占空比为30%14.#define DUTY3 50 //定义占空比为50%15.16.//主函数17.void InitPWM()18.{19.InterruptInit();//初始化中断配置20.}21.22.void setPWMWide(u8 Wide)23.{24.P_SW2 |= 0x80; //使能访问XSFR25.PWMIF=0x00;26.PWMFDCR = 0x00; //关闭PWM异常检测,P5.4和P5.5在IIC中使用,如果不关闭会一直进入异常导致无法设置PWM占空比27.PWMCFG = 0x00; //配置PWM的输出初始电平为低电平28.PWMCKS = 0x00; //选择PWM的时钟为Fosc/(0+1)29.PWMC = CYCLE; //设置PWM周期30.31.//板子PWM4 芯片PWM2_2 P2.732.// PWM2T1 = 0x0000; //设置PWM2第1次反转的PWM计数33.// PWM2T2 = CYCLE * DUTY / 100; //设置PWM2第2次反转的PWM计数34.PWM2T1 = 0x0000; //设置PWM2第1次反转的PWM计数35.PWM2T2 = CYCLE * (Wide) / 100; //设置PWM2第2次反转的PWM计数36.PWM2CR |= 0x08; //选择PWM2输出到P2.7,不使能PWM2中断37.38.PWM3T1 = 0x0000; //设置PWM2第1次反转的PWM计数39.PWM3T2 = CYCLE * (Wide) / 100; //设置PWM2第2次反转的PWM计数40.//占空比为(PWM2T2-PWM2T1)/PWMC41.PWM3CR = 0; //选择PWM2输出到P2.142.43.//使能44.PWMCR = 0x03; //使能PWM信号输出45.PWMCR |= 0x80; //使能PWM模块46.P_SW2 &= ~0x80;47.48.}49.50.void SetPWM(u8 level) //设置风扇等级 1 2 3 4是自动不用管风速51.{52.// PutChar(speedFlag);53.if(level==1) //1是9.8k54.{55.setPWMWide(DUTY1);56.}57.else if(level==2)58.{59.setPWMWide(DUTY2);60.}61.else if(level==3)62.{63.setPWMWide(DUTY3);64.}65.66.}67.68.69.//中断初始化配置70.void InterruptInit()71.{72.73.P2M1 &= 0<<1; //PWM4 P2.1 设置推挽74.P2M0 |= 1<<1;75.P2M1 &= 0<<7; //PWM4 P2.7 设置推挽76.P2M0 |= 1<<7;77.78.PWM=0;79.PWM2=0;80.81.P_SW2 |= 0x80; //使能访问XSFR82.PWMIF=0x00;83.PWMFDCR = 0x00; //关闭PWM异常检测,P5.4和P5.5在IIC中使用,如果不关闭会一直进入异常导致无法设置PWM占空比84.PWMCFG = 0x00; //配置PWM的输出初始电平为低电平85.PWMCKS = 0x00; //选择PWM的时钟为Fosc/(0+1)86.PWMC = CYCLE; //设置PWM周期87.88.//板子PWM4 芯片PWM2_2 P2.789.PWM2T1 = 0x0000; //设置PWM2第1次反转的PWM计数90.PWM2T2 = CYCLE * DUTY1 / 100; //设置PWM2第2次反转的PWM计数91.//占空比为(PWM2T2-PWM2T1)/PWMC92.PWM2CR |= 0x08; //选择PWM2输出到P2.7,不使能PWM2中断93.94.//板子PWM2 芯片PWM3 P2.195.PWM3T1 = 0x0000; //设置PWM2第1次反转的PWM计数96.PWM3T2 = CYCLE * DUTY1 / 100; //设置PWM2第2次反转的PWM计数97.//占空比为(PWM2T2-PWM2T1)/PWMC98.PWM3CR = 0; //选择PWM2输出到P2.199.100.//使能101.PWMCR = 0x03; //使能PWM信号输出102.PWMCR |= 0x80; //使能PWM模块103.P_SW2 &= ~0x80;104.105.}。

51单片机制作的波形发生器

51单片机制作的波形发生器

51单片机制作的波形发生器相信很多朋友都可能接触到一个波型发生器的制作,可能刚刚入门,做的东西也不会说是很复杂。

可能就一个矩形波,或者是三角波。

但是网上的很多资料是忽悠人的,就此,我也提供一个比较完整的波型发生器 C51 原代:该系统的软件比较典型:包括键盘的应用,显示的应用和 DA 转换器的应用。

本设计中,输出的波形有三种:正弦波,方波,三角波。

方波的输出最为简单,只要按照设定的周期值将输出的电压改变即可。

三角波的输出也比较简单,单片机的输出只要完成数字量递增和递减交替进行即可。

、正弦波的输出最麻烦,如果在软件中计算出输出的各点电压值,将会浪费很多的 CPU 时间,以至于无法满足频率的要求。

通常最简单的方法是通过手动的方法计算出输出各点的电压值,然后在编写程序时以数组的方式给出。

当需要时,只要按照顺序进行输出即可。

这种方法比运算法速度快且曲线的形状修改灵活。

在本设计中将 360 度分为 256 个点,则每两个点之间的间隔为1.4 度,然后计算出每个点电压对应的数字量即可。

只要反复输出这组数据到 DAC0832, 就可以在系统输出端得到想要的正弦波。

具体程序如下:#include ;#define uchar unsigned char#define uint unsigned int#define DAdata P0uchar code Sinetab[256]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xab,0xad,0xaf,0xb1,0xb2,0xb4,0xb6,0xb7,0xb9,0xba,0xbc,0xbd,0xbf,0xc0,0xc1,0xc3,0xc4,0xc5,0xc6,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xce,0xcf,0xd0,0xd1,0xd1,0xd2,0xd2,0xd3,0xd3,0xd3,0xd2,0xd2,0xd1,0xd1,0xd0,0xcf,0xce,0xce,0xcd,0xcc,0xcb,0xca,0xc9,0xc8,0xc6,0xc5,0xc4,0xc3,0xc1,0xc0,0xbf,0xbd,0xbc,0xba,0xb9,0xb7,0xb6,0xb4,0xb2,0xb1,0xaf,0xad,0xab,0xaa,0xa8,0xa6,0xa4,0xa2,0xa0,0x9e,0x9c,0x9a,0x98,0x96,0x94,0x92,0x90,0x8e,0x8c,0x8a,0x88,0x86,0x84,0x82, 0x80,0x7d,0x7b,0x79,0x77,0x75,0x73,0x71, 0x6f,0x6d,0x6b,0x69,0x67,0x65,0x63,0x61, 0x5f,0x5d,0x5b,0x59,0x57,0x55,0x54,0x52, 0x50,0x4e,0x4d,0x4b,0x49,0x48,0x46,0x45, 0x43,0x42,0x40,0x3f,0x3e,0x3c,0x3b,0x3a, 0x39,0x37,0x36,0x35,0x34,0x33,0x32,0x31, 0x31,0x30,0x2f,0x2e,0x2e,0x2d,0x2d,0x2c, 0x2c,0x2b,0x2b,0x2b,0x2b,0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2b, 0x2c,0x2c,0x2d,0x2d,0x2e,0x2e,0x2f,0x30, 0x31,0x31,0x32,0x33,0x34,0x35,0x36,0x37, 0x39,0x3a,0x3b,0x3c,0x3e,0x3f,0x40,0x42, 0x43,0x45,0x46,0x48,0x49,0x4b,0x4d,0x4e, 0x50,0x52,0x54,0x55,0x57,0x59,0x5b,0x5d, 0x5f,0x61,0x63,0x65,0x67,0x69,0x6b,0x6d, 0x6f,0x71,0x73,0x75,0x77,0x79,0x7b,0x7d, };uchar code Triangletab[58]={0x1a,0x21,0x28,0x2f,0x36,0x3d,0x44,0x4b, 0x52,0x59,0x60,0x67,0x6e,0x75,0x7c,0x83,0x8a,0x91,0x98,0x9f,0xa6,0xad,0xb4,0xbb,0xc2,0xc9,0xd0,0xd7,0xde,0xe5,0xde,0xd7,0xd0,0xc9,0xc2,0xbb,0xb4,0xad,0xa6,0x9f,0x98,0x91,0x8a,0x83,0x7c,0x75,0x6e,0x67,0x60,0x59,0x52,0x4b,0x44,0x3d,0x36,0x2f,0x28,0x21,};uchar code Squaretab[2]={0x56,0xaa};uchar code disp1[]={&quot;Sine Wave &quot;&quot;Triangle Wale &quot;&quot;Square Wave &quot;};uchar idata disp2[16]={&quot;Frequency:Hz&quot;};uchar code Coef[3]={10,100,200};uchar idata WaveFre[3]={1,1,1};uchar code WaveTH[]={0xfc,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xfc,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, };uchar code WaveTL[]={0xf2,0x78,0xfb,0x3c,0x63,0x7d,0x8f,0x9d,0xa8,0xb1, 0x17,0x0b,0xb2,0x05,0x37,0x58,0x70,0x82,0x90,0x9b, 0x4d,0xa7,0xc4,0xd3,0xdc,0xe2,0xe6,0xea,0xec,0xee };uchar Wavecount,THtemp,TLtemp;uchar Waveform;sbit rs=P2^5;sbit rw=P2^6;sbit e=P2^7;sbit DA=P2^0;sbit KEY=P3^2;void delay(uchar i){uchar j;for(;i>;0;i--)for(j=20;j>;0;j--);}void busy(){uchar temp;temp=0x00;rs=0;rw=1;while((temp&0x80)==0x80) {P0=0xff;e=1;temp=P0;e=0;}}void WR_Com(uchar temp) {busy();rs=0;rw=0;P0=temp;e=1;e=0;}void WR_Data(uchar num){busy();rs=1;rw=0;P0=num;e=1;e=0;}void disp_lcd(uchar addr,uchar *temp1) {uchar i;WR_Com(addr);delay(100);for(i=0;i;0;i--){P0=0x30;rs=0;rw=0;e=1;e=0;delay(100);P0=0x38;rs=0;rw=0;e=1;e=0;delay(100);}void lcd_Reset(){WR_Com(0x01);delay(100);WR_Com(0x06);delay(100);WR_Com(0x0c);delay(100);}void SineOUT(uchar Wavecount) {DAdata=Sinetab[Wavecount++]; Wavecount=0;DA=0;}void TriangleOUT(uchar Wavecount) {DAdata=Triangletab[Wavecount++]; if(Wavecount>;57)Wavecount=0;DA=0;DA=1;}void SquareOUT(uchar Wavecount) {DAdata=Squaretab[Wavecount++];if(Wavecount>;1)Wavecount=0;DA=0;DA=1;}void timer() interrupt 1{TH0=THtemp;TL0=THtemp;if(Waveform==0)SineOUT(Wavecount); else if(Waveform==1)TriangleOUT(Wavecount); else if(Waveform==2)SquareOUT(Wavecount); }void key_int() interrupt 0 {uchar keytemp,keytemp1;uint WaveCoef;EA=0;TR0=0;keytemp1=0;delay(10);while(!KEY);keytemp=~P2&0x1e; keytemp>;>;=1;while(keytemp!=8){keytemp=~P2&0x1e;keytemp>;>;=1;if(keytemp!=keytemp1){keytemp1=keytemp;switch(keytemp){case 1:if(++Waveform==3)Waveform=0;break;case 2:if(++WaveFre[Waveform]==11)WaveFre[Waveform]=1;break;case 4:if(--WaveFre[Waveform]==0)WaveFre[Waveform]=10;break;}THtemp=WaveTH[Waveform*16+(WaveFre[Waveform]-1)]; TLtemp=WaveTL[Waveform*16+(WaveFre[Waveform]-1)];WaveCoef=WaveFre[Waveform]*Coef[Waveform]; disp2[13]=WaveCoef%10+0x30;WaveCoef/=10;disp2[12]=WaveCoef%10+0x30;WaveCoef/=10;disp2[11]=WaveCoef%10+0x30;WaveCoef/=10;disp2[10]=WaveCoef%10+0x30;WaveCoef/=10;disp_lcd(0x80,&disp1[Waveform*16]);disp_lcd(0xc0,disp2);}}TH0=THtemp;TL0=THtemp;Wavecount=0;TR0=1;}void main(){uint WaveCoef;uchar i;lcd_ini();lcd_Reset();WaveCoef=WaveFre[Waveform]*Coef[Waveform]; disp2[13]=WaveCoef%10+0x30;WaveCoef/=10;disp2[12]=WaveCoef%10+0x30;WaveCoef/=10;disp2[11]=WaveCoef%10+0x30;WaveCoef/=10;disp2[10]=WaveCoef%10+0x30;WaveCoef/=10;disp_lcd(0x80,&disp1[Waveform*16]);disp_lcd(0xc0,disp2);i=0;DAdata=0x00;DA=0;TMOD=0x01;IT0=1;ET0=1;EX0=1;EA=1;while(1);}。

基于51单片机的波形发生器的设计

基于51单片机的波形发生器的设计

基于51单片机的波形发生器的设计引言:波形发生器是一种可以生成特定频率、特定波形的电子设备。

它广泛应用于科研、教学和产业生产等领域,可以用于信号发生、信号测试、信号仿真等各种任务。

本文将介绍一个基于51单片机的波形发生器的设计方案。

一、系统硬件设计1.系统框架该波形发生器系统采用51单片机作为主控芯片,主要包括三个部分:信号生成模块、显示模块和控制模块。

其中,信号生成模块负责产生各种特定频率、特定波形的信号;显示模块用于展示信号参数等相关信息;控制模块负责接收用户输入并对波形发生器进行控制。

2.硬件连接信号生成模块与主控芯片之间通过I/O接口相连,用于传输数据和控制信号。

显示模块通过串口与主控芯片相连,用于显示相关信息。

控制模块通过按键、旋钮等输入设备与主控芯片相连,用于接收用户输入。

二、系统软件设计1.系统初始化在系统初始化阶段,主控芯片需要完成引脚、定时器、串口等相关资源的初始化工作。

同时,还需要设置一些全局变量和参数的初始值。

2.信号生成模块信号生成模块通过定时器产生特定频率的时钟信号,并根据用户输入的参数生成相应的信号波形。

主控芯片利用定时器中断函数进行波形生成,并将生成的信号数据存放在缓冲区中。

3.显示模块显示模块负责将信号波形显示在液晶屏上,并显示相关参数,如频率、幅度等。

主控芯片将信号数据从缓冲区中读取,并通过串口发送给显示模块进行显示。

4.控制模块控制模块负责接收用户输入的控制指令,并通过按键、旋钮等输入设备完成用户交互。

主控芯片通过中断函数实时读取用户输入并进行相应的控制操作。

三、系统功能设计1.频率设置功能用户可以通过控制模块设置波形发生器的频率,可以选择固定频率或者可调频率。

利用定时器时钟频率与定时器中断的时间间隔来控制波形的频率。

2.波形选择功能用户可以通过控制模块选择不同的波形类型,如正弦波、方波、三角波、脉冲波等。

主控芯片根据用户指令设置波形参数,并生成相应的波形信号。

(完整版)51单片机毕业课程设计波形发生器

(完整版)51单片机毕业课程设计波形发生器

河南理工大学《单片机应用与仿真训练》设计报告多功能信号发生器设计姓名:王彦凯王翱翔专业班级:电仪09-03指导老师:王莉所在学院:电气工程与自动化学院2012年6月25 日摘要本设计是多功能信号发生器,以 AT89S52 单片机为核心,通过按键输入控制输出信号的类型、频率和幅值,采用 DA 转换芯片DAC0832输出相应的波形,同时以LED 显示器进行实时显示信号相关信息。

我们采用 C 语言进行编程,可实现100-1Khz的方波,锯齿波,三角波和正弦波四种波形的产生,且波形的频率、幅值可通过按键调节,并显示在数码管上。

而且,波形的幅值还可通过电位器实现无极调幅,增加了可选幅值范围。

经测试该设计方案线路优化,结构紧凑,性能优越,满足设计要求。

关键字:单片机AT89S52,DAC0832,信号发生器目录第1章概述 (1)1.1选题背景及其意义 (1)1.2 单片机概述 (1)1.3 信号发生器分类 (1)1.4 研究题目及其意义 (2)第2章信号发生器方案设计与选择 (3)2.1 方案的设计与选择 (3)2.2 设计原理简介 (3)2.3 设计功能 (5)第3章主要电路元器件介绍 (6)3.1 AT89S52单片机简介 (6)3.1.1 单片机简介 (6)3.1.2主要性能 (6)3.1.3 管脚功能说明 (7)3.2 DAC0832简介 (8)3.2.1 DAC0832的主要特性参数 (8)3.2.3 DAC0832工作方式 (9)3.3 数码显示管 (10)3.3.1 原理及分类 (10)3.3.2 显示器的工作方式 (10)3.3.3 数码管字型码 (11)第4章单元电路的硬件设计 (12)4.1 硬件原理框图 (12)4.2 单片机 AT89S52 系统的设计 (12)4.3 时钟电路 (13)4.4复位电路 (13)4.5数码管电路 (14)4.6 DAC0832模数转换电路 (15)4.7 LM324运放电路和低通滤波电路 (16)4.8 按键和波形指示LED电路 (17)第5章系统软件设计 (18)5.1软件开发环境简介 (18)5.1.1 Keil uVision4简介 (18)5.1.2 Proteus7.10 简介 (19)5.1.3 Keil 与Proteus 联合调试仿真 (19)5.2主程序 (20)5.3按键处理程序 (21)5.4 数码管输出程序分析 (22)5.5 各种波形产生思路 (22)5.5.1 方波产生思路 (22)5.5.3 三角波产生思路 (23)5.5.4 正弦波产生思路 (23)5.6 仿真的各种波形效果 (23)第6章课程设计体会 (24)参考文献 (25)致谢 (26)附1:源程序代码 (27)1.主程序 (27)2.头文件 (27)附 2:系统原理图 (31)附 3:实物效果图 (32)第1章概述1.1选题背景及其意义信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。

基于51单片机的波形发生器设计报告

基于51单片机的波形发生器设计报告

基于51单片机的波形发生器设计报告波形发生器是一种电子设备,用于产生各种不同类型和频率的电信号波形。

基于51单片机的波形发生器设计是一种常用的工程设计。

下面是一个关于基于51单片机的波形发生器设计的报告,详细介绍了设计的原理、步骤、电路、程序和性能。

一、设计原理:二、设计步骤:1.确定波形发生器的输出频率范围和分辨率要求。

2.选择适当的定时器/计数器模块来实现频率的计时和控制。

3.设计电路,包括定时器/计数器模块、晶振、滤波电路和输出接口等。

4.编写程序,配置定时器/计数器模块的工作模式、计数值和中断服务程序。

5.调试和测试电路和程序,确保波形发生器正常工作并满足设计要求。

三、电路设计:1.定时器/计数器模块:选择一个合适的定时器/计数器模块,如51单片机的定时器/计数器T0或T1、根据设计要求,设置工作模式、计数器模式和计数值。

2.晶振:选择适当的晶振频率,一般为11.0592MHz,将晶振连接到单片机的晶振引脚。

3.滤波电路:根据需要,设计一个滤波电路来滤除不需要的高频噪声和杂散信号。

4.输出接口:设计一个输出接口电路来连接单片机和外部电路,使用电平转换电路将单片机的低电平(0V)输出转换为所需的电平电压。

四、程序设计:1.配置定时器/计数器模块的工作模式和计数值,设置中断服务程序。

2.在中断服务程序中,根据设计要求生成矩形波信号,并将信号输出到输出端口。

3.在主程序中,初始化单片机和定时器/计数器模块,使波形发生器开始工作。

4.在主循环中,可以设置按键输入来改变输出频率,通过调整计数值来实现不同的频率输出。

五、性能评估:1.输出频率范围:根据设计要求,测试波形发生器的最低和最高输出频率是否在设计范围内。

2.分辨率:对于指定频率范围,测试波形发生器的输出频率的分辨率,即最小可调节的频率。

3.稳定性:测试波形发生器的输出信号的稳定性和准确度,是否有漂移和偏差。

4.噪声:测试波形发生器的输出信号是否有杂散噪声和幅度波动。

基于51单片机的多功能波形发生器设计

基于51单片机的多功能波形发生器设计

基于51单片机的多功能波形发生器设计1.设计目的与任务《电子信息工程专业方向》课程设计是一项重要的实践性教育环节,是学生在完成本专业所有课程学习后必须接受的一项结合本专业方向的、系统的、综合的工程训练。

在教师指导下,运用工程的方法,通过一个较复杂课题的设计练习,可使学生通过综合的系统设计,熟悉设计过程、设计要求、完成的工作内容和具体的设计方法,掌握必须提交的各项工程文件。

其基本目的是:培养理论联系实际的设计思想,训练综合运用电路设计和有关先修课程的理论,结合生产实际分析和解决工程实际问题的能力,巩固,加深和扩展有关电子类方面的知识。

通过课程设计,应能加强学生如下能力的培养:(1)自身的独立工作能力和创造力;(2)综合运用专业及基础知识,解决实际工程技术问题的能力;(3)查阅图书数据、产品手册和各种工具书的能力;(4)工程绘图的能力;(5)编写技术报告和编制技术资料的能力;2.设计指标与技术要求(1)借助现有的单片机系统;(2)能产生正弦波、方波、三角波、锯齿波等波形;(3)各种波形频率可调,频率范围为100-3000Hz;(4)正弦波输出电压为5V峰峰值,方波、三角波、锯齿波输出电压为5V (5)采用8位D/A转换器;(6)进行硬件平滑滤波;(7)编写程序并调试;(8)提供程序清单;。

(9)能实物演示3.总体设计图1.1所示是基于单片机的多波形发生器的总体设计流程图。

图1.1 总体设计流程图3.1总体设计功能说明:根据设计要求,分析得本次设计需要硬件和软件两部分。

硬件上,如图。

键盘输入部分主要用于选择波形。

键盘共设4个键,用于选择三角波、矩形波、锯齿波、正弦波4种不同的波形,。

89C51单片机用来执行某一波形发生程序,向D/A转换器的输入端发送数据,将其转化成模拟量,并通过运算放大器调节波形的幅值,经过滤波器的滤波,从而在输出端得到所需的波形。

软件上,如图。

可由硬件设计好后,再根据要求进行具体编写。

C51单片机的波形发生器

C51单片机的波形发生器

通信专业技能实训报告题目基于Proteus的波形发生器设计学院信息科学与工程学院专业通信工程班级学生学号指导教师魏长智二〇一九年一月五日济南大学通信专业技能实训报告目录1 前言 ...................................................................................................................... - 1 -2 硬件设计 .............................................................................................................. - 2 -2.1 启动方式选择 ........................................................................................... - 2 -2.2 框图设计 ................................................................................................... - 2 -2.3 电路图设计 ............................................................................................... - 3 -3 DAC0832性能与特征........................................................................................ -4 -3.1 D/A转换器与单片机接口探究 .............................................................. - 4 -3.1.1 数据线连接 .................................................................................... - 4 -3.1.2 地址线连接 .................................................................................... - 4 -3.1.3 控制线连接 .................................................................................... - 4 -3.2 DAC0832的认识..................................................................................... - 5 -3.2.1 DAC0832的结构.......................................................................... - 5 -3.2.2 DAC0832的引脚.......................................................................... - 6 -3.2.3 DAC0832的启动控制方式.......................................................... - 7 -4 程序设计 .............................................................................................................. - 8 -4.1 程序流程图 ............................................................................................... - 8 -4.1.1 程序设计思路 ................................................................................ - 8 -4.1.2流程图 .............................................................................................. - 8 -4.2 用C语言实现 .......................................................................................... - 10 -5 Proteus仿真及结果 .......................................................................................... - 13 -5.1方波: ....................................................................................................... - 13 -5.2正弦波: ................................................................................................... - 14 -5.3三角波: ................................................................................................... - 15 -5.4梯形波: ................................................................................................... - 16 -5.5锯齿波: ................................................................................................... - 17 -实训结语: ............................................................................................................ - 18 -参考文献 ................................................................................................................ - 19 -1 前言波形发生器也称函数发生器,作为实验信号源,是现今各种电子电路实验设计应用中必不可少的仪器设备之一。

基于51单片机汇编程序波形发生器实训报告

基于51单片机汇编程序波形发生器实训报告

单片机实训报告(波形发生器)一、设计方案(1)、硬件基本设计思路本设计方案采用8051单片机和DAC0832将数字信号转化成模拟信号,并通过LM324运算放大器将信号进行处理,最终得到各种波形。

其中,波形的切换采用矩阵键盘通过外部中断0来实现。

(2)、软件基本设计思路首先,将基本波形通过程序进行编写,并调试成功;其次,再编写按键扫描子程序;最后,将按键程序放入中断中,并进行整体调试,直到调通为止。

(3)、程序说明略二、原理图波形发生器原理图三、程序JUCHI E QU 50HSANJI EQU 51HFANGB EQU 52HTIXIN EQU 53HKU EQU 55HORG 0000H ;程序入口AJMP MAIN ;指向主程序ORG 0003H ;主程序入口地址AJMP INTT0 ;指向按键中断程序ORG 0030H ;中断程序入口地址MAIN: ;主程序MOV P2,#00H ;将P2口初始化为0SETB EA ;开总中断SETB EX0 ;开启外部中断0SETB IT0 ;将外部中断0设置为下降沿有效MOV DPTR,#00FFH ;设置输入寄存器地址MOV JUCHI,#00H ;初始化MOV SANJI,#00HMOV FANGB,#00H;***************************************************START:MOV A,KU ;将键码送累加器ACJNE A,#00H,W1 ;将累加器A和00H比较,如果相等,则00键按下顺序执行,否则跳到W1再判断01键是否按下MOV SANJI,#00H ;屏蔽其他波形MOV FANGB,#00HMOV TIXIN,#00HAJMP JCB ;跳转到锯齿波形W1: CJNE A,#01H,W2 ;判断01键是否按下MOV JUCHI,#00H ;屏蔽其他波形MOV FANGB,#00HMOV TIXIN,#00HAJMP SJB ;跳转到三角波形W2: CJNE A,#02H,W3 ;判断02键是否按下MOV TIXIN,#00HMOV JUCHI,#00H ;屏蔽其他波形MOV SANJI,#00HAJMP FB ;跳转到方波W3: CJNE A,#03H,W4 ;判断03键是否按下,没有按下,跳转回去继续循环扫描MOV JUCHI,#00H ;屏蔽其他波形MOV FANGB,#00HAJMP TXB ;跳转到梯形波W4: AJMP START;**********************************************INTT0: ;中断程序;***********键盘扫描子程序KEY*****************KEY: ACALL KS ;调按键查询子程序,判断是否有键按下JNZ K1 ;有键按下,转移 WEI1跳转ACALL DELAY ;无键按下,调延时程序去抖AJMP K4 ;继续查询按键;***********键盘逐列扫描程序***********************************K1: ACALL DELAYACALL KS ;再次判别是否有键按下JNZ K2 ;有键按下,转移AJMP K4K2: MOV R3,#0FEH ;首列扫描字送R3MOV R4,#00H ;首列号送R4K3: MOV A,R3MOV P2,A ;列扫描字送P2口MOV P1,#0FFH ;初始化P1口MOV A,P1 ;读取行扫描值JB ACC.0,L1 ;第零行无键按下转查第一行为1跳转MOV A,#00H ;第零行有键按下,行首键号送AAJMP LK ;转求键号L1: JB ACC.1,NEXT ;第一行无键按下,转查下一列MOV A,#03HAJMP LK ;键扫描结束,返回;************************************************************NEXT:INC R4 ;修改列号MOV A,R3JNB ACC.2,KEY ;三列扫描完返回按键查询状态RL A ;未扫描完,改为下列扫描字MOV R3,A ;扫描字暂存R3AJMP K3 ;转列扫描程序LK: ADD A,R4 ;形成键码送AMOV KU,APUSH ACC ;键码入栈保护;**********************************************K4:ACALL KS ;等待键释放JNZ K4POP ACC ;键释放,弹栈送ARETI ;中断返回;**********按键查询子程序**************************************KS: ;MOV A,#00HMOV P2,#00H ;全扫描字送p2口MOV P1,#0FFHMOV A,P1 ;读入P1口状态CPL A ;变正逻辑,高电平表示有键按下ANL A,#0FH ;屏蔽高四位RET ;子程序返回;****************锯齿波***********************JCB:MOV A,JUCHI ;转换初值WW: MOVX @DPTR,A ;D/A转换INC A ;A自加1NOP ;延时CJNE A,#255,WW ;判断A是否加到255,若没有返回到WW继续加MOV JUCHI,AAJMP START;******************三角波********************SJB:MOV A,SANJI ;转换初值EE: MOVX @DPTR,A ;D/A转换INC ANOPCJNE A,#255,EEDEC AQQ: MOVX @DPTR,ADEC ANOPCJNE A,#00,QQMOV SANJI,AAJMP START;******************方波********************* FB:MOV A,FANGBMOVX @DPTR,AACALL DELAY3ACALL DELAY3CPL AMOVX @DPTR,AACALL DELAY3ACALL DELAY3MOV FANGB,APOP ACCAJMP START;***************梯形波**********************TXB:MOV A,TIXINSS: MOVX @DPTR,AINC AACALL DELAY3CJNE A,#255,SSACALL DELAY3ACALL DELAY3DEC AZZ: MOVX @DPTR,ADEC AACALL DELAY3CJNE A,#00,ZZACALL DELAY3ACALL DELAY3MOV TIXIN,AAJMP START;*******************************************************1ms DELAY3: MOV R0,#7DHDEL7: NOPNOPDJNZ R0,DEL7RET;*******************************************50毫秒延时子程序DELAY2: MOV R0,#05DEL5: MOV R1,#10DEL4: MOV R2,7DHDEL3: NOPNOPDJNZ R2,DEL3DJNZ R1,DEL4DJNZ R0,DEL5RET;******************************************END四、实训总结通过两周的实训,我们对单片机有了一个基本的认识和了解,我们学到了怎样从一个设计课题入手去编写相关程序,并通过硬件实现。

基于51单片机的波形发生器的设计讲解

基于51单片机的波形发生器的设计讲解

基于51单片机的波形发生器的设计讲解波形发生器是电子设备中常见的一种电子设备,它可以产生各种不同形状的波形信号。

在这篇文章中,我们将会详细介绍基于51单片机的波形发生器的设计。

一、波形发生器的原理及分类波形发生器的原理是利用电子元件、电路以及控制信号源,将一定幅度的电压信号变化成为需要的各种形状的波形信号。

根据波形的形状分类,可以将波形发生器分为以下几种类型:1.正弦波发生器:产生正弦波信号的发生器,常用于音频设备中。

2.方波发生器:产生方波信号的发生器,常用于数字电路中,也可用于频率测量和脉冲调制等应用。

3.三角波发生器:产生三角波信号的发生器,常用于音频设备以及频率测试等领域。

4.锯齿波发生器:产生锯齿波信号的发生器,常用于音频设备、测试仪器以及数据采集和测量等领域。

二、基于51单片机的波形发生器设计下面我们将详细介绍基于51单片机的波形发生器的设计步骤。

1.硬件设计:在基于51单片机的波形发生器设计中,我们需要准备的硬件元件有:-51单片机控制芯片-芯片烧录器-液晶显示屏-按键开关-电源模块-杜邦线等电子连接线2.硬件连接:根据电路原理图进行将电子元件进行正确的电路连接。

其中,51单片机作为核心控制芯片,负责生成波形信号,液晶显示屏用于显示波形信号,按键开关用于控制波形发生器的启动、停止以及参数调整等操作。

3.软件设计:利用Keil C编译软件进行51单片机的软件设计,根据控制芯片的指令集编写相应的程序代码,实现以下几个功能:-波形信号的产生:根据选择的波形类型(正弦波、方波、三角波或锯齿波),利用特定的算法生成相应形状的波形信号。

-参数调节:通过按键开关控制波形的频率、幅度以及相位等参数的调节,使波形发生器能够产生不同特性的波形信号。

-波形信号显示:通过LCD显示屏将生成的波形信号进行实时显示,以方便观察和调试。

4.软硬件的调试与优化:三、波形发生器的应用1.音频设备:波形发生器可以生成不同频率的正弦波信号,用于音频信号的发生和测试等应用。

51单片机实现波形发生器

51单片机实现波形发生器

51单片机实现波形发生器摘要这个系统是基于AT89C51单片机的波形信号发生器。

使用AT89C51单片机作为控制核心,该系统由数字/模拟转换电路(DAC0832)、运放电路(OP07)、按键电路和6位数码管等组成。

通过按键可控制方波、三角波、正弦波的产生,并且用数码管显示其对应的频率和波形的类型。

这个设计方法简单、性能良好,这个系统可在多种需要低频信号的场所使用,它具有良好的实用性。

关键词:AT89C51 数模转换电路数码管信号发生器1 总体方案设计本次设计的任务是设计制作一个波形发生器,该波形发生器能产生正弦波、方波、三角波和由用户编辑的特定形状波形。

示意图如下:基本要求如下:(1)具有产生正弦波、方波周期性波形的功能;(2)输出波形的频率范围为100Hz~20kHz(非正弦波频率按10次谐波计算);重复频率可调,频率步进间隔≤100Hz;(3)输出波形幅度范围0~5V(峰-峰值),可按步进0.1V(峰-峰值)调整;(4)具有显示输出波形的类型、重复频率(周期)和幅度的功能。

1.1 方案论证方案一:采用单片函数发生器可产生正弦波、方波等,操作简单易行,用 D/A 转换器的输出来改变调节电压,可以实现数控调整频率,但产生信号的频率稳定度不高。

方案二:利用芯片组成的电路输出波形,MAX038是MAXIM公司生产的一个只需要很少外部元件的精密高频波形产生器,它能产生准确的高频正弦波、三角波、方波。

输出频率和占空比可以通过调整电流、电压或电阻来分别地控制。

所需的输出波形可由在A0和A1输入端设置适当的代码来选择,且具有输出频率范围宽、波形稳定、失真小、使用方便等特点。

方案三:采用Atmel公司的AT89C51单片机编程方法实现,该方案可以通过编程的方法控制信号波形的频率和幅度,而在硬件电路不便的情况下,通过程序实现频率的变化和输出波形的选择,并同时在显示器显示相应的结果。

方案一输出信号频率不够稳定;方案二成本高,程序复杂度高;方案三软硬件结合,硬件成本低,软件起点低,用汇编语言即可完成,优化型相对比较好,容易实现,且满足设计要求。

基于51系列单片机的多功能波形发生器及特定波形幅值调节

基于51系列单片机的多功能波形发生器及特定波形幅值调节

基于51系列单片机的多功能波形发生器及特定波形幅值调节概述:随着科技的不断进步,波形发生器在各种测量、调试和实验中发挥着重要的作用。

本文将介绍一种基于51系列单片机的多功能波形发生器,并且可以对特定波形的幅值进行调节。

设计原理:本波形发生器采用51系列单片机作为核心控制器,并通过DAC芯片将数字信号转换为模拟信号输出。

通过LCD显示模块显示当前所选的波形类型和幅值,并通过按键来切换和调节相应的参数。

主要功能:1.多波形输出:本波形发生器可以输出多种波形,如正弦波、方波、三角波、锯齿波等。

用户可以通过按键选择所需的波形类型。

2.幅值调节:本波形发生器还可以根据用户的需求,对特定波形的幅值进行调节。

3.频率调节:用户可以通过按键来调节波形的频率,以满足不同的实验需求。

4.输出控制:用户可以通过按键选择启用或停用输出信号。

硬件设计:1.单片机控制电路:使用51系列单片机作为核心控制器,通过控制IO口的状态来实现波形选择和参数调节。

2.DAC芯片:将单片机输出的数字信号转换为模拟信号,实现波形的输出。

3.LCD显示模块:用于显示当前所选的波形类型和幅值。

4.按键模块:用于选择波形类型、调节幅值和频率等参数。

5.输出控制电路:通过控制开关,使得输出信号可以被启用或停用。

软件设计:1.系统初始化:包括设置IO口的状态、初始化LCD显示模块、初始化按键模块等。

2.波形选择:通过按键选择所需的波形类型,并将相应的参数传递给DAC芯片。

3.幅值调节:根据用户的需求,通过按键调节特定波形的幅值,并通过DAC芯片实现相应的调节。

4.频率调节:通过按键调节波形的频率,并通过定时器来实现相应的调节。

5.输出控制:根据用户选择的开关状态,控制输出信号的启用或停用。

总结:基于51系列单片机的多功能波形发生器及特定波形幅值调节是一种灵活、实用的设计方案。

它可以满足各种不同波形的输出需求,并且可以根据用户的需求对波形的幅值进行调节。

基于51单片机的波形发生器的设计汇总

基于51单片机的波形发生器的设计汇总

基于51单片机的波形发生器的设计汇总波形发生器是电子领域中常用的一种设备,用于产生各种不同形式的波形信号。

本文将基于51单片机的波形发生器的设计进行汇总。

设计思路如下:一、基本原理波形发生器的基本原理是通过控制数字信号的高低电平来产生不同的波形。

在这个设计中,我们将使用51单片机作为控制器来产生波形信号。

二、硬件部分1.时钟电路:使用一个晶体振荡器作为时钟源,提供稳定的时钟脉冲给51单片机。

2.电源电路:使用稳压电源提供稳定的电压给51单片机和其他电路。

3.单片机电路:将51单片机与其他电路进行连接,包括输入输出端口和相应的外部电路。

4.波形输出电路:根据需要产生不同的波形,设计相应的输出电路,包括滤波器、电阻、电容等元器件。

三、软件部分1.系统初始化:在系统上电后,进行相应的初始化工作,包括设置引脚功能、中断,设置计时器等。

2.波形生成算法:根据用户的选择,使用合适的算法生成相应的波形信号。

常见的波形有正弦波、方波、三角波等。

3.输出控制:根据生成的波形信号,通过设置相应的输出引脚,将波形信号输出到波形输出电路中。

4.用户界面:设计一个简单的用户界面,让用户可以选择不同的波形、调整频率、幅度等参数。

5.中断处理:使用中断功能来处理波形输出频率的控制,实现较高的输出稳定性。

四、设计考虑1.精度要求:根据具体应用场景,确定波形发生器的精度要求。

如果需要较高的精度,可能需要采用更复杂的算法和更精密的输出电路。

2.输出负载:考虑波形发生器的输出负载情况,选择合适的输出电路,以确保波形信号的准确性和稳定性。

3.电源稳定性:电源的稳定性对波形发生器的性能也有影响,需要注意电源供电的稳定性。

五、测试与优化完成波形发生器设计后,进行相应的测试与优化。

包括波形信号的频率、幅度等测试,以及对输出电路、算法等进行优化。

最后,通过以上的设计思路,我们可以完成基于51单片机的波形发生器的设计。

根据具体的应用需求,可能需要对硬件和软件进行相应的调整和优化。

基于51单片机控制的函数波形发生器

基于51单片机控制的函数波形发生器
2.6
复位电路的作用是在上电或复位过程中,控制CPU的复位状态。这段时间内让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令、执行错误操作,也可以提高电磁兼容性能。无论用户使用哪种类型的单片机,总要涉及到单片机复位电路的设计。而单片机复位电路设计的好坏,直接影响到整个系统工作的可靠性。许多用户在设计完单片机系统,并在实验室调试成功后,在现场却出现了“死机”、“程序走飞”等现象,这主要是单片机的复位电路设计不可靠引起的。复位电路如图7所示。
由于单片机产生的是数字信号,要想得到所需要的波形,就要把数字信号转换成模拟信号,所以该文选用价格低廉、接口简单、转换控制容易并具有8位分辨率的数模转换器DAC0832。DAC0832主要由8位输入寄存器、8位DAC寄存器、8位D/A转换器以及输入控制电路四部分组成。但实际上,DAC0832输出的电量也不是真正能连续可调,而是以其绝对分辨率为单位增减,是准模拟量的输出。DAC0832是电流型输出,在应用时外接运放使之成为电压型输出。如图5所示。
中断系统是使处理器具有对外界异步事件的处理能力而设置的。当中央处理器CPU正在处理某件事的时候外界发生了紧急事件,要求CPU暂停当前的工作,转而去处理这个紧急事件。在波形发生器中,只用到片内定时器/计数器溢出时产生的中断请求,即是在AT89C51输出一个波形采样点信号后,接着启动定时器,在定时器未产生中断之前,AT89C51等待,直到定时器计时结束,产生中断请求,AT89C51响应中断,接着输出下一个采样点信号,如此循环产生所需要的信号波形【4】。
方案三:采用单片机编程的方法来实现。该方法可以通过编程的方法来控制信号波形的频率和幅度,而且在硬件电路不变的情况下,通过改变程序来实现频率的变换。此外,由于通过编程方法产生的是数字信号,所以信号的精度可以做的很高。

基于51单片机的波形发生器的设计说明

基于51单片机的波形发生器的设计说明

目录1 设计要求 (1)1.1 题目要求及分析 (1)1.1.1 示意图 (1)1.2 设计要求 (1)2 波形发生器系统设计方案 (2)2.1 方案的设计思路 (2)2.2 设计框图及系统介绍 (2)2.3 选择合适的设计方案 (2)3 主要硬件电路及器件介绍 (4)3.1 80C51单片机 (4)3.2 DAC0832 (5)3.3 数码显示管 (6)4 系统的硬件设计 (8)4.1 硬件原理框图 (8)4.2 89C51系统设计 (8)4.3 时钟电路 (9)4.4 复位电路 (9)4.5 键盘接口电路 (10)4.6 数模转换器 (11)5 系统软件设计 (12)5.1 流程图: (12)5.2 产生波形图 (12)5.2.1 正弦波 (12)5.2.2 三角波 (13)5.2.3 方波 (14)6 结论 (16)主要参考文献 (17)1 设计要求(1) 系统具有产生正弦波、三角波、方波三种周期性波形的功能。

(2) 用键盘控制上述三种波形(同周期)的生成,以及由基波和它的谐波(5次以下)线性组合的波形。

(3) 系统具有存储波形功能。

(4) 系统输出波形的频率围为1Hz~1MHz,重复频率可调,频率步进间隔≤100Hz,非正弦波的频率按照10次谐波来计算。

(5) 系统输出波形幅度围0~5V。

(6) 系统具有显示输出波形的类型、重复频率和幅度的功能。

2 波形发生器系统设计方案设计并制作一个波形信号发生器,能够产生正弦波、方波、三角波的波形,其中不使用DDS和一些专用的波形产生芯片。

并让系统的频率围在1Hz~1MHZ可调节,在频率围在1HZ~10KHz时,步进小于或等于10Hz,在频率围在10KHz~1MHz时,步进小于或等于100Hz,并且电压在0~5V围,能够实时的显示波形的类型、频率和幅值。

2.1 方案的设计思路以AT89C51单片机作为系统的控制核心,其中P0口接DAC0832作为信号输入同时进行数模转换,P1口用来接键盘,P2口接LED显示器,由程序来控制P0口产生的波形,再由按键和按键次数控制波形的种类、频率和幅值的大小,并且能够通过按键来控制波形频率值和幅度值。

基于51单片机的波形发生器设计报告

基于51单片机的波形发生器设计报告

目录摘要 (2)一、题目要求及分析 (3)二、总体系统方案设计 (4)2.1总体设计思路 (4)2.2总体框图 (5)2.3信号发生部分 (5)2.4显示部分 (6)2.5按键部分 (6)三、硬件电路 (6)3.1功能与基本原理 (7)3.2资源分配 (8)3.2显示接口电路 (8)3.3波形转换(D/A)电路 (9)3.4红外电路 (10)3.5复位电路 (11)3.6外部时钟电路 (11)3.7 LCD显示部分电路 (12)3.8电源部分 (12)3.9独立按键部分 (13)3.10串口通信模块 (13)四、软件设计 (14)4.1程序流程图 (15)4.2 LCD显示流程图 (15)五、系统仿真 (16)5.1仿真电路图 (16)5.2输出波形图 (16)六、硬件和软件测试 (17)6.1硬件调试 (17)6.2软件调试 (18)七、设计心得 (18)八、参考文献 (20)九、附件 (21)摘要:本系统采用单片机C8051为控制核心,输出数字量,然后由DAC0832把数字量转换成模拟量;但是输出的是电流,需要用运放(OP07),把电流转换成电压量。

显示利用的是LCD1602的液晶,显示其波形,幅值。

按键应用的是独立按键,用来波形的切换,幅值,频率的调解。

其运算核心,我们通过MATLAB对正弦波,三角板,正弦波进行采样,得到一组组数据,然后同过数组存储;利用中断对数组进行扫描。

其频率的调解就是调节其中断间隔的时间,幅值就是调节其数字的大小(同时乘以某个小于1的数)。

为了波形的合成,我们采用的点的个数都是20个。

AT-89C51 DAC0832 独立按键OP07一、题目要求及分析设计任务:设计制作一个波形发生器,该波形发生器能产生正弦波、方波、三角波和由用户编辑的特定形状波形。

示意图如下:图1 设计要求图设计要求:1.具有产生正弦波、方波、三角波三种周期性波形的功能;2.用键盘输入编辑生成上述三种波形(同周期)的线性组合波形,以及由基波及其谐波(5次以下)线性组合的波形。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机制作的波形发生器相信很多朋友都可能接触到一个波型发生器的制作,可能刚刚入门,做的东西也不会说是很复杂。

可能就一个矩形波,或者是三角波。

但是网上的很多资料是忽悠人的,就此,我也提供一个比较完整的波型发生器 C51 原代:该系统的软件比较典型:包括键盘的应用,显示的应用和 DA 转换器的应用。

本设计中,输出的波形有三种:正弦波,方波,三角波。

方波的输出最为简单,只要按照设定的周期值将输出的电压改变即可。

三角波的输出也比较简单,单片机的输出只要完成数字量递增和递减交替进行即可。

、正弦波的输出最麻烦,如果在软件中计算出输出的各点电压值,将会浪费很多的 CPU 时间,以至于无法满足频率的要求。

通常最简单的方法是通过手动的方法计算出输出各点的电压值,然后在编写程序时以数组的方式给出。

当需要时,只要按照顺序进行输出即可。

这种方法比运算法速度快且曲线的形状修改灵活。

在本设计中将 360 度分为 256 个点,则每两个点之间的间隔为1.4 度,然后计算出每个点电压对应的数字量即可。

只要反复输出这组数据到 DAC0832, 就可以在系统输出端得到想要的正弦波。

具体程序如下:#include ;#define uchar unsigned char#define uint unsigned int#define DAdata P0uchar code Sinetab[256]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xab,0xad,0xaf,0xb1,0xb2,0xb4,0xb6,0xb7,0xb9,0xba,0xbc,0xbd,0xbf,0xc0,0xc1,0xc3,0xc4,0xc5,0xc6,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xce,0xcf,0xd0,0xd1,0xd1,0xd2,0xd2,0xd3,0xd3,0xd3,0xd2,0xd2,0xd1,0xd1,0xd0,0xcf,0xce,0xce,0xcd,0xcc,0xcb,0xca,0xc9,0xc8,0xc6,0xc5,0xc4,0xc3,0xc1,0xc0,0xbf,0xbd,0xbc,0xba,0xb9,0xb7,0xb6,0xb4,0xb2,0xb1,0xaf,0xad,0xab,0xaa,0xa8,0xa6,0xa4,0xa2,0xa0,0x9e,0x9c,0x9a,0x98,0x96,0x94,0x92,0x90,0x8e,0x8c,0x8a,0x88,0x86,0x84,0x82, 0x80,0x7d,0x7b,0x79,0x77,0x75,0x73,0x71, 0x6f,0x6d,0x6b,0x69,0x67,0x65,0x63,0x61, 0x5f,0x5d,0x5b,0x59,0x57,0x55,0x54,0x52, 0x50,0x4e,0x4d,0x4b,0x49,0x48,0x46,0x45, 0x43,0x42,0x40,0x3f,0x3e,0x3c,0x3b,0x3a, 0x39,0x37,0x36,0x35,0x34,0x33,0x32,0x31, 0x31,0x30,0x2f,0x2e,0x2e,0x2d,0x2d,0x2c, 0x2c,0x2b,0x2b,0x2b,0x2b,0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2b, 0x2c,0x2c,0x2d,0x2d,0x2e,0x2e,0x2f,0x30, 0x31,0x31,0x32,0x33,0x34,0x35,0x36,0x37, 0x39,0x3a,0x3b,0x3c,0x3e,0x3f,0x40,0x42, 0x43,0x45,0x46,0x48,0x49,0x4b,0x4d,0x4e, 0x50,0x52,0x54,0x55,0x57,0x59,0x5b,0x5d, 0x5f,0x61,0x63,0x65,0x67,0x69,0x6b,0x6d, 0x6f,0x71,0x73,0x75,0x77,0x79,0x7b,0x7d, };uchar code Triangletab[58]={0x1a,0x21,0x28,0x2f,0x36,0x3d,0x44,0x4b, 0x52,0x59,0x60,0x67,0x6e,0x75,0x7c,0x83,0x8a,0x91,0x98,0x9f,0xa6,0xad,0xb4,0xbb,0xc2,0xc9,0xd0,0xd7,0xde,0xe5,0xde,0xd7,0xd0,0xc9,0xc2,0xbb,0xb4,0xad,0xa6,0x9f,0x98,0x91,0x8a,0x83,0x7c,0x75,0x6e,0x67,0x60,0x59,0x52,0x4b,0x44,0x3d,0x36,0x2f,0x28,0x21,};uchar code Squaretab[2]={0x56,0xaa};uchar code disp1[]={&quot;Sine Wave &quot;&quot;Triangle Wale &quot;&quot;Square Wave &quot;};uchar idata disp2[16]={&quot;Frequency:Hz&quot;};uchar code Coef[3]={10,100,200};uchar idata WaveFre[3]={1,1,1};uchar code WaveTH[]={0xfc,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xfc,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, };uchar code WaveTL[]={0xf2,0x78,0xfb,0x3c,0x63,0x7d,0x8f,0x9d,0xa8,0xb1, 0x17,0x0b,0xb2,0x05,0x37,0x58,0x70,0x82,0x90,0x9b, 0x4d,0xa7,0xc4,0xd3,0xdc,0xe2,0xe6,0xea,0xec,0xee };uchar Wavecount,THtemp,TLtemp;uchar Waveform;sbit rs=P2^5;sbit rw=P2^6;sbit e=P2^7;sbit DA=P2^0;sbit KEY=P3^2;void delay(uchar i){uchar j;for(;i>;0;i--)for(j=20;j>;0;j--);}void busy(){uchar temp;temp=0x00;rs=0;rw=1;while((temp&0x80)==0x80) {P0=0xff;e=1;temp=P0;e=0;}}void WR_Com(uchar temp) {busy();rs=0;rw=0;P0=temp;e=1;e=0;}void WR_Data(uchar num){busy();rs=1;rw=0;P0=num;e=1;e=0;}void disp_lcd(uchar addr,uchar *temp1) {uchar i;WR_Com(addr);delay(100);for(i=0;i;0;i--){P0=0x30;rs=0;rw=0;e=1;e=0;delay(100);P0=0x38;rs=0;rw=0;e=1;e=0;delay(100);}void lcd_Reset(){WR_Com(0x01);delay(100);WR_Com(0x06);delay(100);WR_Com(0x0c);delay(100);}void SineOUT(uchar Wavecount) {DAdata=Sinetab[Wavecount++]; Wavecount=0;DA=0;}void TriangleOUT(uchar Wavecount) {DAdata=Triangletab[Wavecount++]; if(Wavecount>;57)Wavecount=0;DA=0;DA=1;}void SquareOUT(uchar Wavecount) {DAdata=Squaretab[Wavecount++];if(Wavecount>;1)Wavecount=0;DA=0;DA=1;}void timer() interrupt 1{TH0=THtemp;TL0=THtemp;if(Waveform==0)SineOUT(Wavecount); else if(Waveform==1)TriangleOUT(Wavecount); else if(Waveform==2)SquareOUT(Wavecount); }void key_int() interrupt 0 {uchar keytemp,keytemp1;uint WaveCoef;EA=0;TR0=0;keytemp1=0;delay(10);while(!KEY);keytemp=~P2&0x1e; keytemp>;>;=1;while(keytemp!=8){keytemp=~P2&0x1e;keytemp>;>;=1;if(keytemp!=keytemp1){keytemp1=keytemp;switch(keytemp){case 1:if(++Waveform==3)Waveform=0;break;case 2:if(++WaveFre[Waveform]==11)WaveFre[Waveform]=1;break;case 4:if(--WaveFre[Waveform]==0)WaveFre[Waveform]=10;break;}THtemp=WaveTH[Waveform*16+(WaveFre[Waveform]-1)]; TLtemp=WaveTL[Waveform*16+(WaveFre[Waveform]-1)];WaveCoef=WaveFre[Waveform]*Coef[Waveform]; disp2[13]=WaveCoef%10+0x30;WaveCoef/=10;disp2[12]=WaveCoef%10+0x30;WaveCoef/=10;disp2[11]=WaveCoef%10+0x30;WaveCoef/=10;disp2[10]=WaveCoef%10+0x30;WaveCoef/=10;disp_lcd(0x80,&disp1[Waveform*16]);disp_lcd(0xc0,disp2);}}TH0=THtemp;TL0=THtemp;Wavecount=0;TR0=1;}void main(){uint WaveCoef;uchar i;lcd_ini();lcd_Reset();WaveCoef=WaveFre[Waveform]*Coef[Waveform]; disp2[13]=WaveCoef%10+0x30;WaveCoef/=10;disp2[12]=WaveCoef%10+0x30;WaveCoef/=10;disp2[11]=WaveCoef%10+0x30;WaveCoef/=10;disp2[10]=WaveCoef%10+0x30;WaveCoef/=10;disp_lcd(0x80,&disp1[Waveform*16]);disp_lcd(0xc0,disp2);i=0;DAdata=0x00;DA=0;TMOD=0x01;IT0=1;ET0=1;EX0=1;EA=1;while(1);}。

相关文档
最新文档