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

发布者:tmgouzi最新更新时间:2019-11-29 来源: 51hei关键字:51单片机  波形发生器  多种波形 手机看文章 扫描二维码
随时随地手机看文章

一、 设计任务和性能指标
1.1 设计任务

按要求设计波形发生器并完成相关功能:

(1)运用单片机控制产生多种波形,这些波形包括三角波、方波、锯齿波等。

(2)信号的发生器所产生波形的频率、幅值均为连续可调。

扩展功能

在上位机将波形实时显示出来,用红外线遥控器实现上述功能,其它功能。

1.2 性能指标

(1)幅值0~5V可调

(2)频率0~1KHz可调               


二、设计方案   

采用AT89C51单片机和数模转换器PCF8591实现波形的产生。波形的产生方法是用AT89C51单片机执行波形程序,向PCF8591转换器的输入端输入相应的数据,从而在DA转换电路输出端再通过运放电路转换得到相应的电压波形。在AT89C51的P1口接按键控制波形的各类和波形的频率,每种波形对应一种按键方式。此方案原理简单,同时适合操作,实现起来也相对较容易。产生的三种波形的频率可由按键控制,并通过按键改变来转换不同的波形,也能够在示波器上显示出所要求的波形。波形的频率步进也可以实现调节,具有线路简单、可行性高、符合设计要求等优点。加上LCD数码显示管,从而能够在LCD上显示出频率值、幅度值信息。输出的波形也较稳定,精度较高,通过滤波电路使得系统的抗干扰性增强,电路简单,性价比高。

图2.1系统组成结构框图


2.1硬件选择

(1)单片机:STC12C5AI6S2是高速/低功耗/超强抗干扰的新一代8051 单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810 专用复位电路,2路PWM,8路高速10位A/D转 换(250K/S),针对电机控制,强干扰场合。

(2)PCF8591:PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。


2.2 系统总体设计

本系统是用单片机来控制波形的转换以及幅值和频率的改变的,所以该系 统可以分为4个电路模块 ,下面是总体设计框图。


     

                          图2.2  系统总体设计框图


三、系统硬件设计

3.1 单片机的最小系统

由于单片机最小系统只需要外围有时钟电路和复位电路即可,则单片机最小系统有着两个外围电路即可正常工作,下面是单片机的最小系统原理图。

                   


                           图3.1    STC12C5AI6S2单片机最小系统




3.2 按键电路设计

本实现采用4个按键来进行波形的转换、幅值的改变、频率的改变,P20键用来改变波P21、P22用来改变幅值的大小,P32用来改变频率的大小,下面是按键电路图。

图3.2按键电路图


3.3 LCD显示的设计

本硬件采用的是12864-12L的液晶显示屏,显示屏将波形的转化显示在显示屏上,下面是 液晶显示的电路。

     

图3.3 12864-12L液晶显示电路



四、系统软件设计
4.1 主程序设计

主程序内进行的是波形的切换及幅值、频率的改变,用示波器和LCD显示,将主要的写进即可,其他的就写在外面,下面是主程序流程图。

         


图4.1 主程序流程图


4.2  LCD显示子程序设计

液晶显示的程序在本程序中比较的简单,就是为了实时的显示出当前的波形是什么,用按键切换之后液晶显示也跟着变。液晶显示程序需首先初始化,再进行数据的传输,并进行字符的显示,所以写出相应的几个程序即可进行LCD的显示。


图4.2 LCD 显示流程图


4.3   D/A转换子程序设计

本程序采用PCD8591来作D/A转换器,需要将A1、A1、A2接地,单片机上的P1和P11接PCF8591上的SCL和SDA端口,AOUT接示波器,供显示D/A转换要满足I2C协议才能进行数据的传输。


void write_add(uchar date)               

{

    start();

    write_byte(0x90);   

    respons();

    write_byte(0x40);

    respons();

    write_byte(date);

    respons();

    stop();


}


五、调试及性能分析
5.1 调试步骤

硬件调试:检查线路连接有无错误,SDA和SCL接单片机的P10和P11口,VCC接电源,CND接地,AOUT接示波器,在下载数据到单片机之后数据在传输的时候PCF8591上的一个蓝色的灯会不停的闪,说明有数据在传输,否则无数据传输。


软件调试:首先看I2C协议是否正确,否则不能传输数据,再看按键的逻辑关系是否正确,还有就是LCD的显示是否正确。


调节电源,使其输出5V电压,调整好示波器。给电路供电,观察示波器,记录各频段对应波形的情况,峰峰值。调试结果表明,该电路在要求频率范围内的大部分频率范围基本上不失真,除了在最高频率的最低频率有少许失真,其中,当频率接近10KHz时,方波高低电压跃变时出现毛刺,审过零比较器的频率特性所致,另外,在最高频和最低频段,三角波出现少许弯斜,可选用频率特性更为宽的电容进行校正。


5.2 性能分析

经过一段时间运行后,可以对系统的性能进行测试。对于本波形发生器来说,用示波器可以测试其性能指标,按前面所述设计的波形发生器,能产生正弦波、三角波及方波信号,其幅值可以0—5V内变化,频率也可以调整。


六、心得体会

在为期几周的时间里,终于顺利地完成了此次课程设计,并从中学习到了很多的知识和经验,对单片机以及C语言有了更深刻的了解。本次课程设计也发现了许多问题,此次单片机的设计硬件电路较为简单,而程序的设计在当中占据很重要的部分。这次课程设计是用STC12C5AI6S2单片机与PCF8591D/A转换器来实现的波形产生与显示,所以要对这两个模块非常的熟悉。对于PCF8591需要深入的认识I2C协议的内容才能正确的传输数据。而对于单片机而需要对各个接口非常熟悉,才能保证数据的正常传输。此外还要熟练的使用示波器,对产生的波形进行调整,来得到更好的效果。它考验我们灵活的运用所学知识,培养了我们在遇到问题善于触屏的良好学习态度,使我认识到设计思路更节省了时间。灵活运用,以书本知识为基础灵活的扩展,学习前人的验,向高层次迈进。当然还是存在不足的地方,例如当频率过小的时候矩形波会有些失真,转换器转换可以加一个锁存器,放大电路设计上还有待进一步改进,使其具有更强的输出能力等。


附录 1 系统硬件电路图


单片机源程序如下:

#include

#include

#include

#define  uchar  unsigned  char

#define  uint  unsigned   int

unsigned long Result,i;

sbit SDA=P1^1;    //PCF8591 接口

sbit SCL=P1^0;

unsigned int a=0;                  //波形采样点值

unsigned int b=0;

unsigned  int c=0;


unsigned  int bx_chang=0;

unsigned  int n=40;  //频率计算值

unsigned char TH;

unsigned char TL;

unsigned int mode=0; //0为调节幅度 1为调节频率

unsigned int fd=6;              //幅度初值  3.0V

unsigned int  x;              //采样点的间隔

unsigned int u;                            //lcd刷屏变量

//*************

sbit CS =P3^5;                             //LCD接口

sbit SID=P3^6;

sbit SCLK=P3^7;

sbit PSB=P1^5;

//*************

sbit p20=P2^0; //波形调节

sbit p21=P2^1; //增加              频率、幅度

sbit p22=P2^2; //减少              频率、幅度

sbit p32=P3^2; //频率幅度选择


                                                                                                                  //sin波形数组

uchar code tosin[256]={

            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,0xE1,0xE3,0xE5,0xE7,0xE9,0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,

                                          0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

                                          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,0xDF,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,

                                          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,

                                          0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,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(unsigned int z)                                                  //延迟函数

{   unsigned int x,y;   

     for(x=z;x>0;x--) 

       for(y=125;y>0;y--) ;

}

//***************************************************LCD显示函数组

void SendByte(unsigned char Dbyte)                                                             //LCD字节传送

{

     unsigned char i;           

              CS=1;

     for(i=0;i<8;i++)

     {              SCLK = 0;          

                  if((Dbyte<                            SID=1;                        

[1] [2] [3] [4]
关键字:51单片机  波形发生器  多种波形 引用地址:基于51单片机的波形发生器的课程设计

上一篇:基于51单片机的温度控制系统设计与制作
下一篇:51单片机做的智能时钟具有闹钟功能(DS1302+DS18B20+LCD1602)

推荐阅读最新更新时间:2024-11-16 20:01

ADC0809与51单片机的连接方式
模数转换器定位为单片机的外部RAM单元,因此与单片机的连接就有很多种。大体上说ADC0809在整个单片机系统中是作为外部RAM的一个单元定位的。具体到某一个连接方式,定位又有区别。adc0809与单片机典型的连接有以下三种: ADC0809与51单片机的第一种连接方式 这是数据线对数据线、地址线对地址线的标准连接方式,如图2.2所示。由于ADC0809片内没有时钟,可利用单片机提供的地址锁存信号ALE经D触发器2分频后获得,ALE引脚的频率是单片机时钟频率的1/6,如果单片机时钟频率采用6MHz,则ALE引脚的输出频率为1MHz,再经过2分频后为500kHz,恰好符合0809对时钟的要求。 由于ADC0809具有输出
[单片机]
ADC0809与<font color='red'>51单片机</font>的连接方式
51单片机~串口通信
(一)计算机串行通信原理: 综上:所以在设置的时候,经常将SCON设置为0X50==0101 0000 ,使用方式1. (二)工作: 中断控制 led灯,每发送一条指令灯亮或灭(反转一下) #include reg52.h typedef signed char int8; typedef signed int int16; typedef signed long int32; typedef unsigned char uint8; //字符型 typedef unsigned int uint16; typedef unsigned long
[单片机]
<font color='red'>51单片机</font>~串口通信
51单片机读写AT24C02串行E2PROM
24C02中带有片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。 ;这是将0600H地址中以下的8个数据写到24C02的01H为首址单元中去的汇编程序 ORG 0000H SCL BIT P3.4;定义24C02的串行时钟线 SDA BIT P3.5;定义24C02的串行数据线 LJMP START START:LCALL STAR;调用 MOV R2,#08H;一个数据有8位 MOV DPTR,#0600H;定义源数据的位置 LOOP:MOV A,#00H MOVC A,@A+DPTR LCALL
[单片机]
51单片机控制步进电机的程序
初学单片机:   #include reg52.h #include stdio.h code unsigned char tab =             {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};  unsigned char code F_Rotation ={0x02,0x04,0x08,0x10}; unsigned char Dis_Shiwei;//定义十位 unsigned char Dis_Gewei; //定义个位 sbit key1=P3^0;//定义按键位置 sbit key2=P3^1; sbit key3=P3^2; sbit key4=
[单片机]
51单片机的比较器的应用
AT89C2051的一个特殊应用,用它的比较器做一个光强调节器,应用在全静态LED显示屏上。当初的情况是原有LED 显示屏的光控是用专用的AD转换芯片做的,比较贵。最后用这个方案做为一个补丁用了一下。 它的使用原理是:用单片机的比较器和电容及光敏电阻组成一个充放电电路,用单片机的两个定时器组成一个PWM信号输出。PWM信号从一个端口输出,然后控制LED 显示屏的显示使能信号,这样就可以做到在夜间LED显示屏变暗一点,的天变亮一点。以达到一个最好的效果。 ORG 0000H LJMP MAIN ORG 000BH LJMP TIMER0 ;改变占空比 ORG 001BH LJMP TIMER1 ;定时10MS ORG 0030
[单片机]
51单片机DIY做PLC编程
简介:有朋友想定制一个净水机控制器,有一些独特的功能要增加,但是商品控制板没有这样的功能,问我能否做一个,我觉得单片机完全能满足这种简单的控制需要,上手开始编程序时候突然感到,用PLC逻辑编这种功能是非常简单轻松的,而如果用汇编或C编却感觉有点棘手,编程效率不高,所以想为何不在单片机上实现PLC的逻辑呢? 上网搜索尝试看能否找到合适的程序下载来稍微改改就能用的呢?方案几年前就有了,实际上是利用三菱的低档plc编程软件编辑好梯形图,存盘后用专用的格式转换工具转换成HEX单片机烧写文件烧进去,尝试下载三菱plc工具软件,但是在我的WIN7-64位系统上不能正常工作,好容易换了系统装好开发工具,但是初次上手这款开发工具,界面挺复杂的
[单片机]
<font color='red'>51单片机</font>DIY做PLC编程
8位数模转换器DAC0832介绍及51单片机驱动程序
1. 引脚及其功能 DAC0832是双列直插式8位D/A转换器。能完成数字量输入到模拟量(电流)输出的转换。图1-1和图1-2分别为DAC0832的引脚图和内部结构图。其主要参数如下:分辨率为8位,转换时间为1μs,满量程误差为±1LSB,参考电压为(+10?/span -10)V,供电电源为(+5~+15)V,逻辑电平输入与TTL兼容。从图1-1中可见,在DAC0832中有两级锁存器,第一级锁存器称为输入寄存器,它的允许锁存信号为ILE,第二级锁存器称为DAC寄存器,它的锁存信号也称为通道控制信号 /XFER。 图1-1、DAC0832引脚图 图1-1中,当ILE为高电平,片选信号 /CS 和写信号 /WR1为低电平
[单片机]
8位数模转换器DAC0832介绍及<font color='red'>51单片机</font>驱动程序
基于51单片机的排矿阀门控制系统设计
0 引言 磁力脱水槽是选矿厂对细粒嵌布铁矿物较为有效的选别设备。广泛应用在磁铁矿(或焙烧磁铁矿)选矿工艺中。磁力脱水槽操作目前采用人工操作。岗位工人按着给矿量的变化,用取矿勺估测精矿层的深度和目测颜色的方法掌握矿层界面的位置,从而调整精矿排矿阀门(胶堆、闸门)阀位的大小,以便相对保证精矿品位和金属回收率的最佳值。在生产实践中,当正常状态下各工序的矿浆量、浓度、品位相对稳定时,磁力脱水槽的选别指标较好。而当给矿量等指标变化频繁时,磁力脱水槽选别指标则急剧恶化,进而影响到选别作业给矿的稳定。在这种状态下,需要岗位工人不断调整阀门操作以满足铁精矿品位和金属回收率的要求。传统的人工操作是岗位工人利用操作勺探测矿层深度和目测颜色的方法掌
[单片机]
基于<font color='red'>51单片机</font>的排矿阀门控制系统设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved