基于单片机的低频信号发生器Word下载.docx
《基于单片机的低频信号发生器Word下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的低频信号发生器Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
![基于单片机的低频信号发生器Word下载.docx](https://file1.bdocx.com/fileroot1/2022-12/17/42708216-8e0b-43d7-b45d-c786bc1ae63f/42708216-8e0b-43d7-b45d-c786bc1ae63f1.gif)
2.2各模块作用介绍3
2.2.1独立键盘3
2.2.2LCD模块3
2.2.3模数转换及集成运放模块4
2.2.4本章小结4
第3章系统硬件电路设计5
3.1STC89C52单片机最小系统设计5
3.1.1STC89C52单片机介绍5
3.1.2STC89C52单片机时钟电路介绍6
3.1.3STC89C52单片机复位电路介绍7
3.2数模转换电路介绍7
3.2.1主要芯片功能介绍7
3.2.2DAC0832芯片内部结构介绍8
3.2.3DAC0832芯片引脚功能介绍8
3.2.4DAC0832芯片应用电路介绍9
3.3本章小结10
第4章系统软件调试环境介绍11
4.1编程软件介绍11
4.1.1软件功能11
4.1.2软件应用流程12
4.2程序下载软件介绍14
4.2.1软件功能14
4.2.2软件应用流程14
4.3本章小结16
第5章系统程序设计17
5.1系统程序设计流程图17
5.2程序流程图对应程序代码17
5.3本章小结22
结 论23
参考文献24
在目录上点右键“更新域”,然后“更新整个目录”
绪 论
本设计的意义
信号发生器,在生产实践和科技领域中有着广泛的应用。
各种波形曲线均可以用三角函数方程式来表示。
能够产生多种波形,如方波、锯齿波、三角波、正弦波的电路被称为函数信号发生器。
在通信、广播、电视系统,在工业、农业、生物医学领域内,函数信号发生器在实验室和设备检测中具有十分广泛的用途。
同时在实验室和检测设备中有着很重要的地位
信号发生器分类
信号发生器是指产生所需参数的电测试信号的仪器。
因其应用广泛,种类繁多,特性各异,分类也不尽一致。
按信号波形可分为正弦信号、函数信号、脉冲信号和随机信号发生器等四大类;
按频率覆盖范围分为低频信号发生器、高频信号发生器和微波信号发生器;
按输出电平可调节范围和稳定度分为简易信号发生器、标准信号发生器和功率信号发生器;
按频率改变的方式分为调谐式信号发生器、扫频式信号发生器、程控式信号发生器和频率合成式信号发生器等。
信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。
研究题目及其意义
信号发生器是一种经常使用的设备,由纯粹物理器件构成的传统的设计方法存在
许多弊端,如:
体积较大、重量较沉、移动不方便、信号失真较大、波形形状调节过于死板,无法满足用户对精度、便携性、稳定性等要求,研究设计出一种具有频率稳定、准确、波形质量好、输出频率范围宽、便携性好等特点的波形发生器具有较好的市场前景。
以满足工业领域对信号源的要求。
本次试验实现利用单片机AT89C52和8位D/A转换芯片DAC0832共同实现三角波、正弦波这两种种常用波形的发生。
根据设计的要求,对各种波形的频率和幅度进行程序的编写,并将所写程序装入单片机的程序存储器中。
在程序运行中,当接收到来自外界的命令,需要输出某种波形时再调用相应的中断服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出。
并且可以通过数码管和键盘显示模块,键盘可以实现对几种波形的切换。
本设计的要求
介绍选题的背景意思,单片机的概述,信号发生器的分类等
方案设计:
介绍系统功能要求和整体结构,包括液晶的显示信号频率,按键波形选择及信号频率调整等。
系统的硬件设计:
介绍各单元电路设计,主要介绍单片机主控制器,信号产生电路、显示电路、键盘电路等。
系统的软件设计:
介绍各子程序的算法和流程,包括主程序、三角波、正弦波的信号产生、液晶显示、键盘扫描、按键处理等。
本设计系统结构介绍
系统结构框图
基于单片机的低频信号发生器的结构框图如下:
图2.1低频信号发生器的结构框图
各模块作用介绍
2.2.1独立键盘
本设计采用5路独立键盘,分别设计为UPDOWNLEFTRIGHT及OK功能按键。
分别用于设定系统的各工作状态,包括波形选择占空比选择及频率选择等。
独立键盘触发方式采用低电平触发方式。
在CPU中由触发中断处理方式读取按键信息,并将信息交由核心处理程序处理。
1.1.2LCD模块
LCD模块采用1602液晶显示屏,该型号液晶显示屏由16*2个显示单元组成,每个显示单元由8*6个像素点构成。
全屏单屏共可显示32个数字(字符)。
在本设计中LCD功能模块主要负责实时显示系统的工作状态,包括输出波形输出频率波形占空比等信息。
模块显示信息由CPU控制程序实时刷新。
2.2.3模数转换及集成运放模块
在本设计中由模数转换器及运算放大电路组成的模拟信号输出电路是本设计的核心模块。
模数转换器采用DAC0832芯片,该芯片可读取TTL电平并行数字信号,该特点将使本设计信号转换电路大大简化。
DAC0832芯片采用8路数字输入信号,分辨单位为256个单位,并可通过CS、Xfer等控制端实时控制芯片的工作状态。
该芯片的输出信号为经过转换的模拟信号,信号分度值为5V/256,由于该信号输出端口输出的信号较为微弱,不便于负载的读取与测量,故在该芯片的模拟信号输出端接入一个集成运算放大器用来放大微弱的输出信号。
2.2.4本章小结
本章简要介绍了本设计系统的主要结构,通过对整个系统的宏观分析,使本设计在结构及主要功能上更加条理清晰,便于本设计的模块化设计。
同时本章还简要分析了各模块的具体功能。
注意:
除第一章绪论外,其他每一章都应该有一个本章小结
系统硬件电路设计
STC89C52单片机最小系统设计
图3-1单片机最小系统
STC89C52单片机介绍
单片机
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口。
另外STC89X52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35Mhz,6T/12T可选。
特性:
1)STC89C52RC单片机:
2)8K字节程序存储空间;
3)512字节数据存储空间;
4)内带4K字节EEPROM存储空间;
5)可直接使用串口下载;
6)AT89S52单片机:
7)8K字节程序存储空间;
8)256字节数据存储空间;
STC89C52单片机时钟电路介绍
单片机的时钟信号通常用两种电路形式得到:
内部振荡和外部振荡方式。
在引脚
XTAL1和XTAL2外接晶体振荡器,构成了内部振荡方式。
由于单片机内部有一个高增益的反相放大器,当外接晶振后,就构成了自激振荡,并产生振动时钟脉冲。
晶振通常选用6MHZ、12MHZ、24MHZ。
本设计中时钟电路图如图,我们选择了12MHZ和晶振分别接引脚XTAL1XTAL2,电容C1,C2均选择为30pF,对振荡器的频率有稳定作用,当频率较大时,正弦波、方波、三角波及锯齿波中每一点的延时时间为几微妙,故延时时间还要加上指令时间才能获得较大的频率波形。
图3-2单片机时钟电路
STC89C52单片机复位电路介绍
复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。
复位电路通常采用上电自动复位和按钮复位两种式。
本设计选择了按键复位如图3.3,在系统运行时,按一下开关,就
在RST断出现一段高电平,使图3.2时钟电路图器件复位。
此时ALE、PSEN、P0、P1、P2、P4输出高电平,RST上输入返回低电平以后,变退出复位状态开始工作。
图3-3单片机复位电路
数模转换电路介绍
主要芯片功能介绍
ADC0832的介绍:
DAC0832是8分辨率的D/A转换集成芯片。
与微处理器完全兼容。
这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。
D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。
图3-4DAC0832
DAC0832芯片内部结构介绍
DAC0832内部结构图:
图3-5DAC0832芯片内部结构
当ILE为1时,只有当/CS、/WR1都为0时输入寄存器才允许输入;
当/WR2、/XFER也都为0时,输入寄存器里的信息才能写入DAC寄存器
DAC0832芯片引脚功能介绍
D0~D7:
8位数据输入线,TTL电平,有效时间应大于90ns(否则锁存器的数据会出错);
ILE:
数据锁存允许控制信号输入线,高电平有效;
CS:
片选信号输入线(选通数据锁存器),低电平有效;
WR1:
数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。
由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;
XFER:
数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;
WR2:
DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。
由WR1、XFER的逻辑组合产生LE2,当LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换。
IOUT1:
电流输出端1,其值随DAC寄存器的内容线性变化;
IOUT2:
电流输出端2,其值与IOUT1值之和为一常数;
Rfb:
反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度;
Vcc:
电源输入端,Vcc的范围为+5V~+15V;
VREF:
基准电压输入线,VREF的范围为-10V~+10V;
AGND:
模拟信号地
DGND:
数字信号地
DAC0832芯片应用电路介绍
图3-6DAC0832芯片应用电路
P0口是数据端口,接上拉电阻(其他端口则不用)。
电源质量要好,质量越好的电源,芯片工作就越稳定。
从LM358运放输出的电压最大峰峰值就是12V所以在二级运放的放大倍数要注意跟基准电压想匹配,否则输出信号会很容易失真。
正弦波的生成:
DAC0832产生信号的原理可以说是ADC0809AD转换的逆过程,但DAC0832生成的信号是离散的。
假设要生成一个Y=Asin(2*pi*f*t)的正弦波。
adc0832数据端口给的数据的范围是0~255一共256个。
前0~127表示是X轴上方的电压值(也可能是下方)。
那么128~255是X轴下方的电压值。
那么我们可以得到数据端口的数值的具体量,即value=127sin(2*pi*f*t)+127;
假设我在X轴上抽样100个点(0~99),那么value=127sin(pi/50*t)+127;
t:
0~99.(这个100位的数组可以用MATALB生成)。
也可以抽样更多的点,抽样的点越多,得到的信号越保真,但信号的频率会有所下降。
抽样的点越少,失真越大,但频率能成大幅度递增。
怎么选择,具体情况具体分析。
其他的波形也跟正弦波一样。
本章小结
本章详细介绍了该课题在硬件电路设计方面的各个组成模块及其具体设计电路。
在具体器件的原理上逐个分析,层层综合。
将基本电路封装成功能模块,并明确其输入及输出信号电气特性及通信编码原理,为后续的系统综合组建与测试提供硬件基础。
系统软件调试环境介绍
编程软件介绍
单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。
机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(Vision)将这些部份组合在一起。
运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP等操作系统。
掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
软件功能
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
用过汇编语言后再使用C来开发,体会更加深刻。
C51工具包的整体结构,其中Vision与Ishell分别是C51forWindows和forDos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。
开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。
然后分别由C51及A51编译器编译生成目标文件(.OBJ)。
目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。
ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。
Keil51的编译环境如图5-1所示。
图中:
标题栏:
显示当前编译的文件
菜单条:
有十项菜单可供选择,相应的所有操作命令均可在此菜单中查找;
工具栏:
常用命令的快捷图标按钮;
管理窗口:
显示工程文件的项目、各个寄存器值的变化、参考资料等;
信息窗口:
显示当前文件编译、运行等相关信息;
工作窗口:
各种文件的显示窗口。
KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
下面详细介绍KeilC51开发系统各部分功能和使用。
软件应用流程
第1步:
打开Keil51软件,首先弹出一个开机启动画面。
第2步:
然后进入Keil51的开发界面。
下面简要介绍一下Keil51开发环境中各个区域的功能。
Keil51开发环境可以分为四个区域,分别为:
菜单条、项目文件管理窗口、代码编译窗口和代码编译信息窗口四个部分。
菜单条分为十项,所有的命令都可以在这里找到。
下面的命令是一些常用的菜单命令,如文件的打开、关闭及保存。
其中编译命令最为常用。
中间靠左是项目文件管理窗口,这里可以看到当前项目中所包含的所有带编译的文件。
项目文件管理窗口的右侧是代码编译窗口,这事我们最主要的工作区域。
最底层显示了代码编译的信息。
当代码有语法错误时,可以在这里轻松的找到问题的所在。
第3步:
下面以建立一个简单的项目为例,来说明Keil51开发项目的一般方法。
单击Project菜单项,选择NewProject项。
第4步:
此时弹出CreateNewProject对话框,选择合适的路径口,在文件名一栏中填入新工程的名字。
单击保存。
第5步:
根据所用的器件,选择CPU的型号,单击确定。
第6步:
Keil51询问是否生成默认的配置文件,这个可选可不选,这里选定。
单击Yes,观察项目文件管理窗口的变化。
第7步:
在File菜单下单击New选项,新建文件。
此时在代码窗口出现一“Text1”空白文档。
第8步:
在“Text1”中编辑完代码后,单击File菜单中的保存项,弹出保存对话框。
保存名写为text.c。
注意在对文件命名时必须加扩展名。
第9步:
在项目导航栏中SourceGroup上单击右键,选AddFiletoGroup‘SourceGroup1’。
第10步:
此时弹出AddFile对话框。
选中刚才保存的text.c文件。
单击Add。
此时在项目文件管理窗口中就会出现刚才所添加的文件text.c。
第11步:
单击快捷菜单栏中的编译按钮
,可以编译程序。
第12步:
单击Project菜单项,选择OptionforTarget‘Target1’选项。
在弹出的对话框中可以对Project进行总体配置。
第13步:
选择Output选项卡,单击CreateHEXFile,代码输出格式应为HEX-80。
第14步:
单击确定后,并重新编译。
可以看到编译成功之后,Build选项卡里又多了一项。
这是生成的HEX文件。
第15步:
单击Debug菜单项中的Start/StopDebugSession命令或工具栏中的
进入调试界面。
第16步:
单击调试界面Debug菜单项中的Go命令或工具栏中的
运行程序,单击StopRunning命令或
来结束程序。
观察运行结果,若结果正确,便可通过下载软件将它烧写到目标板上去。
程序下载软件介绍
STC89C52单片机采用STC_ISP_V4.80向内部烧写程序。
STC_ISP_V4.80是由STC公司研发,可以向STC89C51、STC89C52等系列单片机内烧写程序。
可以设置波特率,串口等参数。
同时STC_ISP_V4.80还可以作为串口调试工具,用于串口收发数据的调试软件。
第一:
打开STC_ISP_V4.80软件,分别设置最高,最低波特率,并选择相应的串口等参数。
如图:
第二:
打开所要下载的.hex文件,如图所示:
第三:
点击DownLoad,程序就开始烧写
第四:
看到如下图就说明下载成功了
本章首先介绍了程序开发软件的主要功能,开发特点,并提出一定的C语言代码要求。
在此基础之上进一步明确C程序的整个开发及调试流程。
其次,介绍了计算机与本设计硬件电路的通信接口程序,详细阐述了系统软件下载及调试具体流程。
系统程序设计
系统程序设计流程图
图5-1系统程序设计流程图
程序流程图对应程序代码
#include<
reg52.h>
absacc.h>
math.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineL_W_DXBYTE[0X9fff]
#defineL_W_CXBYTE[0X1fff]
#defineL_R_CXBYTE[0X5fff]
sbitenlcd=P2^5;
sbiten11=P3^7;
sbiten=P3^6;
sbitdacs=P2^4;
sbitXfer=P2^3;
sbitkey1=P1^7;
sbitkey5=P3^5;
charword[]={
'
S'
'
i'
g'
n'
a'
l'
'
P'
r'
o'
u'
c'
e'
};
charword1[]={
M'
d'
b'
y'
Y'
L'
0'
9'
1'
3'
2'
4'
charboxing[]={
s'
w'
v'
t'
voidwait();
/***********************1602写命令程序******************************************************/
voidsend_command(uintcommand)
{
wait();
L_W_C=command;
}
/***************************1602**********************************************/
voiddelay()
uinti,j;
for(i=0;
i<
50;
i++)
for(j=0;
j<
j++)
;
/**************************读忙程序**************************************************/
voidwait()
ucharx;
do
{