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单片机的波形发生器设计

课题要求:目录: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单片机的波形发生器的设计讲解

目录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单片机波形发生器(本程序适用)其中独立按键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单片机制作的波形发生器

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[]={"Sine Wave ""Triangle Wale ""Square Wave "};uchar idata disp2[16]={"Frequency:Hz"};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单片机的波形发生器的设计方案。
一、系统硬件设计1.系统框架该波形发生器系统采用51单片机作为主控芯片,主要包括三个部分:信号生成模块、显示模块和控制模块。
其中,信号生成模块负责产生各种特定频率、特定波形的信号;显示模块用于展示信号参数等相关信息;控制模块负责接收用户输入并对波形发生器进行控制。
2.硬件连接信号生成模块与主控芯片之间通过I/O接口相连,用于传输数据和控制信号。
显示模块通过串口与主控芯片相连,用于显示相关信息。
控制模块通过按键、旋钮等输入设备与主控芯片相连,用于接收用户输入。
二、系统软件设计1.系统初始化在系统初始化阶段,主控芯片需要完成引脚、定时器、串口等相关资源的初始化工作。
同时,还需要设置一些全局变量和参数的初始值。
2.信号生成模块信号生成模块通过定时器产生特定频率的时钟信号,并根据用户输入的参数生成相应的信号波形。
主控芯片利用定时器中断函数进行波形生成,并将生成的信号数据存放在缓冲区中。
3.显示模块显示模块负责将信号波形显示在液晶屏上,并显示相关参数,如频率、幅度等。
主控芯片将信号数据从缓冲区中读取,并通过串口发送给显示模块进行显示。
4.控制模块控制模块负责接收用户输入的控制指令,并通过按键、旋钮等输入设备完成用户交互。
主控芯片通过中断函数实时读取用户输入并进行相应的控制操作。
三、系统功能设计1.频率设置功能用户可以通过控制模块设置波形发生器的频率,可以选择固定频率或者可调频率。
利用定时器时钟频率与定时器中断的时间间隔来控制波形的频率。
2.波形选择功能用户可以通过控制模块选择不同的波形类型,如正弦波、方波、三角波、脉冲波等。
主控芯片根据用户指令设置波形参数,并生成相应的波形信号。
基于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.噪声:测试波形发生器的输出信号是否有杂散噪声和幅度波动。
AT89C51单片机作为波形发生器

信号发生器在教学、试验、测控等各个领域都有着十分广泛的应用,而且随着现代电子通讯技术的发展, 常常需要高精度且频率可方便调节的信号发生器。
本设计直接采用AT89C51单片机作为波形发生器的重要元件,加上巧妙的软件设计和简易的外围电路,产生频率、幅度可调的正弦波、三角波、锯齿波以及方波等多种信号。
信号的频率、幅值、通过键盘直接输入,并由LED显示。
与现有各类型波形发生器比较而言,ATMEL 的A T89C51是一种高效微控制器,其产生的数字信号干扰小,输出稳定,可靠性高,特别是操作简单方便,成本低,非常适合于物理实验室教学与实验使用。
关键词:AT89C51单片机、波形发生器、LED显示;基于单片机的信号发生器设计收藏这个学期的最后一个月,我们正式进入课程设计实验。
本次我选择了基于单片机的信号发生器设计的这个课程设计,因为相对比较简单,就一个89C51和D/A0832就搞定。
余老师还是比较好的,像他们软件的要焊接,额,密密麻麻的一大堆线,看着就烦。
呵呵,好了,以下要谈谈这次设计的过程了。
首先,本次设计的要求是以单片机为基础,利用D/A转换器,编程能产生锯齿波、方波、正弦波、三角波四种波形,使波形可变且频率可调的信号发生器。
主要难度是波形进行变化和频率可调,好,先准备实验要求的设备,PC机一台(并安装Keil 模拟仿真器软件)实验箱一个、导线落干根,示波器一台。
本来我是想用伟福来进行仿真的,可惜没下载器,一切就绪,马上开始,下面是本次报告中的一部分。
一、设计思路利用Keil C51 系列仿真系统实现。
主要利用其中89C51,D/A0832,拨位开关、按键等模块。
1、波形选择:利用8051分别实时地对P1.0、P1.1两口进行扫描,如果发现两口对应相应的数值,即有四种状态:00,01,10,11,根据四种状态跳到对应的波形程序。
2、三种波形的实现:方波:由8051对P0口不断交替输出00H和0FFH,有D/A0832转换成模拟量实现;三角波:由8051对P0口输出00H,在每一个时钟到来时对输出值加一;当加至0FFH时,继而在时钟来临时减一,这样往复执行,最终输出近似连续的三角波;正弦波:将00H到0FFH按照正弦波波形的变化趋势分成255个间断的点,形成一个正选波取值表,用8051在每一个时钟到来时取表值通过P0口送至D/A0832转换输出。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5
引言
本次课程设计课题是信号发生器,又称为信号源或振荡器,在生产实践和科技领 域中有着广泛的应用。各种波形曲线均可以用三角函数方程式来表示。能够产生多种波 形,如方波、锯齿波、三角波、正弦波的电路被称为函数信号发生器。在通信、广播、 电视系统,在工业、农业、生物医学领域内,函数信号发生器在实验室和设备检测中具 有十分广泛的用途。
3 系统软件设计........................................................................................................... 8
3.1 主程序模块.......................................................................................................8 3.2 中断模块...........................................................................................................9
运放输出 电压
2.1 主控电路 12C5A60S2 单处机内部有两个 16 位可编程的定时器/计数器 T0 和 T1,它们具有计
数器方式和定时器方式两种工作方式及 4 种工作模式。模式 1 采用的是 16 位计数器, 当 T0 或 T1 被允许计数后,从初值开始加计数,最高位产生溢出时向 CPU 请求中断。 中 断系统是使处理器具有对外界异步事件的处理能力而设置的。当中央处理器 CPU 正在处 理某件事的时候外界发生了紧急事件,要求 CPU 暂停当前的工作,转而去处理这个紧急 事件。在波形发生器中,用到片内定时器/计数器以及 2 个外部中断产生的中断请求, 即是在 12C5A60S2 接受外部中断信号后,进入按键判断程序产生中断请求,12C5A60S2 响应中断,接着输出下一个采样点信号,如此循环产生所需要的信号波形。
经比较,方案四既可满足课程设计的基本要求又能充分发挥其优势,电路简单,易 控制,性价比高,所以采用该方案.
6
1.2 改变幅度方案: 方案一:可以将送给 DA 的数字量乘以一个系数,这样就可以改变 DA 输出电流的幅
度,从而改变输出电压;但是这样做有很严重的问题,单片机在做乘法运算时需要很长 的时间,这样的话输出波形的频率就会很低,达不到至少 500HZ 的要求;
并且该方案的输出电压做不到连续可调,当 DA 的输入数字量比较小时,输出的波 形失真就会比较严重。
方案二:将输出电压通过一个运算放大器的放大。这样还有个优点是幅度连续可调。 经比较,方案二既可满足课程设计的基本要求,并且电路也挺简单。
2 硬件设计
按键输入
12C5A60S2 单片机
DAC0832
图 2.1 硬件原理框图
x=0:2*pi/64:2*pi; y=round(sin(x)*127)+128
7
图 2.2 主控电路
2.2 数/模转换电路 由于单片机产生的是数字信号,要想得到所需要的波形,就要把数字信号转换成模
拟信号,所以该文选用价格低廉、接口简单、转换控制容易并具有 8 位分辨率的数模转 换器 DAC0832。DAC0832 主要由 8 位输入寄存器、8 位 DAC 寄存器、8 位 D/A 转换器以及 输入控制电路四部分组成。但实际上,DAC0832 输出的电量也不是真正能连续可调,而 是以其绝对分辨率为单位增减,是准模拟量的输出。DAC0832 是电流型输出,在应用时 外接运放使之成为电压型输出。
1 系统方案论证
本课设方案论证分为两部分,分别为波形频率部分和调幅部分。 1.1 波形及频率的产生
方案一:采用模拟电路搭建函数信号发生器,它可以同时产生方波、三角波、正弦 波。但是这种模块产生的不能产生任意的波形(例如梯形波),并且频率调节很不方便。
方案二:采用锁相式频率合成器,利用锁相环,将压控振荡器(VCO)的输出频率 锁定在所需频率上,该方案性能良好,但难以达到输出频率覆盖系数的要求,且电路复 杂。
12C5A60S2 是整个波形发生器的核心部分,通过程序的编写和执行,产生各种各样 的信号,并从键盘接收数据,进行各种功能的转换和信号幅度的调节。当数字信号电路 到达转换电路,将其转换成模拟信号也就是所需要的输出波形。
波形 ROM 表是将信号一个周期等间距地分离成 64 个点,储存在单片机得 ROM 内。 具体 ROM 表是通过 MATLAB 生成的,例如正弦表,MATLAB 生成的程序如下:
方案三:使用集成信号发生器发生芯片,例如 AD9850,它可以生成最高几十 MHZ 的 波形。但是该方案也不能产生任意波形(例如梯形波),并且价格昂贵。
方案四:采用 AT89C51 单片机和 DAC的波形比较纯净。它的特点是可产生任意波形,频率容易调节,频率能达到设 计的 500HZ 以上。性能高,在低频范围内稳定性好、操作方便、体积小、耗电少。
2 硬件设计................................................................................................................... 6
2.1 主控电路...........................................................................................................6 2.2 数/模转换电路.................................................................................................7 2.3 模数转换电路...................................................................................................8
编号:
基础工程设计说明书
题 目: 基于 51 单片机的波形 发生器
院 (系): 电子工程与自动化学院 专 业: 电子信息科学与技术
学生姓名: 学 号:
讲师
指导教师:
职 称:
2016 年 1 月 10 日
摘要
本文以STC89C51单片机为核心设计了一个函数信号发生器。信号发生器采用数字波 形合成技术,通过硬件电路和软件程序相结合,可输出自定义波形,如正弦波、方波、三 角波,波形的频率和幅度在一定范围内可任意改变。波形和频率的改变通过软件控制, 幅度的改变通过硬件实现。介绍了波形的生成原理、硬件电路和软件部分的设计原理。 该信号发生器具有体积小、价格低、性能稳定、功能齐全的优点。
信号发生器应用广泛,种类繁多,性能各异,分类也不尽一致。按照频率范围分类 可以分为:超低频信号发生器、低频信号发生器、视频信号发生器、高频波形发生器、 甚高频波形发生器和超高频信号发生器。按照输出波形分类可以分为:正弦信号发生器 和非正弦信号发生器,非正弦信号发生器又包括:脉冲信号发生器,函数信号发生器、 扫频信号发生器、数字序列波形发生器、图形信号发生器、噪声信号发生器等。按照信 号发生器性能指标可以分为一般信号发生器和标准信号发生器。前者指对输出信号的频 率、幅度的准确度和稳定度以及波形失真等要求不高的一类信号发生器。后者是指其输 出信号的频率、幅度、调制系数等在一定范围内连续可调,并且读数准确、稳定、屏蔽 良好的中、高档信号发生器。
关键词:低频信号发生器;单片机;D /A 转换
Abstract
A function signal generator based on STC12C5A60S2 MCU is designed in this paper. Signal generator with digital waveform synthesis technology, the hardware circuit and software program combined custom output waveforms, such as sine wave, square wave, triangle wave, frequency and amplitude of the waveform in a certain range can be arbitrarily changed. The change of waveform and frequency is controlled by software, the change of amplitude is realized by hardware. The principle of waveform generation, hardware circuit and software design are introduced in this paper. The signal generator has the advantages of small size, low price, stable performance and complete functions.
1.1 波形及频率的产生...........................................................................................5 1.2 改变幅度方案:................................................................................................6
Key words: signal generator; single chip microcomputer; D/A Transformation