当前位置:文档之家› 基于51单片机的函数发生器和示波器解析

基于51单片机的函数发生器和示波器解析

《智能仪器仪表设计基础》课程设计报告单位:自动化学院学生姓名:汪连升专业:测控技术与仪器班级:0821001学号:2010212950指导老师:耿道渠成绩:设计时间:2013 年5月重庆邮电大学自动化学院制一、题目:基于单片机的多波形信号发生器设计二、指导教师:耿道渠三、设计要求:设计一个信号发生器,实现如下功能:(1)可产生正弦波、方波、三角波、脉冲等波形;(2)通过按钮或键盘选定输出波形;(3)波形频率可设定;(4)波形可通过液晶屏显示。

四、给定条件:1、8051单片机最小系统;2、ADC,DAC器件;五、设计:1、方案论证,并确定设计方案2、给出信号发生器的整体设计框图3、硬件电路设计4、软件设计(画出程序流程图,并给出相应模块程序代码)5、完成设计报告六、具体设计过程及实验结果:七、设计的心得体会:八、附件:(可选)完成心率波、指数上升和指数下降波形;九、参考书目:给出主要参考书目(如:《单片机原理与应用》、《电子测量技术》、《单片机C语言程序设计》等),包括作者,书目名称,出版社等。

基于51单片机的波形发生器引言波形发生器是能够产生大量的标准信号和用户定义信号,并保证高精度、高稳定性、可重复性和易操作性的电子仪器。

函数波形发生器具有连续的相位变换、和频率稳定性等优点,不仅可以模拟各种复杂信号,还可对频率、幅值、相移、波形进行动态、及时的控制,并能够与其它仪器进行通讯,组成自动测试系统,因此被广泛用于自动控制系统、震动激励、通讯和仪器仪表领域。

本系统通过对51单片机的控制,用DA-AD等模块实现了正弦波、方波、三角波和锯齿波的产生,同时可以通过按键实现波形的选择和波形频率的改变。

在实现波形的发生的同时又实现了波形图线的显示,通过NoKia5110对AD实时采集数据的显示、波形类型和波形频率的显示。

摘要:本系统采用单片C8052为控制核心,通过其端口实现数字量的输出,然后由DAC0832把数字量转换成模拟量;但是DAC芯片输出的是电流信号,本系统用LM324运放把电流信号转换为电压信号。

然后利用LM358搭建一个同相比例放大器,将转换后的电压信号按可调比例放大一定倍数。

波形显示利用NoKia5110液晶屏,显示其波形、频率和实时的图像。

显示其图像的时候我们利用ADC0804模数转换芯片将产生的模拟信号转换为数字信号,把AD实时读取到的值等比例显示到液晶屏上。

本系统通过按键实现波形的选择以及波形频率的改变。

关键字:STC89C52 DAC0832 Nokia5110 ADC0804 LM324 独立按键一、设计题目分析(一)设计任务:设计制作一个波形发生器,该波形发生器能产生正弦波、方波、三角波和由用户编辑的特定形状波形。

图1(二)设计功能:1、实现正弦波、三角波、方波、锯齿波的产生;2、实现波形的频率可调;3、实现波形类型、频率的显示;4、实现波形实时图像的显示。

(三)设计方案:方案一:通过软件控制51单片机实现波形的数字输出,然后通过DA实现波形的数模转换,最后通过Nokia5110实现显示。

方案二:通过硬件搭建积分电路实现方波、正弦波、三角波、锯齿波的产生,通过控制源信号的频率改变实现波形频率的改变。

方案三:通过FPGA编程实现波形的产生于频率的改变,通过软件控制FPGA 逻辑整列完成。

(四)方案分析:方案一硬件设计简单,主要通过软件来控制;方案二硬件设计复杂,不便于控制,对输出波形的频率控制也存在很大的误差。

方案三虽然控制实现容易,但是很少人接触过这个FPGA,所以学习起来相对困难。

因此我们这里选择方案一。

二、总体系统方案设计题目要求实现的任务是设计并制作一个函数信号发生器,能够产生正弦波、方波、三角波,要求必须用51单片机和AD-DA芯片,频率可调(范围不定),能够实时的显示波形的类型及其频率,同时实现波形的实时数据图像显示。

现在对方案一进论证和验证。

(一)总体设计思路根据题目的要求,经过仔细的考虑各种要素,制定了整体方案:以STC89C51单片机为控制核心,P0口接DAC0832信号输入并进行数模转换,P2口接矩阵键盘,P1口接液晶显示器Nokia5110,由程序控制P0口产生波形(分别是正弦波、方波、三角波),再由按键控制产生波形的种类及频率在一定范围内可调。

由运放LM324实现DAC0832输出电流到电压的转换,即实现数字信号到模拟信号的转换,同时由LM358搭建的同相放大器将电压波形放大。

在Nokia5110上实时的显示波形的频率,同时我们通过ADC0804读取放大器出来的电压信号,把对应的电压信号对应比例显示到液晶屏上,绘制出波形。

我们通过按键确定,一旦按键按下后,就把当时的波形对应的参数改变显示。

图2系统总体框图(二)单元设计电路1、电源模块:电源通过充电电池提供7.2V电源,然后经过一个470uf的大电容滤波,滤波出来后经过一个5V稳压芯片,稳压源的输出与输入都接一个10uf和一个100nf 电容滤波,减小电源纹波等。

稳压出来的5V电压经过开关,开关后接一个指示灯LED,用于显示电源接通。

5V电源给芯片,等器件供电。

5V后面通过一个3.3V稳压芯片,同样稳压源的输出与输入都接一个10uf 和一个100nf电容滤波,这样出来的3.3V电容给Nokia5110提供电源。

图 3 电源模块2、串口通信模块:串口通信模块通过一个DB9接口与电脑相连接,通过一个MAX232芯片和单片机的P31、P30端口相连接,该电路主要用于单片机的程序下载,与单片与电脑的通信,方便调试。

图4串口通信3、DAC0832数模转换电路:DAC0832的WR1、WR2、XFER接地,TLE和VREF接高电平,其CS片选端接单片机的P23口。

其数据段接锁存器的输出端。

图 5 DAC08324、ADC0804模数转换电路:ADC0804数模转化的CS、RD、WR、INTR分别接单片机的P24、P25、P26、P32;其数据段接单片机的P0口,用于读取模数转换结果。

图 6 ADC08045、Nokia5110液晶显示电路:5110有RST、CS、DC、DIN、CLK五个控制口分别接单片机的P12、P13、P14、P15、P16。

电源连接3.3V电源7LED背光口接一个滑动变阻器用一个调节5110的背光。

图7 Nokia5110液晶6、放大设计电路:一级运算放大器主要用与把电流转换为电压信号,二级运算放大为同相放大器用于把电压信号放大。

图8 运放电路7、整体电路设计:将以上电路图组建起来,就得到总电路图,如图9所示图9 整体设计电路(三)软件设计1、主程序流程图图10 主程序流程图2、中断程序选读取AD然后向DAC端口赋值模数转换,不同的定时周期实现不同的频率波形输出。

3、正弦波的产生过程通过手动的方法计算出输出各点的电压值,形成数组sintab[100],反复顺序输出这组数据到DAC0832,就在系统输出端得到正弦波。

4、方波的产生过程按照设定的周期值改变输出的电压(分别向DAC0832输0x00或0xff)。

5、锯齿波的产生过程将一个周期(360度)分为128个点递增,当128个点输出后再从0开始输出数据到DAC0832,就在系统输出端得到锯齿波。

6、三角波的产生过程将三角波的一个周期(360度)分为256个点,相邻点等差,前128个点递增,后128个点递减,分别把数据到DAC0832,就在系统输出端得到三角波。

7、程序代码#include<reg52.h>#include<math.h>#include <intrins.h>#include "LCD5510_V1.H"#define PI 3.14sbit LOCK = P3^7; //锁存功能sbit Wave =P2^0;sbit up =P2^1;sbit down =P2^2;sbit DAC_cs=P2^3;sbit AD_CS=P2^4;sbit AD_RD=P2^5;sbit AD_WR=P2^6;sbit AD_INT=P1^0;unsigned int temp=0;char flag_display;int i=0;unsigned int AD_data=0;void DrawPoint(int x,int y);char flag;unsigned char code SIN[100]={127,135,143,151,159,166,174,181,188,195,202,208,214,220,225,230,234,238,24 2,245,248,250,251,252,253,254,253,252,251,250,248,245,242,238,234,230,225,220,214,208,202,195,188,18 1,174,166,159,151,143,135,127,119,111,103,95,88,80,73,66,59,52,46,40,34,29,24,20,16,12,9,6,4,3,2,1,0,1,2,3,4,6,9,12,16,20,24,29,34,40,46,52,59,66,73,80,88,95,103,111,119};int Set_Hz; //频率void zhengxian();void sanjiao();void juchi();void fangbo();void scan();void LCD_clr_row(unsigned char num);/***************************************************************** **** 名称: Time0_Init()* 功能: 定时器的初始化,11.0592MZ晶振,50ms* 输入: 无* 输出: 无***************************************************************** ******/void Time0_Init(){TMOD = 0x01;TH0 =(65536-Set_Hz)/256;TL0 =(65536-Set_Hz)%256;IE = 0x82;TR0 = 1;}void AD_start(){AD_CS=0;//允许AD转换AD_WR=0;_nop_();AD_WR=1;//AD开始转换while(AD_INT);//等待转换结束AD_CS=1;//禁止转换}void AD_read(){AD_CS=0;//允许读取AD_RD=0;//读取转换结果_nop_();AD_data=P0;AD_RD=1;AD_CS=1; //停止AD读取}/*****主函数****************************************************************************/void main(void){unsigned char j=0;unsigned int y=0;int temp[4]={0,0,0,0};Set_Hz=1000;flag=1;DAC_cs=0;flag_display=1;LCD5510_Init();Time0_Init();while(1){i++;scan();temp[3]=temp[2];temp[2]=temp[1];temp[1]=temp[0];temp[0]=AD_data;y=temp[4];if(flag!=4){if(y<temp[3]) y=temp[3];if(y<temp[2]) y=temp[2];if(y<temp[1]) y=temp[1];if(y<temp[0]) y=temp[0];}else y=AD_data;y=(y<<5)>>8;DrawPoint(i,y);}}/***************************************************************** **** 名称: Time0_Int()* 功能: 定时器中断,中断中实现Count 加一* 输入: 无* 输出: 无***************************************************************** ******/void Time0_Int() interrupt 1{TH0 =(65536-Set_Hz)/256;TL0 =(65536-Set_Hz)%256;TR0 = 0;AD_start();AD_read();switch(flag){case 1: zhengxian(); break;case 2: sanjiao(); break;case 3: juchi(); break;case 4: fangbo(); break;default : break;}if(flag_display==1){flag_display=0;switch(flag){case 1: LCD_clr_row(0); LCD_clr_row(1); LCD_prints(0, 0, "ZX F");if(Set_Hz==1000) LCD_prints(5, 0, "10HZ");if(Set_Hz==1050) LCD_prints(5, 0, "9.5HZ");if(Set_Hz==1100) LCD_prints(5, 0, "9HZ");if(Set_Hz==1150) LCD_prints(5, 0, "8.6HZ");if(Set_Hz==1200) LCD_prints(5, 0, "8.3HZ");if(Set_Hz==1250) LCD_prints(5, 0, "8HZ");if(Set_Hz==1300) LCD_prints(5, 0, "7.8HZ"); break;case 2:LCD_clr_row(0);LCD_clr_row(1); LCD_prints(0, 0, "SJ F");if(Set_Hz==1000) LCD_prints(5, 0, "7.8HZ");if(Set_Hz==1050) LCD_prints(5, 0, "7.4HZ");if(Set_Hz==1100) LCD_prints(5, 0, "7.1HZ");if(Set_Hz==1150) LCD_prints(5, 0, "6.8HZ");if(Set_Hz==1200) LCD_prints(5, 0, "6.5HZ");if(Set_Hz==1250) LCD_prints(5, 0, "6.2HZ");if(Set_Hz==1300) LCD_prints(5, 0, "6HZ");break;case 3:LCD_clr_row(0); LCD_clr_row(1); LCD_prints(0, 0, "JC F");if(Set_Hz==1000) LCD_prints(5, 0, "3.9HZ");if(Set_Hz==1050) LCD_prints(5, 0, "3.7HZ");if(Set_Hz==1100) LCD_prints(5, 0, "3.5HZ");if(Set_Hz==1150) LCD_prints(5, 0, "3.4HZ");if(Set_Hz==1200) LCD_prints(5, 0, "3.2HZ");if(Set_Hz==1250) LCD_prints(5, 0, "3.1HZ");if(Set_Hz==1300) LCD_prints(5, 0, "3HZ");break;case 4:LCD_clr_row(0); LCD_clr_row(1); LCD_prints(0, 0, "FB F");if(Set_Hz==1000) LCD_prints(5, 0, "7.8HZ");if(Set_Hz==1050) LCD_prints(5, 0, "7.4HZ");if(Set_Hz==1100) LCD_prints(5, 0, "7.1HZ");if(Set_Hz==1150) LCD_prints(5, 0, "6.8HZ");if(Set_Hz==1200) LCD_prints(5, 0, "6.5HZ");if(Set_Hz==1250) LCD_prints(5, 0, "6.2HZ");if(Set_Hz==1300) LCD_prints(5, 0, "6HZ");break;default : break;}}if(i>83){i=0;LCD_clr_row(2); LCD_clr_row(3);LCD_clr_row(4); LCD_clr_row(5);}TR0 = 1;}///Y的0-31各点用来显示波形32-47用来显示文字/** 函数:DrawPoint* 功能:在(x,y)坐标上绘制点,屏幕左下角坐标为(0,0)* 输入参数:x:横坐标值,Range:0-83* y:纵坐标值,Range:0-47* 返回参数:当超过规定范围,默认为0*/void DrawPoint(int x,int y){int YIndex = 0;int bitIndex = 0;if(x>83)x=0;if(y>47)y=0;y = 47-y; //坐标变换YIndex = y/8;bitIndex = y%8;LCD_pos_byte(x,YIndex);LCD_write_dat(0x00|(1<<(bitIndex))&0xff);}/******正弦波函数*****/void zhengxian(){static int i=0;LOCK=1;P0= SIN[i]*0.5;LOCK=0;if(i<100)i++;else i=0;}/*******三角波*********/ void sanjiao(){static int m=0,n=0;LOCK=1;P0=2*m;LOCK =0;if(n<=m&&m<=64){n=m;m++;}else if(m>0){n=m;m--;}else{n=m=0;}}/****锯齿波函数******/ void juchi(){static int m=0;LOCK=1;P0=2*m;LOCK=0;if(m<64){m=m+1;}else{ m=0;}}/******方波函数*******/void fangbo(){static int m=0,n=0;if(n<=m&&m<64){n=m;LOCK=1;P0=0xf0;LOCK=0;m++;}else if(m>=0){n=m;LOCK=1;P0=0x00;LOCK=0;m--;}else m=n=0;}/*****键盘扫描函数*********/ void scan(){if(Wave==0) //波形选择{while(!Wave);if(flag==4){flag=1;}else flag++;flag_display=1;}if(up==0) //频率增加{while(!up);Set_Hz=Set_Hz+50;if(Set_Hz>1300){Set_Hz=1000;}flag_display=1;}if(down==0) //频率减少{while(!down);Set_Hz=Set_Hz-50;if(Set_Hz<1000){Set_Hz=1300;}flag_display=1;}}(四)硬件实物和测试结果图1、实物电路和正弦波形显示:(五)总结本次的设计中利用STC89C51、DAC0832和ADC0804以及放大器完成电路的设计,用开关来控制各种波形的转换和波形频率,用单片机输出后,经过数模转换器生成波形,最终可以通过示波器观察。

相关主题