单片机波形发生器设计课设分解.docx
《单片机波形发生器设计课设分解.docx》由会员分享,可在线阅读,更多相关《单片机波形发生器设计课设分解.docx(15页珍藏版)》请在冰豆网上搜索。
单片机波形发生器设计课设分解
目录
总结.............................................................141
3.1MCS-51单片机的内部结构2
3.1.1内部结构概述2
3.1.2CPU结构3
3.1.3存储器和特殊功能寄存器3
3.2P0-P3口结构4
3.3时钟电路和复位电路4
3.3.1时钟电路4
3.3.2单片机的复位状态5
3.4DAC0832的引脚及功能6
5.2锯齿波程序模块10
5.3三角波程序模块11
5.4方波程序模块12
5.5延迟程序13
总结.............................................................14
参考文献...................................................14
1、题目设计要求
波形发生器设计
要求:
利用51单片机,DS0832,按键,设计三角波、锯齿波和方波发生器。
可按键输出三种波形。
完成以下设计环节:
1)使用AltiumDesinger开发工具,设计电路原理图。
2)使用Uvision2开发平台,采用C语言或汇编语言设计软件程序。
3)使用PROTEUS仿真软件,设计仿真原理图并运行软件程序,完成系统仿真。
2、系统的组成及工作原理
2.1系统组成
DAC0832当今世界在以电子信是8位分辨率的D/A转换集成芯片,与微处理器完全兼容,这个系列的芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到了广泛的应用。
这类D/A转换器由8位输入锁存器,8位DAC寄存器,8位DA转换电路及转换控制电路构成。
图2.1系统组成图
2.2工作原理
D/A转换器产生各种波形的原理:
波形的产生是通过AT89S52单片机执行某一波形发生程序,向D/A转换器的输入端按一定的规律发生数据,从而在D/A转换电路的输出端得到相应的电压波形。
利用D/A转换器输出的模拟量与输入数字量成正比关系这一特点,将D/A转换器作为微机输出接口,CPU通过程序向D/A转换器输出随时间呈现不同变化规律的数字量,则D/A转换器就可输出各种各样的模拟量,如方波、三角波、锯齿波、正弦波等.
3器件的功能和作用
3.1MCS-51单片机的内部结构
3.1.1内部结构概述
典型的MCS-51单片机芯片集成了以下几个基本组成部分。
1一个8位的CPU
2128B或256B单元内数据存储器(RAM)
34KB或8KB片内程序存储器(ROM或EPROM)
44个8位并行I/O接口P0~P3。
5两个定时/计数器。
65个中断源的中断管理控制系统。
7一个全双工串行I/O口UART(通用异步接收、发送器)
8一个片内振荡器和时钟产生电路。
图3.1单片机引脚
3.1.2CPU结构
CPU是单片机的核心部件。
它由运算器和控制器等部件组成。
1. 运算器
运算器以完成二进制的算术/逻辑运算部件ALU为核心。
它可以对半字节(4)、单字节等数据进行操作。
例如,能完成加、减、乘、除、加1、减1、BCD码十进制调整、比较等算术运算,完成与、或、异或、求反、循环等逻操作,操作结果的状态信息送至状态寄存器。
运算器还包含有一个布尔处理器,用以处理位操作。
它以进位标志位C为累加器,可执行置位、复位、取反、位判断转移,可在进位标志位与其他可位寻址的位之间进行位数据传诵等操作,还可以完成进位标志位与其他可位寻址的位之间进行逻辑与、或操作。
2.程序计数器PC
PC是一个16位的计数器,用于存放一条要执行的指令地址,寻址范围为64kB,PC有自动加1功能,即完成了一条指令的执行后,其内容自动加1。
3.指令寄存器
指令寄存器用于存放指令代码。
CPU执行指令时,由程序存储器中读取的指令代码送如指令寄存器,经指令译码器译码后由定时有控制电路发出相应的控制信号,完成指令功能。
3.1.3存储器和特殊功能寄存器
1.存储器(Memory)是计算机系统中的记忆设备,用来存放程序和数据。
计算机中的全部信息,包括输入的原始数据、计算机程序、中间运行结果和最终运行结果都保存在存储器中。
它根据控制器指定的位置存入和取出信息。
2.特殊功能寄存器
特殊功能寄存器(SFR)的地址范围为80H~FFH。
在MCS-51中,除程序计数器PC和四个工作寄存器区外,其余21个特殊功能寄存器都在这SFR块中。
其中5个是双字节寄存器,它们共占用了26个字节。
各特殊功能寄存器的符号和地址见附表2。
其中带*号的可位寻址。
特殊功能寄存器反映了8051的状态,实际上是8051的状态字及控制字寄存器。
用于CPUPSW便是典型一例。
这些特殊功能寄存器大体上分为两类,一类与芯片的引脚有关,另一类作片内功能的控制用。
与芯片引脚有关的特殊功能寄存器是P0~P3,它们实际上是4个八位锁存器(每个I/O口一个),每个锁存器附加有相应的输出驱动器和输入缓冲器就构成了一个并行口。
MCS-51共有P0~P3四个这样的并行口,可提供32根I/O线,每根线都是双向的,并且大都有第二功能。
其余用于芯片控制的寄存器中,累加器A、标志寄存器PSW、数据指针DPTR等的功能前已提及。
3.2P0-P3口结构
P0口功能:
P0口具有两种功能:
第一,P0口可以作为通用I/O接口使用,P0.7—P0.0用于传送CPU的输入/输出数据。
输出数据时可以得到锁存,不需外接专用锁存器,输入数据可以得到缓冲。
第二,P0.7—P0.0在CPU访问片外存储器时用于传送片外存储器de低8位地址,然后传送CPU对片外存储器的读写
P1口功能:
P1口的功能和P0口de第一功能相同,仅用于传递I/O输入/输出数据。
P2口的功能:
2口的第一功能和上述两组引脚的第一功能相同,即它可以作为通用I/O使用。
它的第二功能和P0口引脚的第二功能相配合,作为地址总线用于输出片外存储器的高8位地址。
P3口功能:
P3口有两个功能:
第一功能与其余三个端口的第一功能相同;第二功能作控制用,每个引脚都不同。
P3.0—RXD串行数据接收口
P3.1—TXD串行数据发送口
P3.2—INT0外中断0输入
P3.3—INT1外中断1输入
P3.4—T0计数器0计数输入
P3.5—T1计数器1计数输入
P3.6—WR外部RAM写选通信号
P3.7—RD外部RAM读选通信号
3.3时钟电路和复位电路
单片机的时钟信号用来提供单片机内各种微操作的时间基准;复位操作则使单片机的片内电路初始化,使单片机从一种确定的状态开始运行。
3.3.1时钟电路
单片机的时钟信号通常用两种电路形式得到:
内部振荡和外部振荡方式。
图3.2时钟部分电路图
在引脚XTAL1和XTAL2外接晶体振荡器或陶瓷谐振荡器,构成了内部振荡方式。
由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自积振荡,并产生振荡时钟脉冲。
晶振通常选用6MHZ、12MHZ、或24MHZ。
单片机的时序单位
振荡周期:
晶振的振荡周期,又称时钟周期,为最小的时序单位。
状态周期:
振荡频率经单片机内的二分频器分频后提供给片内CPU的时钟周期。
因此一个状态周期包含2个振荡周期。
机器周期:
1个机器周期由6个状态周期12个振荡周期组成,是计算机执行一种基本操作的时间单位。
指令周期:
执行一条指令所需的时间。
一个指令周期由1-4个机器周期组成,依据指令不同而不同.
3.3.2单片机的复位状态
当MCS-5l系列单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,根据应用的要求,复位操作通常有两种基本形式:
上电复位和上电或开关复位。
上电复位要求接通电源后,自动实现复位操作。
上电或开关复位要求电源接通后,单片机自动复位,并且在单片机运行期间,用开关操作也能使单片机复位。
上电后,由于电容C3的充电和反相门的作用,使RST持续一段时间的高电平。
当单片机已在运行当中时,按下复位键K后松开,也能使RST为一段时间的高电平,从而实现上电或开关复位的操作。
图3.3复位电路
单片机的复位操作使单片机进入初始化状态,其中包括使程序计数器PC=0000H,这表明程序从0000H地址单元开始执行。
单片机冷启动后,片内RAM为随机值,运行中的复位操作不改变片内RAM区中的内容,21个特殊功能寄存器复位后的状态为确定值统复位是任何微机系统执行的第一步,使整个控制芯片回到默认的硬件状态下。
51单片机的复位是由RESET引脚来控制的,此引脚与高电平相接超过24个振荡周期后,51单片机即进入芯片内部复位状态,而且一直在此状态下等待,直到RESET引脚转为低电平后,才检查EA引脚是高电平或低电平,若为高电平则执行芯片内部的程序代码,若为低电平便会执行外部程序。
51单片机在系统复位时,将其内部的一些重要寄存器设置为特定的值,至于内部RAM内部的数据则不变。
3.4DAC0832的引脚及功能
3.4.1DAC0832的引脚及功能:
DAC0832是8分辨率的D/A转换集成芯片。
与微处理器兼容。
这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。
D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及控制转换电路构成。
图3.4DAC0832引脚
3.4.2应用特性
·DAC0832是微处理器兼容型D/A转换器,可以充分利用微处理器的控制能力实现对D/A转换的控制。
这种芯片有许多控制引脚,可以和微处理器控制线相连,接受微处理器的控制,如ILE、/CS、/WR1、/WR2、/XFER端。
有两级锁存控制功能,能够实现多通道D/A的同步转换输出。
·DAC0832内部无参考电压源;须外接参考电压源。
DAC0832为电流输入型D/A转换器,要获得模拟电压输出时,需要外加转换电路。
DAC0832的引脚图及逻辑结构如下图:
图3.5DAC0832结构框图及引脚排列
3.4.3各引脚功能说明:
D0~D7:
8位数据输入线,TTL电平,有效时间应大于90ns(否则锁存器的数据会出错);
ILE:
数据锁存允许控制信号输入线,高电平有效;
CS:
片选信号输入线(选通数据锁存器),低电平有效;
WR1:
数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。
由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;
XFER:
数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;
WR2:
DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。
由WR2、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:
数字信号地
3.4.4DAC0832三种数据输入方式:
(1)双缓冲方式:
即数据经过双重缓冲后再送入D/A转换电路,执行两次写操作才能完成一次D/A转换。
这种方式可在D/A转换的同时,进行下一个数据的输入,可提高转换速率。
更为重要的是,这种方式特别适用于要求同时输出
多个模拟量的场合。
此时,要用多片DAC0832组成模拟输出系统,每片对应一个模拟量。
(2)单缓冲方式:
不需要多个模拟量同时输出时,可采用此种方式。
此时两个寄存器之一处于直通状态,输入数据只经过一级缓冲送入D/A转换电路。
这种方式只需执行一次写操作,即可完成D/A转换。
(3)直通方式:
此时两个寄存器均处于直通状态,因此要将
、
、
和
端都接数字地,ILE接高电平,使LE1、LE2均为高电平,致使两个锁存寄存器同时处于放行直通状态,数据直接送入D/A转换电路进行D/A转换。
这种方式可用于一些不采用微机的控制系统中或其他不须0832缓冲数据的情况。
4系统硬件设计
波形的产生是通过AT89S52单片机执行某一波形发生程序,向D/A转换器的输入端按一定的规律发生数据,从而在D/A转换电路的输出端得到相应的电压波形。
AT89S52单片机的最小系统有三种联接方式。
一种是两级缓冲器型,即输入数据经过两级缓冲器型,即输入数据经过两级缓冲器后,送D/A转换电路。
第二种是单级缓冲器型,输入数据经输入寄存器直接送入DAC寄存器,然后送D/A转换电路。
第三种是两个缓冲器直通,输入数据直接送D/A转换电路进行转换。
本电路仿真的总图如下:
图4.1系统电路图
5系统软件设计及仿真调试
5.1流程图
图5.1流程图
5.2锯齿波程序模块
锯齿波是经过锯齿波函数进行SawtoothOut(unsignedcharfre)来进行转换成数据量,再输出道D/A转换电路输出到示波器进行显示的波形[11]。
锯齿波是和三角波比较相似,他是由两个三角波叠加而成,所以,我们可以把锯齿波,看成是两个三角波。
在处理锯齿波的时候,也是当三角波来处理,锯齿波是由函数来产生,我们只需要知道,最高点,和最低点以及占空比和频率,那么波形就能够实现。
锯齿波的详细程序如下。
1.锯齿波函数的定义
voidSawtoothOut(unsignedcharfre)//定义锯齿波函数
{
SawtoothIncrement=fre;//锯齿波的参数增加值等于频率值
FlagSawtooth=1;//锯齿波默认初始值为1
Count=255;//锯齿波函数的初始值为255
}
2.锯齿波函数的实现
if(FlagSawtooth==1)//判断是否是锯齿波,如果是才能继续
{
CountNumber++;//增加次数计数器
if(CountNumber==2)//就可以输出波
{CountNumber=0;//再次置0
Count=Count-SawtoothIncrement;//找到下一个点
if(Count<0)//判断是否为0如果为0了那么自动
Count=255;//变为255
DATAOUTPUT=Count;//输出波
}
}
}
图5.2锯齿波图
5.3三角波程序模块
三角波是经过锯齿波函数进行TriangleOut(unsignedcharfre)来进行转换成数据量,再输出道D/A转换电路输出到示波器进行显示的波形[12]。
三角波,上面我们提过,与锯齿波原理相同,三角波是由函数来产生,我们只需要知道,最高点,和最低点以及占空比和频率,那么波形就能够实现。
三角波的详细程序如下。
1.三角波函数的定义
voidTriangleOut(unsignedcharfre)//1--10HZ2--20Hz5--50Hz10--100Hz
{
TriangleIncrement=fre;//三角波的参数增加值等于频率值
FlagTriangle=1;//三角波默认初始值为1
}
2.三角波函数的实现
if(FlagTriangle==1)判断是否是锯齿波,如果是才能继续
{
CountNumber++;增加次数计数器
if(CountNumber==2)//输出三角波
{
CountNumber=0;再次置0
Count=Count+TriangleIncrement;//找到下一个点
if(Count>=256)//判断是否为256如果为256了那么自动
Count=0;//变为0(256为最高点。
0为最低点)
DATAOUTPUT=TableTriangle[Count];//输出波
}
}
图5.3三角波图
5.4方波程序模块
方波是经过锯齿波函数进行voidSqureOut(unsignedintfre,unsignedintduty)来进行转换成数据量,再输出道D/A转换电路输出到示波器进行显示的波形[14]。
方波主要是通过指定节点来进行波形的显示,每个节点是已经确定的值,方波和正玄波工作原理相似,节点都是在初始化的过程中定义的,方波的初始化如下:
staticunsignedcharcodeTableTriangle[256]={
128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,
160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,
192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,
224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,
255,254,252,250,248,246,244,242,240,238,236,234,232,230,228,226,
224,222,220,218,216,214,212,210,208,206,204,202,200,198,196,194,
192,190,188,186,184,182,180,178,176,174,172,170,168,166,164,162,
160,158,156,154,152,150,148,146,144,142,140,138,136,134,132,130,
128,126,124,122,120,118,116,114,112,110,108,106,104,102,100,98,
96,94,92,90,88,86,84,82,80,78,76,74,72,70,68,66,
64,62,60,58,56,54,52,50,48,46,44,42,40,38,36,34,
32,30,28,26,24,22,20,18,16,14,12,10,8,6,4,2,
0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,
32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,
64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,
96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126
};
节点初始化完毕。
1.方波函数的定义
voidSqureOut(unsignedintfre,unsignedintduty)//方波有两个变量
{//频率和占空比
TimerCount=12550;//初始计数器值为12550
TH0=(65536-TimerCount)/256;//最高点的初始值
TL0=(65536-TimerCount)%256;//最低点的初始值
Count=0;//
SqureCount=20000/fre;//方波节点的得到,通过一个数学表达式得到
SqureHigh=SqureCount*duty/100;//占空比也影响方波的显示
FlagSqure=1;方波的标记重新置1
}
2.方波函数的实现
if(FlagSqure==1)//判断是三角波flag是否等于1,如果是才能继续
{
Count++;//节点计数器开始计数
if(Count>SqureCount)//如果节点计数器的值大于SqureCount
{//那么需要置0这样才能产生最低点
Count=0;//置0
DATAOUTPUT=0xff;//显示在方波最低段的时候的一段波形
}
if(Count>SqureHigh)//判断节点是否大于SqureHigh如果大于
{//可以输出在最高点的一段波形
DATAOUTPUT=0x00;//输出波形
}
}
图5.4方波图
5.5延迟程序
延迟函数的定义
延迟函数是单片机领域非常常用的函数,函数的定义基本也是一样的,详细代码如下,这里只给出定义,因为它的实现情况,需要结合其他模块,在按键程序模块里出现过[15]。
voidScan10MsDelay(void)//10毫秒延时
{
unsignedintx,y;
for(x=10;x>0;x--)
for(y=110;y>0;y--);
}
在按键和和按键相关的操作是都需要延迟,延迟可以判断按键是否持续,也可以消除抖动,避免误差。
6总结
在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,举个例子,以前写的那几次,数据加减时,我用的都是BCD码,这一次,我全部用的都是16进制的数直接加减,显示处理时在用除法去删分,感觉效果比较好,有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。
参考文献
[1]李朝青.单片机原理及接口技术[M].北京:
北京航空航天大学出版社.2006
[2]张毅刚.单片机原理与应用设计[M].北京:
电子工业出版社.2011
[3]牛昱光.单片机原理及接口[M].北京:
北京电子工业出版社.2008