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

下载本文档

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

文档简介

传送类指令举例: 例31已知(R0)=30H,问执行如下程序,A、R4、30H和31H单元的内容是什么。 MOV A , #10H MOV R4 ,#36H MOV R0 ,#7AH MOV 31H ,#01H 解:8051执行上述指令后的结果为:,(A)=10H (R4)=36H (30H)=7AH (31H)=01H,例32设内部RAM中30H单元的内容为40H ,40H单元的内容为10H,P1口作输入口,其输入数据为0CAH,程序及执行后的结果如下: MOV R0,#30H ;单元地址30H送R0中 MOV A ,R0 ;R0 间址,将30H单元内容送A MOV R1 ,A ;A送R1 MOV B ,R1 ;R1间址,将40H单元内容送B MOV R1,P 1 ;将P1内容送40H单元 MOV P2 , P1 ;将P1内容送P2,执行结果:(R0)=30H , (R1)=40H , (A)=40H , (B) =10H ,(P1)=0CAH ,(40H)=0CAH , (P2)=0CAH,例35 已知外部RAM 2020H单元中有一个数X, 内部RAM 20H单元一个数Y,试编出可以使它们互相交换的程序。 解: MOV P2 , #20H MOV R1 , #20H MOVX A , R1 XCH A , R1 MOVX R1 ,A SJMP $ END,指向内部 RAM 20H单元,指向外部 RAM 2020H单元,例37 把01H单元内容送02H单元,有几种不同的实现方法。 MOV 02H ,01H ; 直接寻址 3字节 2周期 MOV A ,01H ;直接寻址 +寄存器寻址 MOV 02H , A ;4字节 2周期 MOV A , R1 ; 寄存器寻址 2字节 2周期 MOV R2 , A MOV R0 ,#01H ; 4字节 3周期 MOV 02H ,R0 ; 间接寻址 PUSH 01H ; 栈操作 4字节 4周期 POP 02H 第三种方法占存储空间少,执行周期短。,补充:设20H,21H单元存放一个16位2进制数X1(高8位存于21H单元) ;30H,31H单元存放一个16位2进制数X2,(高8位存于31H单元);求X1+X2,结果存放于20H,21H。(两数之和不超过16位),答案,ORG 0000H AJMP main ORG 0100H MAIN: MOV 20H,#12H MOV 21H,#34H MOV 30H,#23H MOV 31H,#45H MOV A,20H ADD A,30H MOV 20H,A MOV A,21H ADDC A,31H MOV 21H,A SJMP $ END 1234H+#2345H = #3579H,例4.3.1 将片内RAM 30H单元中的两位 压缩BCD码转换成二进制数送到片内 RAM 40H单元中.(P63),ORG 1000H START:MOV A, 30H ; 取两位BCD压缩码a1a0送A ANL A, #0F0H ; 取高4位BCD码a1 SWAP A ; 高4位与低4位换位 MOV B, #0AH ; 将二进制数10送入B MUL AB ; 将10a1送入A中 MOV R0, A ; 结果送入R0中保存 MOV A, 30H ; 再取两位BCD压缩码a1a0送A ANL A, #0FH ; 取低4位BCD码a0 ADD A, R0 ; 求和10a1+ a0 MOV 40H, A ; 结果送入40H保存 SJMP $ ; 程序执行完,“原地踏步” END,例4.3.2 将内部RAM中20H单元的压缩BCD码拆开,转换成相应的ASC码,存入21H、22H,高位存22H.(P64),ORG 1000H START:MOV A,20H ; 取压缩BCD码 ANL A,#0FH ; 取低位BCD码 ADD A,#30H ; 转换为低位ASCII码 MOV 21H,A ; 保存低位ASCII码 MOV A,20H ; 重新取压缩BCD码 ANL A,#0F0H ; 分离高位BCD码 SWAP A ; 得到高位BCD码 ADD A,#30H ; 转换为高位ASCII码 MOV 22H,A ; 保存高位ASCII码 SJMP $ END,补充举例:三字节无符号数相加,其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、54H和55H单元中;要求把相加之和存放在50H、51H和52H单元中进位存放在位寻址区的20H单元最低位中(即20H.0)。,分析: 除最低字节可以使用ADD指令之外,其它字节相加时要把低字节的进位考虑进去,因此使用ADDC指令.,MOV 00H,C,#20H,分支程序是通过转移指令实现的,一、单分支程序,使用条件转移指令实现,即根据条件对程序的执行进行判断,满足条件则进行程序转移,否则程序顺利执行。,可实现单分支程序转移的指令有:,JZ、JNZ、CJNE、DJNZ等,还有以位状态作为条件进行程序分支的指令:,JC、JNC、JB、JNB和JBC等,(1)单分支结构举例,例4.3.3 求符号函数的值。已知片内RAM的40H单元内有一自变量X,编制程序按如下条件求函数Y的值,并将其存入片内RAM的41H单元中。见P65,1 X0,0 X=0,-1 X0,Y =,ORG 1000H START: MOV A, 40H ; 将X送入A中 JZ COMP ; 若A为0,转至COMP处 JNB ACC.7, POST ; 若A第7位不为1(X为正数), ;则程序转到 POST处, ;否则(X为负数)程序往下执行 MOV A, #0FFH ; 将1(补码)送入A中 SJMP COMP ; 程序转到COMP处 POST: MOV A, #01H ; 将+1送入A中 COMP: MOV 41H, A ; 结果存入Y SJMP $ ; 程序执行完,“原地踏步” END,补充举例:假定在外部RAM中有ST1、ST2、ST3共3个连续单元,其中ST1和ST2单元中分别存放着两个8位无符号二进制数,要求 找出其中的大数并存入ST3单元中。,MOV A,R2,一、 单重循环程序,例4.3.5 已知片内RAM30H3FH单元中存放了16个二进制无符号数,编制程序求他们的累加和,并将其和数存放在R4,R5中(R4存高8位,R5存低8位)。见P69,ORG 1000H START: MOV R0, #30H MOV R2, #10H ; 设置循环次数(16) MOV R4, #00H ; 和高位单元R4清0 MOV R5, #00H ; 和低位单元R5清0 LOOP: MOV A, R5 ; 和低8位的内容送A ADD A, R0 ; 将R0与R5的内容相加 MOV R5, A ; 低8位的结果送R5 CLR A ; A清0 ADDC A, R4 ; 将R4的内容和Cy相加 MOV R4, A ; 高8位的结果送R4 INC R0 ; 地址递增(加1) DJNZ R2, LOOP ; 若循环次数减1不为0,则转 ;到LOOP处循环,否则,循环结束 SJMP $ END,例4.3.6 编制程序将片内RAM的30H4FH单元中的内容传送至片外RAM的2000H开始的单元中。(见P70),程序如下: ORG 1000H START: MOV R0, #30H MOV DPTR, #2000H MOV R2, #20H ; 设置循环次数 LOOP: MOV A, R0 ; 将片内RAM数据区内容送A MOVX DPTR, A ; 将A的内容送片外 ;RAM数据区 INC R0 ; 源地址递增 INC DPTR ; 目的地址递增 DJNZ R2, LOOP ; 若R2的不为0,则转到 ;LOOP处继续循环,否则循环结束 SJMP $ END,2、较长时间的定时程序,较长时间的定时,通常采用多重循环的方法,1个机器周期,1个机器周期,2个机器周期,4个机器周期,最大定时时间计算公式为:,(4256+2+1)2562s2s+2 s=525828(s),2个机器周期,1个机器周期,1个机器周期,1个机器周期,sbit位类型符用于定义在可位寻址字节或特殊功能寄存器中的位,定义时须指明其位地址,可以是位直接地址,可以是可位寻址变量带位号,也可以是特殊功能寄存器名带位号。格式如下: sbit 位变量名=位地址; 1、位地址为位直接地址,其取值范围为0x000xff; 2、位地址是可位寻址变量带位号或特殊功能寄存器名带位号,则在它前面须对可位寻址变量或特殊功能寄存器进行定义。 Note:字节地址与位号之间、特殊功能寄存器与位号之间一般用“”作间隔。,【例5-5】sbit型变量的定义。 sbit OV=0xd2; sbit CY=0xd7; unsigned char bdata flag; sbit flag0=flag0; sfr P1=0x90; sbit P1_0=P10; sbit P1_1=P11; sbit P1_2=P12; sbit P1_3=P13; sbit P1_4=P14; sbit P1_5=P15; sbit P1_6=P16; sbit P1_7=P17;,3 中断方式,单片机的中断为固定入口式中断,即一响应中断就转入固定入口地址执行中断服务程序。具体入口如下: 编号 中断源 中断向量(汇编) C语言 0 INT0 0003 interrupt 0 1 T0 000BH interrupt 1 2 INT1 0013H interrupt 2 3 T1 001BH interrupt 3 4 RI/TI 0023H interrupt 4 在这些单元中往往是一些跳转指令,跳到真正的中断服务程序,这是因为给每个中断源安排的空间只有8个单元。,51系列单片机的5个中断源的中断服务入口地址之间相差8个单元。这8个存储单元用来存储中断服务程序一般来说是不够的。用户常在中断服务程序地址入口处放一条三字节的长转移指令。一般地,主程序从0030H单元以后开始存放。例如: ORG 0000H LJMP START ; 转入主程序,START为主程序地址标号 ORG 0003H LJMP INT0 ; 转外中断中断服务程序 ORG 000BH LJMP T0 ; 转定时器T0中断服务程序 ORG 0030H START: ; 主程序开始,例6.1.2 在图6.1.6中,P1.0P1.3接有4个开关,P1.4P1.7接有4个发光二极管,消抖电路用于产生中断请求信号,当消抖电路的开关来回拨动一次将产生一个下跳变信号,向CPU申请中断。要求:初时发光二极管全黑,每中断一次,P1.0P1.3所接的开关状态反映到发光二极管上,且要求开关合上时对应发光二极管亮。,解:汇编程序如下: ORG 0000H AJMP MAIN ORG 0003H ;外部中断0入口 AJMP SER_INT0 ;转中断服务程序 ORG 0100H ;主程序 MAIN: MOV P1 , #0FH ;熄灭发光二极管且对开关输入端先输出1 SETB IT0 ;脉冲触发方式 SETB EX0 ;允许中断 SETB EA ;总中断允许 AJMP $ ;等待中断,SER_INT0: MOV P1 , #0FH ;熄灭发光二极管且对开关输入端先输出1 MOV A , P1 ;输入开关状态 CPL A ;状态取反 ANL A , #0FH ;屏蔽A的高半字节 SWAP A ;A高低半字节交换 MOV P1 , A ;开关状态输出 RETI ;中断返回,每次单纯重置一次4个开关的开、合状态,4个发光二极管维持原来的亮、灭状态,仅当来回拨动消抖开关后,产生了中断,发光二极管才反映新置的开关状态。,该例子的执行结果是:,#include void int0() interrupt 0 /*中断函数*/ P1=0x0f ; /*熄灭发光二极管且对开关输入端先输出1*/ P1=4; /*读入开关状态,并左移四位,使开关反映在发光二极管上*/ P1 P1; /*对P1口内容取反*/ main() /*主函数 EA=1; /*开中断总开关*/ EX0=1; /*允许中断*/ IT0=1; /*负跳沿产生中断*/ while(1) /*等待中断*/ ,C语言程序如下:,补2: 通过外部中断控制八盏灯循环点亮。 解:通过P1口扩展八盏灯,在 INT1引脚(P3.3)接一个按钮开关到地,每按一下按钮就申请一次中断,点亮一盏灯,中断服务则是:依次点亮八盏灯中的一盏。采用边沿触发。硬件电路如下图所示。,程序如下: C源程序见int1.c ORG 0000H LJMP MAIN ORG 0013H ; 中断服务程序入口地址 LJMP IN11 MAIN:SETB EA ; 开总中断允许“开关” SETB EX1 ; 开分中断允许“开关” CLR PX1 ; 低 优先级(也可不要此句) SETB IT1 ; 边沿触发 MOV A , #01H ; 给累加器A赋初值 SJMP $ ; 原地等待中断申请 IN11:RL A ; 左环移一次 MOV P1,A ; 输出到P1口 RETI ; 中断返回 END,3 定时器计数器的控制,与定时器计数器有关的控制寄存器有:,1定时器控制寄存器TCON,中断请求标志,触发方式选择,启动定时/计数器,0 低电平1 下降沿,0 停止 1 启动,2工作方式控制寄存器TMOD,C1/T1控制,C0/T0控制,GATE门控位 GATE=0 以运行控制位TR启动定时器 GATE=1 以外中断请求信号(高电平)启动定时器,M1 M0工作方式选择,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=2000 X216-2000 0F830H 所以,初值为: TH0=0F8H,TL0=30H, 采用中断方式:编程时打开全局和局部中断。, 由定时器控制寄存器TCON中的TR0位控制定时器的启动和停止。 TR01,启动; TR00,停止。,ORG 0000H LJMP MAIN ;主程序入口 ORG 000BH LJMP T0INT ;T1中断入口,汇编程序设计,T0INT: MOV TH0,#0F8H ;重新设置初值 MOV TL0,#30H CPL P1.0 ;输出取反 RETI END,ORG 0030H MAIN:MOV TMOD, #01H ;T0为方式1 MOV TH0, #0F8H MOV TL0,#30H ;初值 CLR P1.0 SETB EA ;允许中断 SETB ET0 SETB TR0 ;启动定时 SJMP $ ;等待中断,主程序:,中断处理程序:,#include sbit P1_0=P10; void timer1(void) interrupt 1 using 1 P1_0=!P1_0; TH0= 0xF8; TL0 = 0X30; void main(void) TMOD=0x01; P1_0=0; TH0= 0xF8; TL0 = 0X30; EA=1; ET0=1; TR0=1; while (1); ,C程序设计 中断方式,(2)采用查询方式编程 汇编程序: ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV TMOD ,#01H ;写入方式控制字 MOV TH0 , #0F8H ;写入计数初值 MOV TL0 , #30H SETB TR0 ;启动T0定时 LOOP: JBC TF0 ,NEXT ;查询定时时间到否? SJMP LOOP NEXT: MOV TH0 , #0F8H ;重新写入计数初值 MOV TL0 , #30H CPL P1.0 ;输出取反 SJMP LOOP ;重复循环 END,(2)采用查询方式编程 汇编程序: ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV TMOD ,#01H MOV TH0 , #0F8H MOV TL0 , #30H SETB TR0 LOOP: JBC TF0 ,NEXT SJMP LOOP NEXT: MOV TH0 , #0F8H MOV TL0 , #30H CPL P1.0 SJMP LOOP END,(1)采用中断方式编程 汇编程序: ORG 0000H LJMP MAIN ORG 000BH AJMP SER_T0 ORG 0100H MAIN: MOV TMOD , #01H MOV TH0 , #0F8H MOV TL0 , #30H SETB EA SETB ET0 SETB TR0 SJMP $ SERT0: MOV TH0 , #0F8H MOV TL0 , #30H CPL P1.0 RETI END,#include sbit P1_0=P10; void main(void) TMOD=0x01; P1_0=0; TH0= 0xFF; TL0 = 0X83; TR0=1; while (1) if(TF0 =1) TF0 = 0; P1_0=!P1_0; TH0= 0xFF; 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 中断服务程序流程图,汇编程序: ORG 0000H LJMP MAIN ORG 001BH AJMP SER_T1 ORG 0100H MAIN: MOV TMOD , #20H ;写入方式控制字 MOV TH0 , #06H ;写入计数初值 MOV TL0 , #06H MOV R7 , #00H ;中断次数初值 SETB P1.0 SETB EA ;开总中断 SETB ET1 ;开T1中断 SETB TR1 ;启动T1 SJMP $ ;等待中断 SER_T1: INC R7 ;中断次数加1 CJNE R7 , #60,LOOP1 CLR P1.0 ;中断次数到120次即高电平时间到输出0 AJMP LOOP LOOP1: CJNE R7 , #200,LOOP SETB P1.0 ;中断次数到400次即周期到输出1 MOV R7 , #00H LOOP: RETI END,C语言程序: #include #define uchar unsigned char uchar time=0; uchar period=200; uchar high=60; main () TMOD=0x20; TH0=0x06; TL0=0x06; EA=1; ET1=1; TR1=1; P1.0=1; while (1); ,timer1 () interrupt 3 if (+time=high) P1.0=0; else if (time=period) time=0; P1.0=1; ,1)SCON - 可位寻址的串行口控制寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志:,2 80C51串行口寄存器,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.3 80C51串行口的工作方式,一、方式0 方式0时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接收均为8位数据,低位在先,高位在后。波特率固定为fosc/12。,1、方式0发送过程: 在TI=0时,当CPU执行一条向SBUF写数据的指令时,如 MOV SBUF,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 -,2SMOD fosc 32 波特率 12, 波特率 =,2SMOD fosc 32 12(256 - X),其中:X 是定时器初值, 例 用T1工作于方式2来产生波特率1200, 已知晶振频率=6MHz。要求出T1的初值:,初值 X = 28 -,20 6106 32 1200 12,= 256 - = 256 - 13.02,6106 460800, 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 #define COM8255 XBYTE0xe003/ 定义8255控制寄存器地址 #define uchar unsigned char void init8255(void) COM8255=0x80; /*工作方式选择字送入8255控制寄存器,设置A、B、C口均为基本I/O输出方式 */ , A口与上C口为基本I/O输出方式,B口与下C口为基本I/O输入方式。,#include #define COM8255 0xe003 /*定义8255控制寄存器地址 */ void init8255(void) XBYTE COM8255=0x83; /*工作方式选择字送入8255 控制寄存器,设置A、C口为 基本I/O输出方式,B、C 口为基本I/O输入方式*/ , A口为应答I/O输入方式,B口为应答I/O输出方式。,uchar xdata COM8255 _at_ 0xe003; /*定义8255控制寄存器地址*/ void init8255(void) COM8255=0xb4; /*工作方式选择字送入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!=0xFF) P1+; /这里假设P1口接数据输入 Else Break; While(1) If(P1!=0x00) P1-; /这里假设P1口接数据输入 Else Break; ,ADC0809的工作流程如图所示:,1输入3位地址,并使ALE=1,将地址存入地址锁存器中,经地址译码器译码从8路模拟通道中选通一路模拟量送到比较器。 2送START一高脉冲,START的上升沿使逐次逼近寄存器复位,下降沿启动A/D转换,并使EOC信号为低电平。 3当转换结束时,转换的结果送入到输出三态锁存器,并使EOC信号回到高电平,通知CPU已转换结束。 4CPU使OE为高电平,从输出端D0D7读入数据。,三ADC0809的工作流程,2. ADC0809的接口(模拟时序方式)和编程,#define ALE P2_4 #define START P2_5 #define OE P2_6 #define EOC P2_7,#include #include ,unsigned char adc_0809(unsigned char chanel) /地址信息放在chanel变量中 unsigned char dd; /临时变量 P2 /返回转换值 ,8031,WR,P2.7,P0,DI7DI0,CS,XFER,WR1,WR2,DAC0832,IOUT2,IOUT1,+,-,RFR,DAC0832单缓冲方式接口电路,ILE,+5V,【补充举例1】 利用单缓冲方式(总线方式),编程从DAC0832输出端分别产生锯齿波、三角波和方波。,分析:根据单缓冲方式图的连接,DAC0832的口地址为7FFFH。,汇编语言编程: 锯齿波 MOV DPTR,#7FFFH CLR A LOOP:MOVX DPTR,A INC A SJMP LOOP,三角波: MOV DPTR,#7FFFH CLR A LOOP1:MOVX DPTR,A INC A CJNE A,#0FFH,LOOP1 LOOP2:MOVX DPTR,A DEC A JNZ LOOP2 SJMP LOOP1,方波: MOV DPTR,#7FFFH LOOP:MOV A,#00H MOVX DPTR,A ACALL DELAY MOV A,#FFH MOVX DPTR,A ACALL DELAY SJMP LOOP DELAY:MOV R7,#0FFH DJNZ R7,$ RET,C语言编程: 锯齿波: #include /定义绝对地址访问 #define uchar unsigned char #define DAC0832 XBYTE0x7FFF void main() uchar i; while(1) for (i=0;i0xff;i+) DAC0832=i; ,三角波: #include /定义绝对地址访问 #define uchar unsigned char #define DAC0

温馨提示

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

评论

0/150

提交评论