第一篇:微机原理课设
微机应用系统设计与综合专业班级学生姓名学生学号指导老师实验课程设计
——信号发生器功能程序设计
第一章
设计课题概述
本学期开设的《微型计算机原理与接口技术》理论课程是一门专业基础课程,1.1 课程设计目的
它的主要内容包括微型计算机体系结构、8086 微处理器和指令系统、汇编语言设计以及微型计算机各个组成部分介绍等内容。要求学生对微机原理中的基本概念有较深入的了解,能够系统地掌握微型计算机的结构、8086 微处理器和指令系统、汇编语言程序设计方法、微机系统的接口电路设计及编程方法等,并具有综合运用所学知识分析问题和解决问题的能力。
《微机应用系统设计与综合实验(实践)》课程设计,让学生对微机系统有一个较全面的理解,掌握常规的芯片使用方法、掌握简单的微型计算机应用系统软硬件的设计方法,对典型数字接口电路的应用技术有一个较深入的掌握,并对应用系统进行硬件原理和软件编程进行分析、设计和调试,达到基本掌握简单微型计算机应用系统软硬件的设计方法,提高项目开发能力的目的。课程中要求学生根据课程设计指导书来选择课题,并且独立完成课题,写出课程设计说明书,画出电路原理图,说明工作原理,画出电路板图,编写程序以及程序流程图。
针对《信号发生器功能程序设计》这一课题,主要涉及到硬件的连接(主要用到芯片有:8086CPU,DAC0832,8255,74LS273,74LS138,运放等)以及数码管,键盘矩阵硬件,示波器等连接原理图,程序的编写(主要涉及到显示波形,数码管显示以及通过小键盘来对波形进行选择控制)以及各个子程序或程序段的程序流程等,通过课程设计不仅可以锻炼学生在微机应用方面的实际工作能力,将所学转化为所用,更是一个锻炼解决实际问题能力的很好机会。
1.2 课程设计要求
(1)、分别用C语言和汇编语言编程完成硬件接口功能设计;(2)、硬件电路基于80x86微机的接口电路;
(3)、程序功能要求:小键盘给定、数码管(屏幕)显示,并产生对应信号波形(D/A)输出(信号波形包括正弦波、三角波、方波、锯齿波)、输出信号波形幅度、频率可调。(注意:按键数量应尽量少)。
实现技术指标
(1)、完全用小键盘控制各波形间的切换和频率和幅值的调节以及退出。(2)、实现正弦波、三角波、方波和锯齿波信号的产生。(3)、数码管同步显示当前工作波形的频率和幅值。(4)、实现频率的1到5倍可调。(5)、实现幅值的1到5倍可调。
使用说明
(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.1 8086功能简介
8086 CPU是由总线接口部件BIU和执行部件EU这两大部分构成。总线接口部件BIU是8086 CPU在存储器和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.2 8255A功能简介
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.3 DAC0832功能简介
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.4 74LS273功能简介
地址锁存器就是一个暂存器,它根据控制信号的状态,将总线上地址代码暂存起来。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扫描按键是否有键按下: CCSCAN PROC
NEAR
;扫描是否有按键闭合子程序
MOV
AL,00H
MOV
DX,MY8255_A;将4列全选通,X1~X4置0
OUT
DX,AL
MOV
DX,MY8255_C
IN
AL,DX
;读Y1~Y4
NOT
AL
AND
AL,0FH
;取出Y1~Y4的反值
RET
CCSCAN ENDP
如果有按键,就获取按键码的功能,4×4键盘的编码, 从上到下,从左到右,依次编码为0~F, 如果有按键, 则转入到按键处理子程序模块执行, 如果没有,则返回主程序循环。具体的实现代码如下:
GETKEY1 PROC
NEAR
;获取键值子程序
CALL
DIS
;显示刷新
CALL
DALLY
;延时
CALL
DALLY
;延时
CALL
CLEAR
;清屏
CALL
JNZ
JMP
GETKEY2: MOV
MOV
COLUM: MOV
MOV
OUT
MOV
IN
L1: TEST
JNZ
MOV
JMP
L2: TEST
JNZ
MOV
JMP
L3: TEST
JNZ
MOV
JMP
L4: TEST
JNZ
MOV
KCODE: ADD
CCSCAN
;再次扫描按键
GETKEY2
;有键按下则跳置GETKEY2 BEGIN1
;否则跳回开始继续循环
CH,0FEH
CL,00H
;设置当前检测的是第几列
AL,CH
;选取一列,将X1~X4中一个置0
DX,MY8255_A DX,AL
DX,MY8255_C;读Y1~Y4,用于判断哪一行按键闭合 AL,DX
AL,01H
;是否为第1行 L2
;不是则继续判断
AL,00H
;设置第1行第1列的对应的键值
KCODE
AL,02H
;是否为第2行 L3
;不是则继续判断
AL,04H
;设置第2行第1列的对应的键值
KCODE
AL,04H
;是否为第3行 L4
;不是则继续判断
AL,08H
;设置第3行第1列的对应的键值
KCODE
AL,08H
;是否为第4行 NEXT
;不是则继续判断
AL,0CH
;设置第4行第1列的对应的键值
AL,CL
;将第1列的值加上当前列数,确定按键值
CALL
PUTBUF
;保存按键值
PUSH
AX
KON: CALL
DIS
;显示刷新
CALL
CLEAR
;清屏
CALL
CCSCAN
;扫描按键,判断按键是否弹起
JNZ
KON
;未弹起则继续循环等待弹起
POP
AX
NEXT: INC
CL
;当前检测的列数递增
MOV
AL,CH
TEST
AL,08H
;检测是否扫描到第4列
JZ
KERR
;是则跳回到开始处
ROL
AL,1
;没检测到第4列则准备检测下一列
MOV
CH,AL
JMP
COLUM
KERR: RET
GETKEY1 ENDP PUTBUF PROC
NEAR
;保存键值子程序
MOV
DI,OFFSET KEY
MOV
[DI],AL
CMP
DI,2FFFH
JNZ
GOBACK
MOV
DI,3004H
GOBACK: RET
PUTBUF ENDP
3.2数码管显示模块
4个数码管的X端为选通端,将小键盘的X1~X4对应接到数码管,这样扫描小键盘的时候,也就选中了数码管,当调用getkey1获取键值子程序的时候,数码管轮流选中,也就可以控制哪个数码管显示什么内容。通过对8255写入数据,由B口输出给数码管的A~Dp,当没有波形输入时,数码管显示0数码管;定义两个缓冲区存放幅值和频率,有波形输出时,同步显示该波形的幅值和频率。
先在数据段定义一个缓冲区存放数码管显示0~F的段位值表: DTABLE DB
3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB
7FH,6FH,77H,7CH,39H,5EH,79H,71H 因为要一直显示数码管,所以将显示部分作为子程序,方便经常调用。DIS PROC
NEAR
;显示键值子程序
AGAIN:
PUSH
AX
;以缓冲区存放的键值为键值表偏移找到键值
并显示
MOV
SI,3000H
;缓冲区3000H内存放了当前波形的幅
值,3001H存放了频率。
MOV
DL,0F7H MOV
AL,DL PUSH
DX MOV
DX,MY8255_A OUT
DX,AL
;设置X1~X4,选通一个数码管 MOV
AL,[SI]
;取出缓冲区中存放键值 MOV
BX,OFFSET DTABLE AND
AX,00FFH ADD
BX,AX MOV
AL,[BX]
;将键值作为偏移和键值基地址相加得到
相应的键值
MOV
DX,MY8255_B OUT
DX,AL
;写入数码管A~Dp CALL
DALLY INC
SI
;取下一个键值 POP
DX MOV
AL,DL TEST
AL,01H
;判断是否显示完? JZ
OUT1
;显示完,返回 ROR
AL,1 MOV
DL,AL
JMP
AGAIN
;未显示完,跳回继续
OUT1: POP
AX
RET
DIS ENDP 3.3有级调频调幅判断及控制模块
改变波形产生子程序中的各个数据输出时间,及延时,就可改变整个波形的频率。改变波形产生子程序中的每次输出数值的放大倍数,就可以改变整个波形的幅值。而实现有级变化的初值是在数据段预先定义的数据表。
在选择波形以后,才能调节频率和幅值,频率和幅值的调节由小键盘控制。在3000H和3001H的缓冲区内存放了幅值和频率的初值3,在每个波形输出之前先扫描键盘,键值存在KEY里,对KEY值进行判断后,取出缓冲区的初值做相应改变:0选择增大频率,1选择减小频率,2选择减小幅值,3选择增大幅值,4退出波形,返回开始状态。
具体的实现代码如下:
AMPLFENC PROC
NEAR
;调节幅值频率子程序
CALL
DIS
;刷新
CALL
CCSCAN
;再次扫描按键
JNZ
TRI1
;有键按下则跳置tri1
JMP
TRI5
;没按键按下就跳出该子程序
TRI1: CALL
DIS
;刷新
CALL
GETKEY1
MOV
SI,OFFSET KEY
MOV
AL,[SI]
CMP
AL,4
;第五个键就退出
JZ
TRI10
JZ
TRI5
CMP
AL,0
;第一个键减少周期
JNZ
TRI2
MOV
DI,3001H
;取延时初值
MOV
BL,[DI]
CMP
BL,01H
JE
TRI5
DEC
BL
MOV
[DI],BL
JMP
TRI5
TRI2: CMP
AL,1
;第二个键增加周期
JNZ
MOV
MOV
CMP
JE
INC
MOV
JMP
TRI3: CMP
JNZ
MOV
MOV
CMP
JE
DEC
MOV
JMP
TRI4: CMP
JNZ
MOV
MOV
CMP
JE
INC
MOV
JMP
TRI3
DI,3001H BL,[DI] BL,05H TRI5 BL [DI],BL TRI5
AL,2
TRI4 DI,3000H
BL,[DI]
BL,01H TRI5 BL [DI],BL TRI5
AL,3
TRI5 DI,3000H
BL,[DI]
BL,05H TRI5 BL [DI],BL TRI5
;取延时初值;第三个键减少幅度
;取幅值初值;第四个键增加幅度
;取幅值初值
TRI10: JMP
FAR PTR BEGIN0
TRI5: RET
AMPLFENC ENDP
3.4 波形切换及基本控制模块
这个模块是本次设计的主程序,它控制了波形的输出和切换。它是根据对小键盘的操作来实现的,不同按键对应的编码转入不同模块(0:方波,1:三角波,2:锯齿波,3:正弦波,4:退出波形)。先扫描键盘是否有键按下,若无循环等待,若有则将键值保存再比较,然后实现相应操作。为使程序可循环使用,不至于显示一次波形就退出,在执行完子程序返回时,不退出系统,而是返回到开始等待输入状态,这样就能切换波形。
具体的实现代码如下:
BEGIN0: MOV
SI,3000H
;把数码管清0
MOV
AL,00H
;先初始化键值为0
MOV
[SI],AL
MOV
AL,00H
MOV
[SI+1],AL
MOV
AL,00H
MOV
[SI+2],AL
MOV
AL,00H
MOV
[SI+3],AL
MOV
SI,OFFSET KEY
MOV
AL,00H
MOV
[SI],AL BEGIN1: CALL
DIS
;显示刷新
CALL
CCSCAN
;再次扫描按键
JNZ
LBEGIN0
;有键按下则跳置LBEGIN0
JMP
BEGIN1;不是按下第一或二键就继续等待输入
LBEGIN0: CALL
GETKEY1
;第二个菜单等待输入
CALL
DIS
MOV
SI,OFFSET KEY
MOV
AL,[SI]
CMP
AL,4
;第5个键退出
JZ
BEGIN0
CMP
AL,0
;第1个键到squ(方波)函数
JZ
LBEGIN1
CMP
AL,1
;第2个键到tri(三角波)函数
JZ
LBEGIN2
CMP
AL,2
;第3个键到rec(锯齿)函数
JZ
LBEGIN3
CMP
AL,3
;第4个键到sin(正弦)函数
JZ
LBEGIN4
JMP
BEGIN1
;其他键则跳到继续等待输入
LBEGIN1: CALL
SQUREW
;SQUARE
JMP
BEGIN0
LBEGIN2: CALL
TRIW
;TRIANGLE
JMP
BEGIN0
LBEGIN3: CALL
RCTW
;RECANGLE
JMP
BEGIN0
LBEGIN4: CALL
SINW
;SIN
JMP
BEGIN0
;执行完输出波形之后 回到开始状态
JMP
BEGIN0
3.5波形产生模块 3.5.1方波
方波的产生只要使DAC0832输出一个较大值(此处用20H),并延时一段时间,再输出一个较小值(此处用00F),延时一段相同时间,就是方波的一个周期。但因为实现过程中结合了数码管的显示以及频率幅值的调节所以并不那么简单。先将幅值和频率的初值放入暂存缓冲区,使数码管显示,扫描键盘,无键按下则继续,有键按下则先判断是否为0到3,是则调节频率幅值,是4则退出波形。执行相应操作后刷新数码管,将新的幅值和频率存在TIAOFU和TIAOPIN的缓冲区内,把低电平的值乘以TIAOFU输出,延迟时间乘以TIAOPIN,使该值持续一段时间,输出高电平的过程与低电平相同,循环该周期就得到连续方波。
具体的实现代码如下:
SQUREW PROC
NEAR
;方波发生子程序
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
SQUR1: CALL 调节幅值频率
MOV
MOV
CMP
JZ
CALL
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
TRILOOP1: MOV
MOV
DI,OFFSET FENC
;初始化显示管的值为3
AL,[DI]
SI,3000H
[SI],AL
DI,OFFSET AMPL
AL,[DI]
SI,3001H
[SI],AL
AMPLFENC
;调节幅值频率子程序,有键按下是
SI,OFFSET KEY
;按下第五个键就退出
AL,4
[SI],AL
SQUA
DIS
;刷新数码管
SI,3000H
BL,[SI]
DI,OFFSET TIAOFU
[DI],BL
SI,3001H
AL,[SI]
SI,OFFSET TIAOPIN
[SI],AL
DX,DA0832
;输出低电平
输出方波形
AL,00H
OUT
DX,AL
CALL
DIS
;刷新
PUSH
CX
PUSH
AX
MOV
CL,TIAOPIN
MOV
CH,00H
D11: MOV
D21: DEC
PUSH
PUSH
CALL
CALL
JNZ
POP
POP
JNZ
LOOP
POP
POP
CALL
JNZ
MOV
MOV
MUL
MOV
OUT
CALL
PUSH
PUSH
MOV
MOV
D12: MOV
AX,00FFH AX AX CX DIS
CCSCAN
;再次扫描按键 SQUR1
;有键按下则跳置squr1, CX AX D21 D11 AX CX
CCSCAN
;再次扫描按键
SQUR1;有键按下则跳置squr1,改变幅值频率 BL,TIAOFU AL,20H BL
DX,DA0832
;输出高电平DX,AL
DIS
;刷新 CX AX CL,TIAOPIN CH,00H AX,00FFH
D22: DEC
AX
PUSH
AX
PUSH
CX
CALL
DIS
CALL
CCSCAN
;再次扫描按键
JNZ
SQUR1
;有键按下则跳置tri1
POP
CX
POP
AX
JNZ
D22
LOOP
D12
POP
AX
POP
CX
JZ
TRILOOP1
;没按键时继续输出波形
SQUA: RET
SQUREW ENDP
3.5.2三角波
三角波理论上有两段,上升和下降,上升时从最低值开始自增,直到最大值,然后再自减至最低。本设计中,因为对波形精度要求不是很高,所以采用按列表输出的方式,即先在数据段定义了一段三角波一个周期内的采样值的数字量表,采样频率为60点/周期。数字量表中的值为参考值,输出三角波时通过把表中的每个值乘以相同的倍数,该倍数为我们设定的幅值。波形输出方式都相同,这里简要说明:先将幅值和频率的初值放入暂存缓冲区,使数码管显示,扫描键盘,执行相应操作后刷新数码管,将新的幅值和频率存在TIAOFU和TIAOPIN的缓冲区内,将第一个数字量乘以TIAOFU输出,延迟时间乘以TIAOPIN,再扫描,输出第二个值,直到指针指完该数字量表再循环该周期就得到连续三角波。
具体的实现代码如下:
TRITAB
DB
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;三角函数表
DB
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
DB
30,29,28,27,26,25,24,23,22,21,20,19,18,17,16
DB
15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 TRIW PROC
NEAR
;三角波形子程序
MOV
DI,OFFSET FENC
MOV
AL,[DI]
MOV
SI,3000H
MOV
[SI],AL
TRA1:
TRLOOP1:
TRLOOP2:
MOV
DI,OFFSET AMPL MOV
AL,[DI] MOV
SI,3001H MOV
[SI],AL CALL
AMPLFENC MOV
SI,OFFSET KEY MOV
AL,4 CMP
[SI],AL JZ
TRIA CALL
DIS MOV
SI,3000H MOV
BL,[SI] MOV
DI,OFFSET TIAOFU MOV
[DI],BL MOV
SI,3001H MOV
AL,[SI] MOV
SI,OFFSET TIAOPIN MOV
[SI],AL MOV
SI,OFFSET TRITAB MOV
AL,[SI] MOV
BL,TIAOFU MUL
BL MOV
DX,DA0832
;启动D/A转换 OUT
DX,AL PUSH
AX PUSH
SI
PUSH
CX
MOV
CL,TIAOPIN
MOV
CH,00H
DALLYTRI1: CALL
DIS
CALL
CCSCAN
JNZ
TRA1
LOOP
DALLYTRI1
POP
CX
POP
SI
POP
AX
INC
SI
CMP
SI,OFFSET RCTTAB
JNZ
TRLOOP2
JMP
TRLOOP1
TRIA: RET
TRIW ENDP
3.5.3锯齿波
锯齿波就是截取了三角波的上升部分,由最小值自增到达最大值后下一个值就返回最小值。本设计中锯齿波的产生方式也是对锯齿波采样,采样周期为32点/周期,然后以采样表为基础输出。锯齿波的输出方式与三角波相同,这里不再重复。
具体的实现代码如下:
先在数据段定义一张锯齿波采样后的数字量表: RCTTAB DB
1,2,3,4,5,6,7,8
;锯齿函数表
DB
9,10,11,12,13,14,15,16
DB
17,18,19,20,21,22,23,24
DB
25,26,27,28,29,30,31,32 RCTW PROC
NEAR
;锯齿波形子程序
MOV
DI,OFFSET FENC
MOV
AL,[DI]
MOV
SI,3000H
MOV
[SI],AL
MOV
DI,OFFSET AMPL
MOV
AL,[DI]
MOV
SI,3001H
MOV
[SI],AL
RCT1: CALL
AMPLFENC
MOV
MOV
CMP
JZ
CALL
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
RCLOOP1: MOV
RCLOOP2: MOV
MOV
MUL
MOV
OUT
PUSH
PUSH
PUSH
MOV
MOV
DALLYRCT1: CALL
CALL
SI,OFFSET KEY AL,4 [SI],AL DIS SI,3000H BL,[SI]
DI,OFFSET TIAOFU [DI],BL SI,3001H AL,[SI]
SI,OFFSET TIAOPIN [SI],AL
SI,OFFSET RCTTAB AL,[SI] BL,TIAOFU BL
DX,DA0832
;启动D/A转换 DX,AL AX SI CX CL,TIAOPIN CH,00H
;刷新,扫描,延时CCSCAN
RCTA
DIS
JNZ
RCT1
LOOP
DALLYRCT1
POP
CX
POP
SI
POP
AX
INC
SI
;下一个值
CMP
SI,OFFSET STR1
JNZ
RCLOOP2
JMP
RCLOOP1
RCTA: RET
RCTW ENDP
3.5.4正弦波
正弦波的产生方式有两种,一种是通过调用函数输出,精度较高,第二种为采样查表法。本实验精度要求不高,所以采用第二种。该方法与前面的三角波,锯齿波方法相同,对一个周期内的正弦波采样,采样周期为40点/周期,输出方式与三角波相同,不再重复。
先在数据段定义正弦波的采样数字量表:
SINTAB DB
16,19,21,23,25,27,29,30,31,32,32,32
;正弦函数表
DB
31,30,29,27,25,23,21,19,16,13,11,9
DB
7,5,3,2,1,0,0,0,1,2,3,5,7,9,11,13 SINW PROC
NEAR
;正弦波的子程序
MOV
DI,OFFSET FENC
MOV
AL,[DI]
MOV
SI,3000H
;取幅值初值
MOV
[SI],AL
MOV
DI,OFFSET AMPL
MOV
AL,[DI]
MOV
SI,3001H
;取频率初值
MOV
[SI],AL
SINA1: CALL
AMPLFENC
MOV
SI,OFFSET KEY
MOV
AL,4
CMP
[SI],AL
JZ
SINA
CALL
DIS
MOV
SI,3000H
MOV
BL,[SI]
MOV
MOV
MOV
MOV
MOV
MOV
SINLOOP1: MOV
SINLOOP2: MOV
MOV
MUL
MOV
OUT
PUSH
PUSH
PUSH
MOV
MOV
DALLYSIN1: CALL
CALL
JNZ
LOOP
POP
POP
POP
INC
CMP
DI,OFFSET TIAOFU [DI],BL SI,3001H AL,[SI]
SI,OFFSET TIAOPIN [SI],AL
SI,OFFSET SINTAB AL,[SI] BL,TIAOFU BL
DX,DA0832
;启动D/A转换
DX,AL AX SI CX CL,TIAOPIN CH,00H CCSCAN SINA1 DALLYSIN1 CX SI AX SI
SI,OFFSET TRITAB
;是否结束一个周期
DIS
JNZ
SINLOOP2
JMP
SINLOOP1
SINA: RET
SINW ENDP
第四章 系统调试遇到的问题及解决方法
本次课程设计是对前几次微机原理实验的检验,也是微机原理与接口技术这门课程的综合应用。前几次软件实验,我都积极地实现了拓展题目的要求,所以在选择课题的时候,我第一印象就感觉到信号发生器对软件要求要大于硬件要求,重点是编程,所以,在选择了这个题目以后我就开始思考用何种方式实现。
整体分析后,硬件电路的系统设计比较简单,主程序的设计思路也比较清晰,主要分为波形产生,数码管显示,键盘控制,频率幅值调节四个模块。但是具体每个模块的实现却又遇到了很多的问题,方案上也有些调整。
在此次实验系统调试的过程中,把整个大的程序划分为几个小模块分开调试好,无误后再写主程序将各个子程序整合起来。虽然一开始感觉思路是很好的,但是在实现过程中遇到了很大的麻烦。
1.硬件的连线。硬件连好后,将方波子程序载入8086,最开始示波器连输出都没有,DAC0832的片选端一直没有被选中,我总是以为是地址的问题,可是怎么检查程序也是没有理由出错的,最后发现DAC0832的WR端虚接了,软件画图容易出现虚接的情况,所以连线的时候一定要小心。
2.小键盘控制,这也是整个程序中最核心的部分。这个子程序加在程序的最前面的,如果没有扫描到键值,整个程序就会陷入死循环,不会有任何输出变化。要使键盘扫描得到键值,我参考了实验指导书上的小键盘控制,先把小键盘扫描的程序单独给出来,看能否显示数字,结果并不能正常显示,反复检查调试以后,修改了键值的存储方式以及延时,将其修改后,小键盘方面能正常扫描了。
3.其实最复杂的是将数码管显示和小键盘扫描整合在一起。数码管显示问题一直很复杂,总是不能正常的显示,明明小键盘Y端有变化,表明有键按下,但是数码管就是不能将要显示的数平稳地显示,刚开始只显示零,后来经修改后,会偶尔显示一下幅值或频率但又立马变了,并且显示的数字也不正确,貌似会和之前显示的数字有重双影。查唐都的实验说明得知,数码管只提供了一个8位数据端口,一次只能让一个数码管显示数据,然后显示过程特别地快,基本上看不到想要的结果,并且闪烁得特别厉害。经过反复一直地查找修改,终于发现,有两个数码管显示的内容重叠了,原来是要显示的两个存储单元的地址弄混了,并且延时也有问题。但是数码管的延时又涉及到波形每个输出点的延时,所以将波形产生方面,我改用了采样数字量表,使所有的波形产生都简化了,同时也使延时更短,改为增加循环次数,并且使数码管显示也加入循环里,这样利用视觉暂留,就能看到同时显示幅值和频率。
4.在小键盘实现中还出现了一个很重要的问题,就是在执行到对应的波形时要怎么样跳出然后执行到另外一个波形里面去。原本我想多设置几个按键,4个负责选择波形,4个负责调幅调频,还要加一个退出按键,每输出一个周期就扫描一次,可是这样按键太多了程序显得臃肿,并且没有波形的情况调节频率也是没有意义的,而且一个周期的时间,很有可能使你的按键落空,没有扫描进去。最后决定只用5个键。没有波形时4个按键选择波形,每次执行完一个点后再重新键盘扫描,此时那4个键又代表调幅和调频,而4键从始至终设置为退出键,只要任何时候扫描到此键就返回初始状态,重新进入波形选择,这样就实现了波形的切换,又使按键有效率更高,而且按键数量也很少。
5.方波和三角波的波形产生的程序并不难。锯齿波就是截取三角波的一半,而正弦波,我找到的正弦波采样值序列表都很长,而且值都比较大,所以最后,我用计算器在0~2π内取了40个点的正弦值。最后在调节幅值的时候,当调到最大幅值时,有两种波形失真了,尤其正弦波和三角波形被截顶了。但是我观察到锯齿波却能正常显示,原来锯齿波的采样数字量表的最大值比较小,经放大最大倍数后也没有超出范围。这可能是因为放大后正弦波的最大值已经超出了运放输出的最大电压,所以导致截顶失真。所以我将数字量的值整体缩小了,最后总算达到满意的效果。第五章 课程设计收获与体会
本次课程设计在面临考试的巨大压力和编程难度的双重压力下终于完成了。这让我对于微机原理与接口技术这门课程又有了更深的了解,尤其是汇编语言的运用。这是一次很好的实践的机会,将我们之前几个星期做的微机原理与接口技术实验的软件和硬件部分都结合起来,灵活的运用,锻炼我们学以致用,解决实际问题的能力。我在此次课程设计中受益匪浅,收获良多。
本次设计我是用仿真完成的,因为上学期在模电数电课程设计中也使用到了protues软件,所以这次的设计,对于protues的使用我一点也不陌生。但是,这次的仿真比起以前模电数电仿真要复杂多了。因为这次我选择的信号发生器重点就是汇编语言程序的编写和调试,程序出现的错误比硬件出现的错要难找的多,尤其是逻辑错误,有的时候看都看不出来。但是我还是比较喜欢汇编语言的,可能是对C已经忘得差不多了的缘故吧,脑子里只有汇编。汇编是一门很原始的语言,但是也是一门很有用的语言,通过这么一个比较大的实验,让我对汇编的理解有了进一步的加深。虽然中间过程有苦有煎熬,但是还是很值得回味的,因为我们就是在这样一次又一次煎熬中才熬出了头,才不断成长为更加强大的人。
在这次设计中,一开始想的比较简单和乐观,因为在做微机原理编程实验的时候,我们接触的都是几十行到一百来行的小程序,写完一检查就能比较轻松地查找到错误,但是这次的题目重点就在编程。一开始,我以为这些程序不会错,电路也比较简单。所以当我很快的连好电路,再几个子程序都加载进去的时候,就完全不是我想象的那样输出。而且从整个电路分析,我也找不到问题到底出在哪里。我必须要一步一步地再回头检查错误。这样有可能还检查不出来,最后我只能从一个小模块开始重新连电路,再将该模块对应的程序加载,有问题再改。就这样,一步一步,只有解决了局部的问题,才能为解决整体的问题提供可能。
在小键盘和数码管显示的模块,确实一度陷入瓶颈,不知道问题出在哪里,为什么就是不能显示。我去了几次实验室,想和大家交流一下,但是选择这个题目的人真的很少,最后找到几个同学,但是他们迫于考试压力要么放弃了仿真,要么放弃了小键盘,当时的情绪真是非常抑郁,难道就真的做不出来了吗?怎么可能?就是不相信,感觉就差一点点,就要实现了,因为坚持,因为坚信,因为坚定,哪怕这个茬再难找也会原形毕露的。当看到数码管显示正常,自己的心血终于有了结果,内心的喜悦溢于言表。有句话说得对:失败就是离成功最近的地方,迈过去了就是另一片天。
这次的课程设计,我要十分感谢同学们给予我的帮助,还有李志明老师的指导,让我在短短的几个星期里学到了很多很实用的知识,通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才是真正的知识,才能提高自己的实际动手能力和独立思考的能力。而且在做课程设计的过程中,不仅是考验自己所学的《微机原理》知识,更是要锻炼自己的分析问题的能力和解决实际问题的能力,而在此次课程设计过程中得到了充分的体现。虽然在设计的过程遇到了各种各样的问题,但同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计,把以前所学过的知识重新温习,加以巩固。
这回顾起此次课程设计,我收获颇丰,不仅巩固了《微机原理》的知识,而且锻炼了动手设计,解决实际问题的能力,同时让我坚定了一个信念,学习上,没有攀登不了的山峰,即使山重水复疑无路,只要坚持下去,也会看到柳暗花明又一村。在今后的学习中,我也会将以这样的精神面对所有的困难。
第六章 参考文献
1.《微机原理与接口技术(第4版)》周荷琴等 中国科学技术大学出版社 2.《TD-PIT+实验教程》 3.《TD-PIT+用户手册》
第七章 附录
7.1汇编源程序
IOY0 EQU
0C400H
;片选IOY0对应的端口始地址
IOY1 EQU
0C440H
;片选IOY0对应的端口始地址;*****************************************************************
MY8255_A EQU
IOY0+00H*4;8255的A口地址
MY8255_B EQU
IOY0+01H*4;8255的B口地址
MY8255_C EQU
IOY0+02H*4;8255的C口地址
MY8255_MODE EQU
IOY0+03H*4;8255的控制寄存器地址
DA0832 EQU
IOY1+00H*4;DA0832的端口地址
STACK1 SEGMENT
STACK
DW
256 DUP(?)
STACK1 ENDS
DATA SEGMENT
DTABLE DB
3FH,06H,5BH,4FH,66H,6DH,7DH DB
07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
;键值表,0~F对应的7段数码管的段位值
SINTAB DB
16,19,21,23,25,27,29,30,31,32,32,32 DB
31,30,29,27,25,23,21,19,16
;正弦函数表
DB
13,11,9,7,5,3,2,1,0,0,0,1,2,3,5,7,9,11,13
TRITAB DB
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;三角函数表
DB
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
DB
30,29,28,27,26,25,24,23,22,21,20,19,18,17,16
DB
15,14,13,12,11,10,9,8,7,6,5,4,3,2,1
RCTTAB DB
1,2,3,4,5,6,7,8
;锯齿函数表
DB
9,10,11,12,13,14,15,16
DB
17,18,19,20,21,22,23,24
DB
25,26,27,28,29,30,31,32
STR1 DB
'press 0~3 to output wave',0AH,0DH
DB
'press 4to quit ',0AH,0DH,'$'
AMPL DB
FENC DB
TIAOFU DB
?
TIAOPIN DB
?
KEY DB
?
DATA ENDS
CODE SEGMENT
ASSUME
CS:CODE,DS:DATA
START: MOV
AX,DATA
MOV
DS,AX
MOV
DX,MY8255_MODE
;初始化8255工作方式
MOV
AL,81H
;方式0,A口、B口输出,C口低4位输入
OUT
DX,AL
BEGIN0: MOV
SI,3000H
;把数码管清0
MOV
AL,00H
;先初始化键值为0
MOV
[SI],AL
MOV
AL,00H
MOV
[SI+1],AL
MOV
AL,00H
MOV
[SI+2],AL
MOV
AL,00H
MOV
[SI+3],AL
MOV
SI,OFFSET KEY
MOV
AL,00H
MOV
[SI],AL
BEGIN1: CALL
DIS
;显示刷新
CALL
CCSCAN
;再次扫描按键
JNZ
LBEGIN0
;有键按下则跳置LBEGIN0
JMP
BEGIN1
;不是按下第一或二键就继续等待输入
LBEGIN0: CALL
GETKEY1
;第二个菜单等待输入
CALL
DIS
MOV
SI,OFFSET KEY
MOV
AL,[SI]
CMP
AL,4
;第5个键退出
JZ
BEGIN0
CMP
AL,0
;第1个键到squ(方波)函数
JZ
CMP
JZ
CMP
JZ
CMP
JZ
JMP
LBEGIN1: CALL
JMP
LBEGIN2: CALL
JMP
LBEGIN3: CALL
JMP
LBEGIN4: CALL
JMP
JMP
SQUREW PROC
MOV
MOV
MOV
MOV
MOV
MOV
MOV
LBEGIN1
AL,1
;第2个键到tri(三角波)函数 LBEGIN2
AL,2
;第3个键到rec(锯齿)函数 LBEGIN3
AL,3
;第4个键到sin(正弦)函数 LBEGIN4
BEGIN1
;其他键则跳到继续等待输入 SQUREW
;SQUARE BEGIN0
TRIW
;TRIANGLE BEGIN0
RCTW
;RECANGLE BEGIN0
SINW
;SIN
BEGIN0
;执行完输出波形之后 回到开始状态 BEGIN0
;上面是主程序
NEAR
;方波发生子程序
DI,OFFSET FENC
;初始化显示管的值为3 AL,[DI] SI,3000H [SI],AL
DI,OFFSET AMPL AL,[DI] SI,3001H
MOV
[SI],AL
SQUR1: CALL
AMPLFENC
;调节幅值频率子程序,有键按下是调节幅值频率
MOV
SI,OFFSET KEY
;按下第五个键就退出
MOV
AL,4
CMP
[SI],AL
TRILOOP1:
D11:
D21:
JZ
SQUA CALL
DIS MOV
SI,3000H MOV
BL,[SI] MOV
DI,OFFSET TIAOFU MOV
[DI],BL MOV
SI,3001H MOV
AL,[SI] MOV
SI,OFFSET TIAOPIN MOV
[SI],AL
DX,DA0832
;输出低电平
输出方波形 MOV
AL,00H OUT
DX,AL CALL
DIS
;刷新 PUSH
CX PUSH
AX MOV
CL,TIAOPIN MOV
CH,00H MOV
AX,00FFH DEC
AX PUSH
AX PUSH
CX CALL
DIS CALL
CCSCAN
;再次扫描按键 JNZ
SQUR1
;有键按下则跳置squr1, POP
CX
MOV
POP
AX
JNZ
D21
LOOP
D11
POP
AX
POP
CX
CALL
CCSCAN
;再次扫描按键
JNZ
MOV
MOV
MUL
MOV
OUT
CALL
PUSH
PUSH
MOV
MOV
D12: MOV
D22: DEC
PUSH
PUSH
CALL
CALL
JNZ
POP
POP
JNZ
LOOP
POP
POP
JZ
SQUA: RET
SQUR1
;有键按下则跳置squr1,改变幅值频率 BL,TIAOFU AL,20H BL
DX,DA0832
;输出高电平
DX,AL
DIS
;刷新
CX AX CL,TIAOPIN CH,00H AX,00FFH AX AX CX DIS
CCSCAN
;再次扫描按键 SQUR1
;有键按下则跳置tri1 CX AX D22 D12 AX CX
TRILOOP1
;没按键时继续输出波形
SQUREW ENDP
TRIW PROC
NEAR
;三角波形子程序
MOV
DI,OFFSET FENC
MOV
AL,[DI]
MOV
SI,3000H
TRA1:
TRLOOP1:
TRLOOP2:
MOV
[SI],AL MOV
DI,OFFSET AMPL MOV
AL,[DI] MOV
SI,3001H MOV
[SI],AL CALL
AMPLFENC MOV
SI,OFFSET KEY MOV
AL,4 CMP
[SI],AL JZ
TRIA CALL
DIS MOV
SI,3000H MOV
BL,[SI] MOV
DI,OFFSET TIAOFU MOV
[DI],BL MOV
SI,3001H MOV
AL,[SI] MOV
SI,OFFSET TIAOPIN MOV
[SI],AL MOV
SI,OFFSET TRITAB MOV
AL,[SI] MOV
BL,TIAOFU MUL
BL MOV
DX,DA0832
;启动D/A转换 OUT
DX,AL PUSH
AX
PUSH
SI
PUSH
CX
MOV
CL,TIAOPIN
MOV
CH,00H
DALLYTRI1: CALL
DIS
CALL
CCSCAN
JNZ
LOOP
POP
POP
POP
INC
CMP
JNZ
JMP
TRIA: RET
TRIW ENDP
RCTW PROC
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
RCT1: CALL
MOV
MOV
CMP
JZ
CALL
TRA1 DALLYTRI1 CX SI AX SI
SI,OFFSET RCTTAB TRLOOP2 TRLOOP1
NEAR
;锯齿波形子程序 DI,OFFSET FENC AL,[DI] SI,3000H [SI],AL
DI,OFFSET AMPL AL,[DI] SI,3001H [SI],AL AMPLFENC SI,OFFSET KEY AL,4 [SI],AL RCTA DIS
MOV
SI,3000H
MOV
BL,[SI]
MOV
DI,OFFSET TIAOFU
MOV
[DI],BL
MOV
SI,3001H
MOV
AL,[SI]
MOV
MOV
RCLOOP1: MOV
RCLOOP2: MOV
MOV
MUL
MOV
OUT
PUSH
PUSH
PUSH
MOV
MOV
DALLYRCT1: CALL
CALL
JNZ
LOOP
POP
POP
POP
INC
CMP
JNZ
JMP
RCTA: RET
RCTW ENDP
SI,OFFSET TIAOPIN [SI],AL
SI,OFFSET RCTTAB AL,[SI] BL,TIAOFU BL
DX,DA0832
;启动D/A转换 DX,AL AX SI CX CL,TIAOPIN CH,00H CCSCAN RCT1 DALLYRCT1 CX SI AX SI
SI,OFFSET STR1 RCLOOP2 RCLOOP1
DIS
SINW PROC
NEAR
;正弦波的子程序
MOV
DI,OFFSET FENC
MOV
AL,[DI]
MOV
SI,3000H
MOV
[SI],AL
SINA1:
SINLOOP1:
SINLOOP2:
MOV
DI,OFFSET AMPL MOV
AL,[DI] MOV
SI,3001H MOV
[SI],AL CALL
AMPLFENC MOV
SI,OFFSET KEY MOV
AL,4 CMP
[SI],AL JZ
SINA CALL
DIS MOV
SI,3000H MOV
BL,[SI] MOV
DI,OFFSET TIAOFU MOV
[DI],BL MOV
SI,3001H MOV
AL,[SI] MOV
SI,OFFSET TIAOPIN MOV
[SI],AL MOV
SI,OFFSET SINTAB MOV
AL,[SI] MOV
BL,TIAOFU MUL
BL MOV
DX,DA0832
;启动D/A转换 OUT
DX,AL PUSH
AX PUSH
SI
PUSH
CX
MOV
CL,TIAOPIN
MOV
CH,00H
DALLYSIN1: CALL
DIS
CALL
CCSCAN
JNZ
SINA1
LOOP
POP
POP
POP
INC
CMP
JNZ
JMP
SINA: RET
SINW ENDP
AMPLFENC PROC
CALL
CALL
JNZ
JMP
TRI1: CALL
CALL
MOV
MOV
CMP
JZ
JZ
CMP
JNZ
MOV
DALLYSIN1 CX SI AX SI
SI,OFFSET TRITAB SINLOOP2 SINLOOP1
NEAR
;调节幅值频率子程序 DIS
;刷新
CCSCAN
;再次扫描按键 TRI1
;有键按下则跳置tri1 TRI5
;没按键按下就跳出该子程序DIS
;刷新 GETKEY1
SI,OFFSET KEY
AL,[SI]
AL,4
;第五个键就退出 TRI10 TRI5
AL,0
;第一个键减少周期 TRI2
DI,3001H
MOV
BL,[DI]
CMP
BL,01H
JE
TRI5
DEC
BL
MOV
[DI],BL
JMP
TRI5
TRI2: CMP
JNZ
MOV
MOV
CMP
JE
INC
MOV
JMP
TRI3: CMP
JNZ
MOV
MOV
CMP
JE
DEC
MOV
JMP
TRI4: CMP
JNZ
MOV
MOV
CMP
JE
INC
MOV
AL,1
TRI3 DI,3001H BL,[DI] BL,05H TRI5 BL [DI],BL TRI5
AL,2
TRI4 DI,3000H BL,[DI] BL,01H TRI5 BL [DI],BL TRI5
AL,3
TRI5 DI,3000H BL,[DI] BL,05H TRI5 BL [DI],BL
;第二个键增加周期;第三个键减少幅度;第四个键增加幅度
JMP
TRI5
TRI10: JMP
FAR PTR BEGIN0
TRI5: RET
AMPLFENC ENDP
GETKEY1 PROC
NEAR
CALL
CALL
CALL
CALL
CALL
JNZ
JMP
GETKEY2: MOV
MOV
COLUM: MOV
MOV
OUT
MOV
IN
L1: TEST
JNZ
MOV
JMP
L2: TEST
JNZ
MOV
JMP
L3: TEST
JNZ
MOV
JMP
DIS
;显示刷新 DALLY DALLY
CLEAR
;清屏
CCSCAN
;再次扫描按键
GETKEY2
;有键按下则跳置GETKEY2 BEGIN1
;否则跳回开始继续循环
CH,0FEH
CL,00H
;设置当前检测的是第几列
AL,CH
;选取一列,将X1~X4中一个置0
DX,MY8255_A DX,AL
DX,MY8255_C;读Y1~Y4,用于判断是哪一行按键闭合AL,DX
AL,01H
;是否为第1行 L2
;不是则继续判断
AL,00H
;设置第1行第1列的对应的键值
KCODE
AL,02H
;是否为第2行 L3
;不是则继续判断
AL,04H
;设置第2行第1列的对应的键值
KCODE
AL,04H
;是否为第3行 L4
;不是则继续判断
AL,08H
;设置第3行第1列的对应的键值
KCODE
L4: TEST
AL,08H
;是否为第4行
JNZ
NEXT
;不是则继续判断
MOV
AL,0CH
;设置第4行第1列的对应的键值
KCODE: ADD
AL,CL
;将第1列的值加上当前列数,确定按键值
CALL
PUTBUF
;保存按键值
PUSH
AX
KON: CALL
CALL
CALL
JNZ
POP
NEXT: INC
MOV
TEST
JZ
ROL
MOV
JMP
KERR: RET
GETKEY1 ENDP
CCSCAN PROC
MOV
MOV
OUT
MOV
IN
NOT
AND
RET
CCSCAN ENDP
DIS
;显示刷新 CLEAR
;清屏
CCSCAN
;扫描按键,判断按键是否弹起 KON
;未弹起则继续循环等待弹起 AX
CL
;当前检测的列数递增
AL,CH
AL,08H
;检测是否扫描到第4列 KERR
;是则跳回到开始处
AL,1
;没检测到第4列则准备检测下一列
CH,AL COLUM NEAR
;扫描是否有按键闭合子程序
AL,00H
DX,MY8255_A;将4列全选通,X1~X4置0 DX,AL DX,MY8255_C AL,DX
;读Y1~Y4 AL
AL,0FH
;取出Y1~Y4的反值
CLEAR PROC
NEAR
;清除数码管显示子程序
MOV
DX,MY8255_B;段位置0即可清除数码管显示
MOV
AL,00H
OUT
DX,AL
RET
CLEAR ENDP
DIS
键值并显示
AGAIN:
相应的键值
NEAR
;显示键值子程序
PUSH
AX
;以缓冲区存放的键值为键值表偏移找到MOV
SI,3000H MOV
DL,0F7H MOV
AL,DL PUSH
DX MOV
DX,MY8255_A OUT
DX,AL
;设置X1~X4,选通一个数码管 MOV
AL,[SI]
;取出缓冲区中存放键值 MOV
BX,OFFSET DTABLE AND
AX,00FFH ADD
BX,AX MOV
AL,[BX]
;将键值作为偏移和键值基地址相加得到MOV
DX,MY8255_B OUT
DX,AL
;写入数码管A~Dp CALL
DALLY INC
SI
;取下一个键值 POP
DX MOV
AL,DL TEST
AL,01H
;判断是否显示完? JZ
OUT1
;显示完,返回 ROR
AL,1 MOV
DL,AL PROC
JMP
AGAIN
;未显示完,跳回继续
OUT1: POP
AX
RET
DIS ENDP
PUTBUF PROC
NEAR
;保存键值子程序
MOV
MOV
CMP
JNZ
MOV
GOBACK: RET
PUTBUF ENDP
DALLY PROC
PUSH
MOV
D1: MOV
D2: DEC
JNZ
LOOP
POP
RET
DALLY ENDP
CODE ENDS
END
DI,OFFSET KEY [DI],AL DI,2FFFH GOBACK DI,3004H NEAR
;软件延时子程序 CX CX,000FH AX,000FH AX D2 D1 CX START
7.2 8086 最小模式的硬件连接图
第二篇:微机原理课设
目录
一.课程设计的实验目的与要求……………………………2 1.教学目的……………………………2 2.教学要求……………………………2 3.主要技术指标……………………………2 二.课程设计课题的分析……………………………2 三.课程设计的结果……………………………4 1.实验代码……………………………4 2.实验现象……………………………10 四.心得体会 ……………………………12 五.参考文献 ……………………………12
一、课程设计的目的与要求 1.教学目的
本课程的课程设计是自动化专业学生学习完《微机原理及应用》课程后,进行的一次以汇编语言为主,硬件设计为辅的综合训练。本课程设计的其目的在于加深对微机原理基本知识的理解,掌握汇编语言程序设计的基本方法;掌握运用微机原理开发系统的基本方法。2.教学要求
从课程设计的目的出发,通过设计工作的各个环节,达到以下要求: 1)掌握汇编语言程序设计的基本方法。
2)进一步理解各种接口电路的应用。例如8255并行接口,8253定时器等。3)掌握利用PC机扬声器发出不同频率声音的方法。3.主要技术指标
1)在程序运行时使PC即成为一架可弹奏的电子琴。当按下数字键1-8时,依次发出1,2,3,4,5,6,7,I这八个音调。2)在程序运行时使PC自动按要求提示演奏乐曲。
二、课程设计课题的分析
图1.扬声器工作原理图示
图2.主程序工作流程图
图3.乐曲演奏子程序工作流程图 图4.电子琴子程序工作流程图
图5.扬声器工作流程图
三、课程设计的结果
1、实验代码
DATA
SEGMENT INFO1
DB 0AH, 0DH, 'WELCOME YOU TO COME HERE!$'
DB 0AH, 0DH, 'THIS IS A MUSIC PROGRAM!$' DB 0AH, 0DH, 'PLEASE SELECLT!$' INFO4
DB 0AH, 0DH, 'INPUT ERROR!$' INFO5
DB 0AH, 0DH, 'PLEASE INPUT AGAIN!$' MUSLIST
DB 0AH, 0DH, '========================='
DB 0AH, 0DH, 'Press1
HuanLeSong' DB 0AH, 0DH, 'Press2
KaiXin' DB 0AH, 0DH, 'Press3
XiaoBuWuQu' DB 0AH, 0DH, 'Press4
Wonderful' DB 0AH, 0DH, 'Press5
SCALE PLAY ' DB 0AH, 0DH, 'Press6
EXIT' DB 0AH, 0DH, '=========================' DB 0AH, 0DH, '$' MUS_FRQ1
DW 330, 330, 350, 393, 393, 350, 330, 294
DW 262, 262, 294, 330, 330, 294, 294 DW 330, 330, 350, 393, 393, 350, 330, 294
DW 262, 262, 294, 330, 294, 262, 262 DW 294, 294, 330, 262, 294, 330, 350, 330, 262 DW 294, 330, 350, 330, 262, 262, 294, 393 DW 330, 330, 350, 393, 393, 350, 330, 294 DW 262, 262, 294, 330, 294, 262, 262,-1 MUS_TIM1
DW 8 DUP(100)
DW 7 DUP(100),200 DW 8 DUP(100)DW 7 DUP(100),200 DW 5 DUP(100),50,50,2 DUP(100)DW 100,50,50,4 DUP(100),200 DW 8 DUP(100)DW 7 DUP(100),200 MUS_FRQ2
DW 330, 294, 262, 294, 3 DUP(330)DW 3 DUP(294), 330, 392, 392 DW 330, 294, 262, 294, 4 DUP(330)DW 294, 294, 330, 294, 262,-1 MUS_TIM2
DW 6 DUP(100),200 DW 2 DUP(100,100,200)DW 8 DUP(100)DW 4 DUP(100),400 MUS_FRQ3
DW 392, 262, 294, 330, 350, 392, 262, 262 DW 440, 350, 392, 440, 494, 524, 262, 262 DW 350, 392, 350, 330, 294, 330
DW 350, 330, 294, 262, 294, 330, 294, 262, 247, 262,-1 MUS_TIM3
DW 200, 4 DUP(100), 200, 200, 200 DW 200, 4 DUP(100), 200, 200, 200 DW 200, 4 DUP(100), 200 DW 4 DUP(100), 200, 4 DUP(100), 400 MUS_FRQ4
DW 330, 392, 330, 294, 330, 392, 330, 394, 330 DW 330, 392, 330, 294, 262, 294, 330, 392, 294
DW 262, 262, 220, 196, 196, 220, 262, 294, 330, 262,-1 MUS_TIM4
DW 3 DUP(200), 100, 100, 200, 100, 100, 400 DW 2 DUP(200,200,100,100), 400 DW 3 DUP(200,100,100), 400 TABLE
DW 262, 294, 330, 349, 392, 440, 494, 525
NUMB
DB 0AH, 0DH, 'Keyboard number 1~8 keys play notes of the scale'
DB 0AH, 0DH, 'Enter or Ctrl+C to exit' DB 0AH, 0DH, '$' DATA
ENDS STACK
SEGMENT
PARA STACK 'STACK'
STA
DB 200 DUP('STACK')
STACK
ENDS CODE
SEGMENT ASSUME DS: DATA, SS: STACK, CS: CODE, ES: DATA START:
MOV AX, DATA
MOV DS, AX MOV ES, AX MOV AX, STACK
MOV SS, AX SHOW
MACRO B MOV DX, OFFSET B
MOV AH, 09H
INT 21H ENDM SHOW INFO1 LOP:
SHOW MUSLIST MOV AH, 01H
INT
21H
CMP AL, 36H
JZ
RETU
CMP AL, 31H
JNZ
B0 CALL MUSIC1
JMP
EXIT1 B0:
CMP
AL, 32H
JNZ
C0 CALL MUSIC2
JMP
EXIT1 C0:
CMP
AL, 33H
JNZ
D0 CALL MUSIC3
JMP
EXIT1 D0:
CMP
AL, 34H
JNZ
E0 CALL MUSIC4
JMP
EXIT1 E0:
CMP
AL, 35H
JNZ
EXIT SHOW NUMB CALL MUSIC5 EXIT1:
SHOW INFO5
JMP
LOP EXIT:
SHOW INFO4 SHOW INFO5
JMP
LOP RETU:
MOV AX, 4C00H
INT
21H MUSIC1
PROC
LEA
SI, MUS_FRQ1
LEA
BP,DS: MUS_TIM1 FREQ1:
MOV DI, [SI] CMP DI,-1
JE
END_MUS1 MOV BX, DS: [BP] CALL GENSOUND
ADD
SI,2
ADD
BP,2 JMP FREQ1
END_MUS1:RET MUSIC1
ENDP MUSIC2
PROC
LEA
SI, MUS_FRQ2
LEA
BP,DS: MUS_TIM2 FREQ2:
MOV DI, [SI] CMP DI,-1
JE
END_MUS2 MOV BX, DS: [BP] CALL GENSOUND
ADD
SI,2
ADD
BP,2
JMP FREQ2
END_MUS2:RET MUSIC2
ENDP MUSIC3
PROC
LEA
SI, MUS_FRQ3
LEA
BP,DS: MUS_TIM3 FREQ3:
MOV DI, [SI] CMP DI,-1
JE
END_MUS3 MOV BX, DS: [BP] CALL GENSOUND
ADD
SI,2
ADD
BP,2 JMP FREQ3
END_MUS3:RET MUSIC3
ENDP MUSIC4
PROC
LEA
SI, MUS_FRQ4
LEA
BP,DS: MUS_TIM4 FREQ4:
MOV DI, [SI] CMP DI,-1
JE
END_MUS4 MOV BX, DS: [BP] CALL GENSOUND
ADD
SI,2
ADD
BP,2 JMP FREQ4
END_MUS4:RET MUSIC4
ENDP MUSIC5
PROC NEAR PUSH AX PUSH BX PUSH CX LOP5:
MOV AH, 01H
INT
21H
CMP AL, 0DH
JE
EXIT5
CMP AL, 31H
JB
LOP5
CMP AL, 38H
JA
LOP5
AND AX, 0FH
SHL
AX, 1
SUB
AX, 2
MOV SI, AX MOV BX, OFFSET TABLE MOV DI, [BX][SI]
MOV BX, 100
CALL
GENSOUND
JMP LOP5 EXIT5:
POP CX POP BX POP AX
RET MUSIC5
ENDP GENSOUND
PROC
PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AL, 0B6H
OUT
43H, AL
MOV
DX, 12H
MOV AX, 533H*896 DIV DI OUT 42H, AL
MOV AL, AH OUT 42H, AL
IN AL, 61H
MOV AH, AL OR AL, 3
OUT 61H, AL
PUSH AX
WAIT1:
MOV CX, 1200
DELA1:
IN AL, 61H
AND AL, 10H CMP AL, AH JE DELA1 MOV AH,AL LOOP DELA1 DEC BX JNZ WAIT1 POP AX MOV AL, AH OUT 61H, AL
POP DI POP DX POP CX
POP
BX POP AX
RET GENSOUND ENDP CODE
ENDS END
START
2、实验现象
1.进入DOS后在DOS界面进行汇编链接并生成可执行文件.exe 2.双击可执行文件DZQ.exe进入操作界面如图所示
操作界面初始界面
3.在进行操作的时候只要在键盘上按1-4这数字键就可以听取歌曲1-4,按数字键5时进入电子琴界面,这时候1-8分别表示音乐CDEFGABC这几个音符。按回车后退出电子琴操作界面,这时候按6退出程序。
按数字键5后进入电子琴界面
四、心得体会
这次课程设计给我的感觉是:与其说这次课设是一个任务,不如说是期末对微机原理的一次系统的复习。通过课设,我弄清楚了课本上一些比较晦涩但是又非常重要的章节的内容,例如:键盘和显示器DOS功能调用,数据定义伪指令的使用,子程序的嵌套,8253芯片的初始化等等。
刚拿到课设题目时可以说是毫无思绪,但是通过查阅资料,模仿别人的程序,不断理解,拼凑,改进,终于按照课设要求完成任务。刚开始上机运行程序出现的问题不可谓不多,但是通过汇编的错误提示,我很容易的发现了问题并改正了它,如果不是上机运行,而是一味的盯着程序检查,那样的话真可谓无从下手,事倍功半。这个告诉我有时候动动手实践,远比啃书学习知识的效率要高得多。
五、参考文献
[1] 王忠民.微型计算机原理(第二版).西安:西安电子科技大学出版社,2007年
[2] 马春燕.微机原理与接口技术实验与学习辅导.北京:电子工业出版社.2007年
第三篇:通信原理课设(本站推荐)
目
录
一、音频传输系统设计..................................................................................................................1
1.设计目的................................................................................................................................1 2.设计内容................................................................................................................................1 3.实现步骤................................................................................................................................1 4.结论及思考............................................................................................................................5
二、数字传输系统设计..................................................................................................................7
1.设计目的................................................................................................................................7 2.设计内容................................................................................................................................7 3.实现步骤..............................................................................................................................11 4.结论及思考..........................................................................................................................17
三、总结与收获............................................................................................................................18 指导教师意见................................................................................................................................19
《通信原理》课程设计报告
一、音频传输系统设计
1.设计目的
通信的基本形式是在信源和信宿之间建立一条传递信息的通道,通信系统通常由 信源,变换器,信道,反变换器,信宿以及等效噪声等几部分构成.通过这次音频传输系统设计,我们可以深刻体会到信号在通信系统中的传输和处理过程有一个更加清晰的认识和理解,对于模拟通信系统,考查学生对调制技术的理解和使用, 同时,通过音频传输系统的设计,我们更加深刻理解了模拟通信系统设计,以及模拟通信系统下最重要的调制技术的应用和设计,锻炼了我们独立思考和分析工程问题的能力,同时,通过设计和实现,我们对复杂的工程问题会有更加深刻的认识,对一个完整的模拟通信系统会有一个更加清晰和完善的概念.2.设计内容
利用NI-USRP节点设备接收实际的广播信号.结合LABVIEW,实现对音频信号的调制解调,观察接收信号的质量并进行分析.3.实现步骤
音频传输系统包括发送端和接收端: 音频传输系统TX.vi: 发射端主程序的前面板如图,前面板左侧为参数输入图部分。
(1)首先,用NI-USRP Configuration Utility观察确保硬件与电脑连接上,以及硬件的地址。
(2)然后修改发送端前面板的“设备的IP地址”。
(3)可以设置声音文件路径(labview只能识别wav格式音频文件)。
(4)USRP配置各类程序控制参数,包括IQ速率,可以更改,但是发送端与接收端的IQ速率要相同,载波频率就是频点频率。
《通信原理》课程设计报告
此模块的作用是根据输入的路径获取音频文件,对应于程序框图SUBVI OPEN Waveform File.vi,输入是外部音频文件的路径,要求必须是wav格式。如果留空,则会自动选择默认音频文件,输出时声音文件的引用句柄,每次从声音文件中读取的样点数以及任务id。此外,这个子程序还留有一个选择是否同时播放的选项,程序的前面板会有一个勾选框,可以选择是否在发送的同时也播放声音。
2.读取声音波形
这个模块的作用是将打开音频文件模块中得到的声音文件转换成波形数组形式输出,同时,还将波形数据写进声音输出设备,使得在发送端可以听到将要发送的声音,如果在前面板勾选了同时播放声音这个选项,那么就可以通过电脑声卡播放出声音,对应于程序框图中的SubVI Read Waveforem File.vi子程序。
输出是波形数据、任务ID以及文件标示和同时播放声音这个选项。3.进行FM调制
该模块的作用是对音频进行FM调制,对应于Exercises FM Modulation.vi
图1-3FM调制图
该模块的输入是声音波形数据,IQ 采样率和频偏,输出是经过FM调制后的时域波形,调制后的波形数据进入niUSRP Write Tx Data(poly)函数。根据前面板上配置后的各项参数发射到空间中,以供接收端程序,普通的FM收音机或者有FM接收功能的手机接收。
该模块需要分两步完成对声音信号的FM调制。
《通信原理》课程设计报告
4.结论及思考
思考:
1.频偏的意义是什么?它怎样影响调制信号?从听众的角度,能做些什么来解决这些影响,做一些测试验证观点。
mf = 最大频偏低频信号的频率,B = 2*(mf+1)F,影响带宽,而带宽影响噪声,所以同时频偏也影响输出信噪比。
从听众的角度来讲,因为公共广播的频带范围是有限的,为87.5~108MHz,以100KHz为步进搜索电台。我们在使用通信系统时应该避开这些公共频带。
2.找出一些能证明所设计的FM收发机性能优劣的技术指标
采样率的大小:接收机的采样效率越高,相同信噪比下收听效果越好。天线增益:天线增益越小,接收效果越好。结论:
1.利用NI-USRP节电设备,结合LabVIEW,我实现了对音频信号的调制解调,收听到了包含有噪声的音乐。
2.提高接收质量:有很多因素影响FM通信系统的有效性和可靠性,如带宽、频偏、增益和载波频率对FM通信系统的影响较大。经测试,提高增益和减小频偏可以有效改善质量。
《通信原理》课程设计报告
3、信源编码
该模块主要是完成霍夫曼编码—基于有序频率二叉树的编码。
图2-2信源编码
4、信道编码
这里主要是使用的(7,4)分组编码
5、脉冲调制
主要完成添加训练队列以及脉冲成形滤波的功能。其中添加训练序列主要是为了接收端可以频偏校正。
6、信道设置
主要在信道中加入白噪声。
《通信原理》课程设计报告
前面板左下方是接受信号的它的星座图,和误码率曲线。可以通过这些来判断程序是否正确。
图2-5数字传输系统接收端
而对接收端的程序框图进行分析:
1、初始化
实现USRP初始化和配置USRP的参数,此时注意与发送对应。如图所示。
图2-6初始化框图
2、信号检测
《通信原理》课程设计报告
2.设计内容
1)完成信道编码即(7,4)分组编码的过程,此时需要完成Exercises Encode-74.vi,学习(7,4)分组码译码的过程。
2)将脉冲调制模块的QPSK/BPSK程序图补充完整 3)学习信源编码即霍夫曼编译码的过程 3.实现步骤
1)发送端接收端程序结构:
图2-6发送端(1)
图2-7发送端(2)
发送端程序框图:
《通信原理》课程设计报告
设置生成矩阵,然后输入前面板的生成矩阵内,打开程序框图,进行设计。
图2-9分组码程序框图
设计图如下:
输入后将长串输入数据流进行长度为4的分块。也即为4维数组。和G矩阵相乘,之后再转化为一维数组。由于矩阵乘法是数值相加的过程,而分组编码是异或过程,因此需要将矩阵内每个元素除二取余,余数即为正确的异或过程。
分组码译码: 首先设计校验矩阵H。接着设计程序框图如下:
图2-10解调程序框图
《通信原理》课程设计报告
入信号平均能量,将此能量与符号能量相乘乘上信号幅值,得到输出信号
图2-12 BPSK设计
BPSK。BPSK解调如图所示。输入数据流对2取余,输出到下一个框图,0对应1,1对应-1.4)利用USRP设备实现图像发送 首先设置硬件设备,选择好天线,然后打开发送端和接收端。得到结果如下:
图2-13发送和接收图像
在图像传输过程中会出现噪声干扰,通过增大增益可以使噪声减小。
《通信原理》课程设计报告
(备注:此处要求手写,不得拷贝,要有自己的心得体会)
本人签名:
年
月
月
日指导教师意见
第四篇:通信原理课设
沈阳理工大学通信系统课程设计
摘 要
摘要:所谓调制,就是在传送信号的一方将所要传送的信号附加在高频振荡上,再由天线发射出去。这里高频振荡波就是携带信号的运载工具,也叫载波。振幅调制,就是由调制信号去控制高频载波的振幅,直至随调制信号做线性变化。在线性调制系列中,最先应用的一种幅度调制是全调幅或常规调幅,简称为调幅(AM)。为了提高传输的效率,还有载波受到抑制的双边带调幅波(DSB)和单边带调幅波(SSB)。在频域中已调波频谱是基带调制信号频谱的线性位移;在时域中,已调波包络与调制信号波形呈线性关系。
本课程设计主要利用MATLAB集成环境下的Simulink仿真平台,设计一个AM调制与相干解调通信系统,分别在理想信道和非理想信道中运行,并把运行仿真结果输入显示器,根据显示结果分析所设计的系统性能。经过调制,初步实现了设计目标,并且经过适当的完善后,实验成功。
关键词: MATLAB7.1 ;Simulink仿真平台;AM调制;相干解调
沈阳理工大学通信系统课程设计
目录 课程设计目的…………………………………………………………1 课程设计要求…………………………………………………………1 相关知识………………………………………………………………1 课程设计分析…………………………………………………………2 仿真……………………………………………………………………6
6结果分析………………………………………………………………10 参考文献………………………………………………………………12
沈阳理工大学通信系统课程设计
1.课程设计的目的
1.掌握模拟系统AM调制和解调原理。2.掌握模拟系统AM调制和解调的设计方法。
3.掌握用MATLAB分析系统时域、频域特性的方法,进一步锻炼应用MATLAB进行编程仿真的能力。
4.熟悉基于Simulink的动态建模和仿真的步骤和过程。
2.课程设计的要求
利用Matlab软件进行振幅调制和解调程序设计,输出显示调制信号、载波信号以及已调信号波形,并输出显示三种信号频谱图。对产生波形进行分析,并通过参数的改变,观察波形变化,分析实验现象。
3.相关知识 3.1 AM调制原理
幅度调制是用调制信号去控制高频正弦载波的幅度,使其按调制信号的规律变化的过程。幅度调制器的一般模型如图2.1所示。
图3.1—1 幅度调制模型
在图2-1中,若假设滤波器为全通网络(=1),调制信号mt叠加直流A0后再与载波相乘,则输出的信号就是常规双边带(AM)调幅.AM调制器模型如图2-2所示
图3.1—2 AM调制模型
AM信号波形的包络与输入基带信号mt成正比,故用包络检波的方法很容易恢复原始调制信号。但为了保证包络检波时不发生失真,必须满足A0mtmax,否
沈阳理工大学通信系统课程设计
则将出现过调幅现象而带来失真。AM信号的频谱是由载频分量和上、下两个边带组成(通常称频谱中画斜线的部分为上边带,不画斜线的部分为下边带)。上边带的频谱与原调制信号的频谱结构相同,下边带是上边带的镜像。显然,无论是上边带还是下边带,都含有原调制信号的完整信息。故AM信号是带有载波的双边带信号,它的带宽信号带宽的两倍。
3.2 相干解调
由AM信号的频谱可知,如果将已调信号的频谱搬回到原点位置,即可得到原始的调制信号频谱,从而恢复出原始信号。解调中的频谱搬移同样可用调制时的相乘运算来实现。相干解调的关键是是必须产生一个与调制器同频同相位的载波。如果同频同相位的条件得不到满足,则会破坏原始信号的恢复。
4.课程设计分析
4.1双边带幅度调制
在DSB-AM系统中,已调信号的幅度正比与消息信号。这种调制通过使用乘法器完成,将消息信号吗m(t)与载波Accos(2πfct),如图4.1—1所示,表示为:
u(t)=Acm(t)cos(2πfct)
(1)
图 4.1—1 DSB-AM调制原理结构框图
其中
c(t)=Accos(2πfct)
(2)
是载波,而m(t)是消息信号。若以单频正弦信号调制为例,那么典型波形如图4.1—2所示。
沈阳理工大学通信系统课程设计
现取u(t)的傅立叶变换,可以得到DSB-AM信号的频域表示为:
(3)
其中M(f)是m(t)的傅立叶变换。很明显可以看出,这种调制方式将消息信号的频谱进行了搬移,并在幅度上乘以Ac/2,传输带宽Br是消息信号带宽的两倍,也就是说:
Br=2W
(4)
图3显示了一个典型的消息信号的频谱及其相对应的DSB-AM已调信号的频谱。
图4.1—2 消息信号与DSB-AM已调信号的频谱
已调信号的功率为
(5)
其中Pm是消息信号的功率。在DSB-AM通信系统中,信噪比SNR等于基带的SNR,也就是:
沈阳理工大学通信系统课程设计
(6)
其中PR是接收到的功率(在接收端已调信号的功率),N0是噪声功率谱密度(假定为白噪声),W是信号噪声的带宽。
4.2双边带抑制载波幅度调制
4.2.1.DSB信号的表达式、频谱及带宽
在幅度调制的一般模型中,若假设滤波器为全通网络(=1),调制信号
中无直流分量,则输出的已调信号就是无载波分量的双边带调制信号,或称抑制载波双边带(DSB-SC)调制信号,简称双边带(DSB)信号。
DSB调制器模型如图4.2.1—1所示。可见DSB信号实质上就是基带信号与载波直接相乘,其时域和频域表示式分别为
图4.2.1—1DSB-SC调制模型
(7)
(8)
DSB信号的包络不再与
成正比,故不能进行包络检波,需采用相干解调;除不再含有载频分量离散谱外,DSB信号的频谱与AM信号的完全相同,仍由上下对称的两个边带组成。故DSB信号是不带载波的双边带信号,它的带宽与AM信号相同,也为基带信号带宽的两倍,即
4.2.2.DSB信号的解调
DSB信号只能采用相干解调,其模型与AM信号相干解调时完全相同,此时,乘法器输出
沈阳理工大学通信系统课程设计
经低通滤波器滤除高次项,得
(9)
即无失真地恢复出原始电信号。
抑制载波的双边带幅度调制的好处是,节省了载波发射功率,调制效率高;调制电路简单,仅用一个乘法器就可实现。缺点是占用频带宽度比较宽,为基带信号的2倍。
沈阳理工大学通信系统课程设计
5.仿真
5.1双边带频带幅度调制的系统仿真
图5.1-1双边带频带幅度调制的系统仿真框图
图5.1-2 DSB AM Modulator Passband(双边带频带幅度调制器)的主要参数
沈阳理工大学通信系统课程设计
图5.1-3 DBS AM Demodulator Passband(双边带频带幅度解调器)的主要参数
图5.1-4 DBS AM(双边带幅度调制)频谱仪(Spectrum Scope)的主要参数
沈阳理工大学通信系统课程设计
5.2双边带抑制载波幅度调制系统仿真
图5.2-1 双边带抑制载波幅度调制的系统仿真框图
图5.2-2 DSB-SC AM 信号发生器(Signal Generator)的主要参数
沈阳理工大学通信系统课程设计
图5.2-3 DSB-SC AM Modualtor Passband(双边带频带抑制幅度调制器)的主要参数
图5.2-4 DSB-SC AM的频谱仪(Spectrum Scope)的主要参数
沈阳理工大学通信系统课程设计
6.结果分析
6.1双边带频带幅度调制的系统仿真结果
图6.1-1双边带频带幅度调制后的频域图
图6.1-2双边带频带幅度调制仿真系统中示波器的波形图
沈阳理工大学通信系统课程设计
6.2双边带抑制载波幅度调制系统仿真结果
图6.2-1 双边带频带抑制幅度调制后调制信号的频域图
图6.2-2 双边带抑制幅度调制后调制信号的时域图
沈阳理工大学通信系统课程设计
7.参考文献
【1】桑林,郝建军,刘丹,【数字通信】,北京邮电大学出版社,2002 【2】苗云长等主编,【现代通信原理及应用】,电子工业出版社,2005 【3】吴伟铃,庞沁华,【通信原理】,北京邮电大学出版社,2005 【4】张圣勤,【MATLAB7.0实用教程】桑林,郝建军,刘丹,数字通信,北京邮电大学出版社,2002 【5】邵玉斌,【Matlab/Simulink通信原理建模与仿真实例分析】,清华大学出版社,2008 【6】沈伟慈。【通信电路】,西安电子科技大学出版社,2007
第五篇:微机硬件课设(红绿灯)
微机原理实验课程设计
硬件部分
东华大学信息学院
2013.1
一. 基础实验部分
实验1存储器读写实验
一、实验目的
1.掌握PC机外存扩展的方法。2.熟悉6264芯片的接口方法。
3.掌握8086十六位数据存储的方法。
二、实验设备
微机实验箱、8086CPU模块。
三、实验内容
向02000~020FFH单元的偶地址送入AAH,奇地址送入55H。
四、实验原理介绍
本实验用到存储器电路
五、实验步骤和要求
1、实验接线:本实验无需接线。
2、编写调试程序
3、运行实验程序,可采取单步、设置断点方式,打开内存窗口可看到内存区的变化。本实验的主要目的是学会用使用工具软件,掌握用单步执行和断点方式运行程序,观察寄存器和内存中的数据变化等程序调试的手段。
六、实验提示
七、实验范例程序框图及源代码(实验程序名:RAM.ASM)
八、思考题
1、单步执行到“intram”标号的语句时,ds寄存器的数据是什么?采用断点方式运行时执行到第一个断点处,2000H~202FH内存单元的数据是什么?执行到第二个断点处,2000H~200FH内存单元的数据是什么?并根据观察结果和对源程序的判读简述源程序的运行效果。
答:单步执行到“intram”标号的语句时,ds寄存器的数据都为00。
断点方式运行时执行到第一个断点处时,2000H~202FH内存单元的数据都为00。
到第二个断点处,2000H~200FH内存单元偶地址都为AA,奇地址都为00。
2、修改程序,实现从2000H到200FH单元依次赋值00H~0FH的功能。答:只需改变intram 和 fil中相关的程序: 需改动的原程序:
intram: mov [si],al
incsi loopintram mov si,1000h;设置断点处 mov cx,100h mov ax,55aah fil:
mov [si],ax;RAM区循环置数 incsi
改为:
intram: mov [si],al incsi loopintram mov si,1000h;设置断点处
mov cx,100h mov ax,0100h fil:
mov [si],ax incsi addax,0202h incsi loopfil
;RAM区循环置数
实验2简单I/O口扩展实验
一、实验目的
1、熟悉74LS273,74LS244的应用接口方法。
2、掌握用锁存器、三态门扩展简单并行输入、输出口的方法。
二、实验设备
微机实验箱、8086CPU模块。
三、实验内容
逻辑电平开关的状态输入74LS244,然后通过74LS273锁存输出,利用LED显示电路作为输出的状态显示。
四、实验原理介绍
本实验用到两部分电路:开关量输入输出电路,简单I/O口扩展电路。
五、实验步骤
1、实验接线:(表示相互连接)CS0 CS244; CS1CS273;平推开关的输出K1~K8 IN0~IN7(对应连接); O0~O7LED1~LED8。
2、编辑程序,单步运行,调试程序
3、调试通过后,全速运行程序,观看实验结果。
4、编写实验报告。
六、实验提示
七、实验结果
程序全速运行后,逻辑电平开关的状态改变应能在LED上显示出来。例如:K2置于L位置,则对应的LED2应该点亮。
八、实验范例程序框图(实验程序名: T244273.ASM)
九、程序源代码清单
十、思考题:
将74LS244的片选信号CS244改接CS2,将74LS273的片选信号CS273改接CS3,修改程序实现与范例程序相同的功能。
答:只需改变程序中start相应的输入输出口地址。需改动的原程序:
start:
mov dx,04a0h
inal,dx mov dx,04b0h outdx,al 改为:
start:
mov dx,04c0h
inal,dx mov dx,04d0h outdx,al
实验3 8255并行口实验
一、实验目的
掌握8255A的编程原理。
二、实验设备
微机实验箱、8086CPU模块。
三、实验内容
8255A的A口作为输入口,与逻辑电平开关相连。8255A的B口作为输出口,与发光二极管相连。编写程序,使得逻辑电平开关的变化在发光二极管上显示出来。
四、实验原理介绍
本实验用到两部分电路:开关量输入输出电路和8255可编程并口电路。
五、实验步骤
1、实验接线
CS0CS8255; PA0~PA7平推开关的输出K1~K8; PB0~PB7发光二极管的输入LED1~LED8。
2、编程并全速或单步运行。
3、全速运行时拨动开关,观察发光二极管的变化。当开关某位置于L时,对应的发光二极管点亮,置于H时熄灭。
六、实验提示
七、实验结果
程序全速运行后,逻辑电平开关的状态改变应能在LED上显示出来。例如: K2置于L位置,则对应的LED2应该点亮。
八、实验范例程序框图及源代码(实验程序名:t8255.asm)
九、思考题:
1、修改接线CS2CS8255,并要求开关置“H”(下)位置时对应LED亮,修改程序实现相应功能。
答:改变相应的输入输出口地址,并将读入ax的值取反。
需改动的原程序: start:
mov dx,04a6h
mov ax,90h
out dx,ax
start1:
mov dx,04a0h
in ax,dx
mov dx,04a2h
out dx,ax
jmp start1 改动后: start:
mov dx,04c6h
mov ax,90h
out dx,ax
start1:
mov dx,04c0h
in ax,dx
mov dx,04c2h not
ax
out dx,ax
jmp start1
实验4 8253定时器/计数器接口实验
一、实验目的
掌握8253定时器的编程原理,用示波器观察不同模式下的输出波形。
二、实验设备
微机实验箱、8086CPU模块、示波器。
三、实验内容
了解8253计数器的不同工作方式,掌握其初始化控制字对定时/记数效果的影响。
四、实验原理介绍
本实验用到两部分电路:脉冲产生电路、8253定时器/计数器电路
五、实验步骤
1、实验连线:
CS0CS8253OUT08253CLK2 OUT2LED1 OUT1LED2 CLK38253CLK0,CLK38253CLK1
2、编程调试程序
3、全速运行,观察实验结果
六、实验提示
七、实验结果
程序全速运行后,LED1按一定周期闪烁(周期理论值为0.2s),LED2在高频脉冲信号(约15KHz)影响下,有微弱的光亮,但无明显的周期变化现象。
八、实验范例程序框图及源代码(实验程序名:t8253.asm)
九、思考题:
1、为什么说范例程序运行时LED1闪烁周期的理论值是0.2秒?在范例程序设置LED2的最大闪烁周期是多少?请分析说明。
答:因为T2采用OUT0的输出为时钟,且T2中设置初值为04h,则OUT2输出方波周期为4*0.05s=0.2s 因为OUT1LED2,则LED2的周期即为计数器T1的周期,且T1的计数初值由程序知为32h=50d,所以最大周期为50*4/3*10^6=6.67x10^-5s。
2、修改片选信号接线使CS1和CS8253连接,并要求LED1的闪烁周期变为4秒(亮2秒,灭2秒),修改程序实现功能。答:因为4/0.05=80d=50h,所以只需改变相应的计数值和片选接口地址。
需改动的原程序: mov ax,0b6h
out dx,ax mov dx,04a4h mov ax,04h out dx,ax mov ax,0 out dx,ax 改动后:
mov ax,0b6h
out dx,ax mov dx,04b4h mov ax,50h out dx,ax mov ax,0 out dx,ax 其余列出的程序段都只要将片选接口地址中的a改为b即可。
实验5 8259中断控制器实验
一、实验目的
1、掌握8259A的工作原理。
2、掌握编写中断服务程序方法。
3、掌握初始化中断向量的方法。
二、实验设备
微机实验箱、8086CPU模块。
三、实验内容
了解中断处理的原理,掌握利用中断控制器进行中断申请和中断操作的方法。
四、实验原理介绍
本实验用到三部分电路:电平开关电路、简单I/O口扩展电路和8259中断控制器电路。
五、实验步骤
1、实验接线
CS0CS8259
CS3 CS273 O0~O3LED1~LED4
K1~K4IR0~IR3 INTINT(8086CPU板)INTAINTA(8086CPU板)CS0CS8253OUT08253CLK2 OUT2LED1 OUT1LED2 CLK38253CLK0,CLK38253CLK1
2、编译调试程序
3、全速运行程序,拨动某一电平开关,观察LED的亮灭情况。
六、实验提示
七、实验结果
全速运行程序,由上往下拨动开关时,相应位置的LED点亮,其余LED全灭。
八、实验范例程序框图及源代码(实验程序名:t8259.asm)
九、思考题:
1、说明源代码8259初始化所设置的所有中断控制字的值和含义(按位说明)。
答:ICW1为初始化字,13h即00010011b,对应于边沿触发,间距为8,单片8259A,需要ICW4。
ICW2为中断类型码字,80h即10000000b,对应于IR0~IR7的中断类型码为80h~87h。
ICW3为中断结束方式字,01h即00000001b,对应于普通全嵌套方式,非缓冲方式,正常EOI,8086/8088模式。
OCW1为屏蔽控制字,00h即00000000b,对应于8为全部复位屏蔽。
2、修改接线IR3P+(实验箱右下角),并修改源程序,使按实验箱右下角“Pules”键时LED1~LED4全亮。
答:改变程序最后IR2的中断服务程序的设定值,即由0fbh改为0f0h.二、综合设计实验部分
一、设计要求
参考基础实验的实验1~实验5所使用的硬件和范例程序,设计一个简单的红绿灯控制系统,用LED1~LED4表示两组红绿灯,每组红灯、绿灯各1只。要求实现以下功能:
(1)红绿灯的定时切换(每10秒切换一次)
(2)设置灯光测试开关K1,当K1打开(高电平)时,LED1~LED4全亮,关闭后恢复正常。
二、实验设备
微机实验箱、8086CPU模块。
三、实验内容
了解中断处理的原理,掌握利用中断控制器进行中断申请和中断操作的方法。
四、实验原理介绍
本实验用到五部分电路:电平开关电路、简单I/O口扩展电路和8259中断控制器电路,脉冲产生电路、8253定时器/计数器电路
五、实验步骤
1、实验接线
CS0CS8259CS0CS8253 CS0CS273 O0LED101LED2 02LED403LED3 INTINT(8086CPU板)INTAINTA(8086CPU板)OUT08253CLK2 OUT2IR0 OUT1k1 IR1k1CLK38253CLK0,CLK38253CLK1
2、编译调试程序
3、全速运行程序,观察结果。
六、实验提示
(1)定时功能可利用8253实现,利用定时器输出作为中断申请,利用中断处理切换LED的显示;LED状态可用内存保存或用I/O口读取。
(2)测试功能运行可在主循环中通过I/O口读取开关状态后判定,或利用中断处理方式运行。
七、实验结果
全速运行程序,LED1和LED3为一组,LED12和LED4为一组,两组灯每亮10秒切换一次,拨动k1开关,观察是否出现LED1~LED4全亮,关闭后恢复正常。
八、程序框图及源代码
ASSUME
CS:CODE CODE SEGMENT
PUBLIC
ORG
100H START:
MOV
CX,0
MOV
BX,0FAH START1:
CLI
MOV
DX,04A0H
MOV
AX,13H
OUT
DX,AX
;ICW1, ICW4 NEEDED
MOV
DX,04A2H
MOV
AX,80H
OUT
DX,AX
;ICW2 中断类型80h
MOV
AX,01H
;01
OUT
DX,AX
;ICW4
MOV
AX,00H
OUT
DX,AX
;OCW1, 开放所有中断
NOP
;以上为8259初始化
MOV
AX,0
MOV
DS,AX
MOV
DI,200H
;初始化中断向量表
MOV
AX,OFFSETINT0
MOV
DS:[DI],AX
ADD
DI,2
MOV
DS:[DI],100H
ADD
DI,2
MOV
AX,OFFSET INT1
MOV
DS:[DI],AX
ADD
DI,2
MOV
DS:[DI],100H
ADD
DI,2
MOV
AX,OFFSET INT2
MOV
DS:[DI],AX
ADD
DI,2
MOV
DS:[DI],100H
ADD
DI,2
MOV
AX,OFFSETINT3
MOV
DS:[DI],AX
ADD
DI,2
;上述程序为芯片8259的初始化程序
MOV
DS:[DI],100H
;建议不熟练者不要修改。
MOV
DX,04A6H
;控制寄存器
MOV
AX,36H
;计数器0,方式3
OUT
DX,AX
MOV
DX,04A0H
MOV
AX,7CH
OUT
DX,AX
MOV
AX,92H
OUT
DX,AX
;计数值927Ch
MOV
DX,04A6H
MOV
AX,0B6H
;计数器2,方式3
OUT
DX,AX
MOV
DX,04A4H
MAIN:
WAITING:
DELAY:
INT0:
NOT
INT1:
MOV
INT2:
INT3:
NOP
MOV
CODE
MOV
AX,90H
OUT
DX,AX
MOV
AX,01H
;计数初值0190h
OUT
DX,AX
MOV
AX,0H
STI
;开中断。
CMP
AX,0H
JE
WAITING
;没发生中断,则等待
NOP
NOP
MOV
DX,04A0H
OUT
DX,AX
;对应LED灯亮
MOV
CX,0
LOOP
DELAY
;数字滤波,按键去抖
JMP
START1
CLI
;关中断。以下类推。
NOP
;此两行为IR0的中断服务程序 BX
;输出取反
MOV
AX,BX
;用户可修改。
IRET
;中断返回,以下类推。
CLI
NOP
;此两行为IR1的中断服务程序,AX,0F0H
;用户可修改。
IRET
CLI
NOP
;此两行为IR2的中断服务程序,MOV
AX,0F5H
;用户可修改。
IRET
CLI
;此两行为IR3的中断服务程序,AX,0F7H
;用户可修改。
IRET
ENDS
END
START
九.运行结果调试问题及解决方法
1.对于亮10秒钟的时间设定问题,一开始是算好初值为190h,直接将其赋给AX而忽略了其高位低位的情况,导致验证结果时总是只有3秒左右,发现后改为先低位后高位复制即达到设定要求:
MOV
AX,90H OUT
DX,AX
MOV
AX,01H
;计数初值0190h
OUT
DX,AX
2.对于拨动k1开关后LED1~LED4全亮的情况,一开始实验结果总是四个灯都亮但都只保持10秒的设定时间,之后又恢复到两组灯每亮10秒切换一次的情况。当将开关量k1改为脉冲输入的时候发现每一次脉冲信号也可以产生相同的实验结果,由此想到所设计的程序运行周期的情况,一次中断的产生与有效作用的时间只在这一总线周期内,因此可以在原有中断的基础上再人为的加上周期小于总线周期的脉冲有效信号,使其在k1为高电平时期不断地执行中断程序,因此可在k1有效时使LED1~LED4一直保持全亮,而k1低电平后又恢复原状态,具体操作为将脉冲输出out1也接到k1上