中南大学微机原理课程设计报告信号发生器功能程序设计Word格式.docx
- 文档编号:21411927
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:41
- 大小:298.60KB
中南大学微机原理课程设计报告信号发生器功能程序设计Word格式.docx
《中南大学微机原理课程设计报告信号发生器功能程序设计Word格式.docx》由会员分享,可在线阅读,更多相关《中南大学微机原理课程设计报告信号发生器功能程序设计Word格式.docx(41页珍藏版)》请在冰豆网上搜索。
CS:
片选信号,低电平有效
WR:
写信号1,低电平有效
OUT:
DAC电流输出端
图1.1唐都实验箱D/A0832接线图
1.3.3A/D0809功能简介
ADC0809是采样频率为8位的、以逐次逼近原理进行模—数转换的器件。
其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
当地址ABC=000时,IN0通道被选通。
图1.2唐都实验箱A/D0809接线图
1.3.4唐都小键盘简介
唐都实验箱中提供了4行×
4列16个按键,列选择信号X1-X4,行扫描信号Y1-Y4。
图1.3唐都实验箱小键盘接线图
第二章
总体设计方案
2.1设计思想论述
(1).波形产生:
通过汇编语言编写各个波形子程序,其中方波和三角波参考了唐都的参考程序。
锯齿波由三角波修改而来,正弦波事先用MATLAB仿真存入各点数据,产生波形时依次输出各个数据即可。
波形子程序中主要是各个波形一个周期的代码,循环执行,由此产生连续波形并通过D/A0832将数字量转换成模拟量输出,即可得各种波形。
具体方案见第三章3.1节。
(2).波形切换:
用小键盘输入进行波形的选择,按键0~3分别对应方波、三角波、锯齿波和正弦波。
每个波形周期输出后,调用键盘查询子程序,判断有无按键按下,没有则继续输出下一周期,否则转到相应的波行子程序上。
可随时进行波形间的切换。
具体方案见第三章3.2节。
(3).无极调频:
改变波形子程序中的各个数据输出延时时间,就可改变整个波形的频率,延时越短频率越高。
而延时时间长短可由外部输入决定,通过A/D0809将电位计(0~5V)的模拟量转化成数字量(00~FF)作为延时时间长短。
调节电位器即可调节延时,进而调节频率。
ADC0809芯片分辨率为8位,即可将延时分为256个等级,实现无极调频。
具体方案见第三章3.3、3.4节。
(4).无极调幅:
改变波形子程序中DA输出值的大小即可改变幅值,可以在原数据基础上乘以一个增益。
而增益可由外部输入,原理与调频相似,通过A/D0809输入一个数字量(00~FF)。
按键4用于调频/调幅的切换。
当判断当前为调幅状态时就将这个数字量存入幅值增益变量中,如果判断是调频状态则存入频率延时变量中。
从而实现只用一个电位器分别调节频率和幅度的功能。
(5).开始结束:
通过扫描小键盘,按下5键则退出。
2.2程序流程图
2.3电路原理图
图2.2硬件连接电路图
第三章典型模块分析
3.1波形产生模块
四个波形子程序结构类似,当子程序被调用后,进行以下步骤:
(1)通过8255的C7位输出一个低电平来启动AD0809,并从8255的B口读入AD输入的数字量(00H~FFH)。
(2)判断幅频标志位FLAG_FUPIN,为0则把AD输入的数字量存入频率值空间FRE,否则存入幅值空间AMP。
(3)输出波形的一个周期。
(4)调用子程序CCSCAN,判断小键盘有无按键按下,无则继续步骤
(1),有则返回主程序。
流程图如图3.1所示。
图3.1波形子程序流程图
3.1.1方波
方波的产生先向DA0832输出一个低电平(00H),并延时一段时间。
再输出一个高电平(此处直接用AMP的值作为高电平,AMP是外部AD输入的幅值增益),延时一段相同时间,就是矩形波的一个周期。
(1)一个周期波形的代码:
NEXT1_1:
MOVDX,DA0832;
写00H,输出低电平
MOVAL,00H
OUTDX,AL
CALLDALLY1;
延时
MOVDX,DA0832;
写AMP,输出高电平
MOVAL,AMP;
AMP=00H~FFH,默认值7FH
(2)延时子程序代码:
DALLY1PROCNEAR;
软件延时子程序
PUSHCX
PUSHAX
MOVCH,FRE;
读取频率值,FRE=00H~FFH
ANDCH,0F0H
ADDCH,0FH;
CH的值受FRE的控制,改变FRE则改变延时时间
MOVCL,0FFH
DD1:
MOVAX,0FF00H
DD2:
DECAX
JNZDD2
LOOPDD1
POPAX
POPCX
RET
DALLY1ENDP
3.1.2三角波
三角波从最小值开始逐渐上升,到达最大值之后再逐渐减小到最小。
因此先将最小值(00H)放到BL,输出并延时,对BL加一,再输出并延时,达到最大值后就对BL依次减一,输出并延时,直到BL=00H,则为一个周期波形。
因此三角波有两个过程。
一个周期波形的代码如下:
NEXT1_2:
MOVBL,00H;
BL赋最小值00H
UP1:
AL幅值增益AMP,AMP=00H~FFH
ANDAL,0F0H
SHRAL,4;
AL=00H~0FH
MULBL;
ALBL*AL
启动D/A转换
OUTDX,AL;
输出AL
CALLDALLY2
INCBL;
BL加一
CMPBL,25H;
判断BL是否加到最大值了
JNEUP1
DOWN:
AL幅值增益AMP,AMP=00H~FFH
ANDAL,0F0H
SHRAL,4;
MOVDX,DA0832
CALLDALLY2
DECBL;
BL减一
CMPBL,00H;
判断BL是否减到最小值了
JNEDOWN
延时子程序与方波类似,此处不再赘述。
局部流程图如图3.2所示。
3.1.3锯齿波
锯齿波与三角波类似,只是锯齿波到达最大值之后,直接跳到最小值。
因此锯齿波只有对BL依次加一的过程。
NEXT1_3:
UP2:
AL幅值增益AMP,AMP=00H~FFH
ANDAL,0F0H
SHRAL,4;
MULBL;
INCBL;
JNEUP2
BL加到最大之后直接赋给最小值00H
MOVAL,AMP
SHRAL,4
MOVDX,DA0832
局部流程图如图3.3所示。
3.1.4正弦波
正弦波是利用正弦表(见附录代码段)输出的,即将正弦表中的数值一一输出并延时。
一个周期波形的代码:
NEXT1_4:
LEASI,SIN;
指向正弦表中的第一个数据
MOVCX,255
UP:
MOVBL,AMP;
BL幅值增益AMP,AMP=00H~FFH
ANDBL,0F0H
SHRBL,4;
AMP=00H~FFH,BL=00H~0F
MOVAL,[SI];
读取正弦表中的一个数据
SHRAL,2
ALAL*BL
CALLDALLY3
INCSI;
指向表中的下一个数据
LOOPUP
局部流程图如图3.4所示。
3.2小键盘模块
小键盘用到两个子程序(ccscan和scan)。
(1)ccscan子程序只是一个辅助程序,用于判断当前小键盘是否有键按下,有则全零标志位ZF=0(运算结果不为0),无键按下则ZF=1(运算结果为0)。
子程序代码如下:
CCSCANPROCNEAR;
扫描是否有按键闭合子程序
MOVAL,00H
MOVDX,MY8255_A;
将4列全选通,X1~X4置0
MOVDX,MY8255_C
INAL,DX;
读Y1~Y4
NOTAL
ANDAL,0FH;
取出Y1~Y4的反值
CCSCANENDP
(2)scan功能为当确定小键盘有键按下则一列一列扫描键盘,判断是哪一列哪一行的键被按下了,并把键值保存到数据段的key空间去。
SCANPROCNEAR
MOVCH,0FEH
MOVCL,00H;
设置当前检测的是第几列
COLUM:
MOVAL,CH;
选取一列,将X1~X4中一个置0
MOVDX,MY8255_A
MOVDX,MY8255_C;
读Y1~Y4,用于判断是哪一行按键闭合
INAL,DX
L1:
TESTAL,01H;
是否为第1行
JNZL2;
不是则继续判断
MOVAL,00H;
设置第1行第1列的对应的键值
JMPKCODE
L2:
TESTAL,02H;
是否为第2行
JNZL3;
MOVAL,04H;
设置第2行第1列的对应的键值
L3:
TESTAL,04H;
是否为第3行
JNZL4;
MOVAL,08H;
设置第3行第1列的对应的键值
L4:
TESTAL,08H;
是否为第4行
JNZNEXT;
MOVAL,0CH;
设置第4行第1列的对应的键值
NEXT:
INCCL;
当前检测的列数递增
MOVAL,CH
检测是否扫描到第4列
JZKERR;
是则跳回到开始处
ROLAL,1;
没检测到第4列则准备检测下一列
MOVCH,AL
JMPCOLUM
KCODE:
ADDAL,CL;
将第1列的值加上当前列数,确定按键值
MOVKEY,AL;
保存按键值到key空间
KERR:
SCANENDP
3.3调幅调频模块
系统只使用了一个电位计可以分别调节频率和幅值。
波形子程序中每个循环周期启动一次A/D转换,启动信号由C7口输出,将读入的数据放到特定的存储单元FRE(或AMP)中,供延时(或幅值输出)时使用。
本次实验ADC0809芯片的输出八位数据线连到了8255端口B,通过端口B读入。
模拟输入量Vin通过电位计从0~5V无极可调,对应的数字输出量N从00H~FFH变化。
调频:
改变波形子程序中的各个数据输出延时时间,就可改变整个波形的频率。
延时时间由AD0809读入的数据控制。
调幅:
在波形子程序中给DA输出值乘以一个增益,改变增益的大小即可改变幅值。
增益由AD0809读入的数据控制。
调频/调幅切换:
主程序设了一个幅频标志位FLAG_FUPIN,当小键盘的4键按下时,使FLAG_FUPIN取反(默认标志位=0)。
波形子程序中通过判断幅频标志位FLAG_FUPIN的状态,可以选择是调频还是调幅。
部分代码如下:
(1)主程序中的切换部分
GETKEY3:
CALLSCAN;
有键按下,调用键盘扫描子程序
MOVAL,KEY
CMPAL,08H;
判断是否为调幅/调频键
JNELOOP1;
不是则返回判断波形或退出
NOTBYTEPTR[FLAG_FUPIN];
是,则将幅频标志位取反
CMPFLAG_FUPIN,0
JNETIAOFU
MOVDX,OFFSETMES5;
屏幕显示切换到调频状态
MOVAH,09H
INT21H
JMPJIXU
TIAOFU:
MOVDX,OFFSETMES6;
屏幕显示切换到调幅状态
INT21H
JIXU:
MOVBL,FLAG_BOXING
MOVKEY,BL;
将波形对应的键值存回KEY中
JMPLOOP1;
返回判断波形
(2)波形子程序部分
MOVDX,MY8255_MODE;
通过8255的C7口发出一个低电平
MOVAL,00001110B
OUTDX,AL;
启动AD0809
MOVDX,MY8255_B;
读8255B口数据
MOVBL,FLAG_FUPIN;
判断幅频标志位,默认为0
CMPBL,0
JEPIN_1;
为0则跳转到PIN_1
MOVAMP,AL;
不为0则存为振幅值
JMPNEXT1_1
PIN_1:
MOVFRE,AL;
为0则存为频率值
流程图见图2.1和图3.1
第四章系统调试过程及结果
此次设计波形发生器是我们在学习汇编以来接触到的比较大的程序。
无论用何种程序书写,理清思路是关键。
因此,从拿到题目开始,我们花了很多时间来对设计波形发生器的硬件和软件进行了分析与思考,从中选出最好的解决方法。
在系统调试的过程中,我们用到的一个很重要的分析过程就是先易后难,先局部后整体,先将各个波形的子程序写出来,一一进行测试。
无误后再写主程序将各个子程序整合起来。
设计的过程是由易到难的,我们从实现最简单的波形产生功能开始,逐步添加波形切换功能、小键盘输入功能、无极调频功能、无极调幅功能,整个系统由简至繁逐步完善。
最先遇到的比较大的困难是小键盘的输入,前后试过两个方案,最终以唐都提供的参考程序为基础,进过修改得到了现在使用的键盘扫描子程序,效果很好。
整个过程中最难的是实现无级调频和无极调幅,开始时一直无法调频,经过对各个部位的仔细调试分析,是0809模数转换的问题。
0809需要一个启动信号,且转换需要一定时间。
于是我们用C口每周期输出一启动信号进行转换。
最终达到理想效果。
实现了调频之后,对整个程序的结构稍加改进,引入了幅频标志位,实现了小键盘控制调频/调幅的切换,从而只用一个电位计和一个小键盘按键实现了无极调频和无极调幅的功能。
不足和改进:
1.所产生的频率范围较窄。
应尽量减少延时拓宽频率。
2.幅值调节范围不够大。
3.产生的波形不是理想状态。
特别是方波,上下跳变时,总会有断点。
波形有噪声,不是理想的波形。
4.由于波形每周期之后要读端口,与下一个周期之间有一定延时误差。
第五章收获与体会
本次课程设计的要求虽然不多,但整个设计过程是问题不断,一波三折。
整个课程设计完成之后,我在整体设计思路、硬件连结和汇编语言编程等方面得到了很大的收获。
而程序总体流程也是三易其稿,其中有借鉴了别人的一些设计思路。
第一个方案实在缺乏设计的智慧,在得到正确的指标后就被抛弃了。
第二个方案时,我们把控制波形转换的功能寄希望于用中断实现,而调频变化在延时子程序中进行,最后证实这样子的程序流程图将很复杂冗长,条理不清晰,而且用中断实现时缺乏所需的硬件。
最后一个方案即为当前选择的方案,条理清晰,程序简单,代码也短,但是能很好实现所有功能。
硬件连结的问题主要在使用第二个方案时出现的。
第二个方案的中断控制需要手动输入一个中断脉冲,然后结果总是有差,最后讨论得出结论是我们很难保证这个手动输入脉冲的合格,这个脉冲可能不够标准。
后面做最终方案时,波形发生颤抖,检查发现是控制波形选择的开关处不稳定,也算是硬件连结的问题。
而波形特别是矩形波输出时,在中间总是一个断痕,反复检查软件设计后也归结为硬件内部延时所产生误差。
做软件设计时遇到的关键点也是难点集中到了调频电路的选择。
第二方案时,我们把调频参数的读取放置在延时程序,主程序不循环,每一个波形都是无限循环的波形。
后来得到高人指点,我们忽略了主程序循环所会带来的延时对波形的影响,以主程序无限循环,每输出一个周期波形读一次调频参数的方式进行调频。
结果很完美。
参考文献
[1]周荷琴,吴秀清.微型计算机原理与接口技术.合肥:
中国科学技术大学出版社,2008.6
[2]唐都科教仪器开发有限公司.32位微机原理与接口技术实验教程.
[3]陈明义.数字电子技术基础.长沙.中南大学出版社,2008.9
附录1汇编语言源程序代码
;
****************根据查看端口资源修改下列符号值*******************
IOY0EQU0E400H;
片选IOY0对应的端口始地址
IOY1EQU0E440H;
片选IOY1对应的端口始地址
*****************************************************************
DA0832EQUIOY0+00H*4;
DA0832的端口地址
MY8255_AEQUIOY1+00H*4;
8255的A口地址
MY8255_BEQUIOY1+01H*4;
8255的B口地址
MY8255_CEQUIOY1+02H*4;
8255的C口地址
MY8255_MODEEQUIOY1+03H*4;
8255的控制寄存器地址
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
DATASEGMENT
STR1DB'
DA0832:
PleasechooseWave'
0AH,0DH,'
$'
;
定义显示的字符串
MES1DB'
SHOWASQUARE'
MES2DB'
SHOWASANJIAO'
MES3DB'
SHOWAJUCHI'
MES4DB'
SHOWASINE'
MES5DB'
CHANGETHEFrequence'
MES6DB'
CHANGETHEAmplitude'
KEYDB'
?
'
FLAG_BOXINGDB'
FLAG_FUPINDB0
FREDB7FH
AMPDB7FH
SINDB100,102,105,107,110,112,115,117,120,122
DB124,127,129,132,134,136,139,141,143,145
DB147,150,152,154,156,158,160,162,164,166
DB168,169,171,173,175,176,178,179,181,182
DB184,185,186,187,189,190,191,192,193,194
DB194,195,196,197,197,198,198,199,199,199
DB200,200,200,200,200,200,200,200,199,199
DB199,198,198,197,197,196,195,194,194,193
DB192,191,190,189,187,186,185,184,182,181
DB179,178,176,175,173,171,169,168,166,164
DB162,160,158,156,154,152,150,147,145,143
DB141,139,136,134,132,129,127,124,122,120
DB117,115,112,110,107,105,102,100,98,95
DB93,90,88,85,83,80,78,76,73,71
DB68,66,64,61,59,57,55,53,50,48
DB46,44,42,40,38,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中南 大学 微机 原理 课程设计 报告 信号发生器 功能 程序设计