单片机课程设计正弦波发生器论文.docx
- 文档编号:9196817
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:31
- 大小:548.40KB
单片机课程设计正弦波发生器论文.docx
《单片机课程设计正弦波发生器论文.docx》由会员分享,可在线阅读,更多相关《单片机课程设计正弦波发生器论文.docx(31页珍藏版)》请在冰豆网上搜索。
单片机课程设计正弦波发生器论文
北华航天工业学院
课程设计报告(论文)
设计名称:
单片机技术课程设计
设计地点:
单片机实验室(教7209)
班级:
B09221
姓名:
学号:
指导教师:
完成时间:
2012年4月18日
北华航天工业学院电子工程系
课程设计任务书
姓名:
学号:
班级:
指导教师:
职称:
教授
课程设计题目:
正弦信号发生器的设计
主要课程支撑:
模拟电子技术、数字电子技术、微机原理与接口技术
设计目标:
1.熟练掌握单片机汇编指令的使用方法
2.熟练掌握行列式键盘、LED显示器的控制与管理方法
3.掌握A/D、/D/A的应用
4.掌握单片机应用系统设计方法、软硬件调试方法
5.熟练使用单片机仿真软件
基本要求:
1.完成单片机综合设计(每人选做一个题目)
2.编程实现题目要求的基本功能,程序运行通过。
3.撰写课程设计报告(设计思路、实现方法、硬件资源分配、程序流程图、运行结果分析等),要求用A4纸打印设计报告。
所需仪器设备:
伟福Lab6000综合实验/仿真系统一台套
微机一台
成果验收形式:
程序上机运行、现场回答问题
参考文献:
Lab6000综合实验/仿真系统说明书
时间
安排
(1)8周:
完成选题、方案设计
(2)第1-4次上机调试程序
(3)第5次上机课题验收
(4)第10周上交实践报告
指导教师:
教研室主任:
年月日
一、概述
1、设计目的
①了解单片机系统中实现D/A(数字、模拟)转换的原理及方法
②详细了解D/A转换芯片0832的性能及编程方法
③了解单片机系统中扩展D/A转换的基本原理,了解单片机如何尽行数据采集
④掌握DAC0832,AT89C51输入/输出接口电路设计方法
⑤掌握DAC0832转换实现的程序设计方法
⑥掌握WAVE软件的操作,掌握单片机程序设计的流程
2、设计要求
①正弦波频率范围:
1HZ~100HZ,100HZ~1000HZ
②频率步进值:
1HZ~100HZ档步进是10HZ,100HZ~1000HZ档步进是100HZ
③输出电压:
1~5V幅值可调(1V步进)
④具有显示输出波形频率和幅度的功能
⑤显示位数:
6位
⑥键盘设置频率值
二、方案设计与论证(设计思路、题目分析、解决方法)
1.编程语言的选择
进行单片机开发,既可以用C语言,也可以用汇编语言。
在本设计中选择合适的语言进行设计很重要。
汇编语言是一种用文字助记符来表示机器指令的符号语言。
其主要优点是占用资源少,执行效率高。
但是不同的CPU,其汇编语言可能有所差异,所以不易移植。
C语言是一种结构化的高级语言。
其优点是可读性好,移植容易,是一种普遍使用的计算机语言,缺点是占用资源较多,没有汇编语言执行效率高。
对于目前普遍使用RISC架构的8位单片机来说,其内部ROM、RAM、STACK等资源有限,如果使用C语言编写,一条C语言编译后就会变成很多机器码,很容易出现ROM空间不够、堆栈溢出等问题。
而汇编语言,一条指令就对应一条机器码,每一步的执行动作都很清楚,并且程序大小和堆栈条用情况都容易控制,调试起来也比较方便。
就正弦波发生器设计而言,对程序指令执行的精度、时间要求比较严格,因此本次设计采用汇编语言进行编程较为合理。
2.如何利用单片机进行控制输出-5V~+5V电压
-5V~+5V为模拟量输出,单片机本身并不具备此功能,单片机只能进行数字量输出,因此需要用到DAC(数模转换)芯片
DAC0832简要介绍
DAC转换器是一种将数字量转换成模拟量的器件,其特点是接受、保持和转换的是数字信息,不存在温度和事件的漂移问题,因此电路的抗干扰性能较好。
DAC0832是8位分辨率的D/A转换集成芯片,它具有价格低廉、接口简单及转换控制容易等特点。
它由8位输入锁存器、8位DAC寄存器、8位DIA转换电路及转换控制电路组成,能和CPU数据总线直接连接,属中速转换器,大约在1uS内将一个数字量转换成模拟量输出。
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~+5V;
VREF:
基准电压输入线,VREF的范围为-10V~+10V;
AGND:
模拟信号地;
DGND:
数字信号地;
0832的引脚图和内部结构图如图1、图2所示
图1DAC0832引脚图
图2DAC0832内部结构图
DAC0832的三种工作方式
1、直通方式
直通方式是使DAC0832内部的两个寄存器(输入寄存器和DAC寄存器)处于不锁存状态,数据一旦到达输入端DI7~DI0,就直接送入D/A转换器,被转换成模拟量。
当ILE为高电平,CS和WR1、WR2和XFER端都接数字帝,这时锁存信号LE1、LE2均为高电平,输入寄存器和DAC寄存器均处于不锁存状态,即直通方式。
2、单缓冲方式
单缓冲方式就是使两个寄存器中的一个处于缓冲方式,另一个处于锁存方式,数据只同故宫一级缓冲器送入D/A转换器。
通的做法是将CS和XFER均姐弟,使DAC寄存器处于直通凡事,而把ILE接高电平,接端口地址译码信号。
WR1接CPU系统总显线的IOW信号,是输入寄存器处于锁存方式。
但换种方式只需执行一次写操作即可完成D/A转换。
一般不需要多个模拟量同时输出,可采用单缓冲方式。
3、双缓冲方式
双缓冲方式就是使两个寄存器均处于锁存方式,数据要经过两级锁存(即两级缓冲)后再送入D/A转换器,就是说,要执行两次写操作才能完成一次D/A转换。
只要将ILE接高电平,WR1和WR2接CPU的IOW,CS和XFER分别接两个不同的I/O地址译码信号即可。
在本设计中,令0832工作在单缓冲方式,其片选端接138译码器单元的CS1,其地址为0x9000H。
DAC0832的输出方式
DAC0832为电流型输出,若需要电压输出可使用运算放大器构成单极性输出和双极性,图3中a、b分别为0832的单极性输出和双极性输出的电路连接方式。
若采用单极性输出,则只能产生0V~5V电压,不能得到既有正脉波又有负脉波的正弦波。
因此本设计采用DAC0832的双极性输出,其输出电压为-5~+5V;当DI0~DI7为0000000B时输出-5V,为10000000B时输出0V,为11111111B是输出+5V。
这样可以产生既有正脉波又有服脉波的正弦波。
图3DAC0832的单极性输出和双极性输出
3.如何产生正弦波
(a)(b)
图4正弦波的分解
用单片机控制DAC0832来产生正弦波有个问题,就是数模转换总是有其分辨率的,输出的电压并不是连续变化的。
例如:
8位DAC输出为-5V~+5V,那么分辨率就是:
,所以产生的正弦波会有一定的误差。
如何利用单片机控制DAC0832产生正弦波呢?
我们可以先把一个正弦波按横轴等间距分别为若干个点(如图4分为51个点)。
把每个点电压幅值所对应的8位二进制数值做成表,放在CPU的ROM中。
例如:
图4中左起第一个点幅值是0V,对应的送给DAC0832的8位二进制数为80H,所以表的第一元素为80H
制成下表:
(下表中数据以十进制表示)
TAB1:
DB128,144,160,175,190,203,216,227,236,244,250,254,255,255,254,250,244,236,227,216,203,190,175,160,144,128,112,96,81,66,53,40,29,20,12,6,2,0,0,2,6,12,20,29,40,53,66,81,96,112,128
先取表中第一个元素送给0832,0832输出第一个电压0V,再取第二个数送给0832输出下一个电压,依次类推,取到表的最后一个元素时,从头开始取表的第一个元素。
循环往复,就输出了一个连续的正弦波形。
只产生一个正弦波是不够的,我们还要求其频率和幅值可调。
可以看一下哪些因素会影响输出波形的频率和幅值
频率的影响因素
由图4可知,该正弦波的频率
(
为所取的两个点之间的间隔),所以只要改变
就可以改变输出波形的频率。
我采用的方案是:
用一个定时器,每隔
产生一次中断,在中断服务程序里控制DAC0832输出。
如果想要改变
只要改变定时器的时间就行了。
也就改变了输出波形的频率。
采用这个方案需要验证两个问题:
①本设计要求输出频率在1HZ~1000HZ可调,所以定时器的定时时间需要达到
S,即定时器的定时时间要在
S之间可调,并且其分辨率满足要求。
经验证51单片机的定时器0工作在方式1时,其性能满足要求,故采用定时器的方案可行。
②
不可能无限小,假设单片机晶振为6MHZ,那么定时器的分辨率为2
S即0.000002S。
单片机执行指令是需要时间的,当定时器溢出产生中断时,需要执行一系列指令,包括对断点地址进行压栈、给PC赋值等操作,都是需要占用时间的,这一部分占用的时间是不可避免的。
除此之外,进入中断服务子程序中,顺序执行里面的程序,在执行MOVXDPTR,A给DAC0832送数据让其输出电压之前会有一些必须的程序,包括赋初值给定时器的TH0和TL0,查表程序等。
综合上面几个因素,这时定时器的定时时间并不是理论上计算出的时间,而大于这个时间,这样输出波形的频率就会有误差。
为了减小误差,第一,尽量减少定时中断服务程序中的指令,以减少其占用的时间;第二:
给TH0,TL0幅值时,减去延时的时间,以抵消掉指令占用的时间。
幅值的影响因素
从前面介绍的DAC0832的原理可知,只要改变DAC0832数字量输入就可以改变其输出模拟量的幅度。
由于产生波形的幅度是在存储于单片机内部ROM的表中,按顺序取出的。
因此我们需要从新建立一个表,这样定时中断服务程序中,该表所查的表,就改变了输出波形的幅度。
本设计要求幅值1V~5V可调,因此需要建立5个表。
建立5个表的时候如果一个元素一个元素的算,未免太麻烦。
可以用MATLAB分别算出5个表,然后粘贴到程序中,稍作修改就可以使用(图5为输出幅值为
4V时表的计算方法算法)。
算法:
(U为需要得的到的幅值,此时b数组就是对应的表)
图5表的计算方法(输出幅值为
4V时)
综合上面改变频率和幅值的方法,就可以得到符合本设计的设计要求的波形。
3.频率与幅值的设置
方案:
利用单脉冲发生器,当需要设置幅值和频率时,产生中断,暂停正在工作的定时器,停止波形输出,进入外部中断0中断服务程序,通过按键,对波形进行设置。
按键0:
频率/幅值切换;
按键1:
频率/幅值增加;
按键2:
退出外部中断,开启定时器,输出波形
4.键盘与显示
利用WAVE6000实验环境中的显示程序和键盘扫描电路及程序。
改程序提供了三个子程序:
TestKey;GetKey;DispLedBuf。
三、硬件设计
1.硬件电路
本设计由单片机、D/A转换电路、键盘及显示电路几个组成部分,各部分采用的电路形式及主要器件确定如下:
(1)单片机部分
选用89C51单片机作为主机,同时要设计89C51单片机的晶振电路和复位电路,具体电路略。
(2)D/A转换电路部分
直接利用单片机实验箱上的D/A转换电路正弦波信号的输出。
电路如图6所示。
图6DAC0832连接电路
(3)按键与显示部分
直接利用单片机试验箱上的按键与显示电路。
如图7、图8所示
图7显示器电路连接图
图8键盘电路连接图
四、程序设计
1.程序流程图
主程序流程图:
开始
初始化(中断允许、定时器初始化等)
SJMP$循环等待
图9主程序流程图
定时器0中断服务程序流程图:
是
否
图10定时器0中断服务程序流程图
外部中断0
中断服务程序
流程图:
图11外部中断0中断服务程序流程图
2.程序模块功能
主程序:
进行一系列初始化后,主程序最后停在SJMP$等待。
定时器0中断服务程序:
每隔一定时间按次序查表,把相应数值送给DAC0832进行数模转换,实现正弦波输出。
外部中断0中断服务程序:
配合按键扫描程序和数码管显示程序,对正弦波参数进行设置。
3.硬件资源分配表
存储单元、寄存器
用途
备注
R0
定时器0中断服务程序中,用作循环50个点的查表
每来一次定时器中断加1,到50后清0
F0
标志位
用来判断现在调整频率还是幅值
CU(09H)
查表计数(用作频率调整)
每次加1,到21之后清0
CHZ(12H)
查表计数(用作幅值调整)
每次加1,到5之后清0
CTH0(10H)
存储调整后的TH0的初值
CTL0(11H)
存储调整后的TL0的初值
CDPH
存储调整后的DPH的值
OUTBIT(08002H)
位控制端口
OUTSEG(08004H)
段控制端口
IN(08001H)
键盘读入端口
LEDBuf(60H)
显示缓冲区首地址
60H~65H
四、运行结果分析
1.软硬件调试(出现的问题、如何解决。
。
。
)
搭建PROTEUS仿真电路,进行软件模拟仿真(图12)
图12PROTEUS仿真电路
此电路和实际电路有差异,主要用于前期的软件仿真,基本的波形发生,测试MATLAB软件计算出的数值运行后是否满足设计要求。
此外,我还用此电路测试了取不同点数时,波形差异。
分别测试了30点、50点、70点以及100点,点数越多越接近正弦,点数越少失真越严重。
但是点数过多,所能达到的频率最低值越大,不能满足本设计中频率达到1000HZ的要求。
经试验,取50点可以达到最好的效果,是频率达到要求,波形又不失真严重。
前期仿真完成后,进行上机调试。
起初,加上键盘显示程序时,键盘和显示程序时钟程序始终不正常。
经老师指点,改变思路,在进行频率和幅度设置时,关掉波形发生功能。
顺利完成调试。
2.运行结果
系统上电,产生50HZ,-5V~+5V正弦波。
按单脉冲发生键,进入设置程序,按键盘0键决定调节频率还是幅值;按1键进行调节;按2键完成设置,开始输出波形。
(图13、图14、图15、图16分别为几种不同频率和幅值的输出波形)
图13正弦波(100HZ,-5V~+5V)
图13正弦波(100HZ,-4V~+4V)
图14正弦波(200HZ,-4V~+4V)
五、设计总结
本次设计题目是正弦信号发生器。
用到的硬件有按键、数码管显示、译码电路、DAC0832、8051单片机。
通过这次设计,进一步熟悉了这些硬件的用法。
熟悉了WAVE编程软件的使用。
对汇编语言进行单片机程序设计有了更深一步的认识。
完成本次设计后,学到了一种新的编程思路:
大量的应用查表的方式进行程序设计,可以有效的增加程序执行的效率,缩短其执行时间,一些对程序执行时间有严格要求的场合,可以用此思路进行设计。
当然,查表方式进行程序设计亦有其缺点:
占用大量的内部ROM空间,对于一些内部ROM空间不是很充足的单片机,过多的表可能导致ROM空间不足。
因此,进行程序设计时要将查表方式和算法方式进行综合考虑,选择效率较高的方式进行设计,也可以将两种方式有效结合起来。
此次设计能顺利完成,要感谢李老师的指导,在加入键盘和显示程序时,遇到了困难,是李老师的指导,使我走出了泥潭。
六、参考资料
[1]胡宴如.高频电子线路[M].高教出版社.2001.9:
12-19
[2]卢屹.数字锁相环的参数设计及其应用[J]通信技术2001,(9):
12-15
[3]涂时亮等.单片微机软件设计技术.:
科学技术文献出版社重庆分社,1988
[4]张志良.单片机原理及控制技术.:
机械工业出版社,2001
[5]徐君毅等,单片微型计算机原理与应用.:
上海科学技术版社,1988
[6]成都木马科技.单片机原理及应用.:
北京希望电子出版社,1988
[7]宋培义等.单片机原理、接口技术及应用.:
中国广播电视出版社,1999
[8]何利民.I2C总线应用系统设计.:
北京航空航天大学出版社,1994
附录:
源程序
ORG0000H
AJMPMAIN
ORG0003H
LJMPWBZD0
ORG000BH
LJMPDSZD0
ORG0030H
CUEQU09H
CTH0EQU10H
CTL0EQU11H
CHZEQU12H
CDPHEQU13H
OUTBITequ08002h;位控制口
OUTSEGequ08004h;段控制口
INequ08001h;键盘读入口
LEDBufequ60h;显示缓冲
MAIN:
MOVCHZ,#0
MOVA,#00H
MOVDPTR,#09000H
MOVTMOD,#11H
MOVTH0,#0FFH
MOVTL0,#0EDH
SETBEA
SETBET0
SETBET1
SETBEX1
SETBIT0
SETBIT1
MOVCDPH,#09H
SETBEX0
MOVCTH0,#0FFH
MOVCTL0,#0FH
SETBTR0
SJMP$
Delay:
movr7,#0
DelayLoop:
djnzr7,DelayLoop
djnzr6,DelayLoop
ret
DisplayLED:
movr0,#LEDBuf
movr1,#6;共6个八段管
movr2,#00100000b;从左边开始显示
Loop:
movdptr,#OUTBIT
mova,#0
movxdptr,a;关所有八段管
mova,r0
movdptr,#OUTSEG
movxdptr,a
movdptr,#OUTBIT
mova,r2
movxdptr,a;显示一位八段管
movr6,#1
callDelay
mova,r2;显示下一位
rra
movr2,a
incr0
djnzr1,Loop
ret
TestKey:
movdptr,#OUTBIT
mova,#0
movxdptr,a;输出线置为0
movdptr,#IN
movxa,dptr;读入键状态
cpla
anla,#0fh;高四位不用
ret
GetKey:
movdptr,#OUTBIT
movP2,dph
movr0,#Low(IN)
movr1,#00100000b
movr2,#6
KLoop:
mova,r1;找出键所在列
cpla
movxdptr,a
cpla
rra
movr1,a;下一列
movxa,r0
cpla
anla,#0fh
jnzGoon1;该列有键入
djnzr2,KLoop
movr2,#0ffh;没有键按下,返回0ffh
sjmpExit
Goon1:
movr1,a;键值=列X4+行
mova,r2
deca
rla
rla
movr2,a;r2=(r2-1)*4
mova,r1;r1中为读入的行值
movr1,#4
LoopC:
rrca;移位找出所在行
jcExit
incr2;r2=r2+行值
djnzr1,LoopC
Exit:
mova,r2;取出键码
movdptr,#KeyTable
movca,a+dptr
movr2,a
WaitRelease:
movdptr,#OUTBIT;等键释放
clra
movxdptr,a
movr6,#10
callDelay
callTestKey
jnzWaitRelease
mova,r2
ret
KeyTable:
;键码定义
db16h,15h,14h,0ffh
db13h,12h,11h,10h
db0dh,0ch,0bh,0ah
db0eh,03h,06h,09h
db0fh,02h,05h,08h
db00h,01h,04h,07h
LEDMAP:
;八段管显示码
db3fh,06h,5bh,4fh,66h,6dh,7dh,07h
db7fh,6fh,77h,7ch,39h,5eh,79h,71h
WBZD0:
CLRET0;;禁止定时器中断,不再产生波形
CLRF0;;flag
movLEDBuf+0,#0h;显示8.8.8.8.
movLEDBuf+1,#0h
movLEDBuf+2,#0h
movLEDBuf+3,#0h
movLEDBuf+4,#0
movLEDBuf+5,#0
K1:
CALLDisplayLED;;显示程序
callTestKey;;检测按键
JZK1
callGetKey;;获取键值
ANLA,#0FH
CJNEA,#0,NE1;;判断是否按下0键,0键功能:
输入频率还是幅值的转换
CPLF0
JBF0,BB;;输入幅值还是频率的标志
MOVLEDBuf+0,#71H
SJMPBB1
BB:
MOVLEDBuf+0,#00
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 正弦波 发生器 论文
![提示](https://static.bdocx.com/images/bang_tan.gif)