资源描述
第一章 PIC系列单片机概述
1.1 PIC单片机简单介绍1.2 PIC单片机的特点
PIC 是美国Microchip 公司所生产的单片机系列产品型号前缀,其硬件系统设计简洁,指令系统设计精炼。它是最容易学、最容易掌握、最容易应用的单片机之一。
(1)哈佛总线结构
普通单片机----普林斯顿体系结构 其程序存储器和数据存储器统一编址,也就是两种存储器位于同一个逻辑空间里。其指令总线和数据总线是共用的即时分复用。
PIC单片机采用哈佛体系结构 其程序存储器和数据存储器独立编址,也就是两种存储器位于不同逻辑空间里。(MCS-51采用哈佛体系结构,但他们与CPU之间传递信息必须共用一条总线。) PIC单片机还采用哈佛总线结构 :及芯片内部将数据总线和指令总线分离,并且采用不同的宽度。如图1-2(a)
(2)指令字节化
指令字节和数据字节分别用不同的字节宽度代表。
(3)精简指令集(RISC)技术(单片机所能识别的所有指令的集合)
PIC的指令系统或指令集约有75条指令。MCS-51有111条。
(4) 寻址方式简单,寻址空间独立 寻找操作数的方式PIC只有4种即寄存器直接寻址、寄存器间接寻址、立即数寻址、和位寻址。 MCS-51有7种方式。PIC程序、数据、堆栈各自采用独立的地址空间。
(5)代码压缩率高,运行速度高,功耗低,驱动能力强。
端口吸入电流:25mA,输出电流:20mA 一般驱动能力60~70mA
代码压缩率指相同程序存储器空间所能容纳有效指令的数量。例如 1KB程序存储量空间, MCS-51系列存放500多条指令,而对PIC系列单片机存放多达1024条。
(6) I2C 和SPI串行总线结构 I2C :Inter Integrated Circuit SPI:Serial Peripheral Interface 分别是由PHILIPS MOTOROLA 公司发明的两种串行总线技术,是在芯片之间实现同步串行数据传输的技术
1.3 PIC18系列的内部结构
1.4 几种常见的PIC18系列单片机
微控制器(单片机):将中央处理器CPU、随机存取存储器RAM、只读存储器ROM、输入/输出端口I/O等主要的计算机部件,都集成在一块集成电路芯片上,从而形成一部完整的微型计算机。
微控制技术:以软件取代硬件并能提高系统性能的控制技术。
八位微控制器:
第二章 PIC体系结构与汇编语言编程
2.1 PIC的WREG寄存器
2.2 PIC文件寄存器
除了WREG寄存器,PIC还有其他的很多寄存器,都被称为数据存储器或文件寄存器。
PIC的文件寄存器的容量大小因芯片的不同而不同,从32B到几千字节不等,且数据RAM都是8位宽。
PIC文件寄存器数据RAM分为两类:特殊功能寄存器(SFR)和通用寄存器(GP RAM)。
2.4.2 影响标志位的运算指令
2.5 PIC数据格式和伪指令
2.5.1 PIC数据类型
PIC微控制器只有8位数一种数据类型,而且寄存器也是8位的。所有大于8位的数据在被CPU处理前都会被分解。
第三章 分支、调用和时延循环
3.1 分支指令和循环
3.1.1 DECFSZ指令与循环
格式:DECFSZ fileReg,d
指令说明:该指令,fileReg中的内容自减1,当其值为0时,程序计数器将跳过下一条指令继续执行。如果把GOTO指令放在该指令后面,就可以实现循环功能。
3.1.2 BNZ指令实现循环 BNZ指令的用法如下:
即当零标志位为0时(此时文件寄存器f不等于0),实现跳转。
例1 编写程序实现(a):将WREG清零;(b):将WREG加3,执行10次,所得结果送入PORTB的SFR。
分别用DECFSZ和BNZ编程。
(1) DECFSZ
(2) BNZ
3.1.3 其他的条件转移指令
必须指出的是,所有的条件转移指令都是短跳转,换而言之,目标地址都必须在程序计数器的256B的范围内。
3.1.4 循环嵌套
单个循环的最大计数值是255。那如何实现循环次数大于255呢?循环嵌套能实现循环次数大于255次的循环。
如例2。
3.1.5 无条件分支指令
3.2 CALL指令和栈
3.2.1 CALL 指令
3.2.2 PIC18 的栈和栈指针
栈是CPU 用来临时存放一些非常重要的信息的读写RAM。这些信息通常是地址,也可以是数据。
用于访问栈的寄存器被称为SP(stack pointer,栈指针)寄存器,PIC18的栈指针是5位的,其取值范围是00H-1FH,它可以提供32个地址,每个地址是21位宽。如图3-7所示。
当PIC18通电时,SP寄存器的初始值为0,也就是说,栈的地址1是用于栈的第一个地址,因此SP指向上一次使用的地址,这也意味着栈的地址0是不可用的,实际上,PIC18只有31个栈地址。
3.2.3 如何访问PIC18的栈
压栈PUSH:把CPU的信息放入栈。
出栈POP:把栈信息取出来并传送到CPU寄存器。
3.2.4 CALL指令与栈的作用
3.2.5 RCALL指令
RCALL是一个2B的指令,这与4B的CALL指令不同。
在保存PC到栈和执行RETURN指令方面,两者没有什么不同,唯一的不同在于,CALL的目标地址可以是PIC18的2MB地址空间的任何一个,而RCALL的目标地址只有2KB的范围。
3.3 PIC18的时延与指令流水线
3.3.1 流水线技术
影响时延精确性的两个因素:
1.晶振频率
2.PIC的设计
(1) 哈佛结构(2)RISC 结构(3)流水线技术,(见图3-9)
流水线技术由于指令的重叠的读取和执行会带来分支代价,增加额外的指令周期。
例如,当执行BNZ跳转指令时,BNZ下面的指令已经被读取,但是当跳转条件成立时,PIC不去执行BNZ下面的指令,而是从新读取跳转地址的指令,增加一个周期。即,BNZ指令不跳转时,是单周期指令,跳转时则两个周期。
大部分PIC指令都是单周期指令,也有些指令占用2-3个指令周期,如GOTO,BRA,CALL和所有的分支指令。
3.3.2 PIC的指令周期的计算
在PIC18里,一个指令周期有4个晶振周期组成,即:
指令周期=4x晶振周期
3.3.3 PIC时延的计算
3.3.4 PIC多级执行流水线
第四章 PIC I/O端口编程
4.1 PIC端口内部结构
4.1.1 I/O端口引脚及其功能
PIC18系列的端口数量如表4-1所示。
由图4-1和表4-1可知PIC18F458有5个端口,即PORTA, PORTB, PORTC, PORTD和PORTE。
其中端口A有7引脚,端口B、C、D都有8个引脚,而端口E有3个引脚。
每个端口都有3个SFR,如表4-2所示,分别为PORTx,
TRISx和LATx。
4.1.2 TRIS寄存器的作用
TRIS寄存器是用来指定一个端口是输出还是输入。
TRISx寄存器写入0,则端口设置为输出
TRISx寄存器写入1,则端口设置为输入
当系统复位时,所有端口的TRISx寄存器的值都是FFH,即所有端口都默认为输入。
图4-3 、4-4、4-5、4-6分别介绍了向PIC18单片机的一个引脚输出0、输出1、输入0、输入1时的端口内部结构图。
4.2 PIC端口编程
4.2.1 BSF
4.2.2 BCF
4.2.3 BTG
4.2.4 BTFSS和BTFSC
4.2.5 监测二进制位
人们通常也用位测试指令来检测某个二进制位的状态,从而做出执行下一步操作的决定。具体用法参见例4-6。
4.2.6 读取二进制位
人们通常也用位测试指令来读取某个二进制位的状态,并保存或者将它传送给其他位。具体用法参见例4-8。
4.2.7 读输入引脚与读LATx端口
第五章 算数、逻辑指令和程序示例
5.1 无符号数的算数指令
无符号数—这样一种数据,即所有的二进制位都被用来表示数据,而没有用于表示正号或者负号的位。
5.1.1 无符号数的加法
5.1.2 BCD数字系统及其相关指令
5.1.3 无符号数的减法
PIC18有4条减法指令:SUBLW,SUBWF,SUBWFB,SUBFWB。
最后的两条是带借位的减法指令
5.1.4 无符号数的乘法与除法指令
5.2 有符号数的概念
在有符号数的字节操作数中,D7位是符号位,而其他位用来表示数字的大小。见图5-2。
若D7=1,则操作数为负数,负数的取值范围为
-1—127,负数是用二级制的补码来表示的。虽然汇编器会自动完成转换,但是求二进制补码的步骤还是要知道的(见例5-10):
(1) 用8位二级制数来表示数的大小(无符号)
(2)将各位取反
(3)取反后+1
若D7=0,则操作数为正数,正数的取值范围为
0-+127
5.3 有符号数的溢出问题
在进行有符号数的运算过程中,其运算结果超出了寄存器的范围,就回产生溢出。
溢出问题是在使用有符号数运算过程中必须要处理的一个严重的问题,PIC用OV溢出标志位来表征这个错误。OV=1表示溢出,OV=0表示没有溢出。见例5-13
在8位有符号数的运算过程中,当以下两个条件中的任何一个成立时,OV将置1。
(1)D6向D7有进位,而D7没有进位。
(2)D7有进位,而D6向D7没有进位。
具体实例见例5-14,15,16
5.4 逻辑和比较指令
5.4.1 AND 指令
5.4.2 OR指令
5.4.3 EX-OR指令
5.4.4 COMF指令
5.4.5 NEGF指令
5.4.6 比较指令
5.5 数据串行化
在PIC18中有4个移位指令:
RRNCF:文件寄存器的右移
RLNCF:文件寄存器的左移
RRCF:文件寄存器的右移(带进位标志位)
RLCF:文件寄存器的左移(带进位标志位)
数据串行化是传送数据的方式,它是通过微控制器的一个引脚每次发送一个二进制数据位。
实现数据串行化的传输方法有两种:
(1)使用串行端口
(2)使用移位操作指令(见例5-28)
5.6 BCD和ASCII码转换
5.6.1 从压缩BCD码到ASCII码的转换
5.6.2 从压缩ASCII 码到BCD码的转换
第六章 寻址方式、表处理及存储区的转换
6.1 寻址方式
PIC18提供4种寻址方式:
(1)立即寻址
(2)直接寻址
(3)寄存器间接寻址
(4)变址寻址
6.1.1 立即寻址
在立即寻址方式中,操作数是常数。操作数紧跟在操作码后面。
立即寻址方式可以用于算数和逻辑指令,如下面的例子:
MOVLW 0X25
也可以用伪指令EQU来访问立即数,如下面的例子
COUNT EQU 0X30
MOVLW COUNT
注:文件寄存器RAM不支持立即寻址方式,换言之,要想把数据传送到任何文件寄存器,都必须先把数据传送到WREG寄存器中。
6.1.2 直接寻址
直接寻址可以访问整个数据存储区的文件寄存器。
在直接寻址方式中,当对文件寄存器执行操作时,可以选择吧操作结果存放在原来的文件寄存器中或者存放在WREG中。如下面的例子。
注意:
(1)存入WREG和文件寄存器的区别。
(2)没有给出第二个参数是,则默认为文件寄存器(F)
6.1.3 寄存器间接寻址
1.与寄存器间接寻址相关的寄存器
寄存器间接寻址方式可以用来访问文件寄存器的RAM空间。
与寄存器间接寻址相关的寄存器:
FSR(文件选择寄存器)
INDF(间接寄存器)
两者是一一对应的关系
FSR是12位寄存器,可以访问PIC18数据寄存器RAM的整个4096B的空间。
PIC18中有3个FSR,即:FSR0,FSR1,FSR2。对应的也有3个IDNF。
每个FSR都分为高字节和低字节两部分:FSRxL和FSRxH。注意,高字节只用了低四位。
LFSR指令是用来向FSR中装载数据的。格式如下:
当要将数据传送到INDFx时,也就是要传送数据到FSR所指向的RAM地址中去,同理,要是想读取FSR所指向RAM地址中的数据,直接读取INDF寄存器的内容即可。见下面的例子。
2.寄存器间接寻址方式的优点:
寄存器间接寻址方式的优点是:他可以动态的访问文件寄存器中的数据,而直接寻址方式是静态的。参考下面的例子:
上面的例子中使用了INCF FSR0L ,F来实现指针加一的操作,但是当FSR=5FFH时会出现错误。因此PIC18提供了用于FSRn自增量/自减量的方法。
用于实现这些方法的指令CLRF的指令格式如表6-2所示。
具体实例如下
6.2 查询表及标处理
程序员不会用RAM存储程序,但有时会用ROM存储数据,如何访问存储在ROM中的数据,就涉及到查表了。
6.2.1 DB 伪指令
DB伪指令是用来分配以字节为单位的ROM程序空间,即,DB可以用来定义8位定值数据,数字可以为十进制、二进制、十六进制,或者ASCII码。
在MPASM中还允许使用DATA代替DB。
如何向ROM中存放定值数据,见例6-8。
6.2.2 PIC18的读表操作
表6-3列出了PIC18的读表指令
在读表时,需要一个指向数据的地址指针和一个存放数据的寄存器。
TBLPTR寄存器是一个21位寄存器用来指向要读取的数据。它由3个8位字节组成,分别是TBLPTRL、TBLPTRH、TBLPTRU。其中TBLPTRU的最后两位没用,且被清零。
TABLAT是用来暂存读取出来即将被送往CPU的数据。
具体实例如下:
例:假定在起始地址250H的程序ROM里存放着USA。(1)编制程序,将所有的字符发送到端口B,每次发送一个字节。
(2)用自增量法重新编程。
6.2.3 查表和RETLW指令
6.2.4 访问RAM中的查询表
6.2.5 PIC18的写表操作
6.3 PIC18的存储区转换
PIC18一共有16个存储区。在指令中利用a位来选择存储区,当A=0时,则访问存储区是默认存储区,A=1时,该指令使用BSR指定的储存区,而不是访问存储区。
若是在指令中没有对A的声明,则表示A=0,访问的存储区为默认的存储区。
6.3.1 BSR寄存器
BSR寄存器(存储区选择寄存器)用来选择所期望的得存储区。利用指令MOVLB将存储区的序号写入到BSR中。
BSR寄存器是一位8位的寄存器,属于SFR。在BSR的8位中只用了其中低4位,高4位被忽略
6.3.2 MOVFF指令和存储区
使用指令MOVFF的最大好处是不用考虑存储区的转换,因为它可以在4KBRAM空间内传送数据。其参阅例6-26。
第七章 PIC18定时器
7.1 定时器的本质
PIC18依具体型号有2~5个不等的定时器,即定时器0、定时器1、定时器2、定时器3、定时器4。
定时器从电路本质上来讲就是一个脉冲计数器。
如果计数脉冲源于单片机内部指令周期——定时器;
如果计数脉冲源于外部引脚的输入信号——计数器。
7.2 定时器0基本寄存器及编程
定时器0可以用作8位或16位的定时器。定时器0的16位寄存器使用高字节和低字节来访问,其中低字节被称为TMR0L,高字节被称为TMR0H。如下图所示。
7.2.1 定时器0的基本寄存器
每个定时器都有一个很重要的寄存器—TCON(定时器控制寄存器),它用来设置定时器的各种工作模式。
T0CON是8位的寄存器,用来控制定时器0。
T0CON的位表示如下图所示。
7.2.2 TMR0IF标志位
TMR0IF(定时器器的中断标志位)是INTCON寄存器的一部分,如下图所示。
7.2.3 定时器0的16位模式编程
16位方式下TMR0的简化框图如图7-1所示
为了更好地理解定时器0在16位模式下的编程步骤七参阅例7-1
7.2.4 定时器0的8位模式编程
7.2.5 计算定时器的载入值
63
展开阅读全文