本科实验报告实验名称:A/D和D/A转换课程名称:实验时间:任课教师:实验地点:实验教师:实验类型:□原理验证■综合设计□自主创新学生姓名:学号/班级:组号:学院:同组搭档:专业:成绩:实验四A/D和D/A转换一、实验目的1、了解A/D转换的基本原理,掌握ADC0809的使用方法。2、了解D/A转换的基本原理,掌握DAC0832芯片的使用方法。3、了解直流电机控制的基本方法。二、实验内容与步骤(一)A/D转换部分1、接线:2、实验电路原理图下图通过实验台左下角电位器RW1输出0~5V直流电压送入ADC0809通道0(IN0),利用debug的输出命令启动A/D转换器,输入命令读取转换结果,验证输入电压与转换后数字的关系。启动IN0开始转换:Out298H读取转换结果:In298H3、用万用表测量CLOCK、ADD-C、ADD-B、ADD-A在实验系统上如何联系的。4、编程按中断方式采集IN0输入的电压,在屏幕上显示出转换后的数据(用16进制数)。5、考虑如果采用IN7输入的电压,启动开始转换和读取转换结果的地址应该是多少。6、按查询方式采集IN0输入的电压,软硬件如何实现。编程方案1、ADC0809的IN0口地址为298H。2、IN0单极性输入电压与转换后数字的关系为:其中Ui为输入电压,UREF为参考电压,这里的参考电压为+5V电源。3、一次A/D转换的程序可以为MOVDX,PortOUTDX,AL;启动转换;延时INAL,DX;读取转换结果放在AL中(二)D/A转换部分1、接线:CS/0832接Y2/IO地址用万用表测量WR2和XFER在实验系统上如何联系的。2、实验电路原理如图2,DAC0832采用单缓冲方式,具有单双极性输出端(图中的Ua、Ub),利用debug输出命令(Out290数据)输出数据给DAC0832,用万用表测量单极性输出端Ua及双极性输出端Ub的电压,验证数字与电压之间的线性关系。3、编程产生以下波形(从Ub输出,用示波器观察)(1)锯齿波(2)正弦波编程方案1、8位D/A转换器DAC0832的口地址为290H,输入数据与输出电压的关系为:(UREF表示参考电压,N表示数据),这里的参考电压为+5V电源。2、产生锯齿波只须将输出到DAC0832的数据由0循环递增。产生正弦波可根据正弦函数建一个下弦数字量表,取值范围为一个周期,表中数据个数在16个以上。3、流程图:(三)直流电机转速控制1、按图5线路接线:CS/0832接Y2/IO地址UB/0832接直流电机DJCS/8255接Y1/IO地址PC7~PC0/8255接K7~K0/逻辑电平开关2、编程利用DAC0832输出一串脉冲,经放大后驱动小直流电机,利用开关K0~K5控制改变输出脉冲的电平及持续时间,达到使电机加速,减速之目的。实验原理简述小直流电机的转速是由Ub输出脉冲的占空比来决定的,正向占空比越大转速越快,反之越慢。见图6例:在本实验中,模拟量输出Ub为双极性,当输入数字量小于80H时输出为负,输入等于80H时为0V,输入大于80H时输出为正。因而本实验中,DAC0832输入数字量只有2个(80H和FFH),通过不同的延迟时间达到改变小电机转速的目的。程序框图编程方案通过给DAC0832输入80H时,Ub为0V,给DAC0832输入FFH时,Ub为5V,来控制加给小电机的脉冲电平,通过控制两段延迟时间,来控制占空比。例如,我们给两段延迟系数都为0400h,来得到占空比接近于1的脉冲。三、实验代码及注释1、AD转换DATASEGMENTINT0BDW2DUP(?)IMRDB?P_ADDW298HTABDB'0123456789ABCDEF'DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCPARMOVAX,DATAMOVDS,AXCLI;关闭中断为修改中断向量表准备PUSHES;保护ES和BX中的向量,防止程序出错PUSHBXMOVAH,35H;读取0B中断向量。35H是INT21H中读取中断向量表的中断类型号MOVAL,0BH;使用的是0B中断,所以就读取0B中断,以上两步都是为了保护原有的0B中断INT21HMOVINT0B,ES;将得到的中断向量储存起来,方便后面的恢复MOVINT0B+2,BXPOPBXPOPESPUSHDS;保护原有的DS和DXPUSHDXMOVDX,OFFSETADPROPUSHBXMOVBX,SEGADPRO;seg是段地址MOVDS,BX;将段地址给DSPOPBXMOVAX,250BHINT21HPOPDXPOPDSINAL,21H;从8259中读取屏蔽字MOVIMR,AL;将读取的屏蔽字储存起来,为了后面的恢复ANDAL,0F7HOUT21H,AL;将新的屏蔽字写入到8259中NEXT:MOVDX,P_ADMOVAL,0OUTDX,AL;输出到ad0809PUSHCX;延时等待AD转换,并检测是否有按键MOVCX,100;循环100次LOOP$POPCXSTI;开中断,进行AD转换MOVAH,1INT16HJZNEXTCLI;关闭中断MOVAL,IMR;将之前的8259的屏蔽字恢复OUT21H,AL;将原屏蔽字输出到8259中PUSHDXPUSHDSMOVDX,INT0B;将原有的0B中断向量的段地址恢复到DS中MOVDS,DXMOVDX,INT0B+2;将原有的0B中断向量的偏移量恢复到DX中MOVAX,250BH;和之前一样,写入0B中断向量表INT21HPOPDSPOPDXMOVAX,4C00H;结束程序INT21HMAINENDPADPROPROCFARPUSHAXPUSHDXMOVDX,P_AD;读入AD转换结果INAL,DXLEABX,TABMOVAH,0PUSHAXSHRAX,ANDAX,0FH;MOVSI,AX;MOVDL,[BX+SI];将对应的字母的ASCII的码值给DLMOVAH,2;显示16进制的高位的字母表示INT21HPOPAXANDAL,0FH;MOVSI,AX;;后面与高位的显示一样MOVDL,[BX+SI]MOVAH,2INT21HMOVDL,0DH;输出回车MOVAH,2INT21HMOVDL,0AH;输出换行MOVAH,2INT21HMOVDX,50DELAY:;延时的时间是50*65536个指令周期MOVCX,0LOOP$;与之前的延时相同DECDXCMPDX,0JNZDELAYMOVAL,20H;中断子程序结尾要告知8259,中断子程序结束了OUT20H,ALPOPDXPOPAXIRETADPROENDPCODEENDSENDMAIN2、DA转换DATAsegmentPORT8255EQU288hDAPROTDW290HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARMOVAX,DATAMOVDS,AXMOVDX,PORT8255+3MOVAL,10001001BOUTDX,ALNEXT:MOVDX,DAPROTMOVAL,80HOUTDX,ALMOVAH,1INT16HJNZDONE;有输入则DA转换结束MOVDX,PORT8255+2INAL,DX;读入PC0-PC7的状态MOVAH,0;使AH的高位置0,方便与BX进行加减运算MOVBX,400HADDAX,AX;将输入的数扩大4倍ADDAX,AXPUSHAXSUBBX,AX;占空比为1,则0V延时为0,所以相减GOSUB:MOVCX,0LOOP$;本指令跳转到本指令起到延时作用CMPBX,0JNZGOSUBMOVDX,DAPROT;是0832输出+5V的电压MOVAL,0FFHOUTDX,AL;输出到0832MOVBX,0H;为输出+5V的延时准备POPAX;得到之前进行了4倍扩大后的8255C口的值ADDBX,AX;作为延时控制使用GOADD:MOVCX,0;与之前对于0V输出的操作延时一样LOOP$CMPBX,0JNZGOADDJMPNEXT;继续下一次的DA转换过程DONE:MOVAH,4CHINT21HMAINENDPCODEENDSENDMAIN3、DA转换之锯齿波DATASEGMENTDAPROTDW290HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARMOVAX,DATAMOVDS,AXMOVDX,DAPROTMOVAL,0;用于转换的DA的数字大小NEXT:OUTDX,AL;向DA送数据ADDAL,5;每次加5CMPAL,255JNEGOMOVAL,0GO:MOVCX,50000;延时50000个指令周期LOOP$MOVAH,1INT16HJZNEXTMOVAH,4CHINT21HMAINENDPCODEENDSENDMAIN4、DA转换之正弦波DATASEGMENTDAPROTDW290HSIN_DATADB80H,96H,0AEH,0C5H,0D8H,0E9H,0F5H,0FDHDB0FFH,0FDH,0F5H,0E9H,0D8H,0C5H,0AEH,96HDB80H,66H,4EH,38H,25H,15H,09H,04HDB00H,04H,09H,15H,25H,38H,4EH,66HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARMOVAX,DATAMOVDS,AXMOVDX,DAPROTBEGIN:MOVBH,32LEASI,SIN_DATANEXT:MOVAL,[SI]OUTDX,ALINCSIDECBHMOVCX,10000LOOP$CMPBH,0JZBEGINMOVAH,1INT16HJZNEXTMOVAH,4CHINT21HMAINENDPCODEENDSENDMAIN四、实验结果1、实验时,转动旋钮,观察程序运行时数字的变化,并用万用表检测板子的电压值。①当数字为16进制的B6即2进制的182时,电压值为3.49V。3.49×256÷5=178.688,与182基本相同。②当数字为16进制的32即2进制的50时,电压值为0.96V。0.96×256÷5=49.152,与50基本相同。2、DA转换时,示波器上显示出的锯齿波和正弦波的图形分别如下:五、实验心得与体会这次实验是关于模/数转换的,在以前的基础上,又借助了示波器和万用表来测量实验数据及结果。通过这次实验,我了解了A/D、D/A转换的基本原理,掌握了ADC0809、DAC0832芯片的使用方法,了解直流电机控制的基本方法。