定时器T0中断服务子程序 - 单片机应用技术_第1页
定时器T0中断服务子程序 - 单片机应用技术_第2页
定时器T0中断服务子程序 - 单片机应用技术_第3页
定时器T0中断服务子程序 - 单片机应用技术_第4页
定时器T0中断服务子程序 - 单片机应用技术_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

?单片机应用技术?工程9调压电路设计泸州职业技术学院机电工程系?单片机应用技术?精品课程组本讲主要内容4相关知识1教学目标2工作任务3工程实践6工程考核1、终极目标:制作一个基于单片机控制的调压电路系统。2、促成目标:(1)了解D/A转换芯片的根本工作原理及特性;(2)了解D/A转换器的技术指标;(3)掌握常用D/A芯片与单片机的接口方法;(3)掌握D/A转换程序设计方法;【教学目标】采用8位的D/A转换芯片DAC0832来完成数模转换过程,DAC0832是电流输出型D/A转换芯片,因此,后面接有集成运放LM358来完成电流到电压的转换。其中的数字信号的输入从“D0-D7〞端口输入,控制DAC0832工作的控制信号由“WR-CS〞端口输入,模拟量的输出从“DA输出〞端口输出,由于LM358工作在双电源条件下,因此要给LM358参加±12V电压,从+12,-12V的电源的由MAX232来产生。通过按键K1、K2实现DAC值的加减,并且在LCD1602上显示出来。DAC转换的模拟电压值从DA输出座子输出(用万用表测量)。【工作任务】【活动一】总体设计

本系统功能由硬件和软件两大部份协调完成,硬件局部主要完成信息的显示;软件主要完成信号的处理及控制功能等。本系统的硬件采用模块化设计,以AT89S52单片机为核心,与LCD显示电路、键盘电路、D/A转换电路组成控制系统。该系统硬件主要包括以下几个模块:AT89S52主控模块、LCD显示模块、键盘输入模块、D/A模块等。其中AT89S52主要完成外围硬件的控制以及一些运算功能;LCD显示模块完成字符、数字的显示功能;键盘电路主要实现DAC值的加减;D/A模块由D/A芯片和放大电路组成,DAC转换的模拟电压值从DA输出座子输出,可用万用表测量。【工程实践】系统组成方框图如下图。

单片机LCD显示电路复位电路时钟电路电源电路D/A转换电路键盘电路串口通信电路图9.1D/A转换控制系统组成方框图【工程实践】应用软件采用模块化设计方法。该系统软件主要由主程序、定时器T0中断效劳子程序、D/A转换子程序、计算D/A转换值子程序、按键扫描子程序、串口中断效劳子程序、LCD显示子程序、LCD显示A/D转换值子程序等模块组成,系统软件结构框图如下图。LCD显示子程序定时器T0中断服务子程序主程序计算D/A转换值子程序D/A转换子程序LCD显示D/A转换值子程序按键扫描子程序串口中断服务子程序图9.2系统软件结构框图【工程实践】1.主控模块设计本工程采用ATMEL公司生产的AT89S52单片机,主控模块的具体设计参见工程1。2.LCD显示模块设计LCD显示模块选用1602字符型LCD模块,具体设计请参见工程6。3.键盘输入模块设计键盘输入使用独立式按键K1、K2,具体设计请参见工程3。4.串口通信电路模块设计串口通信电路模块的具体设计请参见工程7。5.D/A转换模块设计D/A模块由D/A芯片和放大电路组成,通过按键K1、K2实现DAC值的加减,范围在0~255之间,并且在LCD1602上显示出来。DAC转换的模拟电压值从DA输出座子输出,可用万用表测量。【工程实践】【活动二】硬件设计在本工程中,D/A芯片选用DAC0832芯片来完成数模转换过程,该芯片的详细介绍请参考本工程的“相关知识〞局部。DAC0832是电流输出型D/A转换芯片,因此,后面接有集成运放LM358来完成电流到电压的转换。其中的数字信号的输入从“D0-D7〞端口输入,控制DAC0832工作的控制信号由“WR-CS〞端口输入,模拟量的输出从“DA输出〞端口输出,由于LM358工作在双电源条件下,因此要给LM358参加±12V电压,从+12,-12V的电源的由MAX232来产生。D/A模块与单片机的接口电路如下图。【工程实践】图9.3D/A模块与单片机的接口电路原理图【工程实践】1.算法设计由PC机发送到单片机串口的值作为数字量初始值,通过按键K1、K2实现DAC值的加减,按键K1实现数字量初始值加1,按键K2实现数字量初始值减1,使数字量在20~200的范围内变化,从而模拟数字信号的输入。根据D/A转换芯片DAC0832的工作时序,20ms进行一次D/A转换,可以利用定时器T0定时,根本定时时间为5ms,控制软计数器的累计次数为4次,20ms〔4*5ms〕定时到时,产生定时器T0中断,在定时器T0中断效劳子程序中调用DA转换子程序进行D/A采样转换,然后调用计算D/A转换值子程序把DA转换值转换成相应的ASCII码,最后通过LCD显示D/A转换值子程序把DAC转换的模拟电压值〔0V~5V〕显示在液晶LCD1602上,并从DA输出座子输出DAC转换的模拟电压,可用万用表测量。【工程实践】【活动三】软件设计2.数据结构设计1602LCD使能信号E定义为P2口线的;1602LCD读/写选择信号R/W定义为P2口线的,0为写数据信号,1为读数据信号;1602LCD数据/命令选择信号RS定义为P2口线的,0为命令信号;1为数据信号;1602LCD的8位双向数据线DB7~DB0信号LCDPORT定义为P0口线;1602LCD写命令入口参数CMD_BYTE定义为片内数据存储器的2EH单元;1602LCD写显示数据入口参数DAT_BYTE定义为片内数据存储器的2FH单元;D/A芯片DAC0832的片选信号DAC_CS定义为P3口线的;D/A芯片DAC0832的写信号DAC_WR定义为P3口线的;【工程实践】当前的DA变量DABL定义为片内数据存储器的30H单元;输出值显示的百位LEDBAI定义为片内数据存储器的31H单元;输出值显示的十位LEDSHI定义为片内数据存储器的32H单元;输出值显示的个位LEDGE定义为片内数据存储器的33H单元;3.程序设计(1)主程序设计主程序主要完成硬件初始化、子程序调用等功能。①初始化首先调用LCD子程序,设置LCD的DDRAM地址,在LCD上显示字符数据“DAC:〞。将DA转换值DABL设置为初值20,设置定时软计数器KEYTIME初值为4。设置串口成功接收数据标志位RECOKBIT为1。②定时初值计算定时器T0定时时间为5ms,系统所用的石英晶体振荡频率为,因此,1个机器周期=1/石英频率*12,即为微秒,定时器工作方式设置为方式1,计算初值如下:【工程实践】x=216-t*fosc/12=65536-5*10-3*11.0592*106/12=60928=EE00H所以TH0=0EEH,TL0=00H③定时器与串口设置设置存放器SCON的SM0、SM1位,定义串口工作方式,选择波特率发生器为定时器T1;设定定时器T1工作方式为方式2;设置波特率参数为9600bps;允许串行中断及总中断;允许串口接收数据,定义REN=1;启动定时/计数器T1工作,定义TR1=1。设定定时器T0的工作方式为方式1;启动定时器T0,即TR0=1,开放定时器T0中断及总中断。综述,设置TMOD=21H,IE=92H。④等待中断定时器T0启动计时后,CPU等待定时中断的到来。当定时器T0定时5ms后,进入定时器T0中断效劳子程序。【工程实践】主程序设计流程图如下图。【工程实践】图9.4主程序设计流程图【工程实践】(2)定时器T0中断效劳子程序当定时器T0定时5ms后,进入定时器T0中断效劳子程序。重装定时器T0初值,即TH0=0EEH,TL0=00H。判断软计数器KEYTIME值是否为0,假设KEYTIME值不为0,说明20ms计时未到,这时中断子程序返回主程序,继续计时;假设KEYTIME值为0,说明20ms计时已到,重置软计数器KEYTIME初值为4,为下次定时做准备。设置按键输入口P1口的值为0DFH,调用按键扫描子程序。接着调用D/A转换子程序进行D/A转换,得到DA转值值DABL,然后换调用计算D/A转换值子程序计算DA转值DABL相应的ASCII码,再调用LCD显示D/A转换值子程序把数字量输入值进行转换后的模拟量显示在液晶LCD1602上。最后T0中断子程序返回主程序进行下一次DA转换。【工程实践】【工程实践】图9.5定时器T0中断效劳子程序设计流程图【工程实践】(3)D/A转换子程序模块设计根据D/A转换芯片DAC0832的工作时序,片选信号低电平有效。把芯片DAC0832片选信号置低电平,选中该芯片。把数字量D/A转换值DABL送给P0口,准备送入芯片DAC0832进行转换处理。芯片DAC0832写信号置低电平后再过两个时钟周期至高电平,产生一个上升沿信号,进行数据转换处理。模拟量DABL从Iout1、Iout2引脚输出送到运算放大器进行处理,最后从DA输出座子输出,可用万用表测量到输出电压。数据转换完毕,把芯片DAC0832片选信号置高电平。子程序返回。D/A转换子程序设计流程图如下图。【工程实践】芯片DAC0832片选信号置低电平,选中该芯片开始把D/A转换值DABL送给P0口,准备送入芯片DAC0832芯片DAC0832写信号置低电平后再过两个时钟周期至高电平,产生一个上升沿信号子程序返回芯片DAC0832片选信号置高电平图9.6D/A转换值子程序设计流程图【工程实践】(4)计算D/A转换值子程序要把DA转换值DABL显示在LCD上,需要把它转换为相应的ASCII码。先把D/A转换值ADBL送给累加器A,除以100,商即为百位计数单元值,该值加上30H,得到百位数的ASCII码,将它送给LCD百位计数单元显示值LEDBAI。将第一次除法运算得到的余数送给累加器A,再除以10,商为十位计数单元值,该值加上30H,得到十位计数单元的ASCII码,将它送给LCD十位计数单元显示值LEDSHI。将第二次除法运算得到的余数送给累加器A,为个位计数单元值,该值加上30H,得到个位计数单元的ASCII码,将它送给LCD个位计数单元显示值LEDGE。最后子程序返回。计算D/A转换值子程序设计流程图如下图。【工程实践】把D/A转换值DABL送给累加器A,除以100,商为百位计数单元值;加30H,得到百位数的ASCII码;送给LCD百位计数单元显示值LEDBAI开始子程序返回将第一次除法运算的余数送给累加器A,再除以10,商为十位计数单元值;加30H,得到十位计数单元的ASCII码;送给LCD十位计数单元显示值LEDSHI将第二次除法运算的余数送给累加器A,为个位计数单元值;加30H,得到个位计数单元的ASCII码;送给LCD个位计数单元显示值LEDGE图9.7计算D/A转换值子程序设计流程图【工程实践】(5)按键扫描子程序模块设计通过按键K1、K2实现DAC值的加减。程序通过、的值来判断是否有键按下。假设P1.0=0,说明K1键按下,使DAC值加1,但不能大于201,否那么使DAC值返回为20。假设P1.0=1,说明K2键按下,使DAC值减1,但不能小于19,否那么使DAC值返回为200。按键扫描子程序设计流程图如下图。【工程实践】【工程实践】图9.8按键扫描子程序设计流程图【工程实践】(6)串口中断效劳子程序设计当串口中断标志位RI为1时,进入串口接收数据中断效劳子程序,开始接收数据。把串口中断标志位RI复位置0,把串口接收缓冲器SBUF中的数据写入累加器A,再把累加器A的值传给DA转换值变量DABL作为数模转换的初始值,同时设置串口成功接收数据标志位RECOKBIT为1,说明串口成功接收数据,最后中断子程序返回。串口中断效劳子程序设计流程图如下图。接收标志位RI清零从PC机串口接收数据,把接收缓冲器SBUF中的数据写到单片机的累加器A,再送给D/A变量单元DABL设置串口成功接收数据标志位RECOKBIT中断子程序返回开始图9.9串口中断效劳子程序设计流程图【工程实践】(7)LCD显示子程序模块设计LCD显示子程序模块包括LCD初始化子程序、写入指令数据到LCD子程序、写入显示数据到LCD子程序、LCD显示D/A转换值子程序、延时子程序等模块组成,详细设计请参见工程6“LCD显示技术〞。4.汇编语言源程序;*******************************************************************;工程名称:DA转换;功能:串口发送一个要输出的电压(00--FF),模数转换输出一个当前串口发出;的电压;输出的电压为V=5*KK/255。其中KK为串口接收到的二进制数;*******************************************************************;*******************************************************************;功能:LCD口线的定义;*******************************************************************【工程实践】LCDPORTEQUP0CMD_BYTEEQU2EHDAT_BYTEEQU2FH;*******************************************************************;功能:DAC0832的引脚定义;*******************************************************************;*******************************************************************;功能:;*******************************************************************DABLEQU30H;当前DA的变量(00到255间),从串口接收LEDBAIEQU31H;显示的百位LEDSHIEQU32H;显示的十位LEDGEEQU33H;显示的个位KEYTIMEEQU35H;KEYBITBIT00H;RECOKBITBIT01H;串口成功接收数据标志位【工程实践】ORG0000HAJMPMAIN;*******************************************************************;功能:定时器T0中断效劳入口地址;*******************************************************************ORG000BH;T0中断效劳入口地址AJMPTIME0_1;*******************************************************************;功能:串口接收数据中断效劳子程序;*******************************************************************ORG0023H;串口中断效劳入口地址;RS232:CLRRIMOVA,SBUF;单片机从PC串口接收数据MOVDABL,A;PC串口发送的数据送给D/A转换值SETBRECOKBITRETI【工程实践】;*******************************************************************;功能:主程序;*******************************************************************ORG0030HMAIN:MOV20H,#00HLCALLINITLCDMOVDABL,#20MOVKEYTIME,#04HMOVCMD_BYTE,#80H;设置DDRAM的地址LCALLWRITE_CMDLCALLDELAY0MOVDAT_BYTE,#"D"LCALLWRITE_DATMOVDAT_BYTE,#"A"LCALLWRITE_DATMOVDAT_BYTE,#"C"LCALLWRITE_DAT【工程实践】MOVDAT_BYTE,#":"LCALLWRITE_DATMOVTH0,#0EEH;定时器T0,定时5ms,D/A转换时间MOVTL0,#00HMOVTMOD,#21HMOVTH1,#0FDH;T1位波特率发生器,波特率9600MOVTL1,#0FDHMOVSCON,#50H;设置串口工作方式SETBTR1;启动定时器T1SETBREN;允许串行口接收数据SETBTR0;启动定时器T0MOVIE,#92H;允许定时器0中断,允许串口中断SETBRECOKBITSJMP$;等待中断【工程实践】;*******************************************************************;功能:定时器T0中断效劳子程序;*******************************************************************ORG0100HTIME0_1:MOVTH0,#0EEHMOVTL0,#00HDJNZKEYTIME,TIME0_REMOVKEYTIME,#04HMOVP1,#0DFHLCALLKEYSCANLCALLDAC0832;调用D/A转换子程序LCALLJSDPBL;调用计算D/A转换值子程序LCALLDISPDPBL;调用LCD显示D/A转换值子程序TIME0_RE:RETI;*******************************************************************;功能:;按键扫描子程序;*******************************************************************KEYSCAN:MOVP1,#0FFH【工程实践】;*******************************************************************;功能:;D/A转换子程序;*******************************************************************DAC0832:CLRDAC_CSMOVA,DABLMOVP0,ACLRDAC_WRNOPNOPSETBDAC_WRSETBDAC_CSRET;***********************************************************;功能:LCD1602要用到的一些子程序;***********************************************************;***********************************************************;功能:写入指令数据到LCD子程序(入口参数CMD_BYTE);***********************************************************WRITE_CMD:CLRRSCLRRW【工程实践】MOVA,CMD_BYTE

MOVLCDPORT,ASETBENOPNOPCLRELCALLDELAY0RET;***********************************************************;功能:写入显示数据到LCD子程序(入口参数DAT_BYTE);***********************************************************WRITE_DAT:SETBRSCLRRWMOVA,DAT_BYTEMOVLCDPORT,ASETBENOPNOP【工程实践】CLRELCALLDELAY0RET

***********************************************************;功能:LCD显示初始化子程序;***********************************************************INITLCD:MOVCMD_BYTE,#30HLCALLWRITE_CMDMOVCMD_BYTE,#30HLCALLWRITE_CMDMOVCMD_BYTE,#30HLCALLWRITE_CMDMOVCMD_BYTE,#38H;设定工作方式LCALLWRITE_CMDMOVCMD_BYTE,#0CH;显示状态设置LCALLWRITE_CMDMOVCMD_BYTE,#01H;清屏【工程实践】LCALLWRITE_CMDMOVCMD_BYTE,#06H;输入方式设置LCALLWRITE_CMDRET

;***********************************************************;功能:延时子程序;***********************************************************DELAY0:MOVR5,#0A0HDELAY1:NOPDJNZR5,DELAY1RET;***********************************************************;功能:计算D/A转换值子程序;***********************************************************JSDPBL:MOVA,DABL;取得A/D转换值MOVB,#64H;除以100,得到百位【工程实践】DIVABORLA,#30H;加30H,变换成相应的ASCIIMOVLEDBAI,A;送到LCD显示MOVA,BMOVB,#0AH;除以10,得到十位DIVABORLA,#30H;加30H,变换成相应的ASCIIMOVLEDSHI,A;送到LCD显示MOVA,B;余数为个位ORLA,#30H;加30H,变换成相应的ASCIIMOVLEDGE,A;送到LCD显示RET【工程实践】;*******************************************************************;功能:LCD显示D/A转换值子程序;*******************************************************************DISPDPBL:MOVCMD_BYTE,#85H;设置DDRAM的地址LCALLWRITE_CMD;MOVDAT_BYTE,LEDBAI;百位显示LCALLWRITE_DATMOVDAT_BYTE,LEDSHI;十位显示LCALLWRITE_DATMOVDAT_BYTE,LEDGE;个位显示LCALLWRITE_DATRETEND【工程实践】【活动四】系统仿真调试【工程实践】系统仿真调试过程参见工程1。1、D/A转换器的根本原理D/A转换器的根本功能是将一个用二进制表示的数字量转换成相应的模拟量。实现这种转换的根本方法是对应于二进制数的每一位,产生一个相应的电压〔电流〕,而这个电压〔电流〕的大小那么正比于相应的二进制位的权。具体电路较复杂,这里就不多述,有兴趣的同学请看有关书籍。2、主要技术指标〔1〕分辩率。通常用数字量的数位表示,一般为8位,12位,16位等。分辩率10位,表示它可能对满量程的1/210=1/1024的增量作出反响。〔2〕输入编码形式。如二进制码,BCD码等。〔3〕转换线性。通常给出在一定温度下的最大非线性度,一般为~0.03%。〔4〕转换时间。通常为几十纳秒~几微秒。〔5〕输出电平。不同型号的输出电平相差很大。大局部是电压型输出,一般为5~10伏;也有高压输出型的,为24~30伏。也有一些是电流型的输出,低者为20毫安左右,高者可达3安培。【相关知识】3、集成D/A转换器——DAC0832DAC0832是目前国内用得较普遍的D/A转换器。⑴、DAC0832主要特性DAC0832是采用CMOS/Si-Cr工艺制成的双列直插式单片8位D/A转换器。它可直接与Z80,8085,8080等CPU相连,也可同8031相连,以电流形式输出;当转换为电压输出时,可外接运算放大器。其主要特性有:1〕出电流线性度可在满量程下调节。2〕转换时间为1μS。3〕数据输入可采用双缓冲、单缓冲或直通方式。4〕增益温度补偿为0.02%FS/℃。5〕每次输入数字为8位二进制数。6〕功耗20mW。7〕逻辑电平输入与TTL兼容。8〕供电电源为单一电源,可在5~15V内。【相关知识】⑵DAC0832内部结构及外部引脚DAC0832D/A转换器,其内部结构由一个数据存放器、DAC存放器和D/A转换器三大局部组成。DAC0832内部采用R-2R梯形电阻网络。两个存放器输入数据存放器和DAC存放器用以实现两次缓冲,故在输出的同时,尚可集一个数字,这就提高了转换速度。当多芯片同时工作时,可用同步信号实现各模拟量同时输出。图示出了DAC0832的外部引脚【相关知识】图9.11DAC0832引脚图【相关知识】片选信号,低电平有效。与ILE相配合,可对写信号是否有效起到控制作用。ILE允许输入锁存信号,高电平有效,输入存放器的锁存信号由ILE,,的逻辑组合产生。当ILE为高电平,为低电平,输入负脉冲时,输入存放器的锁存信号产生正脉冲。当输入存放器的锁存信号为高电平时输入线的状态变化,输入存放器的锁存信号的负跳变将输入在数据线上的信息打入输入锁存器。写信号1,低电平有效。当,,ILE均有效时,可将数据写入8位输入存放器。写信号2,低电平有效。当有效时,在传送控制信号作用下,可将锁存在输入存放器的8位数据送到DAC存放器。数据传送信号,低电平有效。当,均有效时,那么在DAC存放器的锁存信号产生正脉冲,当DAC存放器的锁存信号为高电平时,DAC存放器的输出和输入存放器的状态一致,DAC存放器的锁存信号负跳变,输入存放器的内容打入DAC存放器。【相关知识】Vref基准电源输入端,它与DAC内的R-2R梯形网络相接,Vref可在±10V范围内调节。DI0~DI78位数字量输入端,ID7为最高位,DI0为最低位。Iout1:DAC的电流输出1,当DAC存放器各位为1时,输出电流为最大。当DAC存放器各位为0时,输出电流为0。Iout2:DAC的电流输出2,它使Iout1+Iout2恒为一常数。一般在单极性输出时Iout2接地,在双极性输出时接运放〔详见图9-46〕Rfb反响电阻。在DAC0832芯片内有一个反响电阻,可用作外部运放的分路反响电阻。Vcc:电源输入线:DGND为数字地,AGND为模拟信号地。4、DAC0832和MCS-51的接口DAC0832可工作在单、双缓冲器方式。单缓冲器方式即输入存放器的信号和DAC存放器的信号同时控制,使一个数据直接写入DAC存放器。这种方式适用于只有一路模拟量输出或几路模拟量不需要同步输出的系统;双缓冲器方式,即输入存放顺的信号和DAC存放器信号分开控制,这种方式适用于几个模拟量需同时输出的系统。下面我们分别讨论上述两种方式时的接口方法。【相关知识】1、单缓冲器方式图9.12单极性单缓冲器电路接口图【相关知识】图为具有单极性一路模拟量的8031系统。图中ILE接+5V,Iout2接地,Iout1输出电流经运放器741输出一个单极性电压范围为0~5V。片选信号和传送信号都连到地址线A15,输入存放器和DAC存放器地址都可选为7FFFH,写选通输入线,都和8031的写信号连接,CPU对0832

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论