信号发生器课程设计报告.docx
- 文档编号:3760168
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:37
- 大小:208.93KB
信号发生器课程设计报告.docx
《信号发生器课程设计报告.docx》由会员分享,可在线阅读,更多相关《信号发生器课程设计报告.docx(37页珍藏版)》请在冰豆网上搜索。
信号发生器课程设计报告
微机应用系统设计与综合专业班级
学生姓名
学生学号
指导老师实验课程设计——信号发生器功能程序设计
第一章设计课题概述
1.1课程设计目的
本学期开设的《微型计算机原理与接口技术》理论课程是一门专业基础课程,它的主要内容包括微型计算机体系结构、8086微处理器和指令系统、汇编语言设计以及微型计算机各个组成部分介绍等内容。
要求学生对微机原理中的基本概念有较深入的了解,能够系统地掌握微型计算机的结构、8086微处理器和指令系统、汇编语言程序设计方法、微机系统的接口电路设计及编程方法等,并具有综合运用所学知识分析问题和解决问题的能力。
《微机应用系统设计与综合实验(实践)》课程设计,让学生对微机系统有一个较全面的理解,掌握常规的芯片使用方法、掌握简单的微型计算机应用系统软硬件的设计方法,对典型数字接口电路的应用技术有一个较深入的掌握,并对应用系统进行硬件原理和软件编程进行分析、设计和调试,达到基本掌握简单微型计算机应用系统软硬件的设计方法,提高项目开发能力的目的。
课程中要求学生根据课程设计指导书来选择课题,并且独立完成课题,写出课程设计说明书,画出电路原理图,说明工作原理,画出电路板图,编写程序以及程序流程图。
针对《信号发生器功能程序设计》这一课题,主要涉及到硬件的连接(主要用到芯片有:
8086CPU,DAC0832,8255,74LS273,74LS138,运放等)以及数码管,键盘矩阵硬件,示波器等连接原理图,程序的编写(主要涉及到显示波形,数码管显示以及通过小键盘来对波形进行选择控制)以及各个子程序或程序段的程序流程等,
通过课程设计不仅可以锻炼学生在微机应用方面的实际工作能力,将所学转化为所用,更是一个锻炼解决实际问题能力的很好机会。
1.2课程设计要求
(1)、分别用C语言和汇编语言编程完成硬件接口功能设计;
(2)、硬件电路基于80x86微机的接口电路;
(3)、程序功能要求:
小键盘给定、数码管(屏幕)显示,并产生对应信号波形(D/A)输出(信号波形包括正弦波、三角波、方波、锯齿波)、输出信号波
形幅度、频率可调。
(注意:
按键数量应尽量少)。
1.3实现技术指标
(1)、完全用小键盘控制各波形间的切换和频率和幅值的调节以及退出。
(2)、实现正弦波、三角波、方波和锯齿波信号的产生。
(3)、数码管同步显示当前工作波形的频率和幅值。
(4)、实现频率的1到5倍可调。
(5)、实现幅值的1到5倍可调。
1.4使用说明
(1)、小键盘第一列对应0-3,第二列对应4—7。
(2)、开始选择0—3分别对应方波,三角波,锯齿波,正弦波。
同时数码管会显示当前波形的幅值和频率。
(3)、有波形产生以后,再调节幅值和频率。
0对应增大频率,1对应减小频率,2对应减小幅值,3对应增大幅值。
(4)、频率和幅值可以实现1到5倍可调,同时数码管会显示当前波形的幅值和频率的倍数(1~5)。
(5)、任何时候4都对应退出,回到最开始的选择波形状态,数码管归零。
第二章设计思想和实施方案
2.1功能分析
2.1.1波形产生
由于要由数字信号转换为模拟信号来产生波形,因此要由D/A转换芯片DAC0832来完成此项任务。
通过汇编语言编写各个波形子程序,由于要显示波形,所以每输出一个值,都要进行一定时间的延时,扫描没有按键按下后再输出下一个值,直到形成一个周期的代码。
利用循环,就可产生连续波形代码,再通过8255输出给DAC0832,将数字量转换成模拟量输出,即可得各种波形。
具体方案
在后面有分析。
2.1.2波形切换
波形的选择和调节由小键盘控制。
第一列从上到下编码为0,1,2,3,分别对应方波、三角波、锯齿波、正弦波。
第二列第一个键的键值为4,对应退出波形,可以重新选择波形,实现波形切换。
当没有输出波形的时候,也就是输出为零,选择0到3就会进入相应的波形子程序。
进入波形子程序以后,每一个点输出之前都会调用扫描子程序,判断是否有键按下,有则跳转到相应的程序断去执行,无则继续。
由于小键盘扫描在程序总是存在的,因此可随时进行波形间的切换。
2.1.3数码管显示
数码管同步显示当前波形的幅值和频率。
硬件上由8086将数据输出给8255,8255再将输出送给数码管的A~Dp,显示相应字符。
软件上定义一个缓冲区存放波形的幅值和频率,显示数码管时,利用缓冲区的数值查找数码管键值表再输出对应数值。
循环输出波形时也循环输出缓冲区内容对应的值,就可以同步显示波形的幅值和频率。
利用小键盘扫描得到的键值进行判断,对缓冲区内的幅值频率进行相应的改变,使数码管能显示不同的幅值和频率。
2.1.4小键盘控制
使用实验箱上4×4键盘,可以实现切换波形,调频、调幅和退出波形的控制功能。
Protues内的键盘矩阵扫描时轮流选通一行,然后从端口处读取列数据,如果有按键则读取的数据肯定有一位为0,经过取反后,尽有一位为1,然后再根据选取的列和读取的行值,确定按的是哪一个键,然后将键值编码保存在一个名为keyass的存储单元里。
当有键按下时,从keyass内取出键值进行判断,就能转入相应的子程序进行控制,并且键盘扫描、获取键值等子程序也能够很好的嵌入在其他程序中,方便调用。
2.1.5有极调频
改变波形子程序中的各个数据输出时间,即延时,就可改变整个波形的频率。
延时越短频率越高。
定义三个缓冲区来存放延时,其中一个存放初始值3,一个存放当前波形的延时,还有一个作为中间暂存用。
产生波形以后,取出延时初值存入中间暂存缓冲区,再扫描键盘:
0对应减小延时,1对应增大延时,无键则不改变延时。
对暂存区的数值进行相应操作后,将最后的值存入名为tiaopin的缓冲区内作为当前波形的延时。
2.1.6有极调幅
和有级调频类似,有极调幅也是定义三个缓冲区,功能和有极调频类似。
幅值缓冲区存放的是输出点的值的放大倍数,调节放大倍数也就使幅值改变了。
产生波形以后,取出倍数初值存入中间暂存缓冲区,再扫描键盘:
2对应减小倍数,3对应增大倍数,无键则不改变倍数。
对暂存区的数值进行相应操作后,将最后的值存入名为tiaofu的缓冲区内作为当前波形的幅值放大倍数。
2.1.6开始结束
用小键盘第二列第一个也就是4来结束波形,无论在什么时候只在小键盘扫描到了4键,它就会无条件跳出程序,返回起始状态,等待选择波形,同时数码管显示零。
2.2所用芯片功能简介
2.2.18086功能简介
8086CPU是由总线接口部件BIU和执行部件EU这两大部分构成。
总线接口部件BIU是8086CPU在存储器和I/O设备之间的接口部件,负责对全部引脚的操作,即8086对存储器和I/O设备的所有操作都是由BIU完成的。
所有对外部总线的操作都必须有正确的地址和适当的控制信号,BIU中的各部件主要是围绕这个目标设计的。
它提供了16位双向数据总线、20位地址总线和若干条控制总线。
其具体任务是:
负责从内存单元中预取指令,并将它们送到指令队列缓冲器暂存。
CPU执行指令时,总线接口单元要配合执行单元,从指定的内存单元或I/O端口中取出数据传送给执行单元,或者把执行单元的处理结果传送到指定的内存
单元或I/O端口中。
执行单元EU中包含1个16位的运算器ALU、8个16位的寄存器、1个16位标志寄存器FR、1个运算暂存器和执行单元的控制电路。
这个单元进行所有指令的解释和执行,同时管理上述有关的寄存器。
EU对指令的执行是从取指令操作码开始的,它从总线接口单元的指令队列缓冲器中每次取一个字节。
如果指令队列缓冲器中是空的,那么EU就要等待BIU通过外部总线从存储器中取得指令并送到EU,通过译码电路分析,发出相应控制命令,控制ALU数据总线中数据的流向。
管脚图如下:
2.2.28255A功能简介
8255A具有24条输入/输出引脚、可编程的通用并行输入/输出接口电路。
它是一片使用单一+5V电源的40脚双列直插式大规模集成电路。
8255A的通用性强,使用灵活,通过它CPU可直接与外设相连。
8255A在使用前要写入一个方式控制字,选择A、B、C三个端口各自的工作方式,共有三种。
方式0:
基本的输入输出方式,即无须联络就可以直接进行的I/O方式。
其中A、B、C口的高四位或低四位可分别设置成输入或输出;方式1:
选通I/O,此时接口和外围设备需联络信号进行协调,只有A口和B口可以工作在方式1,此时C口的某些线被规定为A口或B口与外围设备的联络信号,余下的线只有基本的I/O功能,即只工作在方式0;方式2:
双向I/O方式,
只
有A口可以工作在这种方式,该I/O线即可输入又可输出,此时C口有5条线被规定为A口和外围设备的双向联络线,C口剩下的三条线可作为B口方式1的联络线,也可以和B口一起方式0的I/O线。
管脚图如下:
2.2.3DAC0832功能简介
DAC0832是采用CMOS工艺制成的单片电流输出型8位数/模转换器。
它由倒T型R-2R电阻网络、模拟开关、运算放大器和参考电压VREF四大部分组成。
电路有极好的温度跟随性,使用了COMS电流开关和控制逻辑而获得低功耗、低输出的泄漏电流误差。
集成电路内有两级输入寄存器,使DAC0832芯片具备双缓冲、单缓冲和直通三种输入方式,以便适于各种电路的需要.DAC0832有8个输入端(其中每个输入端是8位二进制数的一位),有一个模拟输出端。
输入可有2的8次方,即256个不同的二进制组态,输出为256个电压之一,即输出电压不是整个电压范围内任意值,而只能是256个可能值。
D/A转换结果采用电流形式输出。
若需要相应的模拟电压信号,可通过一个高输入阻抗的线性运算放大器实现。
运放的反馈电阻可通过RFB端引用片内固有电阻,也可外接。
DAC0832逻辑输入满足TTL电平,可直接与TTL
电路或微机电
路连接。
DAC0832的管脚图如下:
2.2.474LS273功能简介
地址锁存器就是一个暂存器,它根据控制信号的状态,将总线上地址代码暂存起来。
8086/8088数据和地址总线采用分时复用操作方法,即用同一总线既传输数据又传输地址。
当微处理器与存储器交换信号时,首先由CPU发出存储器地址,同时发出允许锁存信号ALE给锁存器,当锁存器接到该信号后将地址/数据总线上的地址锁存在总线上,随后才能传输数据。
地址锁存器74LS273是带清除端的八D触发器,只有清除端为高电平时才具有锁存功能,锁存控制端为11脚CLK,在上升沿锁存。
8086的ALE端输出的锁存控制信号必须经反相器后才能连到74LS273的CLK端,以满足CLK在上升沿锁存的要求。
74LS273的引脚1D~8D为数据输入端,1Q~8Q为数据输出端,WR:
主清除端,低电平触发,即当为低电平时,芯片被清除,输出全为0。
CP(CLK):
触发端,上升沿触发,即当CP从低到高电平时,D0~D7的数据通过芯片,为0时将数据锁存,D0~D7的数据不变。
由于8086有20位物理地址,所以需要用3片74LS273级联。
74LS273的管脚图如右:
2.3实施方案
2.3.1系统总体设计方案
该设计包括硬件设计和软件设计两部分。
1.硬件上要求以8086CPU为核心进行电路设计。
完全用小键盘对波形进行控制。
小键盘作为产生波形、波形切换、调节频率,调节幅值、退出波形的控制端口。
8255A芯片完成对小键盘扫描,获取键值编码以及输出到数码管。
通过DAC0832将数字量转换成模拟量输出,再由转换电路将电流输出转换为电压输出产生各种波形,通过虚拟示波器显示出波形。
由于8255A的A,B,C端口都已使用,所以采用键盘控制进行幅值和频率的有极调节。
2.软件方面要设计方波,三角波,锯齿波,正弦波何时产生,如何产生,何时退出,并且还要设计如何通过对按键的判断,对频率和幅值进行调节。
方波比较简单,先扫描键盘,无键按下时输出零,保持一个延时,再扫描键盘,无键按下时输出20H的倍数,该倍数就是我定义的幅值,再延时,循环该周期就可得到方波。
如果有键按下就会转入相应子程序。
三角波分为两段,因它的上升斜坡和下降斜坡都是线性关系,所以只要由数字量的增减来控制就可以了。
产生上升斜坡时让输出值从零开始逐渐递增,其上升的最大值是30乘以放大倍数,相反,产生下降斜坡时,让输出值从最大值逐渐递减到零。
为简单起见,这里采用的是查表法,在数据段定义了三角波函数表,规律如上。
其幅值由放大倍数控制,频率是由输出点之间的延时来控制。
锯齿波截取三角波的上升斜坡部分,到达最大值后就跳回最低值0,方法与三角波相同,也采用查表法。
先定义了锯齿波的函数表,输出时只要按着函数表一个一个往下输出,当显示到最大值即一个周期内的最后一个值再将指针指向表的首地址就开始了新的周期。
其幅值由放大倍数控制,频率是由输出点之间的延时来控制。
正弦波也是用的查表法。
该方法的优点是速度快,但在精度高的情况下要求的存储器容量也要增大,所以此种方法应用在对精度要求不高的场合。
本程序中制造了一张正弦数字量表,即查函数表得到的值转换成十进制数填表。
一个周期
内,采样点越多,精度越高,本实验中采样点为40点/周期。
正弦数字量表中的值为参考值,对于不同幅值的正弦波可以通过把表中的每个值乘以相同的倍数得到,其频率由改变输出点之间的延时来实现。
频率和幅值的调节由每个点的延时和幅值的放大倍数决定。
在各个波形输出之前,先读取频率和幅值的初值,若要增加(减小)频率,则使延时减(加)1;若要增大(减小)幅值,则使原幅值基础值得放大倍数加(减)1。
然后再将改变后的幅值频率送给原波形进行输出,同时,幅值和频率的值作为偏移量查找数码管显示表,然后送给对应的数码管显示。
2.3.2系统设计方框图
第三章典型程序模块及编程技巧分析
3.1键盘扫描模块
小键盘工作原理:
(1)初始化8255的工作方式:
A,B口作为输出,C口低四位作为输入。
矩阵的X1~X4接到输出端口PA0-PA3上,用程序控制4条行线的输出。
4条列线Y1~Y4连接到输入端口C的PC0-PC3。
用读指令读取C口状态时,可读取键盘的列号。
(2)在无键按下的时候,由于接到+5V上的上拉电阻的作用,列线被置成
高电平。
压下某一个键所在的行线和列线接通。
这时,如果向被压下的键所在的行线上输出一个低电平信号,则对应的列线也呈现低电平。
当从C口读取列线信号时,便能检测到该列线上的低电平。
(3)扫描键盘时,A口输出全0,读C口,取低四位再取反,若为0则无键输入,若不为零则转获取键值子程序。
获取键值时,对X1到X4轮流选中,即轮流输出0。
先把第一行赋0,读C口检测是不是第一行,不是再继续第二行,没有的话总共循环4次跳出循环,这样根据选中的行和读入的列状态中低电平的位置,便能确定哪个键被按下了。
检测到按键后,对压下的键进行编码,将该键的行列信号转化成16进制码,将键值存入缓冲区,以便以后利用进行判断比较。
接着继续扫描按键,等待按键释放。
具体的实现如下:
CCSCAN扫描按键是否有键按下:
CCSCANPROCNEAR;扫描是否有按键闭合子程序
MOVAL,00H
MOVDX,MY8255_A;将4列全选通,X1~X4置0OUTDX,AL
MOVDX,MY8255_C
INAL,DX;读Y1~Y4
NOTAL
ANDAL,0FH;取出Y1~Y4的反值
RET
CCSCANENDP
如果有按键,就获取按键码的功能,4×4键盘的编码,从上到下,从左到右,依次编码为0~F,如果有按键,则转入到按键处理子程序模块执行,如果没有,则返回主程序循环。
具体的实现代码如下:
GETKEY1PROCNEAR;获取键值子程序
CALLDIS;显示刷新
CALLDALLY;延时
CALLDALLY;延时
CALLCLEAR;清屏
CALLCCSCAN;再次扫描按键
JNZGETKEY2;有键按下则跳置GETKEY2JMPBEGIN1;否则跳回开始继续循环GETKEY2:
MOVCH,0FEH
MOVCL,00H;设置当前检测的是第几列
COLUM:
MOVAL,CH;选取一列,将X1~X4中一个置0MOVDX,MY8255_A
OUTDX,AL
MOVDX,MY8255_C
INAL,DX
L1:
TESTAL,01H;
JNZL2;
MOVAL,00H;
JMPKCODE
L2:
TESTAL,02H;
JNZL3;
MOVAL,04H;
JMPKCODE
L3:
TESTAL,04H;
JNZL4;
MOVAL,08H;
JMPKCODE
L4:
TESTAL,08H;
JNZNEXT;
MOVAL,0CH;
KCODE:
ADDAL,CL;
键值
CALLPUTBUF;
PUSHAX
KON:
CALLDIS;
CALLCLEAR;
CALLCCSCAN;
JNZKON;
POPAX
;读Y1~Y4,用于判断哪一行按键闭合是否为第1行不是则继续判断设置第1行第1列的对应的键值是否为第2行不是则继续判断设置第2行第1列的对应的键值是否为第3行不是则继续判断设置第3行第1列的对应的键值是否为第4行不是则继续判断设置第4行第1列的对应的键值将第1列的值加上当前列数,确定按保存按键值显示刷新清屏扫描按键,判断按键是否弹起未弹起则继续循环等待弹起13
NEXT:
INCCL;当前检测的列数递增
MOVAL,CH
TESTAL,08H;检测是否扫描到第4列
JZKERR;是则跳回到开始处
ROLAL,1;没检测到第4列则准备检测下一列MOVCH,AL
JMPCOLUM
KERR:
RET
GETKEY1ENDP
PUTBUFPROCNEAR;保存键值子程序
MOVDI,OFFSETKEY
MOV[DI],AL
CMPDI,2FFFH
JNZGOBACK
MOVDI,3004H
GOBACK:
RET
PUTBUFENDP
3.2数码管显示模块
4个数码管的X端为选通端,将小键盘的X1~X4对应接到数码管,这样扫描小键盘的时候,也就选中了数码管,当调用getkey1获取键值子程序的时候,数码管轮流选中,也就可以控制哪个数码管显示什么内容。
通过对8255写入数据,由B口输出给数码管的A~Dp,当没有波形输入时,数码管显示0数码管;定义两个缓冲区存放幅值和频率,有波形输出时,同步显示该波形的幅值和频率。
先在数据段定义一个缓冲区存放数码管显示0~F的段位值表:
DTABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB7FH,6FH,77H,7CH,39H,5EH,79H,71H
因为要一直显示数码管,所以将显示部分作为子程序,方便经常调用。
DISPROCNEAR;显示键值子程序
PUSHAX;以缓冲区存放的键值为键值表偏移找到键
值并显示
MOVSI,3000H;缓冲区3000H内存放了当前波形的
幅值,3001H存放了频率。
MOVDL,0F7H
MOVAL,DL
AGAIN:
PUSHDX
MOVDX,MY8255_A
OUTDX,AL;设置X1~X4,选通一个数码管MOVAL,[SI];取出缓冲区中存放键值
MOVBX,OFFSETDTABLE
ANDAX,00FFH
ADDBX,AX
MOVAL,[BX];将键值作为偏移和键值基地址相加得
到相应的键值
MOVDX,MY8255_B
OUTDX,AL;写入数码管A~Dp
CALLDALLY
INCSI;取下一个键值
POPDX
MOVAL,DL
TESTAL,01H;判断是否显示完?
JZOUT1;显示完,返回
RORAL,1
MOVDL,AL
JMPAGAIN;未显示完,跳回继续
OUT1:
POPAX
RET
DISENDP
3.3有级调频调幅判断及控制模块
改变波形产生子程序中的各个数据输出时间,及延时,就可改变整个波形的频率。
改变波形产生子程序中的每次输出数值的放大倍数,就可以改变整个波形的幅值。
而实现有级变化的初值是在数据段预先定义的数据表。
在选择波形以后,才能调节频率和幅值,频率和幅值的调节由小键盘控制。
在3000H和3001H的缓冲区内存放了幅值和频率的初值3,在每个波形输出之前先扫描键盘,键值存在KEY里,对KEY值进行判断后,取出缓冲区的初值做相应
改变:
0选择增大频率,1选择减小频率,2选择减小幅值,3选择增大幅值,4退出波形,返回开始状态。
具体的实现代码如下:
AMPLFENCPROCNEAR;调节幅值频率子程序
CALLDIS;刷新
CALLCCSCAN;再次扫描按键
JNZTRI1;有键按下则跳置tri1
JMPTRI5;
TRI1:
CALLDIS;
CALLGETKEY1
MOVSI,OFFSETKEY
MOVAL,[SI]
CMPAL,4;
JZTRI10
JZTRI5
CMPAL,0;
JNZTRI2
MOVDI,3001H;
MOVBL,[DI]
CMPBL,01H
JETRI5
DECBL
MOV[DI],BL
JMPTRI5
TRI2:
CMPAL,1;
JNZTRI3
MOVDI,3001H;
MOVBL,[DI]
CMPBL,05H
JETRI5
INCBL
MOV[DI],BL
JMPTRI5
TRI3:
CMPAL,2;
没按键按下就跳出该子程序刷新第五个键就退出第一个键减少周期取延时初值第二个键增加周期取延时初值第三个键减少幅度16
JNZTRI4
MOVDI,3000H
MOVBL,[DI];取幅值初值
CMPBL,01H
JETRI5
DECBL
MOV[DI],BL
JMPTRI5
TRI4:
CMPAL,3;第四个键增加幅度
JNZTRI5
MOVDI,3000H
MOVBL,[DI];取幅值初值
CMPBL,05H
JETRI5
INCBL
MOV[DI],BL
JMPTRI5
TRI10:
JMPFARPTRBEGIN0
TRI5:
RET
AMPLFENCENDP
3.4波形切换及基本控制模块
这个模块是本次设计的主程序,它控制了波形的输出和切换。
它是根据对小键盘的操作来实现的,不同按键对应的编码转入不同模块(0:
方波,1:
三角波,2:
锯齿波,3:
正弦波,4:
退出波形)。
先扫描键盘是否有键按下,若无循环等待,若有则将键值保存再比较,然后实现相应操作。
为使程序可循环使用,不至于显示一次波形就退出,在执行完子程序返回时,不退出系统,而是返回到开始等待输入状态,这样就能切换波形。
具体的实现代码如下:
BEGIN0:
MOVSI,3000H;把数码管清0
MOVAL,00H;先初始化键值为0
MOV[SI],AL
MOVAL,00H
MOV[SI+1],AL
MOVAL,00H
MOV[SI+2],AL
MOVAL,00H
MOV[SI+3],AL
MOVSI,OFFSETKEYMOVAL,00H
MOV[SI],AL
BEGIN1:
CALLDIS;
CALLCCSCAN;
JNZLBEGIN0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信号发生器 课程设计 报告