版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、DA及AD转换实验报告自03 张驰昱 20100120281、D/A转换 用DAC0832实现D/A转换,使产生的模拟电压波形分别为锯齿波,三角波和正弦波要求: 程序运行后等待键入(1)若键入1,则产生锯齿波(2)若键入2,则产生三角波(3)若键入3,则产生正弦波(4)若键入4,则返回DOS 程序运行过程中没有新键入别的数字,则维持原状不变,用示波器能观测到连续的电压波形。解决思路:先写三个用于波形发生的过程,分别发出锯齿波、三角波和正弦波。再写一个每次从DAC0832输出数据前都会调用的产生延迟的过程,在这个过程中进行有无按键的判断和分辨按键的判断。主程序先调用这个延迟的过程,这样程序一旦运
2、行起来就相当于不断的在检测按键了。正弦波的值我是通过matlab生成和写入文件,并保存在数据段里的。以下是生成一个周期256个采样sin值的matlab代码:clear;clc;fid=fopen(sine.txt,w);s=round(sin(2*pi/256*1:256)*127.5+127.5);s=reshape(s,16,16);for i=1:16 fprintf(fid,DB ); fprintf(fid,%03XH,s(:,i); fprintf(fid,n);end源代码:DATAS SEGMENT DNUM DB 01H CSADD DW 0280H HINT1 DB TE
3、ETH WAVE,0DH,0AH,$ HINT2 DB TRIANGLE WAVE,0DH,0AH,$ HINT3 DB SINE WAVE,0DH,0AH,$ SINE DB 083H,086H,089H,08CH,08FH,092H,095H,098H,09BH,09EH,0A2H,0A5H,0A7H,0AAH,0ADH,0B0HDB 0B3H,0B6H,0B9H,0BCH,0BEH,0C1H,0C4H,0C6H,0C9H,0CBH,0CEH,0D0H,0D3H,0D5H,0D7H,0DAHDB 0DCH,0DEH,0E0H,0E2H,0E4H,0E6H,0E8H,0EAH,0EBH,0E
4、DH,0EEH,0F0H,0F1H,0F3H,0F4H,0F5HDB 0F6H,0F8H,0F9H,0FAH,0FAH,0FBH,0FCH,0FDH,0FDH,0FEH,0FEH,0FEH,0FFH,0FFH,0FFH,0FFHDB 0FFH,0FFH,0FFH,0FEH,0FEH,0FEH,0FDH,0FDH,0FCH,0FBH,0FAH,0FAH,0F9H,0F8H,0F6H,0F5HDB 0F4H,0F3H,0F1H,0F0H,0EEH,0EDH,0EBH,0EAH,0E8H,0E6H,0E4H,0E2H,0E0H,0DEH,0DCH,0DAHDB 0D7H,0D5H,0D3H,0D0H
5、,0CEH,0CBH,0C9H,0C6H,0C4H,0C1H,0BEH,0BCH,0B9H,0B6H,0B3H,0B0HDB 0ADH,0AAH,0A7H,0A5H,0A2H,09EH,09BH,098H,095H,092H,08FH,08CH,089H,086H,083H,080HDB 07CH,079H,076H,073H,070H,06DH,06AH,067H,064H,061H,05DH,05AH,058H,055H,052H,04FHDB 04CH,049H,046H,043H,041H,03EH,03BH,039H,036H,034H,031H,02FH,02CH,02AH,028
6、H,025HDB 023H,021H,01FH,01DH,01BH,019H,017H,015H,014H,012H,011H,00FH,00EH,00CH,00BH,00AHDB 009H,007H,006H,005H,005H,004H,003H,002H,002H,001H,001H,001H,000H,000H,000H,000HDB 000H,000H,000H,001H,001H,001H,002H,002H,003H,004H,005H,005H,006H,007H,009H,00AHDB 00BH,00CH,00EH,00FH,011H,012H,014H,015H,017H,
7、019H,01BH,01DH,01FH,021H,023H,025HDB 028H,02AH,02CH,02FH,031H,034H,036H,039H,03BH,03EH,041H,043H,046H,049H,04CH,04FHDB 052H,055H,058H,05AH,05DH,061H,064H,067H,06AH,06DH,070H,073H,076H,079H,07CH,07FHDATAS ENDS STACKS SEGMENT STACK DW 100 DUP(?) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:ST
8、ACKS DELAY PROC ;延时子程序 PUSH DX PUSH AX MOV AH,0BH ;检测键盘有无按键,不等待 INT 21H CMP AL,0FFH ;如果没有按键,继续 JNZ CONTINUE MOV AH,01H ;如果有按键,读取键盘缓冲区的值并回显 INT 21H CMP AL,1 JNZ DUE CALL TEETH ;如果是1,调用锯齿波 DUE: CMP AL,2 JNZ TRE CALL TRI;如果是2,调用三角波 TRE: CMP AL,3 JNZ QUA CALL SIN;如果是3,调用正弦波 QUA: CMP DL,4;如果是4,退出 JZ EXIT
9、 EXIT: MOV AX,4C00H INT 21H CONTINUE: MOV DL,DNUM ;如果无按键,那么哪里调用的就返回到哪里去 L: DEC DL JNZ L POP AX POP DX RET DELAY ENDP TRI PROC ;三角波子程序 PUSH AX PUSH DX LEA DX,HINT1 MOV AH,09H INT 21H MOV AH,0FFH DOWN: CALL DELAY ;三角波下降过程 MOV AL,AH MOV DX,0280H OUT DX,AL CMP AH,1 JE UP SUB AH,2 JMP DOWN UP: CALL DELAY
10、;三角波上升过程 MOV AL,AH MOV DX,0280H OUT DX,AL CMP AH,0FFH JE DOWN ADD AH,2 JMP UP POP DX POP AX RET TRI ENDP TEETH PROC ;锯齿波子程序 PUSH AX PUSH DX LEA DX,HINT2 MOV AH,09H INT 21H PEAK: MOV AH,0FFH ;我写的是一个下降的锯齿波 Z : CALL DELAY MOV AL,AH MOV DX,0280H OUT DX,AL CMP AH,0 JE PEAK DEC AH JMP Z POP DX POP AX RET
11、TEETH ENDP SIN PROC ;正弦波子程序 PUSH DI PUSH SI PUSH AX PUSH DX LEA DX,HINT3 MOV AH,09H INT 21H LEA DI,SINE ADD DI,0FFH ;相当于用一个指针取顺序的扫描数据段里的数据 HEAD: LEA SI,SINE ;扫描到结尾了再返回到开头 TAIL: CALL DELAY MOV AL,SI MOV DX,0280H OUT DX,AL CMP SI,DI JE HEAD INC SI JMP TAIL POP DX POP AX POP SI POP DI RET SIN ENDP STAR
12、T: MOV AX,DATAS MOV DS,AX CALL DELAY;主程序一开始就不断调用DELAY检查有无按键 JMP START CODES ENDS END START 2、A/D转换 用ADC0809实现A/D转换,用汇编语言程序自动对一个模拟信号重复采集20组不同的数据,在CRT上将每组数据对应显示成如下形式:D/A A/Dxx xx 然后等待键盘输入,若键入字母C则接着往下再做20组数据;若键入字母E则退回DOS。输入字母大小写应能兼容。源代码:DATAS SEGMENT DNUM DW 0FFFFH T DB 0DH,0AH,D/A A/D,0DH,0AH,$ ;标题D/A
13、 A/D BLANK DB ,$ ;三个空格,为了与上面标题对对齐 ENT DB 0DH,0AH,$;回车加换行DATAS ENDSSTACKS SEGMENT STACK DW 20 DUP(?)STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS DELAY MACRO ;延时子程序 LOCAL N PUSH DX MOV DX,DNUM N : DEC DX JNZ N POP DX ENDMPLAY MACRO SEG ;显示AL寄存器十六进制值的子程序,这个子程序我在实验三中写过 LOCAL A2 LOCAL A1
14、PUSH CX PUSH DX PUSH AX MOV DL,SEG AND DL,0F0H ;取前四位 MOV CL,4 SHR DL,CL CMP DL,09H JBE A1 ADD DL,07H A1:ADD DL,30H PUSH AX MOV AH,02H;输出前四位 INT 21H POP AX MOV DL,SEG AND DL,0FH ;取后四位 CMP DL,09H JBE A2 ADD DL,07H A2:ADD DL,30H MOV AH,02H ;输出后四位 INT 21H POP AX POP DX POP CX ENDM START: MOV AX,DATAS MO
15、V DS,AX MOV CH,0 AGAIN:MOV CL,20 LEA DX,T MOV AH,09H INT 21HNEXT: PLAY CH ;显示转换前的数字值 MOV AL,CH ;数模转换 MOV DX,280H OUT DX,AL LEA DX,BLANK;输出空格 MOV AH,09H INT 21H DELAY MOV AL,0 ;模数转换 MOV DX,0289H OUT DX,AL DELAY JMP GO ;这里三行只是一个中途的跳板,因为程序过长,JMP超出限度 JUMP:JMP NEXT AGA: JMP AGAIN GO: MOV DX,0289H ;读入AD结果
16、 IN AL,DX PLAY AL ;输出AD结果 LEA DX,ENT ;输出回车 MOV AH,09H INT 21H ADD CH,0FH ;每两个值相隔0FH DEC CL JNZ JUMP READ: MOV AH,01H ;检查键盘 INT 21H CMP AL,E ;E退出 JE EXIT CMP AL,e JE EXIT CMP AL,C ;C继续读 JNE READ CMP AL,c JNE READ JMP AGA EXIT: MOV AX,4C00H INT 21HCODES ENDS END START计算机原理应用综合实验报告自03 张驰昱 20100120281、方
17、式0 I/O 将TPC实验台上的8255电路A口设置成方式0输入,检测8只开关的状态;将C口设置成方式0输出,控制8只LED灯。程序运行后不断地读入8只开关的状态,送往对应的LED灯显示,直至在计算机键盘上敲入空格键退回DOS。源代码:code segment assume cs:codeSTART: MOV AL,10010000B ;写控制字 MOV DX,0283H OUT DX,AL AGAIN: MOV DX,0280H ;从A口输入 IN AL,DX MOV DX,0282H ;C口输出 OUT DX,AL MOV AH,0BH ;检查键盘有无按键,不等待 INT 21H CMP
18、AL,0FFH ;如果有按键,去检查是不是空格 JE EXIT JMP AGAIN ;如果无按键,继续 EXIT: MOV AH,01H INT 21H CMP AL, JNE AGAIN mov ax,4c00h int 21hcode ends end start2、选作内容A口仍保持方式0输入开关状态,C口仍以方式0输出LED灯显示,满足如下条件:(1)若仅K7=1,8只LED的状态循环左移(2)若仅K6=1,8只LED的状态循环右移(3)若仅K6=K7,8只LED一起闪烁。源代码:code segment assume cs:code DELAY MACRO ;延时子程序 LOCAL
19、N PUSH DX MOV DX,0FFFFH N : DEC DX JNZ N POP DX ENDM HOLD MACRO ;发现一次0FFFFH的计数不够长,四次够长了,五次的话JMP就超限了 DELAY DELAY DELAY DELAY ENDMLEFT MACRO ;向左亮灯子程序 LOCAL L PUSH CX MOV CL,8 MOV AL,00000001B L: HOLD MOV DX,0282H OUT DX,AL SHL AL,1 ;向左亮灯的本质就是寄存器的移位 DEC CL JNE L POP CX ENDMRIGHT MACRO ;向左亮灯子程序,与向左几乎一样,
20、指示寄存器向右移位 LOCAL R PUSH CX MOV CL,8 MOV AL,10000000B R: HOLD MOV DX,0282H OUT DX,AL SHR AL,1 DEC CL JNE R POP CX ENDMBLINK MACRO ;闪烁子程序,本质就是全亮停片刻,全灭停片刻 MOV AL,0FFH MOV DX,0282H OUT DX,AL HOLD MOV AL,0 MOV DX,0282H OUT DX,AL HOLD ENDM START: MOV AL,10010000B ;主程序,写控制字 MOV DX,0283H OUT DX,AL AGAIN: MOV
21、 DX,0280H ;读入A口状态 IN AL,DX CMP AL,10000000B ;如果仅K7开,则调用向左亮灯子程序 JNE A1 LEFT JMP AGAIN ;向左一遍马上回去继续检测A口状态 A1: CMP AL,01000000B ;如果仅K6开,则调用向右亮灯子程序 JNE A2 RIGHT JMP AGAIN A2: CMP AL,11000000B ;如果仅K7、K6开,则调用向闪灯子程序 JNE AGAIN BLINK JMP AGAIN EXIT: mov ax,4c00h int 21hcode ends end start3、方式1 I/O实验中每按一次单脉冲按键
22、,通过8255电路发一次中断请求。CRT上显示一个A口的ASCII码字符,直到A口数据为FFH退出。4、选作内容修改主程序实现密码检测功能,连续两次从A口拨入数据,与计算机内部事先存放的两字节数比较,相符则在CRT上显示“OK”,否则重新输入。以下代码已把3、4两个程序合并在一起。源代码:DATAS SEGMENT PASSWORD DB 38H,38H ;密码写在数据段中,定位88 HINT DB 0DH,0AH,OK,0DH,0AH,$ ;提示语句”OK”DATAS ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAS CHECKPASS MACRO BLA ;
23、检验密码子程序,入口参数为8位寄存器“BLA” LOCAL BAD LOCAL GOOD LOCAL NEXT CMP BLA,SI ;如果对了第一位密码,SI向后走一个字节,一旦有错,SI回到PASSWORD头 JNE BAD CMP SI,DI ;DI指向PASSWORD尾,如果正确,则可以显示“OK”了 JNE GOOD LEA DX,HINT MOV AH,09H INT 21HGOOD:INC SI JMP NEXTBAD :LEA SI,PASSWORD NEXT: ENDMSERV PROC ;中断服务程序 MOV DX,0280H ;读入A口数据 IN AL,DX CMP AL
24、,0FFH ;如果是FF那么退出 JNE GO MOV AX,4C00H INT 21H GO: PUSH AX ; 这里保护AX MOV DL,AL ;显示A口ASCII码值 MOV AH,02H INT 21H POP AX CHECKPASS AL ;顺便检验一下是不是密码 MOV AL,20H ;EOI命令退出中断 OUT 20H,AL IRETSERV ENDPSTART: MOV AX,DATAS MOV DS,AX LEA SI,PASSWORD ;SI指向PASSWORD头 MOV DI,SI INC DI ;DI指向PASSWORD尾 PUSH DS ;置中断矢量 MOV D
25、X,OFFSET SERV MOV AX,SEG SERV MOV DS,AX MOV AH,25H MOV AL,0BH INT 21H POP DS IN AL,21H ;消除中断屏蔽 AND AL,11110111B OUT 21H,AL MOV AL,10111011B ;写8255方式控制字 MOV DX,0283H OUT DX,AL MOV AL,00001001B ;消除8255的中断屏蔽,这里好像没有明确讲 MOV DX,0283H OUT DX,AL STI ;允许中断过程W:JMP W mov ax,4c00h int 21hcode ends end start这个实验
26、主要的问题就是一开始没有消除8255的中断屏蔽,我在书上也没有找到有关内容,希望如果教科书再版的话,加入详细的8255方式1输入输出的中断说明。5、选作内容将8255电路A口改成方式1输出(仅将PA7接一只LED示范即可),修改前面的程序实现每次中断后,通过A口输出数据控制LED状态在0,1之间翻转。源代码:STACKS SEGMENT DB 20 DUP(?)STACKS ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACKSSERV PROC MOV AL,CL ;CL相当于一个全局的控制灯翻转的变量 MOV DX,0280H ;输出给A口 OUT DX,AL
27、NOT CL ;每次输出完,把CL反向一下,下一次输出的就是反向值了 MOV AL,20H ;EOI命令 OUT 20H,AL IRETSERV ENDPSTART: MOV DX,OFFSET SERV ;置中断矢量 MOV AX,SEG SERV MOV DS,AX MOV AH,25H MOV AL,0BH INT 21H IN AL,21H ;消除中断屏蔽 AND AL,11110111B OUT 21H,AL MOV AL,10100000B ;写8255方式控制字 MOV DX,0283H OUT DX,AL MOV AL,00001001B ;清除8255中断屏蔽 MOV DX,
28、0283H OUT DX,AL MOV CL,0FFH STIW:JMP W mov ax,4c00h int 21hcode ends end start6、扫描显示接口电路8255电路A口以方式0输出,C口也初始化成方式0输出且仅用其最低两位:PC1接数码管位码输入端S1,PC0接位码输入端S0。程序实现当A口输出字形“0”的段码时,C口输出01H,第一个数码管显示“0”,当A口输出字形“1”的段码时,C口输出02H,于是第二个数码管显示“1”。每一位显示之后调用一段延时程序,选择恰当的延时程序,使“01”几乎同时显示在两位数码管上。源代码:code segment assume cs:c
29、odeDELAY MACRO LOCAL GO PUSH DX MOV DX,01H GO:DEC DX JNE GO POP DX ENDMHOLD MACRO ;与之前一样,四次Delay才够长DELAYDELAYDELAYDELAY ENDMSTART: MOV AL,10000000B ;写8255方式控制字 MOV DX,0283H OUT DX,ALAGAIN: MOV AL,0 ;这里尤其关键,先要输出全暗,在输出所需值,这是为了消除重影 MOV DX,0280H OUT DX,AL MOV AL,01H ;选通S0 MOV DX,0282H OUT DX,AL MOV AL,3
30、FH ;输出0 MOV DX,0280H OUT DX,AL HOLD MOV AL,0 ;如果不清零的话,之前“0”的值3F还保留在A口里, MOV DX,0280H ;这样一选通S1首先输出的是0而非1,即有重影 OUT DX,AL MOV AL,02H;选通S1 MOV DX,0282H OUT DX,AL MOV AL,06H;输出1 MOV DX,0280H OUT DX,AL HOLD MOV AH,0BH ;检测有无按键,不等待,之前已反复用到,不再赘述 INT 21H CMP AL,0FFH JNZ AGAIN MOV AH,01H INT 21H CMP AL, JNZ AG
31、AIN MOV AX,4C00H INT 21H code ends end start7、选作内容当程序运行后,从计算机键盘上输入两位十进制数,分别在两个数码管上显示。若继续输入数字则更新显示。若发现输入了非数字键则退回DOS。解决思路:把每次键盘输入的数字按键都放在一个缓存TEMP中,如果发现已经有两个数字键输入了,那么把这片缓存复制给名为PLAY的缓存,七段管每次只输出PLAY缓存的值,这样就可以实现每按两个键才改变七段管的值了。源代码:DATAS SEGMENT LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,07FH,06FH ;七段管0到9的ag的取值
32、 PLAY DB 3FH,3FH ;数码管当前显示值缓存器,默认值设为“00” TEMP DB 3FH,3FH ;键盘两位十进制数缓存器DATAS ENDSSTACKS SEGMENT DB 100 DUP(?)STACKS ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACKS,DS:DATASTRANS MACRO BLA ;键盘的ASCII码到七段管值的译码宏,入口参数为ASCII的八位寄存器BLA LOCAL OK LOCAL EXIT LOCAL N PUSH DX MOV DL,BLA SUB DL,30H CMP DL,09H ;首先要判断键盘输入的是
33、不是一个数字 JA EXIT ;如果不是就退出 LEA SI,LEDN: CMP DL,0 ;如果是,就去找到这个数字对应的七段管的值 JZ OK INC SI DEC DL JMP NEXIT:MOV AX,4C00H INT 21HOK: MOV BLA,SI ;出口参数还是BLA,此时译码已完成,它表示的是七段管的值 POP DX ENDMDELAY MACRO ;延时子程序 LOCAL GO PUSH DX MOV DX,0FFFFH GO:DEC DX JNE GO POP DX ENDMSTART:MOV AX,DATAS MOV DS,AX MOV AL,10000000B ;写
34、8255方式控制字 MOV DX,0283H OUT DX,AL MOV CL,0 ;CL用来对键盘按键计数 LEA BX,TEMP AGAIN: CMP CL,2 JNE N MOV CL,0;如果之前已经有两个键输入了,那么一切从头开始 N: CMP CL,1 JE ONE MOV AH,0BH ;不等待的检测按键,这个功能之前已反复用到 INT 21H CMP AL,0FFH JNZ ONE MOV AH,01H INT 21H TRANS AL ;先译码为七段管值,再写入缓存TEMP MOV BX,AL INC CL ONE: MOV AH,0BH INT 21H CMP AL,0FF
35、H JNZ SHOW MOV AH,01H INT 21H TRANS AL MOV BX+1,AL ;之前已经有过一次按键了,所以写入BX+1位置 INC CLSHOW: CMP CL,2 ;检验是不是已有两次按键 JNE FORWARD LEA SI,PLAY ;如果已有两次,就把TEMP缓存复制到PLAY缓存,即更新待显示的值 MOV AX,BX MOV SI,AX INC SI MOV AX,BX+1 MOV SI,AX FORWARD: MOV AL,0 ;先清除A口的输出值 MOV DX,0280H OUT DX,AL MOV AL,02H ;选通S1 MOV DX,0282H O
36、UT DX,AL LEA DI,PLAY ;输出缓存PLAY的第一个值 MOV AL,DI MOV DX,0280H OUT DX,AL DELAY MOV AL,0 ;清除A口的输出值 MOV DX,0280H OUT DX,AL MOV AL,01H;选通S0 MOV DX,0282H OUT DX,AL INC DI ;输出缓存PLAY的第二个值 MOV AL,DI MOV DX,0280H OUT DX,AL DELAY JMP AGAINcode ends end start8、选作内容使用TPC实验台上的8253定时计数电路来代替前面的软件延时。8253定时器自动重复工作,每工作一个周期发出一次中断请求信号
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024正规个人房屋租赁合同格式(简单版)
- 街区店铺租赁协议
- 合作事宜协议书模板
- 个人买房协议书
- 2024股份合作协议书合同范本
- 2024竞争性招标合同范文
- 城市更新项目拆除合同
- 工程工具租赁合同
- 2024补偿贸易借款合同标准范本范文
- 专业婚车租赁协议
- 关于学校安全保卫工作存在的问题及对策
- 2024年广西铝业集团有限公司招聘笔试参考题库附带答案详解
- 2024年西藏开发投资集团有限公司招聘笔试参考题库含答案解析
- 爱校主题班会课件
- 黑龙江省哈尔滨市南岗区2023-2024学年九年级上学期期末语文试题
- 国际人权法与强制劳动保护人权的法律框架
- 设立绿化养护服务公司商业计划书
- 勘察设计单位管理制度模版
- 2024年中国铁塔湖北分公司招聘笔试参考题库含答案解析
- 生产设备搬迁方案
- 永椿化工新材料有限公司 年产 800 吨邻三氟甲基苯甲酰氯系列产品、1500 吨 2,6- 二氟苯甲酰胺系列产品、500 吨叔丁基二甲基氯硅烷、500 吨 3-氨基-2-溴-5-氟苯甲酸甲酯等产品项目环境影响报告书
评论
0/150
提交评论