毕业设计论文基于单片机的正弦信号发生器.docx
《毕业设计论文基于单片机的正弦信号发生器.docx》由会员分享,可在线阅读,更多相关《毕业设计论文基于单片机的正弦信号发生器.docx(31页珍藏版)》请在冰豆网上搜索。
毕业设计论文基于单片机的正弦信号发生器
第一章绪论
1.1课题简介
1.1.1课题来源
本课题适用于科学教研、生产实践和教学实验等领域。
它是有AT89C51单片机、DAC0832。
通过按键来实现波形的产生。
1.12技术现状
运用单片机来完成本设计具有好的实用性和操作性。
因为单片机具有体积小、功能强、成本低、应用面广等功能。
1.2单片机的产生和发展
1.21单片机的定义
计算机的发展经历了从电子管到大规模集成电路等几个发展阶段,随着大规模集成电路技术的发展,使计算机向性能稳定可靠、微型化、廉价方向发展,从而出现了单片微型计算机。
所谓单片微型计算机,是指将组成微型计算机的基本功能部件,如中央处理器CPU、存储器ROM和RAM、输入/输出(I/O)接口电路等集成在一块集成电路芯片上的微型计算机,简称单片机。
总体来讲,单片机可以用以下“表达式”来表示:
单片机=CPU+ROM+RAM+I/O+功能部件
1.22单片机的发展史及发展趋势
单片机的历史可以追朔到1974年,美国仙童公司研究出世界上第一台单片微型计算机F8,该机由两块集成电路芯片组成,结构奇特,具有与众不同的指令系统,深受民用电器和仪器仪表领域的欢迎和重视。
从此,单片机开始迅速发展,应用范围也在不断扩大。
单片机的发展历史大致可分为下面三个阶段:
第一阶段(1976年~1978年):
初级单片机微处理阶段。
以Intel公司是MCS-48为代表,此系列的单片机具有8为CPU、并行I/O端口、8位时序同步计数器,寻址范围不大于4KB,但是没有串行口。
第二阶段(1978年~1982年):
高性能单片机微处理阶段,如Intel公司的MCS-51、Motorola公司的6801和Zilog公司的Z8等。
该类型单片机具有串行I/O端口,有多级中断处理系统,16位时序同步计数器,RAM,ROM容量加大,寻址范围可达64KB,有的芯片甚至还带有A/D转换接口。
由于该系统单片机应用领域极其广泛,各公司正大力改进其结构与性能。
第三阶段(1982年~现在):
8位单片机微处理改良型及16位单片机微处理阶段。
1.3单片机的特点及应用
1.31单片机的特点
随着现代科技的发展,单片机的集成度越来越高,CPU的位数也越来越高,已能将所有主要部件都集成在一块芯片上,使其应用模式多、范围广,并具有以下特点:
①体积小,功耗低,价格便宜,重量轻,易于产品化。
②控制功能强,运行速度快,能针对性地解决从简单到复杂的各类控制问题,满足工业控制要求,并有很强的位处理和接口逻辑操作等多种功能。
③抗干扰能力强,适用温度范围宽。
由于许多功能部件集成在芯片内部,受外界影响小,故可靠性高。
④虽然单片机内存储器的容量不可能很大,但存储器和I/O接口都易于扩展。
⑤可以方便的实现多机和分布式控制
1.32单片机的应用
单片机的应用具有面广量大的特点,目前它广泛的应用于国民经济各个领域,对技术改造和产品的更新起着重要作用。
主要表现在以下几个方面:
①单片机在智能化仪器、仪表中的应用:
由于单片机有计算机的功能,它不仅能完成测量,还既有数据处理、温度控制等功能,易于实现仪器、仪表的数字化和智能化。
②单片机在实时控制中的应用:
单片机可以用于各种不太复杂的实时控制系统中,如一般性的温度控制、液面控制、电镀顺序控制等。
将测量技术、自动控制技术和单片机技术相结合,充分发挥单片机的数据处理和实时控制功能,使系统工作于最佳状态。
③单片机在机电一体化中的应用:
单片机有利于机电一体化技术的发展,已广泛应用于数控机床、医疗设备、汽车设备等。
④单片机在多机系统中的应用:
单片机在多机系统中的应用是将来单片机发展的主要模式,它可以提高单片机的可靠性,使系统运行速度更快。
⑤单片机在计算机外围设备中的应用:
单片机广泛应用于打印机、绘图机等多种计算机的外围设备,特别是用于智能终端,可大大减轻主机负担,提高系统的运行速度。
⑥单片机在家用电器中的应用:
单片具有体积小、重量轻、价格便宜等特点,所以家电产品中配上微电脑后,使其身价百倍,功能更强,使用方便,灵活,深得用户欢迎。
⑦单片机在通信中的应用:
单片机广泛应用于移动通信领域,使移动电话的功能更强大,操作更方便。
第二章AT89C51单片机的特性与功能
2.1单片机的应用与选择
8051是MCS-51系列单片机中的代表产品,它内部集成了功能强大的中央处理器,包含了硬件乘除法器、21个专用控制寄存器、64kB的程序存储器、256B字节的数据存储器、4组8位的并行口、两个16位的可编程定时/计数器、一个全双工的串行口以及布尔处理器。
由于MCS-51集成了几乎完善的8位中央处理单元,处理功能强,中央处理单元中集成了方便灵活的专用寄存器,硬件的加、减、乘、除法器和布尔处理机及各种逻辑运算和转移指令,这给应用提供了极大的便利。
MCS-51的指令系统近乎完善,指令系统中包含了全面的数据传送指令、完善的算术和逻辑运算指令、方便的逻辑操作和控制指令、对于编程来说,是相当灵活和方便的。
MCS-51单片机的工作频率为2-12MHz,当振荡频率为12MHz时,一个机器周期为1us,这个速度应该说是比较快的。
8051中集成了完善的各种中断源,用户可十分方便地控制和使用其功能,使得它的应用范围加大,可以说它可以满足绝大部分的应用场合。
MCS-51把微型计算机的主要部件都集成在一块心片上,使得数据传送距离大大缩短,可靠性更高,运行速度更块。
由于属于芯片化的微型计算机,各功能部件在芯片中的布局和结构达最优化,抗干扰能力加强,工作亦相对稳定。
因此,在工业测控系统中,使用单片机是最理想的选择。
单片机属于典型的嵌入式系统,所以它是低端控制系统最佳器件。
2.2芯片简介
2.21AT89C51性能简介
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
2.22AT89C51的主要特性
⑴8031CPU与MCS-51兼容
⑵4K字节可编程FLASH存储器(寿命:
1000写/擦循环)
⑶全静态工作:
0Hz-24KHz
⑷三级程序存储器保密锁定
⑸128*8位内部RAM
⑹32条可编程I/O线
⑺两个16位定时器/计数器
⑻5个中断源
⑼可编程串行通道
⑽低功耗的闲置和掉电模式
⑾片内振荡器和时钟电路
2.23AT89C51管脚功能
MCS-51系列单片机芯片均为40个引脚,HMOS工艺制造的芯片采用双列直插(DIP)方式封装,其引脚示意及功能分类如图2-1:
MCS-51系列单片机的40个引脚中有2个专用于主电源的引脚,2个外接晶体的引脚,4个控制或与其它电源复用的引脚,以及32条输入输出I/O引脚。
VCC:
供电电压。
GND:
接地。
①P0口(P0.0~P0.7)为双向8位三态I/O口,当作为I/O口使用时,可直接连接外部I/O设备。
它是地址总线低8位及数据总线分时复用口,可驱动8个TTL负载。
一般作为扩展时地址/数据总线口使用。
②P1口(P1.0~P1.7)为8位准双向I/O口,它的每一位都可以分别定义为输入线或输出线(作为输入时,口锁存器必须置1),可驱动4个TTL负载。
③P2口(P2.0~P2.7)为8位准双向I/O口,当作为I/O口使用时,可直接连接外部I/O设备。
它是与地址总线高8位复用,可驱动4个TTL负载。
一般作为扩展时地址总线的高8位使用。
④P3口(P3.0~P3.7)为8位准双向I/O口,是双功能复用口,可驱动4个TTL负载。
P3口也可作为AT89C51的一些特殊功能口,如下所示:
P3口管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
综上所述,MCS-51系列单片机的引脚作用可归纳为以下两点:
⑴单片机功能多,引脚数少,因而许多引脚都具有第2功能;
⑵单片机对外呈3总线形式,由P2、P0口组成16位地址总线;由P0口分时复用作为数据总线;由ALE、PSEN/、EA/与P3口中的INT0/、INT1/、T0、T1、WR/、RD/共10个引脚组成控制总线。
第三章硬件设计
3.1正弦信号发生器设计方案框图
图3-1设计方框图
3.2DAC0832硬件简介
3.2.1管脚功能如图3-2所示:
图3-2DAC0832管脚图
DAC0832的主要特性参数如下:
*分辨率为8位;
*输出为电流信号,电流的建立时间为1us;
*可单缓冲、双缓冲或直接数字输入;
*只需在满量程下调整其线性度;
*单一电源供电(+5V~+15V),低功耗,20mW;
*参考电压可以达到±10V;
*直接的数字接口可以与任何一款单片机相连。
DAC0832的引脚功能:
*D0~D7:
8位数据输入线,TTL电平,通常与单片机的数据总线相连,用于输入CUP送来的待转换数字量。
有效时间应大于90ns(否则锁存器的数据会出错);
*ILE:
数据锁存允许控制信号输入线,高电平有效;
*
:
片选信号输入线(选通数据锁存器),低电平有效;
*
:
数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。
由ILE、
、
的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;
*
:
数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;
*
:
DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。
由
、
的逻辑组合产生LE2,当LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换。
*IOUT1:
电流输出端1,其值随DAC寄存器的内容线性变化;
*IOUT2:
电流输出端2,其值与IOUT1值之和为一常数;
—当DAC寄存器内容全为1时,IOUT1为最大,IOUT2=0;
—当DAC寄存器内容全为0时,IOUT1=0,IOUT2为最大;
为了保证输出电流的线性,应将IOUT1及IOUT2接到外部运算放大器的输入端上。
*Rfb:
反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度;
*Vcc:
芯片工作电源,范围为+5V~+15V;
*VREF:
基准电压输入线,VREF的范围为-10V~+10V;
*AGND:
模拟信号地,为模拟信号和基准电源的参考地;
*DGND:
数字信号地,为工作电源地和数字逻辑地;
3.2.2DAC0832芯片与单片机硬件接口设计
DAC0832与MCS-51单片机的连接方式:
根据对DAC0832的数据锁存器和DAC寄存器的不同的控制方式,DAC0832有三种连接方式:
直通方式、单缓冲方式和双缓冲方式。
1、双缓冲方式:
进行两级缓冲;
2、单缓冲方式:
只进行一级缓冲;
3、直通方式:
不进行缓冲,适用于比较简单的场合。
本设计采用的是直通连接方式。
具体电路设计如图3-3、3-4所示:
图3-3连接图
图3-4连接图
3.2.3放大整形电路
为了输入的是小信号时也能对精确的测出它的频率,所以在信号的输入口加电压放大。
有时输入的信号波形不是很好时,放大后也是失真的信号,这就会影响到所测信号的频率,因此要经过整形。
其电路如图3-5所示:
图3-5放大电路
3.3LCD1602硬件介绍
图3-6LCD1602引脚图
LCD1602引脚及其功能介绍如表2-1所示:
表2—1
管脚号
管脚名称
LEVER
管脚功能描述
1
VSS
0V
电源地
2
VDD
5.0V
电源电压
3
VEE
对比调整电压
续表
4
RS
H/L
RS=“H”,表示DB7~DB0为显示数据
RS=“L”,表示DB7~DB0为显示指令数据
5
R/W
H/L
R/W=“H”,E=“H”,数据被读到DB7~DB0
R/W=“L”,E=“H→L”DB7~DB0的数据被写到IR或DR
6
E
H/L
使能信号:
R/W=“L”,E信号下降沿锁存DB7~DB0
R/W=“H”,E=“H”
DRAM
数据读到
D7~D0
7
D0
H/L
数据线
8
D1
H/L
数据线
9
D2
H/L
数据线
10
D3
H/L
数据线
11
D4
H/L
数据线
12
D5
H/L
数据线
13
D6
H/L
数据线
14
D7
H/L
数据线
第四章基于51单片机的正弦信号发生器设计
4.1正弦信号发生器程序的流程图如图4-1所示:
图4-1流程图
4.2程序设计
#include//头文件
#defineucharunsignedchar
#defineuintunsignedint
sbitlcdrw=P3^3;//位变量的定义
sbitlcdrs=P3^2;//位变量的定义
sbitlcde=P3^4;//位变量的定义
sbits1=P2^0;//位变量的定义
sbits2=P2^1;//位变量的定义
sbits3=P2^2;//位变量的定义
sbitcs1=P3^5;//位变量的定义
sbitcs2=P3^6;//位变量的定义
uchars1num,a,ys,j;//变量的定义(字符型)
uintfre;//变量的定义(整型)
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,0xde,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(uintz)//延时子程序
{
uchari,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
voiddelay1(uinty)//延时子程序
{
uinti;
for(i=y;i>0;i--);
}
voidwrite_com(ucharcom)//1602写指令
{
lcdrs=0;
P1=com;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
voidwrite_data(uchardate)//1602数据
{
lcdrs=1;
P1=date;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
voidinit()//初始化
{
lcdrw=0;
lcde=0;
cs2=0;
cs1=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x00);
write_data(0x77);//写wave:
write_data(0x61);
write_data(0x76);
write_data(0x65);
write_data(0x3a);
write_com(0x80+0x40);//写f:
write_data(0x66);
write_data(0x3a);
}
voidwrite_f(uintdate)//写频率
{
ucharqian,bai,shi,ge;
qian=date/1000;
bai=date/100%10;
shi=date/10%10;
ge=date%10;
write_com(0x80+0x42);
write_data(0x30+qian);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
write_data(0x48);
write_data(0x5a);
}
voidxsf()//显示频率
{
if(s1num==1)//if语句(判断是否是状态1)
{
fre=(1000/(9+3*ys));//频率计算公式
write_f(fre);//写频率
}
}
voidkeyscanf()//按键部分
{
if(s1==0)
{
delay(5);
if(s1==0)
{
while(!
s1);//无限循环函数
s1num++;//s1num+1
if(s1num==1)//if语句(判断是否是状态1)
{
ys=0;
write_com(0x80+0x05);
write_data(0x73);//写sine:
write_data(0x69);
write_data(0x6e);
write_data(0x65);
write_data(0x20);
write_data(0x20);
}
if(s1num==2)//if语句(判断是否是状态2)
{
s1num=0;
P1=0;
write_com(0x80+0x05);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_com(0x80+0x42);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
write_data(0x20);
}
}
}
if(s2==0)//按键减频率
{
delay(5);
if(s2==0)