东南大学《微机实验及课程设计》实验报告实验七8251串行通信实验八数模与模数转换姓名:学号:专业:实验室:实验时间:报告时间:评定成绩:审阅教师:实验七8251串行通信一、实验目的与内容(一)实验目的:(1)了解串行通信的基本原理,认识串行收发过程;(2)掌握串行接口芯片8251 的工作原理和编程方法。
(二)实验内容:(1)编写测试程序,初始化8251,实现连续发送固定字符,用示波器观察发送波形,试用多种不同字符格式和字符;(2)编程实现从键盘输入一个字符, 将其ASCII 码加1 后发送出去,再接收回来在屏幕上显示,实现自发自收;二、基本实验原理(1)按图连接好电路 (8251 插在带锁通用插座D 上),其中8253 计数器用于产生8251 的发送和接收时钟,TXD 和RXD 直接相连;(2)编写测试程序,初始化8251,实现连续发送固定字符,用示波器观察发送波形,试用多种不同字符格式和字符;(3)编程实现从键盘输入一个字符, 将其ASCII 码加1 后发送出去,再接收回来在屏幕上显示,实现自发自收;(4)若在调试方式下用命令或单步初始化8251,用端口输出(发送)和输入(接收)检查硬件;编程简单周期连续发送,用示波器观察发送过程和波特率(波形)。
三. 方案实现与测试(1)8251 通信查询程序流程图:8251串行通信程序关键程序段:start:mov ax,stacksmov ss,axmov ax,datamov ds,axmov dx,io8253b ;设置8253 计数器0 工作方式mov al,16hout dx,almov dx,io8253amov al,52 ;给8253 计数器0 送初值out dx,almov dx,io8251b ;初始化8251xor al,almov cx,03 ;向8251 控制端口送3 个0delay: call out1loop delaymov al,40h ;向8251 控制端口送40H,使其复位 call out1mov al,4eh ;设置为1 个停止位,8 个数据位call out1 ;波特率因子为16mov al,27h ;向8251 送控制字允许其发送和接收 call out1lds dx,mes2 ;显示提示信息mov ah,09int 21hwaiti: mov dx,io8251bin al,dxtest al,01 ;发送是否准备好jz waitimov ah,01 ;是,从键盘上读一字符int 21hcmp al,27 ;若为ESC,结束jz exitmov dx,io8251ainc alout dx,al ;发送mov cx,0F00hs51: loop s51 ;延时next: mov dx,io8251bin al,dxtest al,02 ;检查接收是否准备好jz next ;没有,等待mov dx,io8251ain al,dx ;准备好,接收inc al ;如果需要处理,如加1mov dl,almov ah,02 ;将接收到的字符显示在int 21h 屏幕上jmp waitiout1 proc near ;向外发送一字节的子程序out dx,alpush cxmov cx,0F00hgg: loop gg ;延时pop cxret实验八数模与模数转换一、实验目的与内容(一)实验目的:(1)了解数/模转换器的基本原理,掌握DAC0832 芯片的使用方法;(2)了解模/数转换器的基本原理,掌握ADC0809 芯片的使用方法。
(二)实验内容:(1)分别编程产生锯齿波、正弦波电压波形(从Ub 输出,用示波器观察)。
(2)编程采集IN0 输入的电压,在屏幕上显示出转换后的数据(用16 进制数)。
二、基本实验原理(1)DAC 实验电路原理如图3.9-1,DAC0832 采用单缓冲方式,具有单双极性输入端(图中的Ua、Ub)。
进入DEBUG 调试,输出命令(O 290 数据)输出数据给DAC0832,用万用表测量单极性输出端Ua 及双极性输出端Ub 的电压,验证数字与电压之间的线性关系。
(2)分别编程产生锯齿波、正弦波电压波形(从Ub 输出,用示波器观察)。
(3) ADC 实验电路原理图如图3.9-2,通过实验台左下角电位器RW1 输出0~5V直流电压送入ADC0809通道0(IN0),利用debug 的输出命令启动A/D转换器,输入命令读取转换结果,检查硬件是否正常,验证输入电压与转换后数字的关系。
启动IN0 开始转换: O 0C818 0;读取转换结果: I 0C818。
(4) 编程采集IN0 输入的电压,在屏幕上显示出转换后的数据(用16 进制数)。
(5) 将JP3 的1、2 短接,使IN1 处于双极性工作方式,并给IN1 输入一个低频交流信号(幅度为±5V),编程采集这个信号数据并在屏幕上显示波形。
三. 方案实现与测试(1)DA转换关键程序段:程序1:锯齿波发生程序start: mov ax,stacksmov ss,axmov cl,0mov dx,io0832alll: mov al,clout dx,alinc cl ;cl 加1inc clinc clinc clinc clinc clinc clpush dxmov ah,06h ;判断是否有键按下mov dl,0ffhint 21hpop dxjz lll ;若无则转LLLmov ah,4ch ;返回DOSint 21h程序2:正弦波发生程序data segmentioport equ 0d400h-0280h ;tpc 卡中设备的io 地址io0832a equ ioport+290h ;DAC0832 的口地址为290Hsin db 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdhdb 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96hdb 80h,66h,4eh,38h,25h,15h,09h,04hdb 00h,04h,09h,15h,25h,38h,4eh,66h ;正弦波数据data endsstacks segmentstart: mov ax,stacksmov ss,axmov ax,datamov ds,axll: mov si,offset sin ;置正弦波数据的偏移地址为SI mov bh,32 ;一组输出32 个数据lll: mov al,[si] ;将数据输出到D/A 转换器mov dx,io0832aout dx,almov ah,06hmov dl,0ffhint 21hjne exitmov cx,1delay:loop delay ;延时inc si ;取下一个数据dec bhjnz lll ;若未取完32 个数据则转llljmp llexit: mov ah,4ch ;退出int 21h(2)AD转换关键程序段:程序1:数据转换和数据显示start: mov ax,stacksmov ss,axmov dx,io0809a ;启动A/D 转换器out dx,almov cx,0ffh ;延时delay:loop delayin al,dx ;从A/D 转换器输入数据mov bl,al ;将AL 保存到BLmov cl,4shr al,cl ;将AL 右移四位call disp ;调显示子程序显示其高四位mov al,bland al,0fhcall disp ;调显示子程序显示其低四位mov ah,02mov dl,20h ;加回车符int 21hmov dl,20hint 21hpush dxmov ah,06h ;判断是否有键按下mov dl,0ffhint 21hpop dxje start ;若没有转STARTmov ah,4ch ;退出int 21hmain endpdisp proc near ;显示子程序mov dl,alcmp dl,9 ;比较DL 是否>9jle ddd ;若不大于则为'0'~'9',加30h 为其ASCII 码add dl,7 ;否则为'A'~'F',再加7ddd: add dl,30h ;显示mov ah,02int 21h程序2:A/D转换曲线绘制start: mov ax,stacksmov ss,axmov ax,0012h ;设屏幕显示方式为VGA 640X480 模示int 10hand cx,0 ;cx 为横坐标draw:mov dx,io0809b ;启动A/D 转换器通道1out dx,almov bx,500 ;延时delay:dec bxjnz delayin al,dx ;读入数据mov ah,0mov dx,368 ;dx 为纵坐标sub dx,axmov al,0ah ;设置颜色mov ah,0ch ;画点int 10hcmp cx,639 ;一行是否满jz start ;是则转startinc cx ;继续画点push dxmov ah,06h ;是否有键按下mov dl,0ffhint 21hpop dxje draw ;无,则继续画点mov ax,0003 ;有恢复屏幕为字符方式int 10hmov ah,4ch ;返回DOS 操作系统int 21h四、提高与创新研究1、编程实现数字录音器。
连接电路,将声传感器接J2,把代表语音的电信号送给ADC0809 通道2(IN2);D/A 转换器的输出端通过K8 跳线接喇叭。
编程以每秒钟5000 次的速率采集IN2 输入的语音数据并存入内存,共采集60000 个数据(录12 秒),然后再以同样的速率将数据送DAC0832 使喇叭发声(放音)。
(1)关键程序段如下:Begin:Mov dx, io0809a;ADC0809的地址Out dx,al;启动一次A/D转换器Call delay;调用延时子程序In al,dx;从端口读入数据Mov [di],al;将数据放入缓冲区中Inc diLoop begin ;循环装入60000个数据Play:Mov di,offset buf;取缓冲区的入口地址Mov cx,60000Begin1:Mov dx,io0832a;DAC0832的入口地址Mov al,[di];将要转换的数据从内存中取出Out dx,al;将数据打入寄存器Call delay;调用延时子程序Inc diLoop begin1Mov dx,offset word3;显示循环放音提示Mov ah,9Int 21hMov ah,1Int 21hDelay proc nearPush dx;保存dx的内容Mov dx,io8253c;8253的控制字地址Mov al,00010000b ;计数器0只读低字节以方式0工作,二进制计数Out dx,alMov dx,io8253a;8253的入口地址Mov al,200;写入循环计数初值Out dx,alMov dx,io8255c;8255的控制字的地址Mov al,10010000b;D7=1控制字标志位,D6D5=00 方式0 ,;D4=1表示A口输入Out dx,alMov dx,io8255a;8255的入口地址五.分析与总结1、串行通信时,构成一个字符或数据的各位按时间先后,从低位到高位一位一位地传送,占用较少的通信线,使成本降低,而且适合较远距离的传输。