二○一四~二○一五学年第一学期信息科学与工程学院自动化系课程设计报告课程名称:微机原理及应用课程设计班级:自动化1204班姓名:田野学号:201209157043指导教师:陈国年时间:2014.12.28题目:函数发生器1的设计1.设计任务用8086做控制器,利用DAC0832设计一个函数发生器,能分别产生方波、阶梯波(每阶梯1V)、锯齿波(正向或负向)和三角波,并利用按键选择(自行定义)输出波形同时将当前输出波形代号显示在LED上:0为方波、1为阶梯波、2为锯齿波、3为三角波。2.设计要求波形输出幅值和频率不限(可根据需要考虑增加调频调幅功能),通过8255A进行按键选择。3.设计内容3.1系统方案的设计与选择:(1)数字按键的实现可以通过8255的输入输出端口,定义方式0工作方式,C口低四位输入信号,B口输出信号,通过按键改变C口电平信号,使输入信号改变,并在在B口输出不同信号,在数码管上显示不同数字;(2)波形的产生则使用8086与DAC0832连接,通过8086给DAC0832输入不同数字信号,在DAC0832的输出端输出波形,波形的观察使用一个放大器连接模拟示波器显示。3.2系统框图:3.3系统基本介绍:此方案是通过并行接口芯片8255A和8086计算机的硬件连接,并通过8086控制DAC0832产生波形相应波形,通过8255A输出信号控制数码管显示不同数字。8255A的C端口有四个按键,按下相应的按键,使输入低电平。①按下第一个按键显示数字0,在示波器上产生方波;②按下第二个按键显示数字1,产生阶梯波;③按下第三个按键显示数字3,产生锯齿波;④按下第四个按键显示数字4,产生三角波。3.4模块功能介绍:8255A:D0~D7口与8086数据端连接,PB0~PB6与七段共阴极数码管相连接以显示数字,PC0~PC4连接四个按键,实现输入电平的改变。A0、A1接地址线A1、A2,CS端连接74ls138的片选端。DAC0832:DI0~DI7接8086的数据端CS接74LS138的片选端,Vref接输入电压,这里我选用的是+5v电压,IOUT1、IOUT2接一个放大器与示波器,实现数字信号的显示。74LS138:三八译码器,ABC分别接373的A3,A4,A5,使能端E1接A7,这几个地址端共同参与地址译码,Y0接8255A的CS端,Y1接DAC0832的CS端。74HC373:三态锁存器,这里用来锁存地址,AD0~AD7分别接8086,A0~A7为地址信号。8086:16位微处理器芯片,AD0~AD15为地址/数据总线,分时复用,与373AD0~AD7相连并作为数据端与DAC0832、8255A相连。3.5程序流程图:清屏子程序:波形选择函数:开始读C口数据按键1是否按下显示数字0方波产生程序按键2是否按下显示数字1阶梯波产生程序按键3是否按下显示数字3锯齿波产生程序按键4是否按下显示数字4三角波产生程序返回清屏子函数结束是是是是否否否否4.功能实现电路图:8255A:改变按键,写入不同数据,选择波形产生函数,并在PB口与数码管连接,显示数字。DAC0832:实现数字信号与模拟信号的转变,将8086通入的数字信号转换为模拟信号.74LS138:三八译码器,进行DAC0832与8255的片选。74HC373:三态锁存器,锁存地址信息。8086:16位微处理器芯片,进行数据的输入与读取,并进行地址编码程序源代码:DAC0832EQU88H;DAC0832的编码地址M8255_AEQU80H;8255的A口地址M8255_BEQU82H;8255的B口地址M8255_CEQU84H;8255的C口地址M8255_ZEQU86H;8255的控制寄存器地址;主程序部分STACKSEGMENTSTACK'stack'DW32DUP(0)STACKENDSCODESEGMENTASSUMECS:CODE,SS:STACKSTART:MOVDX,M8255_Z;初始化8255工作方式MOVAL,81H;方式0,C口输入,B口输出OUTDX,ALSTEP:CALLCLEAR;清屏CALLBEGIN;调用波形选择函数JMPSTEP;继续循环;----------------------------------------------------------------------------------------------;清理子程序CLEARPROCNEARMOVDX,M8255_B;清除显示内容MOVAL,00HOUTDX,ALRETCLEARENDP;------------------------------------------------------------------------------------------------;判断输入数据,选择波形BEGINPROCNEARMOVDX,M8255_C;读c口输入数据INAL,DXCMPAL,0EH;当按第一个键时显示0输出方波JNEL1MOVDX,M8255_BMOVAL,3FHOUTDX,ALCALLFANGBO;调用方波子程序L1:CMPAL,0BH;当按第三个键时显示3输出锯齿波JNEL3MOVDX,M8255_BMOVAL,4FHOUTDX,ALCALLDOG;调用锯齿波子程序L3:CMPAL,0DH;当按第二个键时显示1输出阶梯波JNEL4MOVDX,M8255_BMOVAL,06HOUTDX,ALCALLCAT;调用阶梯波子程序L4:CMPAL,07H;当按第四个键时显示4输出三角波JNEL5MOVDX,M8255_BMOVAL,66HOUTDX,ALCALLSANJIAOBO;调用三角波子程序L5:RET;否则退出BEGINENDP;方波信号产生程序FANGBOPROCNEARF1:MOVCX,0FFHFB:MOVDX,DAC0832MOVAL,0OUTDX,ALLOOPFB;形成一个延迟的信号MOVCX,0FFHFB1:MOVAL,0FFHMOVDX,88HOUTDX,ALLOOPFB1MOVDX,M8255_C;判断按键是否改变INAL,DXCMPAL,0EHJEF1JMPBEGINRETFANGBOENDP;锯齿波信号产生程序DOGPROCNEARC1:MOVDX,M8255_C;判断按键是否改变INAL,DXCMPAL,0BHJECBJMPBEGINCB:MOVAL,0LLL:MOVDX,DAC0832OUTDX,ALINCALCMPAL,0FFH;判断是否到顶JEC1JMPLLLRETDOGENDP;阶梯波信号产生程序CATPROCNEARD1:MOVDX,M8255_C;判断按键是否改变INAL,DXCMPAL,0DHJED2JMPBEGIND2:MOVAL,0D3:MOVDX,DAC0832OUTDX,ALMOVCX,33HD4:LOOPD4CMPAL,0FFH;判断是否到顶JED1ADDAL,33H;每次信号AL加33H,即每阶梯加1VJMPD3CATENDP;三角波信号产生程序SANJIAOBOPROCNEARB1:MOVAL,0MOVDX,M8255_C;判断按键是否改变INAL,DXCMPAL,07HJEB2JMPBEGINB2:MOVDX,DAC0832OUTDX,ALINCALCMPAL,0FFH;判断是否到顶,到顶跳转JEB3JMPB2B3:MOVDX,DAC0832OUTDX,ALDECALJEB1;到0转移,重新开始JMPB3RETSANJIAOBOENDP;子程序结束CODEENDSENDSTART5.总结这次的微机课程设计让我真正认识到实际操作与书本知识的不同。1、首先要注意编码的严谨性,开始自定义的锯齿波阶梯波简略为JCB,JTB在实际过程中却发现这些不能作为目的标号,导致编译失败;2、其次是选片问题,最开始使用的是80H到83H作为ABC及控制字端口的地址,但是却怎么也选不上,通过微机实验报告书发现书上使用的是62、64、66等偶地址,改用偶地址后便实现了成功的片选。3、在初次编程时什么都没注意,编译有十几处的服务错误,自己按行依次修改的。4、三角波仿真与阶梯波仿真时进入了死循环导致无法出现波形,查找之后改变了反悔的地址。尽管出现了各种问题,最后还是成功完成了这次课程设计,经历了辛苦做出来的东西才会对所学知识更加熟悉,以后的设计相信也会更加顺利。6.参考文献[1]朱定华,微机原理、汇编与接口技术,清华大学出版社,2005