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

上传人:b****8 文档编号:11089365 上传时间:2023-02-25 格式:DOCX 页数:28 大小:134.10KB
下载 相关 举报
基于单片机的波形发生器的设计.docx_第1页
第1页 / 共28页
基于单片机的波形发生器的设计.docx_第2页
第2页 / 共28页
基于单片机的波形发生器的设计.docx_第3页
第3页 / 共28页
基于单片机的波形发生器的设计.docx_第4页
第4页 / 共28页
基于单片机的波形发生器的设计.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

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

《基于单片机的波形发生器的设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的波形发生器的设计.docx(28页珍藏版)》请在冰豆网上搜索。

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

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

 

《智能仪器仪表设计与调试》课程设计报告

学院:

_电气与信息工程学院______专业班级:

学生姓名:

学号:

设计地点(单位)_________________________

设计题目:

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

完成日期:

2013年7月12日

指导教师评语:

_______________________________________

____________________________________________________________________________________________________________________________________________________________________________________________________________________

成绩(五级记分制):

________________

指导教师(签字):

________________

重庆科技学院

课程设计任务书

设计题目:

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

学生姓名

课程名称

智能仪器仪表设计与调试

专业班级

地点

起止时间

设计内容及要求

1.要求设计的波形发生器完成以下功能:

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

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

2.扩展功能

1)在上位机将波形实时显示出来。

2)用红外线遥控器实现上述功能。

3)其它功能

设计参数

 

1.幅值0~5V可调

2.频率0~1KHz可调

进度要求

1.布置仪表设计任务、方案设计(1天)

2.硬件设计、制作、调试(1天)

3.软件设计、调试(5天)

4.综合测试(1天)

5.成果展示、答辩(1天)

6.撰写报告(1天)

详见进度安排表

参考资料

1.程德福.智能仪器.机械工业出版社.2009.9

2.胡文金.单片机系统实训教程.重庆:

重庆大学出版社,2005

3.梁森.自动检测技术及应用.北京:

机械工业出版社,2012

其它

说明

1.本表应在每次实施前一周由负责教师填写二份,院系审批后交院系办备案,一份由负责教师留用。

2.若填写内容较多可另纸附后。

3.一题多名学生共用的,在设计内容、参数、要求等方面应有所区别。

系主任:

指导教师:

聂玲

 

目录

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

1.1设计任务1

1.2性能指标1

二、设计方案2

2.1硬件选择2

2.2系统总体设计3

三、系统硬件设计4

3.1单片机的最小系统4

3.2按键电路设计4

3.3LCD显示的设计5

四、系统软件设计6

4.1主程序设计6

4.2LCD显示子程序设计7

4.3D/A转换子程序设计7

五、调试及性能分析8

5.1调试步骤8

5.2性能分析8

六、心得体会9

参考文献10

附录1系统硬件电路图11

附录2程序代码12

 

一、设计任务和性能指标

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-bitCMOS数据获取器件。

PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。

PCF8591的3个地址引脚A0,A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。

在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。

2.2系统总体设计

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

图2.2系统总体设计框图

三、系统硬件设计

3.1单片机的最小系统

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

图3.1STC12C5AI6S2单片机最小系统

3.2按键电路设计

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

图3.2按键电路图

3.3LCD显示的设计

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

图3.312864-12L液晶显示电路

四、系统软件设计

4.1主程序设计

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

图4.1主程序流程图

4.2LCD显示子程序设计

液晶显示的程序在本程序中比较的简单,就是为了实时的显示出当前的波形是什么,用按键切换之后液晶显示也跟着变。

液晶显示程序需首先初始化,再进行数据的传输,并进行字符的显示,所以写出相应的几个程序即可进行LCD的显示。

图4.2LCD 显示流程图

4.3D/A转换子程序设计

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

voidwrite_add(uchardate)

{

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.胡文金.单片机系统实训教程.重庆:

重庆大学出版社,2005

2.梁森.自动检测技术及应用.北京:

机械工业出版社,2012

3.程德福.智能仪器.机械工业出版社.2009.9

 

 

附录1系统硬件电路图

 

附录2程序代码

#include

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

unsignedlongResult,i;

sbitSDA=P1^1;//PCF8591接口

sbitSCL=P1^0;

unsignedinta=0;//波形采样点值

unsignedintb=0;

unsignedintc=0;

unsignedintbx_chang=0;

unsignedintn=40;//频率计算值

unsignedcharTH;

unsignedcharTL;

unsignedintmode=0;//0为调节幅度1为调节频率

unsignedintfd=6;//幅度初值3.0V

unsignedintx;//采样点的间隔

unsignedintu;//lcd刷屏变量

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

sbitCS=P3^5;//LCD接口

sbitSID=P3^6;

sbitSCLK=P3^7;

sbitPSB=P1^5;

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

sbitp20=P2^0;//波形调节

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

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

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

//sin波形数组

ucharcodetosin[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

};

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

voiddelay(unsignedintz)//延迟函数

{unsignedintx,y;

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

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

}

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

voidSendByte(unsignedcharDbyte)//LCD字节传送

{

unsignedchari;

CS=1;

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

{SCLK=0;

if((Dbyte<

SID=1;

else

SID=0;

SCLK=1;

SCLK=0;

}

CS=0;

}

voidLcd_WriteCmd(unsignedcharCbyte)//LCD的数据与指令传送

{

delay(10);

SendByte(0xf8);

SendByte(0xf0&Cbyte);

SendByte(0xf0&(Cbyte<<4));

}

voidLcd_WriteData(unsignedcharDbyte)

{

delay(10);

SendByte(0xfa);

SendByte(0xf0&Dbyte);

SendByte(0xf0&(Dbyte<<4));

}

voidInitLCD()//LCD初始化

{

Lcd_WriteCmd(0x30);

Lcd_WriteCmd(0x06);

Lcd_WriteCmd(0x0c);

Lcd_WriteCmd(0x04);

Lcd_WriteCmd(0x01);

Lcd_WriteCmd(0x02);

Lcd_WriteCmd(0x80);

}

voidxianshi(unsignedcharx,unsignedchary,unsignedchar*stri)//LCD数据传送地址

{

if(x==1)Lcd_WriteCmd(0x80+y-1);

elseif(x==2)Lcd_WriteCmd(0x90+y-1);

elseif(x==3)Lcd_WriteCmd(0x88+y-1);

elseif(x==4)Lcd_WriteCmd(0x98+y-1);

while(*stri>0)

{

Lcd_WriteData(*stri);

stri++;

}

}

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

voiddelayp()//延迟函数

{;;}

voiddelay_1ms(uintz)

{

uintx,y;

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

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

;

}

//****************************************I2C协议

voidstart()//开始信号

{

SDA=1;

delayp();

SCL=1;

delayp();

SDA=0;

delayp();

}

voidstop()//停止信号

{

SDA=0;

delayp();

SCL=1;

delayp();

SDA=1;

delayp();

}

voidrespons()//应答相当于一个智能的延时函数

{

uchari;

SCL=1;

delayp();

while((SDA==1)&&(i<250))

i++;

SCL=0;

delayp();

}

voidinit()//初始化

{

SDA=1;

delayp();

SCL=1;

delayp();

}

voidwrite_byte(uchardate)//写一字节数据

{

uchari,temp;

temp=date;

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

{

temp=temp<<1;//左移一位移出的一位在CY中

SCL=0;//只有在scl=0时sda能变化值

delayp();

SDA=CY;

delayp();

SCL=1;

delayp();

}

SCL=0;

delayp();

SDA=1;

delayp();

}

voidwrite_add(uchardate)//D/A转换

{

start();

write_byte(0x90);

respons();

write_byte(0x40);

respons();

write_byte(date);

respons();

stop();

}

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

intmain()//************************************************主函数

{

TMOD=0x01;

TH0=(65536-99000/n)/256;//定时时间

TL0=(65536-99000/n)%256;

TH1=(65536-5000)/256;

TL1=(65536-5000)%256;

EA=1;

ET0=1;

ET1=1;

TR0=1;

TR1=1;

init();

while

(1)

{

PSB=0;

InitLCD();

//*******************************************显示模块

for(u=0;u<9;u++)

{

xianshi(1,1,"信号发生器");

xianshi(2,1,"波形:

");

if(bx_chang==0)xianshi(2,4,"sin");

if(bx_chang==1)xianshi(2,4,"Square");

if(bx_chang==2)xianshi(2,4,"Triangle");

if(mode==0)

{

xianshi(3,1,"幅度:

");

Lcd_WriteData(0x30+(fd*5/10));

xianshi(3,5,".");

Lcd_WriteData(0x30+(fd*5%10));

xianshi(3,6,"V");

}

if(mode==1)

{

xianshi(3,1,"频率:

");

Lcd_WriteData(0x30+(n/2/100));

Lcd_WriteData(0x30+(n/2/10));

Lcd_WriteData(0x30+(n/2%10));

xianshi(3,8,"HZ");

}

}

}

}

//**************************************************************8

voidrefresh_f(void)interrupt1//定时器中断

{

if(n>=0&&n<40)

{x=14;

T

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 党团建设

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1