资源描述
重庆科技学院学生实习(实训)总结报告
重庆科技学院
学生实习(实训)总结报告
学院: 电气与信息工程学院专业班级: 测控
学生姓名:学 号:
设计地点(单位) I506
设计题目:基于单片机的波形发生器的设计
完成日期: 2014 年 03月 17日
指导教师评语:________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
成绩(五级记分制):___________________________指导教师(签字):____________________________
目录
一、 实习的任务要求与意义1
1。1 设计要求1
1。2 设计任务1
1。3 基本功能与性能指标1
1。4 实习的意义1
二、设计方案2
2。1硬件选择2
2。2 系统总体设计3
三、系统硬件设计4
3。1 单片机的最小系统4
3.2 按键电路设计5
3。3 LCD显示的设计5
四、系统软件设计7
4.1 主程序设计7
4。2 LCD显示子程序设计8
4.3 D/A转换子程序设计8
五、调试及性能分析9
5.1 调试步骤10
5。2 性能分析12
参考文献13
附录 1 系统硬件电路图14
附录 2 程序代码15
一、 实习的任务要求与意义
1。1 设计要求
1.掌握电子系统的一般设计方法
2. 掌握仿真软件的应用
3。培养综合应用所学知识来指导实践的能力
4。根据技术指标要求及实验室条件自选方案设计出原理电路图,分析工作原理
并计算元件参数。
1。2 设计任务
按要求设计波形发生器并完成相关功能:
(1)运用单片机控制产生多种波形,这些波形包括三角波、方波、锯齿波等。
(2)信号的发生器所产生波形的频率、幅值均为连续可调。
扩展功能
在上位机将波形实时显示出来,用红外线遥控器实现上述功能,其它功能。
1.3 基本功能与性能指标
基本功能 :
(1)可以产生正弦波、方波、三角波,频率和幅值可调.
(2)按KEY1键选择输出波形。
(3)按KEY2,KEY5键调节输出信号频率和电压幅值的增进和减少。
(4)按KEY6键是转换调节频率或电压幅值.
性能指标:
(1)幅值0~5V可调
(2)频率0~100Hz可调
1。4 实习的意义
本次实训的目的是让我们更加熟练的掌握单片机的原理与应用,通过学习的单片机基础知识来更加熟悉的操作将软件和硬件相结合,通过控制单片机控制的程序代码与能
实现系统控制功能的电子元件来实现所需要的数据。通过对软件和硬件的了解与应用再结合基础知识对单片机更深层次的了解,达到以后能更加熟练的通过单片机去完成更复杂的任务。
二、设计方案
采用AT89C51单片机和数模转换器PCF8591实现波形的产生。波形的产生方法是用AT89C51单片机执行波形程序,向PCF8591转换器的输入端输入相应的数据,从而在DA转换电路输出端再通过运放电路转换得到相应的电压波形。在AT89C51的P1口接按键控制波形的各类和波形的频率,每种波形对应一种按键方式。此方案原理简单,同时适合操作,实现起来也相对较容易。产生的三种波形的频率可由按键控制,并通过按键改变来转换不同的波形,也能够在示波器上显示出所要求的波形。波形的频率步进也可以实现调节,具有线路简单、可行性高、符合设计要求等优点。加上LCD数码显示管,从而能够在LCD上显示出频率值、幅度值信息.输出的波形也较稳定,精度较高,通过滤波电路使得系统的抗干扰性增强,电路简单,性价比高。
图2。1系统组成结构框图
2。1硬件选择
(1)单片机:STC89C52是高速/低功耗/超强抗干扰的新一代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个电路模块 ,下面是总体设计框图。
STC89C52
PCF8591
按键控制
示波器显示
L C D
图2.2 系统总体设计框图
三、系统硬件设计
3。1 单片机的最小系统
由于单片机最小系统只需要外围有时钟电路和复位电路即可,则单片机最小系统有着两个外围电路即可正常工作,下面是单片机的最小系统原理图。
图3.1 STC89C52单片机最小系统
3。2 按键电路设计
本实现采用4个按键来进行波形的转换、幅值和频率的改变、幅值和频率的选择,P32键用来改变波P33、P16用来改变幅值或频率的大小,P17用来选择频率和幅值,下面是按键电路图。
图3。2按键电路图
3。3 LCD显示的设计
本硬件采用的是12864的液晶显示屏,显示屏将波形的转化显示在显示屏上,下面是 液晶显示的电路。
图3.312864液晶显示电路
四、系统软件设计
4。1 主程序设计
主程序内进行的是波形的切换及幅值、频率的改变,用示波器和LCD显示,将主要的写进即可,其他的就写在外面,下面是主程序流程图。
开始
DA 转换器
初始化
LCD初始化
Chang++
Chang=1输出方波
Chang=2输出三角波
Chang=0输出正弦波
图4。1 主程序流程图
4.2 LCD显示子程序设计
液晶显示的程序在本程序中比较的简单,就是为了实时的显示出当前的波形是什么,用按键切换之后液晶显示也跟着变.液晶显示程序需首先初始化,再进行数据的传输,并进行字符的显示,所以写出相应的几个程序即可进行LCD的显示。
开始
初始化
12864LCD
写控制指令
写显示数据
串行传输数据
写汉字到LCD屏 指定位置
结束
图4。2 LCD 显示流程图
4.3 D/A转换子程序设计
本程序采用PCD8592来作D/A转换器,需要将A1、A1、A2接地,单片机上的P37和P36接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();
}
图4。3 PCF8591电路图五、调试及性能分析
5。1 调试步骤
硬件调试:检查线路连接有无错误,SDA和SCL接单片机的P36和P37口,VCC接电源,CND接地,AOUT接示波器,在下载数据到单片机之后数据在传输的时候PCF8591上的一个蓝色的灯会不停的闪,说明有数据在传输,否则无数据传输。
软件调试:首先看I2C协议是否正确,否则不能传输数据,再看按键的逻辑关系是否正确,还有就是LCD的显示是否正确。
调节电源,使其输出5V电压,调整好示波器.给电路供电,观察示波器,记录各频段对应波形的情况,峰峰值。调试结果表明,该电路在要求频率范围内的大部分频率范围基本上不失真,除了在最高频率的最低频率有少许失真,其中,当频率接近10KHz时,方波高低电压跃变时出现毛刺,审过零比较器的频率特性所致,另外,在最高频和最低频段,三角波出现少许弯斜,可选用频率特性更为宽的电容进行校正.
示波器显示之后的幅值频率的调试结果如下图所示:
调试之后的正弦波
调试之后的方波
调试之后的三角波
5。2 性能分析
经过一段时间运行后,可以对系统的性能进行测试。对于本波形发生器来说,用示波器可以测试其性能指标,按前面所述设计的波形发生器,能产生正弦波、三角波及方波信号,其幅值可以0—5V内变化,频率也可以调整。
六、心得体会
经过两周的实训,很快就结束了。虽然时间短暂,但是其中我们在完成任务的时候还是面临了很多的问题,正是因为遇到了难题,我们小组在一起探讨,经过多次改正最后还是圆满的完成了任务.虽然平时上课我们做过实验,但是现在给我们一个任务让我们去完成的时候才发现并不是那么容易就能做出来的,不仅需要扎实的基础知识还要去查询相关的书籍了解一些我们不懂的。
经过本次实训,我们不仅增强了知识,也学到了很多技巧,对单片机的理解与运用更加熟练了。此次单片机的设计硬件电路较为简单,而程序的设计在当中占据很重要的部分.这次课程设计是用STC12C5AI6S2单片机与PCF8592D/A转换器来实现的波形产生与显示,所以要对这两个模块非常的熟悉。对于PCF8591需要深入的认识I2C协议的内容才能正确的传输数据.而对于单片机而需要对各个接口非常熟悉,才能保证数据的正常传输。此外还要熟练的使用示波器,对产生的波形进行调整,来得到更好的效果。它考验我们灵活的运用所学知识,培养了我们在遇到问题善于触屏的良好学习态度。
以书本知识为基础灵活的扩展,学习前人的验,向高层次迈进.当然还是存在不足的地方,例如当频率过小的时候矩形波会有些失真,转换器转换可以加一个锁存器,放大电路设计上还有待进一步改进,使其具有更强的输出能力等。
参考文献
1. 胡文金。 单片机系统实训教程. 重庆:重庆大学出版社,2005
2. 梁森。 自动检测技术及应用。北京:机械工业出版社,2012
3. 程德福。 智能仪器. 机械工业出版社.2009。9
4. 朱定华,戴汝平等.单片危机原理与应用。清华大学出版社.
5. 彭楚武.微机原理与接口技术.湖南大圩出版社。
6. 李朝清.单片机原理与接口技术。北京航空航天大学出版社。
7. 张李勇,陈郎,张飞舟。基于8051的双通道波形发生器的设计与现实。计算机工程与应用
8. 许庆山等编.电路、信号与系统.北京:航空工业出版社。
附录 1 系统硬件电路图
附录 2 程序代码
#include<reg52。h〉
#include〈intrins.h〉
#include〈math。h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P3^6;
sbit SCL=P3^7;
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;
unsigned int fd=6;
unsigned int x;
unsigned int u;
//*************
sbit RS =P2^4;
sbit RW=P2^5;
sbit E=P2^6;
sbit PSB=P1^4;
//*************
sbit p20=P3^2;
sbit p21=P3^3;
sbit p22=P1^6;
sbit p32=P1^7;
//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——) ;
}
//***************************************************
void SendByte(unsigned char Dbyte)
{
unsigned char i;
RS=1;
for(i=0;i〈8;i++)
{E = 0;
if((Dbyte<<i)&0x80)
RW=1;
else
RW=0;
E = 1;
E= 0;
}
RS=0;
}
void Lcd_WriteCmd(unsigned char Cbyte )
{
delay(10);
SendByte(0xf8);
SendByte(0xf0&Cbyte);
SendByte(0xf0&(Cbyte〈〈4));
}
void Lcd_WriteData(unsigned char Dbyte )
{
delay(10);
SendByte(0xfa);
SendByte(0xf0&Dbyte);
SendByte(0xf0&(Dbyte〈<4));
}
void InitLCD()
{
Lcd_WriteCmd(0x30);
Lcd_WriteCmd(0x06);
Lcd_WriteCmd(0x0c);
Lcd_WriteCmd(0x04);
Lcd_WriteCmd(0x01);
Lcd_WriteCmd(0x02);
Lcd_WriteCmd(0x80);
}
void xianshi(unsigned char x,unsigned char y,unsigned char *stri)//LCD数据传送地址
{
if(x==1) Lcd_WriteCmd(0x80+y-1);
else if(x==2) Lcd_WriteCmd(0x90+y-1);
else if(x==3) Lcd_WriteCmd(0x88+y—1);
else if(x==4) Lcd_WriteCmd(0x98+y—1);
while(*stri〉0)
{
Lcd_WriteData(*stri);
stri++;
}
}
//****************************************************
void delayp() //延迟函数
{;;}
void delay_1ms(uint z)
{
uint x,y;
for(x=z;x〉0;x—-)
for(y=110;y〉0;y-—)
;
}
//*****************************************I2C协议
void start()
{
SDA=1;
delayp();
SCL=1;
delayp();
SDA=0;
delayp();
}
void stop()
{
SDA=0;
delayp();
SCL=1;
delayp();
SDA=1;
delayp();
}
void respons()
{
uchar i;
SCL=1;
delayp();
while((SDA==1)&&(i<250))
i++;
SCL=0;
delayp();
}
void init()
{
SDA=1;
delayp();
SCL=1;
delayp();
}
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i〈8;i++)
{
temp=temp<〈1;
SCL=0;
delayp();
SDA=CY;
delayp();
SCL=1;
delayp();
}
SCL=0;
delayp();
SDA=1;
delayp();
}
void write_add(uchar date)
{
start();
write_byte(0x90);
respons();
write_byte(0x40);
respons();
write_byte(date);
respons();
stop();
}
//****************************************************
int main()//************************************************主函数
{
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”);
xianshi(3,1,"幅度:”);
Lcd_WriteData(0x30+(fd*5/10));
xianshi(3,5,”。”);
Lcd_WriteData(0x30+(fd*5%10));
xianshi(3,6,”V”);
xianshi(4,1,”频率:");
Lcd_WriteData(0x30+(n/2/100));
Lcd_WriteData(0x30+(n/2/10));
Lcd_WriteData(0x30+(n/2%10));
xianshi(4,6,"Hz”);
}}
}
//**************************************************************8
void refresh_f( void ) interrupt 1 //定时器中断
{
if(n>=0&&n<40)
{x=14;
TH0 = (65536—92900/n)/256;
TL0 = (65536—92900/n)%256;
}
else if (n>=40&&n〈80)
{x=15;
TH0 = (65536—97920/n)/256;
TL0 = (65536—97920/n)%256;
}
//*************************************正弦波形
a=a+x;
if(a〈256&&bx_chang==0)
{
write_add(tosin[a]*0。1*fd);
}
if(a〉=256)
{
a=0;
}
//************************************方波波形
b=b+x;
if(b〈128&&bx_chang==1)
{
write_add(0x00*0。1*fd);
}
if(b〉=128&&b〈256&&bx_chang==1)
write_add(0xff*0。1*fd);
if(b>=256)
{
b=0;
}
//*************************************三角波波形
c=c+x;
if(c〈128&&bx_chang==2)
{
write_add(c*0。2*fd);
}
if(c>=128&&c<256&&bx_chang==2)
write_add((—c+256)*0。2*fd);
if(c〉=256)
{
c=0;
}
}
//********************************************定时器中断 按键中断
void refresh_zd( void ) interrupt 3
{
TH1 = (65536—5000)/256;
TL1 = (65536-5000)%256;
//*******************************************8
if(p32==0)
{
delay_1ms(100);
if(p32==0)
mode=mode+1;
if(mode〉=2)
mode=0;
while(!p32);
}
if(p20==0)
{
delay_1ms(100);
bx_chang=bx_chang+1;
if(bx_chang〉=3)
bx_chang=0;
while(!p20);
}
//*******************************************频率调节
if(p21==0&&mode==1)
{
delay_1ms(100);
n=n+2;
if(n〉=100)
n=1;
while(!p21);
}
if(p22==0&&mode==1)
{
delay_1ms(100);
n=n-2;
if(n<=0)
n=100;
while(!p22);
}
//*******************************************幅度调节
if(p21==0&&mode==0)
{
delay_1ms(100);
fd=fd+1;
if(fd>=10)
fd=1;
while(!p21);
}
if(p22==0&&mode==0)
{
delay_1ms(100);
fd=fd—1;
if(fd〈=1)
fd=10;
while(!p22);
}
}
13
展开阅读全文