实验4A/D和D/A转换一、实验目的1.了解A/D转换的基本原理,掌握ADC0809芯片的使用方法。2.了解D/A转换的基本原理,掌握DAC0832芯片的使用方法。3.了解直流电机控制的基本方法。二、实验内容与步骤(一)A/D转换部分1.接线:CS/0809接Y3/IO地址IN0/0809接0~5V/直流信号EOC接总线的IRQ2.实验电路原理图如图1.通过实验台左下角电位器RW1输出0~5V直流电压送入ADC0809通道0(IN0),利用debug的输出命令启动A/D转换器,输入命令读取转换结果,验证输入电压与转换后数字的关系。启动IN0开始转换:OUT298H读取转换结果:IN298H图1模数转换电路3.用万用表测量CLOCK、ADD-C、ADD-B、ADD-A在实验系统上如何联系的?4.编程按中断方式采集IN0输入的电压,在屏幕上显示出转换后的数据(用16进制数)。5.考虑如果采用IN7输入的电压,启动开始转换和读取转换结果的地址应该是多少?6.按查询方式采集IN0输入的电压,软硬件如何实现?●编程提示1.ADC0809的IN0口地址为298H.2.IN0单极性输入电压与转换后的数字的关系为:其中,为输入电压,为参考电压,这里的参考电压为+5V电源。3.一次A/D转换的程序可以为:MOVDX,portOUTDX,AL;延时INAL,DX(二)D/A转换部分1.接线:CS/0832接Y2/IO地址用万用表测量WR2和XFER在实验系统上如何联系的?2.实验电路原理如图2所示:图2DAC0832电路原理图DAC0832采用单缓冲方式,具有单双极性输入端(图中的Ua、Ub),利用debug输出命令(Out290数据)输出数据给DAC0832,用万用表测量单极性输出端Ua及双极性输出端Ub的电压,验证数字与电压之间的线性关系。3.编程产生以下波形(从Ub输出,用示波器观察)(1)锯齿波(2)正弦波●编程提示1.8位D/A转换器DAC0832的口地址为290H,输入数据与输出电压的关系为:(UREF表示参考电压,N表示数数据),这里的参考电压为PC机的+5V电源。2.产生锯齿波只须将输出到DAC0832的数据由0循环递增。产生正弦波可根据正弦函数建一个下弦数字量表,取值范围为一个周期,表中数据个数在16个以上。3.参考流程图设计(三)直流电机转速控制1.按图5线路接线:图5直流电机连线在实验时,我们对实验进行了改进,考虑到拿8255去做,只有开关的几种状态,因此我们使用ADC0809对电位器的采样值来控制电机转速,从而实现了电机速度的连续可调。CS/0832接Y2/IO地址UB/0832接直流电机DJCS/0809接Y3/IO地址IN0/0809接0~5V/直流信号EOC接总线的IRQ三、程序代码及注释3.1ADC0809程序;ADC0809DATASSEGMENT;数据段PORT_ADCEQU298HSPACEDB13,'$'INT_SEGDW?;保存中断向量段基址的变量INT_OFFDW?;保存中断向量偏移量的变量INT_SORDB?;定义保存中断屏蔽字的变量DATASENDSSTACKSSEGMENT;堆栈段STADB256dup(?)TOPEQUSIZESTASTACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSMAINPROCFAR;主函数MOVAX,DATASMOVDS,AXMOVAX,STACKSMOVSS,AXMOVSP,TOP;建立堆栈指针;初始化0B号中断向量PUSHESPUSHBX;保护MOVAL,0BH;指定中断号,0BH对应IRQ3MOVAH,35H;取该中断向量INT21HMOVINT_SEG,ES;保存向量段基址MOVINT_OFF,BX;保存向量偏移地址CLI;中断允许标志位清零POPBXPOPES;填写中断向量表PUSHDSMOVAX,SEGINTPMOVDS,AX;中断服务程序入口段基址送DSMOVDX,OFFSETINTP;中断服务程序入口偏移量送DXMOVAL,0BH;IRQ3中断类型号MOVAH25H;功能号INT21HPOPDSINAL,21HMOVINT_SOR,AL;保存原中断屏蔽字ANDAL,11110111B;开放IRQ3的中断请求OUT21H,ALSTI;开中断LO:MOVDX,PORT_ADCOUTDX,AL;启动ADHLTMOVCX,0FFFFHLOOP$JMPLOEND_PRO:MOVAX,INT_SEG;恢复中断向量MOVDS,AXMOVDX,INT_OFFMOVAL,0BHMOVAH,25HINT21HMOVAL,INT_SOROUT21H,ALSTIMOVAH,4CHINT21H;结束程序MAINENDPINTPPROCMOVDX,PORT_ADCINAL,DX;读ADC数据CALLDISPLAY;显示;OUTDX,AL;启动下一次ADC转换MOVAL,20H;EOI结束OUT20H,ALIRETINTPENDPDISPLAYPROCMOVAH,0MOVCL,4SHLAX,CL;AH中高4bitSHRAL,CL;AL中低4bitPUSHAXMOVAL,AHCMPAL,10;AL10JBDISP1JMPDISP2DISP1:;显示高4bitADDAL,30H;30H-39HMOVDL,AL;显示MOVAH,2INT21HJMPDISP_NEXTDISP2:SUBAL,10ADDAL,41H;41H--AMOVDL,AL;显示MOVAH,2INT21HDISP_NEXT:POPAXCMPAL,10JBDISP3JMPDISP4DISP3:ADDAL,30H;0-9MOVDL,AL;显示MOVAH,2INT21HJMPDISP_ENDDISP4:SUBAL,10ADDAL,41HMOVDL,ALMOVAH,2INT21HDISP_END:MOVDL,48H;显示MOVAH,2INT21HLEADX,SPACE;回车换行MOVAH,9INT21HRETDISPLAYENDPCODESENDSENDMAIN3.2DAC0832程序;DAC0832DATASSEGMENT;数据段PORT_DACEQU290HLENDB32DATA_SINDB80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh;正弦表DB0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96hDB80h,66h,4eh,38h,25h,15h,09h,04hDB00h,04h,09h,15h,25h,38h,4eh,66hDATA_JUCHIDB0H,1H,2H,3H,4H,5H,6H,7H;锯齿波DB8H,9H,0AH,0BH,0CH,0DH,0EH,0FHDB10H,0FH,0EH,0DH,0CH,0BH,0AH,9HDB8H,7H,6H,5H,4H,3H,2H,1HDATASENDSSTACKSSEGMENT;堆栈段STADB256dup(?)TOPEQUSIZESTASTACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSMAINPROCFAR;主函数MOVAX,DATASMOVDS,AXMOVAX,STACKSMOVSS,AXMOVSP,TOP;建立堆栈指针MOVDX,PORT_DACINIT_LO:MOVBH,LEN;LEASI,DATA_SINLEASI,DATA_JUCHISEND_LO:MOVAL,[SI]MOVCL,3SHLAL,CLOUTDX,AL;向DA送数据INCSIDECBHCMPBH,0;一个周期已完成JZINIT_LOMOVAH,1;检测按键INT16HJZSEND_LOMOVAH,4CH;结束INT21HMAINENDPCODESENDSENDMAIN3.3利用AD采样值调速直流电机(PWM);PWM_motorDATASSEGMENT;数据段PORT_ADCEQU298HPORT_DACEQU290HDUTYDB0;保存AD采样数据SPACEDB13,'$'INT_SEGDW?;保存中断向量段基址的变量INT_OFFDW?;保存中断向量偏移量的变量INT_SORDB?;定义保存中断屏蔽字的变量DATASENDSSTACKSSEGMENT;堆栈段STADB256dup(?)TOPEQUSIZESTASTACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSMAINPROCFAR;主函数MOVAX,DATASMOVDS,AXMOVAX,STACKSMOVSS,AXMOVSP,TOP;建立堆栈指针PUSHES;初始化0B号中断向量PUSHBX;保护MOVAL,0BH;指定中断号,0BH对应IRQ3MOVAH,35H;取该中断向量INT21HMOVINT_SEG,ES;保存向量段基址MOVINT_OFF,BX;保存向量偏移地址CLI;中断允许标志位清零POPBXPOPES;填写中断向量表PUSHDSMOVAX,SEGINTPMOVDS,AX;中断服务程序入口段基址送DSMOVDX,OFFSETINTP;中断服务程序入口偏移量送DXMOVAL,0BH;IRQ3中断类型号MOVAH,25H;功能号INT21HPOPDSINAL,21HMOVINT_SOR,AL;保存原中断屏蔽字ANDAL,11110111B;开放IRQ3的中断请求OUT21H,ALSTI;开中断MOVDX,PORT_ADCOUTDX,AL;启动ADMOVBL,0LO:MOVAL,0FFHMOVAH,DUTY;ANDAH,(0FFH-111B)CMPBL,AHJBSKIP_ZEROMOVAL,128SKIP_ZERO:MOVDX,PORT_DACOUTDX,AL;向DA送数INCBL;MOVCX,10;延时;LOOP$JMPLOEND_PRO:MOVAX,INT_SEG;恢复中断向量MOVDS,AXMOVDX,INT_OFFMOVAL,0BHMOVAH,25HINT21HMOVAL,INT_SOROUT21H,ALSTIMOVAH,4CHINT21H;结束程序MAINENDPINTPPROCPUSHDXPUSHCXPUSHAXMOVDX,PORT_ADCINAL,DX;读ADC数据MOVDUTY,AL;SAVETHESAMPLEDDUTYCALLDISPLAY;显示MOVDX,PORT_ADCOUTDX,AL;启动下一次ADC转换MOVAL,20H;EOI结束OUT20H,ALPOPAXPOPCXPOPDXIRETINTPENDPDISPLAYPROCMOVAH,0MOVCL,4SHLAX,CL;AH中高4bitSHRAL,CL;AL中低4bitPUSHAXMOVAL,AHCMPAL,10;AL10JBDISP1JMPDISP2DISP1:;显示高4bitADDAL,30H;30H-39HMOVDL,AL;显示MOVAH,2INT21HJMPDISP_NEXTDISP2:SUBAL,10ADDAL,41H;41H--AMOVDL,AL;显示MOVAH,2INT21HDISP_NEXT:POPAXCMPAL,10JBDISP3JMPDISP4DISP3:ADDAL,30H;0-9MOVDL,AL;显示MOVAH,2INT21HJMPDISP_ENDDISP4:SUBAL,10ADDAL,41HMOVDL,ALMOVAH,2INT21HDISP_END:MOVDL,48H;显示MOVAH,2INT21HLEADX,SPACE;回车换行MOVAH,9INT21HRETDISPLAYENDPCODESENDSENDMAIN四、实验结果及分析1)对ADC0809芯片进行正确连线,然后用实验板上的逻辑笔测量CLOCK、ADD-C、ADD-B、ADD-A,发现其电平均为低电平,因此在实验系统上这三条线均为低电平,选