片机原理与应用技术重点程序高惠芳_第1页
片机原理与应用技术重点程序高惠芳_第2页
片机原理与应用技术重点程序高惠芳_第3页
片机原理与应用技术重点程序高惠芳_第4页
片机原理与应用技术重点程序高惠芳_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

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

文档简介

传送类指令举例:例31已知(R0)=30H,问执行如下程序,A、R4、30H和31H单元的内容是什么。MOVA,#10HMOVR4,#36HMOVR0,#7AHMOV31H,#01H解:8051执行上述指令后的结果为:,(A)=10H(R4)=36H(30H)=7AH(31H)=01H,例32设内部RAM中30H单元的内容为40H,40H单元的内容为10H,P1口作输入口,其输入数据为0CAH,程序及执行后的结果如下:MOVR0,#30H;单元地址30H送R0中MOVA,R0;R0间址,将30H单元内容送AMOVR1,A;A送R1MOVB,R1;R1间址,将40H单元内容送BMOVR1,P1;将P1内容送40H单元MOVP2,P1;将P1内容送P2,执行结果:(R0)=30H,(R1)=40H,(A)=40H,(B)=10H,(P1)=0CAH,(40H)=0CAH,(P2)=0CAH,例35已知外部RAM2020H单元中有一个数X,内部RAM20H单元一个数Y,试编出可以使它们互相交换的程序。解:MOVP2,#20HMOVR1,#20HMOVXA,R1XCHA,R1MOVXR1,ASJMP$END,指向内部RAM20H单元,指向外部RAM2020H单元,例37把01H单元内容送02H单元,有几种不同的实现方法。MOV02H,01H;直接寻址3字节2周期MOVA,01H;直接寻址+寄存器寻址MOV02H,A;4字节2周期MOVA,R1;寄存器寻址2字节2周期MOVR2,AMOVR0,#01H;4字节3周期MOV02H,R0;间接寻址PUSH01H;栈操作4字节4周期POP02H第三种方法占存储空间少,执行周期短。,补充:设20H,21H单元存放一个16位2进制数X1(高8位存于21H单元);30H,31H单元存放一个16位2进制数X2,(高8位存于31H单元);求X1+X2,结果存放于20H,21H。(两数之和不超过16位),答案,ORG0000HAJMPmainORG0100HMAIN:MOV20H,#12HMOV21H,#34HMOV30H,#23HMOV31H,#45HMOVA,20HADDA,30HMOV20H,AMOVA,21HADDCA,31HMOV21H,ASJMP$END1234H+#2345H=#3579H,例4.3.1将片内RAM30H单元中的两位压缩BCD码转换成二进制数送到片内RAM40H单元中.(P63),ORG1000HSTART:MOVA,30H;取两位BCD压缩码a1a0送AANLA,#0F0H;取高4位BCD码a1SWAPA;高4位与低4位换位MOVB,#0AH;将二进制数10送入BMULAB;将10a1送入A中MOVR0,A;结果送入R0中保存MOVA,30H;再取两位BCD压缩码a1a0送AANLA,#0FH;取低4位BCD码a0ADDA,R0;求和10a1+a0MOV40H,A;结果送入40H保存SJMP$;程序执行完,“原地踏步”END,例4.3.2将内部RAM中20H单元的压缩BCD码拆开,转换成相应的ASC码,存入21H、22H,高位存22H.(P64),ORG1000HSTART:MOVA,20H;取压缩BCD码ANLA,#0FH;取低位BCD码ADDA,#30H;转换为低位ASCII码MOV21H,A;保存低位ASCII码MOVA,20H;重新取压缩BCD码ANLA,#0F0H;分离高位BCD码SWAPA;得到高位BCD码ADDA,#30H;转换为高位ASCII码MOV22H,A;保存高位ASCII码SJMP$END,补充举例:三字节无符号数相加,其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、54H和55H单元中;要求把相加之和存放在50H、51H和52H单元中进位存放在位寻址区的20H单元最低位中(即20H.0)。,分析:除最低字节可以使用ADD指令之外,其它字节相加时要把低字节的进位考虑进去,因此使用ADDC指令.,MOV00H,C,#20H,分支程序是通过转移指令实现的,一、单分支程序,使用条件转移指令实现,即根据条件对程序的执行进行判断,满足条件则进行程序转移,否则程序顺利执行。,可实现单分支程序转移的指令有:,JZ、JNZ、CJNE、DJNZ等,还有以位状态作为条件进行程序分支的指令:,JC、JNC、JB、JNB和JBC等,(1)单分支结构举例,例4.3.3求符号函数的值。已知片内RAM的40H单元内有一自变量X,编制程序按如下条件求函数Y的值,并将其存入片内RAM的41H单元中。见P65,1X0,0X=0,-1X0,Y=,ORG1000HSTART:MOVA,40H;将X送入A中JZCOMP;若A为0,转至COMP处JNBACC.7,POST;若A第7位不为1(X为正数),;则程序转到POST处,;否则(X为负数)程序往下执行MOVA,#0FFH;将1(补码)送入A中SJMPCOMP;程序转到COMP处POST:MOVA,#01H;将+1送入A中COMP:MOV41H,A;结果存入YSJMP$;程序执行完,“原地踏步”END,补充举例:假定在外部RAM中有ST1、ST2、ST3共3个连续单元,其中ST1和ST2单元中分别存放着两个8位无符号二进制数,要求找出其中的大数并存入ST3单元中。,MOVA,R2,一、单重循环程序,例4.3.5已知片内RAM30H3FH单元中存放了16个二进制无符号数,编制程序求他们的累加和,并将其和数存放在R4,R5中(R4存高8位,R5存低8位)。见P69,ORG1000HSTART:MOVR0,#30HMOVR2,#10H;设置循环次数(16)MOVR4,#00H;和高位单元R4清0MOVR5,#00H;和低位单元R5清0LOOP:MOVA,R5;和低8位的内容送AADDA,R0;将R0与R5的内容相加MOVR5,A;低8位的结果送R5CLRA;A清0ADDCA,R4;将R4的内容和Cy相加MOVR4,A;高8位的结果送R4INCR0;地址递增(加1)DJNZR2,LOOP;若循环次数减1不为0,则转;到LOOP处循环,否则,循环结束SJMP$END,例4.3.6编制程序将片内RAM的30H4FH单元中的内容传送至片外RAM的2000H开始的单元中。(见P70),程序如下:ORG1000HSTART:MOVR0,#30HMOVDPTR,#2000HMOVR2,#20H;设置循环次数LOOP:MOVA,R0;将片内RAM数据区内容送AMOVXDPTR,A;将A的内容送片外;RAM数据区INCR0;源地址递增INCDPTR;目的地址递增DJNZR2,LOOP;若R2的不为0,则转到;LOOP处继续循环,否则循环结束SJMP$END,2、较长时间的定时程序,较长时间的定时,通常采用多重循环的方法,1个机器周期,1个机器周期,2个机器周期,4个机器周期,最大定时时间计算公式为:,(4256+2+1)2562s2s+2s=525828(s),2个机器周期,1个机器周期,1个机器周期,1个机器周期,sbit位类型符用于定义在可位寻址字节或特殊功能寄存器中的位,定义时须指明其位地址,可以是位直接地址,可以是可位寻址变量带位号,也可以是特殊功能寄存器名带位号。格式如下:sbit位变量名=位地址;1、位地址为位直接地址,其取值范围为0 x000 xff;2、位地址是可位寻址变量带位号或特殊功能寄存器名带位号,则在它前面须对可位寻址变量或特殊功能寄存器进行定义。Note:字节地址与位号之间、特殊功能寄存器与位号之间一般用“”作间隔。,【例5-5】sbit型变量的定义。sbitOV=0 xd2;sbitCY=0 xd7;unsignedcharbdataflag;sbitflag0=flag0;sfrP1=0 x90;sbitP1_0=P10;sbitP1_1=P11;sbitP1_2=P12;sbitP1_3=P13;sbitP1_4=P14;sbitP1_5=P15;sbitP1_6=P16;sbitP1_7=P17;,3中断方式,单片机的中断为固定入口式中断,即一响应中断就转入固定入口地址执行中断服务程序。具体入口如下:编号中断源中断向量(汇编)C语言0INT00003interrupt01T0000BHinterrupt12INT10013Hinterrupt23T1001BHinterrupt34RI/TI0023Hinterrupt4在这些单元中往往是一些跳转指令,跳到真正的中断服务程序,这是因为给每个中断源安排的空间只有8个单元。,51系列单片机的5个中断源的中断服务入口地址之间相差8个单元。这8个存储单元用来存储中断服务程序一般来说是不够的。用户常在中断服务程序地址入口处放一条三字节的长转移指令。一般地,主程序从0030H单元以后开始存放。例如:ORG0000HLJMPSTART;转入主程序,START为主程序地址标号ORG0003HLJMPINT0;转外中断中断服务程序ORG000BHLJMPT0;转定时器T0中断服务程序ORG0030HSTART:;主程序开始,例6.1.2在图6.1.6中,P1.0P1.3接有4个开关,P1.4P1.7接有4个发光二极管,消抖电路用于产生中断请求信号,当消抖电路的开关来回拨动一次将产生一个下跳变信号,向CPU申请中断。要求:初时发光二极管全黑,每中断一次,P1.0P1.3所接的开关状态反映到发光二极管上,且要求开关合上时对应发光二极管亮。,解:汇编程序如下:ORG0000HAJMPMAINORG0003H;外部中断0入口AJMPSER_INT0;转中断服务程序ORG0100H;主程序MAIN:MOVP1,#0FH;熄灭发光二极管且对开关输入端先输出1SETBIT0;脉冲触发方式SETBEX0;允许中断SETBEA;总中断允许AJMP$;等待中断,SER_INT0:MOVP1,#0FH;熄灭发光二极管且对开关输入端先输出1MOVA,P1;输入开关状态CPLA;状态取反ANLA,#0FH;屏蔽A的高半字节SWAPA;A高低半字节交换MOVP1,A;开关状态输出RETI;中断返回,每次单纯重置一次4个开关的开、合状态,4个发光二极管维持原来的亮、灭状态,仅当来回拨动消抖开关后,产生了中断,发光二极管才反映新置的开关状态。,该例子的执行结果是:,#includevoidint0()interrupt0/*中断函数*/P1=0 x0f;/*熄灭发光二极管且对开关输入端先输出1*/P1=4;/*读入开关状态,并左移四位,使开关反映在发光二极管上*/P1P1;/*对P1口内容取反*/main()/*主函数EA=1;/*开中断总开关*/EX0=1;/*允许中断*/IT0=1;/*负跳沿产生中断*/while(1)/*等待中断*/,C语言程序如下:,补2:通过外部中断控制八盏灯循环点亮。解:通过P1口扩展八盏灯,在INT1引脚(P3.3)接一个按钮开关到地,每按一下按钮就申请一次中断,点亮一盏灯,中断服务则是:依次点亮八盏灯中的一盏。采用边沿触发。硬件电路如下图所示。,程序如下:C源程序见int1.cORG0000HLJMPMAINORG0013H;中断服务程序入口地址LJMPIN11MAIN:SETBEA;开总中断允许“开关”SETBEX1;开分中断允许“开关”CLRPX1;低优先级(也可不要此句)SETBIT1;边沿触发MOVA,#01H;给累加器A赋初值SJMP$;原地等待中断申请IN11:RLA;左环移一次MOVP1,A;输出到P1口RETI;中断返回END,3定时器计数器的控制,与定时器计数器有关的控制寄存器有:,1定时器控制寄存器TCON,中断请求标志,触发方式选择,启动定时/计数器,0低电平1下降沿,0停止1启动,2工作方式控制寄存器TMOD,C1/T1控制,C0/T0控制,GATE门控位GATE=0以运行控制位TR启动定时器GATE=1以外中断请求信号(高电平)启动定时器,M1M0工作方式选择,2).方式1:16位方式,3).方式2:8位自动装入时间常数方式,定时/计数器常数的计算,1计数器初值的计算把计数器计满为零所需要的计数值设定为C,计数初值设定为Tc,由此可得到公式:Tc=M-C式中,M为计数器模值,该值和计数器工作方式有关。在方式0时M为213;在方式1时M为216;在方式2和方式3时M为28。,2定时器初值的计算在定时器模式下,计数器由单片机主脉冲经12分频后计数。因此,定时器定时时间T的公式:T=(M-Tc)T计数上式也可写成:Tc=M(T/T计数)式中,M为模值,和定时器的工作方式有关;T计数是单片机振荡周期TCLK的12倍;Tc为定时器的定时初值。,开中断(如果使用中断方式):编程置位EA、ETi,TRi位置位控制定时器的启动和停止。,四、应用举例,计算计数器的计数初值:编程时将计数初值送THi、TLi;,可编程器件在使用前需要进行初始化:,确定TMOD控制字:编程时将控制字送TMOD;,例1设晶振频率fOSC=12MHz,使用定时器0以方式1产生周期为4ms的方波脉冲,并由P1.0输出。以中断方式实现。,1.定时器/计数器作定时器使用,TMOD确定,T1控制,T0控制,控制字01H,要产生4ms的方波脉冲,只需在P1.0端以2ms为间隔,交替输出高低电平即可实现。为此,定时间应为2000s。使用12z晶振,则一个机器周期为1s,设待求计数初值为,则:,计算计数器的计数初值;,(216X)1us=2000us即216X=2000X216-20000F830H所以,初值为:TH0=0F8H,TL0=30H,采用中断方式:编程时打开全局和局部中断。,由定时器控制寄存器TCON中的TR0位控制定时器的启动和停止。TR01,启动;TR00,停止。,ORG0000HLJMPMAIN;主程序入口ORG000BHLJMPT0INT;T1中断入口,汇编程序设计,T0INT:MOVTH0,#0F8H;重新设置初值MOVTL0,#30HCPLP1.0;输出取反RETIEND,ORG0030HMAIN:MOVTMOD,#01H;T0为方式1MOVTH0,#0F8HMOVTL0,#30H;初值CLRP1.0SETBEA;允许中断SETBET0SETBTR0;启动定时SJMP$;等待中断,主程序:,中断处理程序:,#includesbitP1_0=P10;voidtimer1(void)interrupt1using1P1_0=!P1_0;TH0=0 xF8;TL0=0X30;voidmain(void)TMOD=0 x01;P1_0=0;TH0=0 xF8;TL0=0X30;EA=1;ET0=1;TR0=1;while(1);,C程序设计中断方式,(2)采用查询方式编程汇编程序:ORG0000HLJMPMAINORG0100HMAIN:MOVTMOD,#01H;写入方式控制字MOVTH0,#0F8H;写入计数初值MOVTL0,#30HSETBTR0;启动T0定时LOOP:JBCTF0,NEXT;查询定时时间到否?SJMPLOOPNEXT:MOVTH0,#0F8H;重新写入计数初值MOVTL0,#30HCPLP1.0;输出取反SJMPLOOP;重复循环END,(2)采用查询方式编程汇编程序:ORG0000HLJMPMAINORG0100HMAIN:MOVTMOD,#01HMOVTH0,#0F8HMOVTL0,#30HSETBTR0LOOP:JBCTF0,NEXTSJMPLOOPNEXT:MOVTH0,#0F8HMOVTL0,#30HCPLP1.0SJMPLOOPEND,(1)采用中断方式编程汇编程序:ORG0000HLJMPMAINORG000BHAJMPSER_T0ORG0100HMAIN:MOVTMOD,#01HMOVTH0,#0F8HMOVTL0,#30HSETBEASETBET0SETBTR0SJMP$SERT0:MOVTH0,#0F8HMOVTL0,#30HCPLP1.0RETIEND,#includesbitP1_0=P10;voidmain(void)TMOD=0 x01;P1_0=0;TH0=0 xFF;TL0=0X83;TR0=1;while(1)if(TF0=1)TF0=0;P1_0=!P1_0;TH0=0 xFF;TL0=0X83;,C程序设计查询方式,2.定时器/计数器作长时间定时器使用,方法1:采用软件计数的方法实现,每次溢出后,用于计数的寄存器加1方法2:T1计数回0溢出时,使P1.1输出一个负脉冲,再把P1.1接到T0/P3.4引脚用以计数。,用定时器/计数器产生的定时时间是有限的,如晶振为6MHz时,一个定时器最长的定时时间为T=216(1/6)12=131.072ms,例2.采用6MHz晶振,使用定时器/计数器1在P1.0脚上输出周期为100ms,占空比为30%的矩形脉冲,以工作方式2编程实现。,解:对于6MHz晶振,使用工作方式2,最大定时时间为(28-0)(1/6)10-612=512s取500s定时,则周期100ms需要中断200次,占空比为30%,高电平需要60次中断。500s定时,初值为:256(6/12)500=6,图6.2.7中断服务程序流程图,汇编程序:ORG0000HLJMPMAINORG001BHAJMPSER_T1ORG0100HMAIN:MOVTMOD,#20H;写入方式控制字MOVTH0,#06H;写入计数初值MOVTL0,#06HMOVR7,#00H;中断次数初值SETBP1.0SETBEA;开总中断SETBET1;开T1中断SETBTR1;启动T1SJMP$;等待中断SER_T1:INCR7;中断次数加1CJNER7,#60,LOOP1CLRP1.0;中断次数到120次即高电平时间到输出0AJMPLOOPLOOP1:CJNER7,#200,LOOPSETBP1.0;中断次数到400次即周期到输出1MOVR7,#00HLOOP:RETIEND,C语言程序:#include#defineucharunsignedcharuchartime=0;ucharperiod=200;ucharhigh=60;main()TMOD=0 x20;TH0=0 x06;TL0=0 x06;EA=1;ET1=1;TR1=1;P1.0=1;while(1);,timer1()interrupt3if(+time=high)P1.0=0;elseif(time=period)time=0;P1.0=1;,1)SCON-可位寻址的串行口控制寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志:,280C51串行口寄存器,SM0和SM1为工作方式选择位,可选择四种工作方式:,SM2:多机通信控制位。,REN:允许接收控制位。当REN=1,则允许接收,当REN=0,则禁止接收。,TB8:发送数据的第9位。,RB8:接收数据的第9位。,TI:发送中断标志位。,RI:接收中断标志位。,*SM2,多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB80时不激活RI,收到的信息丢弃;RB81时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。在方式0时,SM2必须是0。在方式1时,若SM2=1,则只有接收到有效停止位时,RI才置1。REN,允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。,TI,发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。RI,接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。,2)PCON电源控制寄存器:,SMOD(PCON.7)波特率倍增位。在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。,3)IE中断允许控制寄存器:EA-中断允许总控制位;ES-串行中断允许控制位,4)IP中断优先级控制寄存器:PS-串行中断优先级设定位,6.3.380C51串行口的工作方式,一、方式0方式0时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接收均为8位数据,低位在先,高位在后。波特率固定为fosc/12。,1、方式0发送过程:在TI=0时,当CPU执行一条向SBUF写数据的指令时,如MOVSBUF,A;就启动发送过程。经过一个机器周期,写入发送数据寄存器中的数据按低位在前,高位在后从RXD依次发送出去,同步时钟从TXD送出。8位数据(一帧)发送完毕后,由硬件使发送中断标志TI置位,向CPU申请中断。,2、方式0接收过程,在RI=0的条件下,将REN(SCON.4)置“1”就启动一次接收过程。串行数据通过RXD接收,同步移位脉冲通过TXD输出。在移位脉冲的控制下,RXD上的串行数据依次移入移位寄存器。当8位数据(一帧)全部移入移位寄存器后,接收控制器发出“装载SBUF”信号,将8位数据并行送入接收数据缓冲器SBUF中,同时,由硬件使接收中断标志RI置位,向CPU申请中断。,常用于串行通讯。除发/收8位数据外,还在D0位前有一个起始位“0”;在D7位后有一个停止位“1”。,方式1工作时:发送端自动添加一个起始位和一个停止位;接收端自动去掉一个起始位和一个停止位。,二、方式18位UART(1+8+1位)波特率可变,波特率可变用定时器T1作波特率发生器:公式:波特率=(2SMOD/32)T1的溢出率,波特率=(2SMOD/32)T1的溢出率(P172),溢出率:T1溢出的频繁程度即:T1溢出一次所需时间的倒数。T1溢出时间(256X)(12/fosc),初值X=2n-,2SMODfosc32波特率12,波特率=,2SMODfosc3212(256-X),其中:X是定时器初值,例用T1工作于方式2来产生波特率1200,已知晶振频率=6MHz。要求出T1的初值:,初值X=28-,20610632120012,=256-=256-13.02,6106460800,243=0F3H,2.总线的构造,1。以P0口的8位口线作低8位地址/数据线。2。以P2口的口线作高位地址线3。控制信号.使用ALE作地址锁存的选通信号,以实现低8位地址的锁存;.以PSEN信号作扩展程序存储器的读选通信号;.以EA信号作为内外程序存储器的选择信号;.以RD和WR作为扩展数据存储器和I/O端口的读选通信号。,扩展总线构造图,两种命令,工作方式命令,C口位置位/复位命令,1、工作方式命令,用于确定各数据口的工作方式及数据传送方向,48255初始化,A口有三种工作方式B口只有两种工作方式,在方式1或方式2下,对C口的定义不影响作为联络线使用的C口各位功能,最高位()是标志位,其状态固定为“1”,用于表明本字节是工作方式命令,例7.3.1按照图7.3.4中8255与AT89C52的连接图对8255初始化编程。A、B、C口均为基本I/O输出方式。A口与上C口为基本I/O输出方式,B口与下C口为基本I/O输入方式。A口为应答I/O输入方式,B口为应答I/O输出方式。,3、初始化编程,8255A初始化的内容就是向控制字寄存器写入工作方式命令和C口位置位/复位命令。工作方式字应输入控制寄存器,按上面的连接方式,控制寄存器的地址为E003H。,A、B、C口均为基本I/O输出方式,解:8255的初始化程序为:(1)#include#include#defineCOM8255XBYTE0 xe003/定义8255控制寄存器地址#defineucharunsignedcharvoidinit8255(void)COM8255=0 x80;/*工作方式选择字送入8255控制寄存器,设置A、B、C口均为基本I/O输出方式*/,A口与上C口为基本I/O输出方式,B口与下C口为基本I/O输入方式。,#include#defineCOM82550 xe003/*定义8255控制寄存器地址*/voidinit8255(void)XBYTECOM8255=0 x83;/*工作方式选择字送入8255控制寄存器,设置A、C口为基本I/O输出方式,B、C口为基本I/O输入方式*/,A口为应答I/O输入方式,B口为应答I/O输出方式。,ucharxdataCOM8255_at_0 xe003;/*定义8255控制寄存器地址*/voidinit8255(void)COM8255=0 xb4;/*工作方式选择字送入8255控制寄存器,设置A、B、C口为基本I/O输出方式*/,五DAC0832的应用,D/A转换器在实际中经常作为波形发生器使用,通过它可以产生各种各样的波形。它的基本原理如下:利用D/A转换器输出模拟量与输入数字量成正比这一特点,通过程序控制CPU向D/A转换器送出随时间呈一定规律变化的数字,则D/A转换器输出端就可以输出随时间按一定规律变化的波形。,00H,直通方式举例,程序实例1:输出正锯齿波Main()While(1)P1+;/这里假设P1口接数据输入,程序实例2:输出负锯齿波Main()While(1)P1-;/这里假设P1口接数据输入,程序实例3:输出三角波Main()P1=0;While(1)While(1)If(P1!=0 xFF)P1+;/这里假设P1口接数据输入ElseBreak;While(1)If(P1!=0 x00)P1-;/这里假设P1口接数据输入ElseBreak;,ADC0809的工作流程如图所示:,1输入3位地址,并使ALE=1,将地址存入地址锁存器中,经地址译码器译码从8路模拟通道中选通一路模拟量送到比较器。2送START一高脉冲,START的上升沿使逐次逼近寄存器复位,下降沿启动A/D转换,并使EOC信号为低电平。3当转换结束时,转换的结果送入到输出三态锁存器,并使EOC信号回到高电平,通知CPU已转换结束。4CPU使OE为高电平,从输出端D0D7读入数据。,三ADC0809的工作流程,2.ADC0809的接口(模拟时序方式)和编程,#defineALEP2_4#defineSTARTP2_5#defineOEP2_6#defineEOCP2_7,#include#include,unsignedcharadc_0809(unsignedcharchanel)/地址信息放在chanel变量中unsignedchardd;/临时变量P2/返回转换值,8031,WR,P2.7,P0,DI7DI0,CS,XFER,WR1,WR2,DAC0832,IOUT2,IOUT1,+,-,RFR,DAC0832单缓冲方式接口电路,ILE,+5V,【补充举例1】利用单缓冲方式(总线方式),编程从DAC0832输出端分别产生锯齿波、三角波和方波。,分析:根据单缓冲方式图的连接,DAC0832的口地址为7FFFH。,汇编语言编程:锯齿波MOVDPTR,#7FFFHCLRALOOP:MOVXDPTR,AINCASJMPLOOP,三角波:MOVDPTR,#7FFFHCLRALOOP1:MOVXDPTR,AINCACJNEA,#0FFH,LOOP1LOOP2:MOVXDPTR,ADECAJNZLOOP2SJMPLOOP1,方波:MOVDPTR,#7FFFHLOOP:MOVA,#00HMOVXDPTR,AACALLDELAYMOVA,#FFHMOVXDPTR,AACALLDELAYSJMPLOOPDELAY:MOVR7,#0FFHDJNZR7,$RET,C语言编程:锯齿波:#include/定义绝对地址访问#defineucharunsignedchar#defineDAC0832XBYTE0 x7FFFvoidmain()uchari;while(1)for(i=0;i0 xff;i+)DAC0832=i;,三角波:#include/定义绝对地址访问#defineucharunsi

温馨提示

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

评论

0/150

提交评论