1 数模转换及DAC0832工作原理
1.1 数模转换原理
数模转换是将数字量转换为模拟电量(电流或电压),使输出的模拟电量与输入的数字量成正比。实现这种转换功能的电路叫数模转换器( DAC )。
最常见的数模转换器是将并行二进制的数字量转换为直流电压或直流电流,它常用作过程控制计算机系统的输出通道,与执行器相连,实现对生产过程的自动控制。数模转换器电路还用在利用反馈技术的模数转换器设计中。
数字量是用代码按数位组合起来表示的,对于有权码,每位代码都有一定的位权。为了将数字量转换成模拟量,必须将每1位的代码按其位权的大小转换成相应的模拟量,然后将这些模拟量相加,即可得到与数字量成正比的总模拟量,从而实现了数字—模拟转换。这就是组成D/A转换器的基本指导思想。
D/A转换器由数码寄存器、模拟电子开关电路、解码网络、求和电路及基准电压几部分组成。数字量以串行或并行方式输入、存储于数码寄存器中,数字寄存器输出的各位数码,分别控制对应位的模拟电子开关,使数码为1的位在位权网络上产生与其权值成正比的电流值,再由求和电路将各种权值相加,即得到数字量对应的模拟量。D/A转换器的一般结构如图1.1所示。
图1.1 D/A转换器的一般结构
数模转换器的输出电压计算公式:
- 1 -
武汉理工大学《单片微型计算机》课程设计说明书
1.2 DAC0832芯片介绍
(1)DAC0832芯片介绍:
DAC0832为一个8位D/A转换器,单电源供电,在+5~+15V范围内均可正常工作。基准电压的范围为±10V,电流建立时间为1μs,CMOS工艺,低功耗20mW。DAC0832的内部结构框图如图1.2所示。
图1.2 DAC0832的内部结构框图
(2) DAC0832与8031的连接方式:
DAC0832的与单片机的连接方式有三种方式:一、单缓冲、二、双缓冲、三是直通方式。本程序采用的是方式一即单缓冲方式,ILE为高电平,CS、WR1、WR2、XFER为低电平。图1.3为DAC0832与8031的单缓冲连接方式,其中,数模转换结果以模拟电流的形式输出。
图1.3 DAC0832与8031的单缓冲连接方式
- 2 -
武汉理工大学《单片微型计算机》课程设计说明书
2 系统硬件线路设计图
2.1 各模块电路设计
从此题的要求我的设计思路分以下两步:
(1) 课设最基本的要求是输出50HZ的正弦波,并且通过按键可以控制频率的增加或者减小。相对于三角波和阶梯波,正弦波的实现是比较麻烦的。它的实现过程是通过先在正弦波表中定义256个数据,执行时直接输出表中的数据就可以了。为了实现50HZ的频率,我将总时间除以总点数,即算出每个正弦波数据输出后的延时时间,即可达到要求,然后建一个表通过查表来进行输出,这样主要工作任务就落到了建表的过程中。这样做的好处在于,查表所耗费的时钟周期相同,这样输出的点与点之间的距离就相等了,输出的波形比较平滑,而且它输出波形的频率将近达到了50HZ。此外,通过修改延时子程序的参数,我们可以对频率进行控制,这样基本能够满足我们的设计要求。
(2) 在本次课程设计中,除了实现最基本的功能,我还做了一些相关的扩展,比如用两个外部中断实现正弦波、三角波、阶梯波之间的切换,其中默认的波形设置为正弦波。并在每次循环之初进行扫描是否有中断来临,而在每个中断入口处,对中断优先级进行设定,最终可以达到目的。
2.1.1 正弦波产生电路
正弦波的实现则相对比较复杂,因为正弦波的实现是通过输出各个点的值从而形成一个连续的正弦波,可是各个点值则要通过正弦函数来求出。根据下面的方法我们可以求出一个周期中正弦波的256个点,根据正弦波上的两个点(0,80H)、(π/2,FFH),在0至π/2范围内有个点,可以求得正弦波的函数方程为Y=127sin(90n/)+128,(n=1,2,3,….256),如当n=1时,求得Y=83H。
图2.1即为频率为50HZ的正弦波,图2.2为周期以2ms/次的速度增加的正弦波,图2.3为周期以2ms/次的速度减小的正弦波。
- 3 -
武汉理工大学《单片微型计算机》课程设计说明书
图2.1 频率为50HZ的正弦波
图2.2 频率增大的正弦波
图2.3 频率减小的正弦波
- 4 -
武汉理工大学《单片微型计算机》课程设计说明书
2.2.2 三角波产生电路
三角波的实现是先设置一个初值,然后进行加数,每加一个数,进行适当的延时,加到设定的幅值后再进行减数,减到初值之后就再返回到先前的操作,即可输出一个连续的三角波,这个操作跟锯齿波的实现是相似的。此程序输入的VREF的电压是+5V,因此该波形输出的最小值为00H最大值为99H,经DAC0832转换后,输出的最小电压为0V,最大电压为3V。要保证输出的三角波的频率为50HZ,需要计算出每一步的延时,而10ms/154即为输出一个数所需的延时时间,每一次循环延时65us,即可达到题目的要求,输出频率50HZ。示波器输出的三角波如图2.4所示。
2.2.3 阶梯波产生电路
阶梯波的实现是先设置一个初值00H,然后进行加数32,加到设定的幅值之
后再进行减数,减到初值之后就再返回到先前的操作,在每个加数与减数时适当延时,达到频率50HZ的要求。这个操作跟三角波的实现是相似的。此外要在具体的调试过程中观察输出波形的频率是否为50HZ,需要反复修改程序,并加以调试,才能得到理想的波形。示波器输出的阶梯波如图2.5所示。
图2.4 示波器输出的三角波 图2.5 示波器输出的阶梯波
- 5 -
武汉理工大学《单片微型计算机》课程设计说明书
2.2 系统硬件电路图设计
图2.6 系统硬件电路图
图2.6是用proteus软件仿真的系统硬件电路图。晶振给51单片机提供12M的工作频率。在本课题中,因为程序比较简单,没有用到外部存储器,只用到了内部数据存储器和内部程序存储器。数据存储器用来储存程序运行中需要的数据(常数或变量)或运算的结果,程序存储器用来存放相关的表格。
外部中断0为阶梯波,外部中断1为三角波,默认状态为正弦波。即当两个开关都断开时为正弦波,P3.2开关闭合时为阶梯波,P3.3口开关闭合时为三角波,但当P3.2和P3.3都闭合时,则按照中断优先级确定。一般默认的是外部中断0的优先级较高。P3.0开关闭合时正弦波的周期以2ms的速度增加,频率则随之减小,不过并不是以恒定的速度减小,因为频率与周期是倒数关系,当正弦波的频率减小到接近0时,频率又从最小值开始增大,这样周而复始执行下去,直至检测到有其他按键按下。因此,按下开关P3.0时,我们观察的正弦波由密集变得稀疏,再由稀疏变得密集。同理,按下开关P3.1时的现象与此刚好相反。
6
武汉理工大学《单片微型计算机》课程设计说明书
3 程序框图
3.1 系统总体硬件流程图
在本次课题中,我做的函数信号发生器能产生三种波形,即正弦波,三角波,阶梯波,其中,默认状态为正弦波,三角波和阶梯波的输出是由外部中断来控制的。中断0产生阶梯波,中断1产生三角波,通过程序的控制,三种波形可以自由切换,。中断返回后,又回到默认状态—正弦波。图3.1为系统总体硬件流程图。
函数信号发生器 正弦波 中断1 中断返回 中断返回 中断0 三角波50HZ 阶梯波50HZ 图3.1 系统总体硬件流程图 3.2 各模块程序框图
3.2.1 正弦波流程图设计
正弦波是通过先定义一个正弦波表,表
中有256个数据,先将指针指向表头,在正弦波表中取出数据并输出到数模转换器DAC0832输出,经过一定的延时后将偏移指针后移,直到表中所有数据全部输出或者有外部中断来临为止。图3.2为正弦波发生器的程序流程图。
7
武汉理工大学《单片微型计算机》课程设计说明书
3.2.2 三角波流程图设计
由于前面对于三角波的形成已经详细介绍,这里就不再赘述,三角波发生器的程序流程图如图3.3所示。
3.2.3 阶梯波流程图设计
图3.4为阶梯波发生器的程序流程图。
外部中断0 给A设置初值 MOV DPTR,#7FFFH 否,阶梯波 判断P3.2是否为0 MOVX @DPTR,A 否 INC A,延时 判断A达到最大是 DEC A 否 MOVX @DPTR,A 延时 判断是否等于初值? 中断返回 图3.3 三角波发生器流程图 外部中断1 给A设置初值 MOV DPTR,#7FFFH 是,正弦波 判断P3.2是否为1 否 MOVX @DPTR,A 否 ADD A,#32 累加 延时 判断A是否已满? 是 SUBB A,#32 MOVX @DPTR,A 否 延时 判断是否等于初值? 中断返回
图3.4 阶梯波发生器流程图
8
武汉理工大学《单片微型计算机》课程设计说明书
4 资源分配表
由于设计比较简单,在本次课题中用的的资源并不多,下面一一列出。 在端口的使用上:
(1) P0.0~P0.7用于连接DAC0832的数据端口用来传输数据; (2) P2.7用于连接数模转换器DAC0832的选片端CS; (3) P3.6用于连接DAC0832的写控制端口WR;
(4)P3.0-P3.3用来控制正弦波频率的改变以及波形之间的切换; (5)内部数据存储器用来存放参加运算的数据,中间变量以及运算结果; (6)内部程序存储器用来存放相关的表格,如正弦波表。
5 源程序
程序部分主要由汇编来写,下面是源程序。后面标有注释,各模块资料前面已经介绍,并在源代码中标记出来。各模块互相配合共同来实现本设计的功能。
ORG 0000H
AJMP MAIN ;程序起始地址 ORG 0003H ;外部中断INT0入口处
AJMP JIETI ;转向中断服务子程序产生阶梯波 ORG 0013H ;外部中断INT1入口处
AJMP SANJIAO ;转向中断服务子程序产生三角波 ORG 0030H
MAIN: SETB EX0 ;允许外中断INT0 SETB EX1 ;允许外中断INT1
SETB IT0 ;外中断触发方式设置为下降沿触发 SETB IT1
SETB EA ;打开中断允许总控开关 LCALL ZHENGXIAN ;设置默认的波形为正弦波 TEST: JNB P3.2,JIETI ;检测P3.2处按键是否被按下 JNB P3.3,SANJIAO ;检测P3.3处按键是否被按下 AJMP ZHENGXIAN
9
武汉理工大学《单片微型计算机》课程设计说明书
;三角波
SANJIAO: MOV DPTR,#7FFFH ;指向DAC0832的入口地址 MOV A,#00H ;取三角波表初值
JNB P3.2,JIETI ;检测三角波过程中P3.2开关是否闭合 UP1: MOVX @DPTR,A ;向DAC0832输出数据 INC A ;输出值增加 LCALL DELAY2 ; CJNE A,#99H,UP1 ;DOWN1: DEC A ; MOVX @DPTR,A ; LCALL DELAY2 ; NOP
CJNE A, #00H,DOWN1 ; RETI ;;阶梯波
JIETI: MOV A,#00H ; MOV DPTR,#7FFFH ;UP2: JB P3.2,ZHENGXIAN ; MOVX @DPTR,A ; LCALL DELAY1 ; CLR C ; ADD A,#32 ; CJNE A,#192,UP2 ;DOWN2: CLR C ; SUBB A,#32 ; MOVX @DPTR,A ; LCALL DELAY1 ; JNZ DOWN2
AJMP UP2 ;
延时
设置三角波的幅值为3V 输出值减少
向DAC0832输出数据 延时 设置三角波的最小输出为0V 外部中断1返回 取阶梯波表初值 指向DAC0832的入口地址
在阶梯波显示时检测P3.2开关是否闭合向DAC0832输出数据 延时 清进位位 幅值跳跃着增加 设置阶梯波的梯数为6 清进位位 幅值跳跃着减小 向DAC0832输出数据 延时 输出为0V时又进行下一轮循环
10
武汉理工大学《单片微型计算机》课程设计说明书
RETI ;外部中断INT0返回 ;正弦波
ZHENGXIAN:MOV R3,#00H ;取正弦表格初值
MOV R2,#00H ;对输出的正弦波点数进行计数
JNB P3.2,JIETI ;检测三角波显示时P3.2按键是否被按下 JNB P3.3,SANJIAO ;检测三角波显示时P3.3按键是否被按下 TEST1: JNB P3.0,L1 ; JNB P3.1,L2 ; AJMP LOOP ;LOOP: MOV A,R3 ; MOV DPTR,#SETTAB ; MOVC A,@A+DPTR ; MOVX @DPTR,A ; LCALL DELAY ; INC R3 ; INC R2 ; CJNE R2,#256,LOOP ; AJMP TEST ;;正弦波频率减小
L1: JNB P3.1,L2 ; CLR C ; MOV A,20H
ADDC A,#04H ; MOV 20H,A
AJMP LOOP ;;正弦波频率增加
L2: JNB P3.0,L1 ; CLR C ; MOV A,20H
检测三角波显示时P3.2按键是否被按下 检测三角波显示时P3.2按键是否被按下 检测到无键按下,则输出50Hz的正弦波 将偏移量设置为零 正弦表头指针
到程序存储器取正弦波表中数据 将正弦波表中的数据输出到DAC0832 延时 偏移指针后移 点数加1
循环直到256个点全部输出 继续检测中断是否来临 若检测到P3.1处按键被按下则转向L2 清进位位 正弦波的周期以2ms/次增加 重设延时后输出频率减小的正弦波 若检测到P3.0处按键被按下则转向L1 清进位位 11
武汉理工大学《单片微型计算机》课程设计说明书
SUBB A,#04H ;正弦波的周期以2ms/次减少 MOV 20H,A
AJMP LOOP ;重设延时后输出频率增加的正弦波 SETTAB: ;正弦表格 DB 80H,83H,86H,H,8DH,90H,93H,96H DB 99H,9CH,9FH,0A2H,0A5H,0A8H,0ABH,0AEH DB 0B1H,0B4H,0B7H,0BAH,0BCH,0BFH,0C2H,0C5H DB 0C7H,0CAH,0CCH,0CFH,0D1H, 0D4H,0D6H,0D8H DB 0DAH,0DDH,0DFH,0E1H,0E3H, 0E5H,0E7H,0E9H DB 0EAH,0ECH,0EEH,0EFH,0F1H, 0F2H,0F4H,0F5H DB 0F6H,0F7H,0F8H,0F9H,0FAH, 0FBH,0FCH,0FDH DB 0FDH,0FEH,0FFH,0FFH,0FFH, 0FFH,0FFH,0FFH DB 0FFH,0FFH,0FFH,0FFH,0FFH, 0FFH,0FEH,0FDH DB 0FDH,0FCH,0FBH,0FAH,0F9H, 0F8H,0F7H,0F6H DB 0F5H,0F4H,0F2H,0F1H,0EFH, 0EEH,0ECH,0EAH DB 0E9H,0E7H,0E5H,0E3H,0E1H, 0DEH,0DDH,0DAH DB 0D8H,0D6H,0D4H,0D1H,0CFH, 0CCH,0CAH,0C7H DB 0C5H,0C2H,0BFH,0BCH,0BAH, 0B7H,0B4H,0B1H DB 0AEH,0ABH,0A8H,0A5H,0A2H, 9FH, 9CH, 99H DB 96H, 93H, 90H, 8DH, H, 86H, 83H, 80H DB 80H, 7CH, 79H, 78H, 72H, 6FH, 6CH, 69H DB 66H, 63H, 60H, 5DH, 5AH, 57H, 55H, 51H DB 4EH, 4CH, 48H, 45H, 43H, 40H, 3DH, 3AH DB 38H, 35H, 33H, 30H, 2EH, 2BH, 29H, 27H DB 25H, 22H, 20H, 1EH, 1CH, 1AH, 18H, 16H DB 15H, 13H, 11H, 10H, 0EH, 0DH, 0BH, 0AH DB 09H, 08H, 07H, 06H, 05H, 04H, 03H, 02H DB 02H, 01H, 00H, 00H, 00H, 00H, 00H, 00H DB 00H, 00H, 00H, 00H, 00H, 00H, 01H, 02H
12
武汉理工大学《单片微型计算机》课程设计说明书
DB 02H, 03H, 04H, 05H, 06H, 07H, 08H, 09H DB 0AH, 0BH, 0DH, 0EH, 10H, 11H, 13H, 15H DB 16H, 18H, 1AH, 1CH, 1EH, 20H, 22H, 25H DB 27H, 29H, 2BH, 2EH, 30H, 33H, 35H, 38H DB 3AH, 3DH, 40H, 43H, 45H, 48H, 4CH, 4EH DB 51H, 55H, 57H, 5AH, 5DH, 60H, 63H, 66H DB 69H, 6CH, 6FH, 72H, 76H, 79H, 7CH, 80H RET ;延时子程序
DELAY: MOV R4,20H ;正弦波的延时子程序 DJNZ R4,$ NOP RET
DELAY1: MOV R5,#2000 ;阶梯波的延时子程序 DJNZ R5,$ RET
DELAY2: MOV R6,#32 ;三角波的延时子程序 DJNZ R6,$ RET END
6 性能分析
本次课程设计,我实现了信号发生器的功能,总共能产生三种波形,即正弦波、三角波和阶梯波,默认状态为正弦波,通过切换两个外部中断处的开关,可以很方便的在三种波形之间切换。另外,可以用P3.0和P3.1处的按键来控制正弦波的频率,其中,P3.0的按键控制频率的减小,P3.1的按键控制频率的增加。因此,本次课程设计的任务基本完成,功能也都实现了,不过美中不足的是本次课程设计的资源有限,很多比较有趣的功能都不能实现,如果以后有机会,我希望能弥补这一不足。
13
武汉理工大学《单片微型计算机》课程设计说明书
7 总结与心得
做了一周的单片机课程设计,我有了很多的体会和感想。
我的题目是做频率可调的正弦波发生器,在这一周中遇到了好多问题,比如说,用汇编写的代码运行是正确的,但是下载到单片机板子上发现根本没有实现我们想要的功能,程序里面明明是用按键控制频率的增减,但是实际上,频率却维持50HZ不变,后来,通过不断地尝试,不断地修改程序,终于得到得到预期的结果。后来我又想尝试输出三种不同的波形,并通过按键在三种波形之间进行切换,发现运行时只能显示正弦波,阶梯波和三角波根本没有显示,通过查资料,我最终发现了问题的所在,原来在正弦波的子程序里面要检测控制阶梯波和三角波的按键是否被按下,若被按下,就执行相应操作,输出阶梯波或者三角波,从而才能在波形之间进行切换。
这一周的课设,刚开始真的有点郁闷,程序里面的好多内容不懂,自我感觉是单片机我们所学的内容还不足以编出这两个程序,但是只好硬着头皮去看去理解。但在学习过程中也充满了乐趣,当看懂了程序的一些语句,画出了要求的设计图,那我喜悦那种成就感油然而生。
这次实习让我受益匪浅,无论从知识上还是其他的各个方面。上课的时候的学习从来没有见过真正的单片机,只是从理论的角度去理解枯燥乏味。但在实习中见过甚至使用了单片机及其系统,能够理论联系实际的学习,开阔了眼界,提高了单片机知识的理解和水平。在这次课程设计中又让我体会到了合作与团结的力量,当遇到不会或是设计不出来的地方,我们就会在QQ群里讨论或者是同学之间相互帮助。团结就是力量,无论在现在的学习中还是在以后的工作中,团结都是至关重要的,有了团结会有更多的理念、更多的思维、更多的情感。 单片机是很重要的一门课程,老师和一些工作的朋友都曾说过,如果学好一门单片机,就凭这个技术这门手艺找一个好工作也不成问题。尽管我们在课堂学到的内容很有限,但在以后的学习中单片机还需要好好的深入研究和学习,学好了单片机也就多了一项生存的本钱。最后感谢老师对我们的精心指导和帮助,感谢同学们对我的帮助。
14
武汉理工大学《单片微型计算机》课程设计说明书
8 参考文献
[1]李群芳 张士军.单片微型计算机与接口技术.北京:电子工业出版社,2008 [2]李秀忠. 单片机应用技术:汇编语言. 中国劳动社会保障出版社,2006 [3]王守中,聂元铭. 51单片机开发入门与典型实例. 人民邮电出版社,2009 [4]万福君,潘松峰.MCS-51单片机原理系统设计与应用. 清华大学出版社,2008 [5]叶钢,李三波,张莉. 单片机原理与仿真设计. 北京航空航天大学,2009 [6]周航慈.单片机应用程序设计技术. 北京航空航天大学出版社,2005
15
因篇幅问题不能全部显示,请点此查看更多更全内容