为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

嵌入式系统与最新单片机 - 北京科技大学

2023-02-26 30页 ppt 1MB 3阅读

用户头像 个人认证

is_428829

暂无简介

举报
嵌入式系统与最新单片机 - 北京科技大学嵌入式系统与单片机北京科技大学电子信息系PIC单片机部分主要内容PIC单片机微处理器体系结构PIC单片机存储器组织与寻址方式PIC单片机指令系统与汇编语言集成开发环境MPLAB_IDEPIC单片机常用的周边功能模块参考书1刘和平主编,单片机原理及应用,重庆大学出版社,2002年(www.toopoo.com)2刘和平等编著,PIC16F87X单片机实用软件与接口技术,北航出版社,2002年3刘笃仁著.PIC软硬件系统设计.北京:电子工业出版社,2004年4李学海编,PIC单片机实用教程(基础篇、提高篇),北航出版社,2002年...
嵌入式系统与最新单片机 - 北京科技大学
嵌入式系统与单片机北京科技大学电子信息系PIC单片机部分主要内容PIC单片机微处理器体系结构PIC单片机存储器组织与寻址方式PIC单片机指令系统与汇编语言集成开发环境MPLAB_IDEPIC单片机常用的周边功能模块参考书1刘和平主编,单片机原理及应用,重庆大学出版社,2002年(www.toopoo.com)2刘和平等编著,PIC16F87X单片机实用软件与接口技术,北航出版社,2002年3刘笃仁著.PIC软硬件系统设计.北京:电子工业出版社,2004年4李学海编,PIC单片机实用教程(基础篇、提高篇),北航出版社,2002年第四讲PIC单片机指令系统与汇编语言PIC系列单片机的指令系统PIC系列单片机的汇编语言一、PIC系列单片机的指令系统一种单片机所能识别的全部指令的集合称为该单片机的指令系统。不同厂家生产的单片机,或者基于不同CPU内核的单片机,一般具有不同的指令系统。开发嵌入式单片机系统离不开汇编语言,由于汇编语言直接与硬件打交道,因此对于底层的开发或实时性要求很高的场合,必须要用汇编语言。而掌握好每一条指令又是熟练应用汇编语言进行开发的关键。一、PIC系列单片机的指令系统PIC系列单片机的指令格式:4种面向字节的文件寄存器操作指令d=0时:目标寄存器为Wd=1时:目标寄存器为ff=7位文件寄存器地址一、PIC系列单片机的指令系统PIC系列单片机的指令格式:4种面向位的文件寄存器操作指令b=3位二进制位地址f=7位文件寄存器地址一、PIC系列单片机的指令系统PIC系列单片机的指令格式:4种一般立即数和控制操作指令k=8位立即数一、PIC系列单片机的指令系统PIC系列单片机的指令格式:4种CALL和GOTO指令k=11位立即数一、PIC系列单片机的指令系统PIC系列单片机的指令集:35条指令:Easytolearn:易学Highcompaction:高效Verypowerfulsingle-wordinstructions:单字Upwardcompatibilityofinstructions:向上兼容一、PIC系列单片机的指令系统PIC系列单片机的指令集:35条PIC16F87X系列单片机采用14位的精简指令集(RISC),共有35条指令。整个指令集根据操作方式的不同,分为如下四类:(1)字节操作类指令18条(2)位操作类指令4条(3)立即数操作类指令6条(4)控制操作类指令7条PIC系列单片机的指令集——字节操作类指令18条PIC系列单片机的指令集——字节操作类指令18条P16F877A.INC;-----RegisterDefinitions------------------------------------------WEQUH'0000'FEQUH'0001';-----RegisterFiles--------------------------------------------------INDFEQUH'0000'TMR0EQUH'0001'PCLEQUH'0002'STATUSEQUH'0003'FSREQUH'0004'PORTAEQUH'0005'PORTBEQUH'0006'PORTCEQUH'0007'PORTDEQUH'0008'PORTEEQUH'0009'…………PIC系列单片机的指令集——字节操作类指令18条14-bit字节操作类指令格式OPCODEdfffffffd=目的位d=0目的操作数是Wd=1目的操作数是Ff=7-bit寄存器地址Example:ADDWFREG,WADDWFf,dNOP-MOVWFfCLRW-CLRFfSUBWFf,dDECFf,dIORWFf,dANDWFf,dXORWFf,dADDWFf,dMOVFf,dCOMFf,dINCFf,dDECFSZf,dRRFf,dRLFf,dSWAPFf,dINCFSZf,d字节操作类指令PIC系列单片机的指令集——字节操作类指令18条1NOPNoOperation语法:NOP操作数:None操作:Nooperation影响状态位:None机器码:00000000000000指令字数:1指令周期:1Example:NOPPIC系列单片机的指令集——字节操作类指令18条2MOVWFMoveWtof语法:MOVWFf操作数:0<=f<=127操作:(W)→(f)影响状态位:None机器码:0000001fffffff指令字数:1指令周期:1Example:MOVWFFSR指令执行前:FSR=0xFFW=0x4F指令执行后:FSR=0x4FW=0x4FPIC系列单片机的指令集——字节操作类指令18条3CLRWClearW语法:CLRW操作数:None操作:00h→(W)1→Z影响状态位:Z机器码:00000100000000指令字数:1指令周期:1Example:CLRW指令执行前:W=0x4F指令执行后:W=0x00Z=1PIC系列单片机的指令集——字节操作类指令18条4CLRFClearf语法:CLRFf操作数:0<=f<=127操作:00h→(f)1→Z影响状态位:Z机器码:0000011fffffff指令字数:1指令周期:1Example:CLRFFSR指令执行前:FSR=0x4F指令执行后:FSR=0x00Z=1PIC系列单片机的指令集——字节操作类指令18条5SUBWFSubtractWfromf语法:SUBWFf,d操作数:0<=f<=127d={0,1}操作:(f)-(W)→dest影响状态位:C,DC,Z机器码:000010dfffffff指令字数:1指令周期:1Example:SUBWFFSR,W指令执行前:FSR=0x03W=0x02C=?Z=?指令执行后:FSR=0x03W=0x01C=1Z=0PIC系列单片机的指令集——字节操作类指令18条6DECFDecrementf语法:DECFf,d操作数:0<=f<=127d={0,1}操作:(f)-1→dest影响状态:Z机器码:000011dfffffff指令字数:1指令周期:1Example:DECFFSR,F指令执行前:FSR=0x01Z=0指令执行后:FSR=0x00Z=1PIC系列单片机的指令集——字节操作类指令18条7IORWF语法:IORWFf,d操作数:0<=f<=127d={0,1}操作:(W)OR(f)→dest影响状态:Z机器码:000100dfffffff指令字数:1指令周期:1Example:IORWFRESULT,0指令执行前:RESULT=0x13W=0x91指令执行后:RESULT=0x13W=0x93Z=0PIC系列单片机的指令集——字节操作类指令18条8ANDWF语法:ANDWFf,d操作数:0<=f<=127d={0,1}操作:(W)AND(f)→dest影响状态:Z机器码:000101dfffffff指令字数:1指令周期:1Example:ANDWFFSR,1BeforeInstruction:W=0x17FSR=0xC2AfterInstruction:W=0x17FSR=0x02PIC系列单片机的指令集——字节操作类指令18条9XORWF语法:XORWFf,d操作数:0<=f<=127d={0,1}操作:(W)XOR(f)→dest影响状态:Z机器码:000110dfffffff指令字数:1指令周期:1Example:XORWFREG,1BeforeInstruction:REG=0xAFW=0xB5AfterInstruction:REG=0x1AW=0xB5PIC系列单片机的指令集——字节操作类指令18条10ADDWF语法:ADDWFf,d操作数:0<=f<=127d={0,1}操作:(W)+(f)→dest影响状态:C、DC、Z机器码:000111dfffffff指令字数:1指令周期:1Example:ADDWFFSR,0BeforeInstruction:W=0x17FSR=0xC2AfterInstruction:W=0xD9FSR=0xC2PIC系列单片机的指令集——字节操作类指令18条11MOVFMovef语法:MOVFf,d操作数:0<=f<=127d={0,1}操作:(f)→dest影响状态:Z机器码:001000dfffffff指令字数:1指令周期:1Example1:MOVFFSR,FBeforeInstruction:FSR=0x00Z=0AfterInstructionFSR=0x00Z=1Example2:MOVFH’55,WAfterInstruction:W=H’55PIC系列单片机的指令集——字节操作类指令18条Example:COMFREG,0BeforeInstruction:REG=0x13AfterInstruction:REG=0x13W=0xEC12COMF语法:COMFf,d操作数:0<=f<=127d={0,1}操作:(f)→dest影响状态:Z机器码:001001dfffffff指令字数:1指令周期:1PIC系列单片机的指令集——字节操作类指令18条13INCF语法:INCFf,d操作数:0<=f<=127d={0,1}操作:(f)+1→dest影响状态:Z机器码:001010dfffffff指令字数:1指令周期:1Example:INCFCNT,1BeforeInstruction:CNT=0xFFZ=0AfterInstruction:CNT=0x00Z=1PIC系列单片机的指令集——字节操作类指令18条14DECFSZDec.f,Skipif0语法:DECFSZf,d操作数:0<=f<=127d={0,1}操作:(f)-1→dest如果result=0,则跳过一句影响状态:None机器码:001011dfffffff指令字数:1指令周期:1(2)Example:LoopDECFSZCNT,FGOTOLoopContinue……BeforeInstruction:PC=addressLoopAfterInstruction:CNT=CNT-1ifCNT=0,PC=addressContinueelseCNT!=0,PC=addressLoop+1PIC系列单片机的指令集——字节操作类指令18条15RRFf寄存器带进位循环右移语法:RRFf,d操作数:0<=f<=127d={0,1}操作:影响状态:C机器码:001100dfffffff指令字数:1指令周期:1Example:RRFCNT,WBeforeInstruction:CNT=11100110C=0AfterInstruction:CNT=11100110W=01110011C=0CRegisterfPIC系列单片机的指令集——字节操作类指令18条16RLFf寄存器带进位循环左移语法:RLFf,d操作数:0<=f<=127d={0,1}操作:影响状态:C机器码:001101dfffffff指令字数:1指令周期:1Example:RLFREG,0BeforeInstruction:REG=11100110C=0AfterInstruction:REG=11100110W=11001100C=1CRegisterfPIC系列单片机的指令集——字节操作类指令18条17SWAPFf半字节交换语法:SWAPFf,d操作数:0<=f<=127d={0,1}操作:(f<3:0>)→目标寄存器<7:4>(f<7:4>)→目标寄存器<3:0>影响状态:无机器码:001110dfffffff指令字数:1指令周期:1Example:SWAPFREG,0BeforeInstruction:REG=0xA5AfterInstruction:REG=0xA5W=0x5APIC系列单片机的指令集——字节操作类指令18条18INCFSZ语法:INCFSZf,d操作数:0<=f<=127d={0,1}操作:(f)+1→dest,结果为0则间跳影响状态:无机器码:001111dfffffff指令字数:1指令周期:1(2)Example:HEREINCFSZCNT,1GOTOLOOPCONTINUE…情况1:指令执行前:PC=地址HERECNT=0xFF执行后:CNT=0x00PC=地址CONTINUE情况2:指令执行前:PC=地址HERECNT=0x00执行后:CNT=0x01PC=地址HERE+1PIC系列单片机的指令集——位操作类指令4条PIC系列单片机的指令集——位操作类指令4条14-bit位操作类指令格式OPCODEbfffffffb=3-BitAddress(位地址)f=7-bitRegisterAddress(文件寄存器地址)bbExample:BTFSCSTATUS,CBTFSCf,bBCFf,bBSFf,bBTFSCf,bBTFSSf,b位操作类指令所有位操作指令将首先读整个寄存器的内容,然后在选择的位上进行操作,最后将结果写回(读-修改-写(R-M-W))指定寄存器。PIC系列单片机的指令集——位操作类指令4条1BCF寄存器f的第b位清零语法:BCFf,b操作数:0<=f<=1270<=b<=7操作:0→(f)影响状态:None机器码:0100bbbfffffff指令字数:1指令周期:1Example:BCFFSR,4BeforeInstruction:FSR=00110000AfterInstruction:FSR=00100000PIC系列单片机的指令集——位操作类指令4条2BSF寄存器f的第b位置1语法:BSFf,b操作数:0<=f<=1270<=b<=7操作:1→(f)影响状态:None机器码:0101bbbfffffff指令字数:1指令周期:1Example:BSFFSR,2BeforeInstruction:FSR=00110000AfterInstruction:FSR=00110100PIC系列单片机的指令集——位操作类指令4条3BTFSC语法:BTFSCf,b操作数:0<=f<=1270<=b<=7操作:skipif(f)=0影响状态:None机器码:0110bbbfffffff指令字数:1指令周期:1(2)Example:HEREBTFSCFLAG,4FALSEGOTOPR_CODETRUE…情况1:执行前:PC=地址HEREFLAG=xxx0xxxx执行后:PC=地址TRUE情况2:执行前:PC=地址HEREFLAG=xxx1xxxx执行后:PC=地址FALSEPIC系列单片机的指令集——位操作类指令4条4BTFSS语法:BTFSSf,b操作数:0<=f<=1270<=b<=7操作:skipif(f)=1影响状态:None机器码:0111bbbfffffff指令字数:1指令周期:1(2)Example:HEREBTFSSFLAG,4FALSEGOTOPR_CODETRUE…情况1:执行前:PC=地址HEREFLAG=xxx0xxxx执行后:PC=地址FALSE情况2:执行前:PC=地址HEREFLAG=xxx1xxxx执行后:PC=地址TRUEPIC系列单片机的指令集——立即数操作类指令6条k14-bit立即数操作类指令格式OPCODEkkkkkkkk=8-bit立即数Example:MOVLW0x2FMOVLWkMOVLWkIORLWkADDLWkSUBLWkANDLWkXORLWk立即数操作类指令PIC系列单片机的指令集——立即数操作类指令6条1MOVLW8位立即数移入W语法:MOVLWk操作数:0<=k<=255操作:k→(W)影响状态:None机器码:110000kkkkkkkk指令字数:1指令周期:1Example:MOVLW0x5AAfterInstruction:W=0x5APIC系列单片机的指令集——立即数操作类指令6条2IORLW8位立即数与W相或语法:IORLWk操作数:0<=k<=255操作:(W)ORk→(W)影响状态:Z机器码:111000kkkkkkkk指令字数:1指令周期:1Example:IORLW0x35BeforeInstruction:W=0x9AAfterInstruction:W=0xBFZ=0PIC系列单片机的指令集——立即数操作类指令6条3ADDLW8位立即数与W相加语法:ADDLWk操作数:0<=k<=255操作:(W)+k→(W)影响状态:C、DC、Z机器码:11111xkkkkkkkk指令字数:1指令周期:1Example:ADDLW0x15BeforeInstruction:W=0x10AfterInstruction:W=0x25PIC系列单片机的指令集——立即数操作类指令6条4SUBLW8位立即数与W相减语法:SUBLWk操作数:0<=k<=255操作:k-(W)→(W)影响状态:C、DC、Z机器码:11110xkkkkkkkk指令字数:1指令周期:1Example:SUBLW0x02BeforeInstruction:W=0x01C=xZ=xAfterInstruction:W=0x01C=1;结果为正Z=0PIC系列单片机的指令集——立即数操作类指令6条5ANDLW8位立即数与W相与语法:ANDLWk操作数:0<=k<=255操作:(W)ANDk→(W)影响状态:Z机器码:111001kkkkkkkk指令字数:1指令周期:1Example:ANDLW0x5FBeforeInstruction:W=0xA3AfterInstruction:W=0x03PIC系列单片机的指令集——立即数操作类指令6条6XORLW8位立即数与W相异或语法:XORLWk操作数:0<=k<=255操作:(W)XORk→(W)影响状态:Z机器码:111010kkkkkkkk指令字数:1指令周期:1Example:XORLW0xAFBeforeInstruction:W=0xB5AfterInstruction:W=0x1AZ=0PIC系列单片机的指令集——控制操作类指令7条k14-bitRETLW指令格式OPCODEkkkkkkkk=8-bit立即数SLEEP-CLRWDT-RETLWkRETFIE-RETURN-CALLkGOTOk控制操作类指令14-bitCALL、GOTO指令格式OPCODEk=11-bit立即数kkkkkkkkkkkPIC系列单片机的指令集——控制操作类指令7条Example:SLEEPPIC系列单片机的指令集——控制操作类指令7条PIC系列单片机的指令集——控制操作类指令7条3RETLW返回且立即数入W语法:RETLWk操作数:0<=k<=255操作:k→(W)TOS(栈顶)→PC影响状态:None机器码:1101xxkkkkkkkk指令字数:1指令周期:2Example:movlwHIGHDecodemovwfPCLATHmovfB’00000101,WHEREcallDecodemovwfPORTBgotoContinueDecodeaddwfPCL,FretlwB’00111111’;decode0retlwB’00000110’;decode1retlwB’01011011’;decode2retlwB’01001111’;decode3retlwB’01100110’;decode4retlwB’01101101’;decode5retlwB’01111101’;decode6Continueretlw指令执行前:W=B’00000101retlw指令执行后:W=B’01101101PCL=TOS=HERE地址+1PIC系列单片机的指令集——控制操作类指令7条4RETFIE中断返回语法:RETFIE操作数:None操作:TOS→PC1→GIE;全局中断允许位影响状态:None机器码:00000000001001指令字数:1指令周期:2Example:RETFIE执行后:PC=TOSGIE=1TOS:(TopOfStack)栈顶PIC系列单片机的指令集——控制操作类指令7条5RETURN子程序返回语法:RETFIE操作数:None操作:TOS→PC影响状态:None机器码:00000000001000指令字数:1指令周期:2Example:HERERETURN执行后:PC=TOSPIC系列单片机的指令集——控制操作类指令7条6CALL调用子程序语法:CALLk操作数:0<=k<=2047操作:(PC)+1→TOSk→PC<10:0>(PCLATH<4:3>)→PC<12:11>影响状态:None机器码:100kkkkkkkkk指令字数:1指令周期:2Example:HERECALLTHERE指令执行前:PC=地址HERE指令执行后:PC=地址THERETOS=地址HERE+1PIC系列单片机的指令集——控制操作类指令7条7GOTO无条件转移指令语法:GOTOk操作数:0<=k<=2047操作:k→PC<10:0>PCLATH<4:3>->PC<12:11>影响状态:None机器码:101kkkkkkkkkkk指令字数:1指令周期:2Example:GOTOTHEREAfterInstruction:PC=地址THERE二、PIC系列单片机的汇编语言下面是一个简单的汇编语言源程序例子。#include“p16f877a.inc”Destequ0x20;定义常量org0x0000;复位向量gotoStartorg0x0020;程序开始处StartmovlwB’00001010’;二进制数00001010→wmovwfDest;w→DestbcfDest,3;将Dest的bit3位清零gotoStartend二、PIC系列单片机的汇编语言用MPASM对源程序进行汇编时,汇编语言语句格式由以下几部分构成:#include“p16f877a.inc”……StartmovlwB’00001010’;二进制数00001010→w……1标号2操作码3操作数4注释5包含文件二、PIC系列单片机的汇编语言5包含文件汇编器包含(头)文件是指任何包含有效汇编代码的文件。通常,该文件包含特定器件的寄存器和位分配。该文件可以被“包含”在代码中,从而可以被很多程序重复使用。例如,如果要将PIC16F877A器件的标准头文件添加到汇编代码中,则使用如下语句:#include“p16f877a.inc”标准头文件位于:C:\ProgramFiles\Microchip\MPLABASM30Suite\Support\inc目录下。二、PIC系列单片机的汇编语言P16F877A.INC;-----RegisterDefinitions------------------------------------------WEQUH'0000'FEQUH'0001';-----RegisterFiles--------------------------------------------------INDFEQUH'0000'TMR0EQUH'0001'PCLEQUH'0002'STATUSEQUH'0003'FSREQUH'0004'PORTAEQUH'0005'PORTBEQUH'0006'PORTCEQUH'0007'PORTDEQUH'0008'PORTEEQUH'0009'…………伪指令伪指令是出现在源代码中的汇编器命令,但是通常不被直接编译为操作码。它们用于控制汇编器的输入、输出和数据分配。#define——定义文本替换标号语法:#definename[string]描述:定义一个文本替换字符串。在汇编代码中的任何位置遇到name时,它将会被string替换。#define用于定义程序中常数的值。例:#definelength20#include——包含额外的源文件语法:#include“include_file”;从引号中指定的文件路径(或当前;目录)下寻找该文件,或者:#include;去默认的路径下寻找该文件描述:将指定文件作为源代码读取到源程序中。例:#include;把预定义的PIC16F877A;寄存器符号包含到此处#include“math.asm”;把现有的程序文件包含进来作为;源代码的一部分。end——结束程序块语法:end描述:表示程序的结束。用于通知MPASM汇编程序结束对源程序的汇编。如果end后面还有语句,将被忽略。equ——定义一个汇编器常数语法:labelequexpr描述:expr的值被赋值给label,equ通常用于将变量名称分配给RAM中的地址单元。例:WEQUH'0000'FEQUH'0001’INDFEQUH'0000'TMR0EQUH'0001'org——设置程序起始地址语法:[label]orgexpr描述:将其后代码的程序起始处设置在由expr定义的地址。如果未指定org伪指令,将从地址0开始存放代码。例:#includep16f877a.inc;org0x0000gotoMainorg0x0004gotoint_routineorg0x0010Main……banksel——生成存储区选择代码语法:banksellabel描述:用来指示汇编器和链接器生成存储区选择代码,以便将存储区设置为包含指定label的存储区。说明:label标号必须在之前已定义,一次只能指定一个标号。例:#includep16f877a.inc;包含标准头文件,以选择设备bankselTRISB;定位存储区为bank1,缺省为bank0clrfTRISB;设置PORTB口为输出口bankselPORTB;返回bank0存储区,因为PORTB端口寄;存器在此区域#include“p16f877a.inc”Destequ0x20;定义常量org0x0000;复位向量gotoStartorg0x0020;程序开始处StartmovlwB’00001010’;二进制数00001010→wmovwfDest;w→DestbcfDest,3;将Dest的bit3位清零gotoStartend数据传送示意图单片机的开发和应用的主要任务有两项:一是硬件设计,二是软件设计。软件设计实际上就是运用指令编写程序。PIC单片机的指令作用范围非常集中,作用的对象主要就是数据存储器中的各个寄存器单元。单片机的工作就是用一条条的指令指挥各部分硬件的动作,这种指挥就是通过给特殊功能寄存器填写相应的内容来实现的。内核—寄存器—外围模块相互关系内核与寄存器之间存在着灵活的软件上的对应关系,而寄存器与外围模块之间存在着固定的硬件上的映射关系。特殊功能寄存器在中间起着桥梁的作用。各个外围模块从外部世界采集的现场信息,经过硬件电路立即反映到与自己对应的特殊功能寄存器上。CPU通过执行指令从该寄存器里获取相应的信息。相反,CPU通过填写与某一外围模块对应的特殊功能寄存器单元,由该寄存器单元经过硬件电路将控制信息映射到外围模块上,再由外围模块驱动外接电路完成相应的动作,从而将CPU的命令落到实处。我们在用指令编写程序时,不仅应搞清楚指令中每条指令的功能,还应弄清楚特殊功能寄存器与外围模块或功能部件之间的对应关系。RB0RB1RB2RB3RB4RB5RB6bcdefgaRA4RB0RB1RB2RB3RB4RB5RB6bcdefgaRA4RB0RB1RB2RB3RB4RB5RB6bcdefgaRA4链接:第六讲PIC单片机常用的周边功能模块#INCLUDEp16F877A.inc;IncludethestandarddefinitionsclrfPORTB;初始化PORTB,所有LED全部熄灭BANKSELTRISB;选择TRISB(86h)寄存器所在的数据存储体;(bank1)clrfTRISB;ClearTRISB设置PORTB引脚为输出movlwB'00010000’;w=00010000,movwfTRISA;TRISA=w=00010000,使RA4=1,设置A口;的RA4引脚为输入,以接受按键,A口其余;引脚为输出(多余,默认)movlwH'07‘;w=7movwfADCON1;ADCON1=00000111,设置所有引脚都允;许数字输入BANKSELPORTA;恢复bank0(forPORTA,PORTB)Lab2程序:LoopbtfssPORTA,4;当RA4=1,则间跳到OffgotoOn;当RA4=0(即按钮按下时),则转向OnOffmovlwB'00000010’;W=00000010BmovwfPORTB;PORTB=00000010B,R1脚的灯亮gotoLoop;循环检测OnmovlwB'00001000‘;W=00001000BmovwfPORTB;PORTB=00001000B,R3脚的灯亮gotoLoop;循环检测HeregotoHere;无限循环END;程序结束Lab3实验示意图:按下RA4键喇叭响,不按则停止响。通过改变PWM波形的占空比改变音调。RC0RC1RC2RC3RC4RC5RC6RA4Lab3实验示意图:按下RA4键喇叭响,不按则停止响。通过改变PWM波形的占空比改变音调。RC0RC1RC2RC3RC4RC5RC6RA4链接:第六讲PIC单片机常用的周边功能模块Lab3实验现象:按下RA4键喇叭响,不按则停止响。通过改变PWM波形的占空比改变音调。通过以下将CCP模块配置为PWM模式:1.将相应的TRIS位清零以将CCPx引脚设为输出。2.写入PR2寄存器以设定PWM周期。3.将脉宽值写入CCPR1L4.TRISA位4置1,设定RA4为输入引脚5.设定T2CON,设定分频器的分频比和启用定时器TMR26.设定CCP1CON,设定CCP1模块为PWM模式#INCLUDEp16F877A.inc;标准头文件StartBANKSELTRISC;选择bank1bcfTRISC,2;设置CCP1为输出,CCP1与RC2引脚;复用movlwD‘180’;设置方波周期movwfPR2;PR2在bank1BANKSELCCPR1L;选择bank0.movlwD‘90’;设置占空比为50%movwfCCPR1L;装载CCPR1Lmovlw0x06;00000110,TurnonTMR2;(forPWM)movwfT2CON;打开Timer2,且预分频器为16Lab3程序分析:CheckButtonbtfscPORTA,4;若RA4=0则间跳gotoButtonOff;ButtonOnmovlwH'0C';iflow(pressed),fallhereto;"ButtonOn"code.movwfCCP1CON;H’0C=00001100,设置PWM;模式.gotoCheckButton;gocheckthebuttonagain(backtoCheckButton)ButtonOffbankselCCP1CONclrfCCP1CON;关闭CCP1模块by;writing0toitgotoCheckButton;gocheckthebutton;again(backtoCheckButton)END;AllprogramsmusthaveanENDdirectiveLab4实验现象:调节RA0,当模拟输入小于100时,RB0灯亮,蜂鸣器响;当模拟输入大于100时,RB1灯亮,蜂鸣器不响。RB0RB1RB2RB3RC0RC1RC2RA0输入减小Lab4实验现象:调节RA0,当模拟输入小于100时,RB0灯亮,蜂鸣器响;当模拟输入大于100时,RB1灯亮,蜂鸣器不响。RB0RB1RB2RB3RB4RB5RB6RA0输入增大1定义RB1、RB0为LED输出2定义RA0为输入,其他为输出3设定ADCON1,使AN0(RA0)为模拟输入4选择A/DclockisFosc/8,AN0通道,并启动A/D转换Lab4程序分析:#INCLUDEp16F877A.inc;#INCLUDE701PIC.inc;#DEFINETESTVALD'100‘;HighValuetocompare;A/DreadingagainstORG0StartLEDEnableB‘11111100‘;MACRO定义RB1、RB0为LED;输出BANKSELTRISA;BANKSELtoTRISAinbank1movlwH‘01‘;RA0为输入,其他为输出movwfTRISAmovlwH‘0E’;00001110;设定AN0(RA0)为模拟输入,movwfADCON1;其余引脚为数字模式BANKSELADCON0;BANKSELtoADCON0inbank0movlwH‘41’;01000001A/DclockisFosc/8,AN0通道movwfADCON0;A/D转换模式开启BANKSELTRISC;bcfTRISC,2;设置CCP1(RC2)为输出movlwD‘70’;设置PWM周期movwfPR2;loadedintoPR2(alsoinbank1)BANKSELCCPR1;movlwD‘35’;设置占空比(50%)movwfCCPR1L;loadedintoCCPR1Lmovlw0x06;TurnonTMR2(forPWM)movwfT2CON;and/16prescaleCheckAgainDly32D'50';MACROtoWait1ms(at4MHz)bsfADCON0,GO;StarttheConversion启动转换PollADbtfscADCON0,GO;若转换结束则间跳gotoPollAD;未结束,继续等待ConvertDonemovfADRESH,W;将A/D转换结果的高字节送WsublwTESTVAL;100-(w)TestA/DresultagainsttestvaluebtfssSTATUS,C;若无借位,即(W)100则跳转到“Ok"gotoOver;若(W)>100,则跳转到"Over"OkLEDOn0;MACROtoturnonLED0LEDOff1;MACROtoturnoffLED1movlwH'0C'movwfCCP1CON;PWM模式gotoCheckAgain;OverLEDOn1;MACROtoturnonLED1LEDOff0;MACROtoturnoffLED0bankselCCP1CONclrfCCP1CON;关闭CCP1模块bankselCCP1CONgotoCheckAgain;DoA/DreadandvaluetestoveragainENDLab5实验现象:RB0灯每隔200ms亮一下RB0RB1RB2RB3RC0RC1RC2Lab5实验现象:RB0灯每隔200ms亮一下RB0RB1RB2RB3RC0RC1RC2Lab5程序分析:#INCLUDEp16F877A.inc;#INCLUDE701PIC.inc;ISRCtrEQU0x30;ORG0StartgotoInitialize;Onstart-upgotoInitializationcodeORG4;中断向量ISRISRSave;MacrotocontextsaveinISRbcfINTCON,T0IF;清TMR0中断标志位callDoReloadTime;装载TMR0decfszISRCtr,F;ISRCounter减1,若为零则间跳gotoSkipToggle;若ISRCounter不为零,则无须切换gotoToggleLED;ifthecounteris0,runtogglecodeLab5程序分析:ToggleLEDmovlw4;put4intoWtoreloadintothemovwfISRCtr;Interruptcounter(after4countswe;needtoresetit)movlwB'00000001‘;write1toWinorderto,xorwfPORTB,F;toggleLED0ofPORTB-XORwith;1willtogglethebitSkipToggle;Doneinterrupt,sorestoreandexitISRRestore;Macrotocontextrestorewhen;leavingISRretfie;ReturnfrominterruptInitializeLEDOff0;EnsureLED0isoffLEDEnableH'FE’;11111110MACROtosetupI/Oport;todriveLEDRB0movlw4;Write4toWtomovwfISRCtr;preloadtheISRcounterwithcallDoReloadTimer;Preloadthetimerfor;appropriatetimedelaymovlwB'10100000‘;TurnonGIEandmovwfINTCON;TMR0interrupt(T0IE)BANKSELOPTION_REG;movlwB'11000111';SetupTMR0for256prescaleandmovwfOPTION_REG;internalclockmode内部时钟BANKSELPORTB;returntoaccessingBANK0goto$;WaitforeverforInterruptLab5程序分析:;SubroutinetoreloadTMR0DoReloadTimermovlwD'256‘;PreloadTimertomovwfTMR0;count256timesbeforeroll-overreturn;returnfromsubroutineEND习题1.PIC系列单片机有哪几种指令?共有多少条?4.5.6.7.8.9.
/
本文档为【嵌入式系统与最新单片机 - 北京科技大学】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
热门搜索

历史搜索

    清空历史搜索