从PIc中档系列单片机的结构介绍人手,系统阐述PIc单片机开发过程的最基本步骤;通过引入设计实例,深A浅出地介绍PIc单片机的各主要功能模块。书中介绍的代码实例将以汇编指令为主,最后专门介绍PIc单片机的c语言编程。读者对象主要是对PIc单片机感兴趣的初学者或准备用PIc单片机进行产品开发的工程师,对已经熟悉PIC单片机开发的工程师也可以作为设计时的参考。
第1章PIC单片机的结构和指令系统
1.1Microchip单片机产品概述
1.2PIC中档单片机的基本特性
1.2.1内核结构简述
1.2.2指令流水线概念
1.2.3寄存器文档概念
1.2.4单字指令概念
1.3PIC中档系列单片机的指令集
L3.1字节操作指令详述
1.3.2位操作指令详述
1.3.3立即数操作指令详述
1.3.4控制指令详述
1.4PIC单片机数据寄存器的寻址
1.4.1数据寄存器直接寻址
1.4.2数据寄存器间接寻址
1.5PIC单片机程序空间的寻址问题
1.5.1PIC单片机程序空间的直接跳转
1.5.2PIC单片机程序空间的间接跳转
1.6PIC中档系列单片机的中断机制
1.6.1中断响应时的人口地址(中断向量)
1.6.2中断优先级控制
1.6.3中断现场保护和恢复
1.6.4中断控制逻辑
第2章PIC单片机的特色
2.1PIC单片机的工作时钟模式
2.1.1石英晶体或陶瓷谐振器振荡
2.1.2外部时钟
2.1.3外部RC振荡
2.1.4内部RC振荡
2.1.5振荡模式的确定
2.2PIC单片机的复位过程
2.2.1上电复位(POR)
2.2.2低电压检测复位(BOR或BOD)
2.2.3外部复位
2.2.4看门狗复位
2.2.5判别复位情形
2.3PIC单片机的低功耗休眠
2.4PIC单片机在线串行编程
2.5PIC单片机的芯片配置字
第3章PIC单片机的开发环境
3.1MPLAB-IDE的功能组成
3.1.1MPLAB-IDE综述
3.1.2MPLAB-IDE的安装
3.1.3MPI.AB-IDE项目管理
3.L4MPLABqDE源程序编辑
3.2汇编编译器MPASMTM及其汇编程序编程的基本规则
3.2.1汇编编译器MPASM简介
3.2.2MPASM的语法简要说明
3.2.3MPASM的伪指令
3.2.4MPASM内的直接运算符
3.2,5MPASM的宏指令
3.2.6程序模板
3.2.71DE内MPASM编译环境的设定
第4章PIC单片机的开发工具
4.1软件模拟器MPI.AB—SIM”.
4.1.1软件模拟器的安装和启动
4.1.2软件模拟器的程序运行控制方式
4.1.3断点的设定和取消
4.1.4光标控制程序运行
4.1.5软件模拟器的跑表功能
4.1.6运行结果的观察窗口
4.1.7模拟器的信号激励功能
4.1.8软件模拟器的局限
4.2在线调试器MPI.AB—ICD2
4.2.11CD2的基本功能及其优缺点
4.2.21CD2与计算机的连接方式
4.2.31CD2与目标板的连线方式
4.2.41CD2和目标板的供电问题
4.2.5MPLAB—IDE环境下ICD2的启用
4.2.6用ICD2进行系统调试
4.2.7ICD2的辅助信息
4.2.8用ICD2让芯片独立工作
4.3硬件仿真器MPLAB—ICE2000
4.3.11CE2000的基本功能
4.2.21CE2000与计算机的连接
4.3.31CE2000与目标板的连接
4.3.4启动ICE2000仿真器
4.3.51CE2000的基本调试功能
4.3.61CE2000对代码执行的跟踪功能
4.3.71CE2000高级触发功能
4.3.81CE2000触发输入/输出同步功能
4.3.91CE2000代码执行覆盖检查功能
4.3.10关于ICE2000的其他有用信息
4.4芯片编程烧写工具PICSTART-P1us和
PROMATE—Ⅱ
4.4.1PICSTART—P1us
4.4.2PROMATE—II
4.5第三方开发工具
4.5.1第三方仿真工具
4.5.2第三方编程工具
第5章PIC单片机的I/O口及其灵活应用
5.1PIC单片机I/O口的基本特性
5.1.1完全双向的I/O引脚
5.1.2端口输入/输出设定
5.1.3端口的读和写
5.1.4端口的输出驱动能力
5.1.5端口的“读一修改一写”问题
5.1.6引脚端口的ESD保护
5.2PIC单片机I/O口的设定方法
5.3PIC单片机PORTA端口
5.3.1PORTA的特点
5.3.2RA4的特殊性
5.4PIC单片机PORTB端口
5.4.1PORTB综述
5.4.2RB0/INT引脚的中断功能
5.4.3P()RTB的RB?一RB4引脚状态变化中断
5.5PIC单片机PORTC端口
5.6PIC单片机PORTD和PORTE端口
5.7PIC单片机I/O引脚的应用技巧
5.7.1输入输出分时复用
5.7.2普通I/()引脚测电压值
5.7.3普通I/O引脚测电阻值
5.7.4普通I/O引脚进行超限电压检测
第6章PIC单片机的定时器资源及其应用
6.1定时器TMR0
6.1‘lTMR0综述
6.1.2与TMR0相关的控制寄存器
6.1.3TMR0的运作
6.1.4TMR0中断
6.1.5TMR0用于外部脉冲计数
6.1.6TMR0的预分频器
6.1.?TMR0应用注意事项
6.2定时器TMRl
6.2.1TMRl综述
6.2.2与TMRl相关的控制寄存器
6.2.3TMRI作为定时器
6.2.4TMRl作为同步计数器
6.2.5TMRl作为异步计数器
6.2.6TMRl的内部振荡器
6.2.7TMRl与CCP模块配合
6.2.8TMRl的具体应用
6.3定时器TMR2
6.3.1TMR2综述
6.3.2与TMR2相关的控制寄存器
6.3.3TMR2的工作方式
6.3.4TMR2的应用
第7章PIC单片机的模/数转换模块使用
7.1PIC单片机片上ADC模块综述
7.2ADC相关控制寄存器介绍
7.2.1ADCON0控制寄存器
7.2.2ADCONl控制寄存器
7.2.3ADRES结果寄存器
7.2.4A/D转换中断相关的寄存器
7.3设定模拟信号输入引脚
7.4A/D转换过程说明
7.5被测输入信号的参数要求
7.5.1输入电压信号的幅度
7.5.2输入电压信号的内阻
7.5.3输入信号的抗混叠滤波
7.6输入信号的采样过程
7.7AD转换时钟的选择
7.8参考电压的选取
7.9休眠时进行A/D转换
7.10特殊事件触发进行A/D转换
7.1110/12位分辨率的ADC模块
7.11.110/12位分辨率A/D模块的工作原理
7.11.2ADCONl寄存器的内容扩充
7.11.3A/D转换结果的格式问题
7.11.4参考电压的考虑
7.11,5采样时间的考虑
7.128/“引脚单片机上的A/D模块
7.12.18/14引脚单片机A/D模块综述
7.12.2ADCON0寄存器的变化
7.12.3ADCONl寄存器的变化
7.12.4ANSEL寄存器的引入
7.12.5其他注意事项
7.13A/D模块的应用技巧
7.13.1模拟/数字引脚分配时的问题
7.13.2合理实现采样时间
7.13.3转换结果的软件数字滤波方法
第8章PIC单片机的USART通信模块,其使用
8.1USART简介
8.2USART模块关键寄存器介绍
8.2.1TXSTA数据发送控制及状态寄存器
8.2.2RCSTA数据接收控制及状态寄存器
8.2.3SPBRG波特率控制寄存器
8.2.4相关的中断控制寄存器
8.2.5TXREG和RCREG寄存器
8.3USART波特率设定
8.3.1异步通信时的波特率设定
8.3.2同步通信时的波特率设定
8.3.3SPBRG寄存器的写效应
8.4USART模块的异步通信
8.4.1异步通信数据格式
8.4.2异步通信数据发送过程
8.4.3异步通信数据接收过程
8.4.4常用的异步通信的协议
8.5USART模块同步通信主模式
8.5.1同步通信主模式发送
8.5.2同步通信主模式接收
8.6USART模块同步通信从模式
8.6.1同步从模式数据发送
8.6.2同步从模式数据接收
8.7通信时的数据缓冲技巧
8.7.1接收环形FIFO缓冲队列
8.7.2发送缓冲队列
8.8通信数据的校验方法
8.8.1奇偶位校验
8.8.2累加和校验
8.8.3循环冗余校验(CRC)
8.9报文通信时的简单协议
8.10异步串行通信的波特率自适应技术探讨
8.10.1标准波特率穷举法
8.10.2码元宽度实时检测法
8.11多机通信的寻址方式
8.11.19位数据传输
8.11.2数据包传输
8.12软件实现异步串行通信
8.12.1三倍速采样法
8.12.2起始位中断捕捉定时采样法
第9章PIC单片机同步串行接口及其应用
9.1同步串行接口简介
9.2SSP接口模块控制寄存器
9.2.1SSPSTAT同步接口状态和控制寄存器
9.2.2SSPCON同步接口控制寄存器
9.2.3SSPBUF数据寄存器
9.2.4SSPADD地址寄存器
9.2.5SSPCON2同步接口控制寄存器
9.2.6与SSP相关的中断控制寄存器
9.3SSP模块的SPI通信方式
9.3.1使用SPI通信接口
9,3,2SPI通信引脚设置
9.3.3SPI通信时的连接方式
9,3.4SPI主模式通信
9.3.5SPI从模式通信
9,3,6SPI从模式选择控制通信
9.3.?SPI应用实例介绍
9.4SSP和MSSP模块的IC模式
9.4.11zC从模式
9.4.2MSSP模块的IC主模式
9.4.31C通信程序范例
9.4.41C总线硬件处理
9.5软件实现同步串行通信
9.5.1软件实现SPI主模式通信
9.5.2软件实现IC主模式通信
第10章PIC单片机的CCP模块及其应
10,1CCP模块简介
10.2与CCP模块相关的控制寄存器
10.3CCP模块的输人捕捉模式
10.3.1CCPx引脚配置
10.3.2改变不同的捕捉模式
10.3.3脉冲沿捕捉时的预分频
10.3,4休眠时进行捕捉
10.3.5复位时的情形
10.3.6捕捉模式应用实例介绍
10.4CCP模块的比较输出模式
10.4.1比较模式下的CCPx引脚
10.4.2软件中断模式
10.4.3特殊事件触发
10.4.4休眠时的比较输出状态
10.4.5比较输出模式应用实例
10.5CCP模块的PWM模式
10.5.1PWM周期
10.5.2PWM占空比(高电平持续宽度)
10.5.3占空比调整的绝对分辨率
10.5.4PWM工作模式设定
10.5.5PWM应用实例
第11章PIC单片机的C语言编程
11.1PIC单片机C语言编程简介
11.2Hitech-PICC编译器
11.3MPLAB-IDE内挂接PICC
11.4PIC单片机的C语言源程序基本框架
11.5PICC中的变量定义
11.5.1PICC中的基本变量类型
11.5.2PICC中的高级变量
11.5.3PICC对数据寄存器bank的管理
11.5.4PICC中的局部变量
11.5.5PICC中的位变量
11.5.6PICC中的浮点数
11.5.7PICC中变量的绝对定位
11.5.8PICC的其他变量修饰关键词
11.5.9PICC中的指针
11.6PICC中的子程序和函数
11.6.1函数的代码长度限制
11.6.2调用层次的控制
11.6.3函数类型声明
11.6.4中断函数的实现
11.6.5标准库函数
11.?PICC定义特殊区域值
11.7.1定义工作配置字
11.7.2定义芯片标记单元
11.8MPLAB-IDE中实现PICC的编译选项设置
11.8.1选择单片机型号
11.8.2PICC普通编译选项(General)设定
11.8.3PICC全局选项设定(PICCGlobal)
11.8.4C编译器选项设定(PICCCompiler)
11.8.5连接器选项设定(PICCLinker)
11.8.6汇编器选项设定(PICCAssembler)
11.9C和汇编混合编程
11.9.1嵌入行内汇编的方法
11.9.2汇编指令寻址C语言定义的全局变
11.9.3汇编指令寻址C函数的局部变量
11.9.4混合编程的一些经验
后记
参考文献
单片机,又称微控制器,对于现在从事电子技术应用的工程师们来说已经是很平常的一类器件了。在单片机应用逐渐渗入到各行各业的各类产品中的同时,制造单片机的半导体厂家也从十几年前屈指可数的几家发展到现在的几十家甚至更多。不同厂家提供了基于不同架构平台,具备不同功能特点的单片机,这就使得工程师们可以按照具体设计的要求,挑选一款最合适的芯片进行系统开发,在满足功能要求的同时最大限度地降低成本,亦即提高了自己产品的性能价格比。
在众多的单片机系列中,Microchip公司生产的冠以PIC~的8位单片机从以Intel公司51系列和Motorola公司68系列占绝对主导地位的8位单片机市场中脱颖而出。从1989年公司成立生产第一款8位单片机时的名不见经传,每年都持续快速成长,到2003年跃居8位单片机年出货量全球排名第一。要知道,PIC单片机从一开始就是一款与众不同的芯片,它没有兼容当时任何一种市场上流行的单片机结构。在设计工程师们认识和应用的惯性下,在激烈的市场竞争的夹缝中,PIC最终能取得如此的成功,其中必有道理。
Microchip公司是第一个在8位单片机结构中实现精简指令集的厂家,并采用了程序空间和数据空间完全分离的哈佛总线结构。这种体系结构大大降低了PIC单片机的总体成本,同时提高了运行效率。另外,PIC单片机不搞简单的功能堆积,Microchip公司提供了不同系列不同型号的单片机。众多型号的单片机其运行性能有高有低,片上功能资源有多有少,但始终保持了高度一致的可移植性。这样,设计工程师就可以在最初定方案时挑选一款功能最恰当的芯片,随着开发的深入,能够随时方便地将整个设计移植到其它型号的单片机上,保证最终产品中使用的单片机不会有太多的资源浪费,提高了产品的性价比。
Microchip公司的P1C单片机从一开始就走保证现场可编程灵活性之路。从早期的OTP芯片(用户一次可编程)到现在的FLASH芯片(闪存多次可编程),正好符合整个市场快速变化的需求。这也是PIC单片机能够取得成功的重要原因之一。现在的普遍情况是一个产品的生命周期短的只有几个月,长的也就是一两年。要想在变幻莫测的市场上获得成功,产品的上市时间和速度是必须要考虑的成本因素之一。仅从产品的上市速度和承担的风险这两方面考虑,以前靠掩膜定制单片机的做法已经不能适应这一现状,因此越来越多的用户转向使用OTP和FLASH形式单片机,以求加快产品的开发和上市速度,避免开发和生产中的风险,提高产品升级换代的灵活性。
另外,从产品的角度去看一个设计,必须要考虑售后的维护成本。这就要求作为控制核心的单片机具有非常高的可靠性,在各种不同的环境下都必须稳定可靠地工作。PIC单片机能获得成功的另外一个重要原因就在于其高稳定度和可靠性。这与Microchip公司芯片设计的严格细致和制造过程的精益求精息息相关。
再来看国内单片机的应用现状,基本上还是以51内核系列为主。其实这也正常,51系列在国内的根基非常深厚,现在学校的教学一般都是以51作为基本教材,51系列芯片本身也在不断地变革和发展。随着市场的细分和产品设计所需,PIC单片机在国内相关行业中的认知度迅速提高,其应用范围和市场占有率也随之上升。但基本上,PIC不会是第一种被接触的单片机,我本人也不例外,我于1999年6月加入Microchip公司从事现场技术支持工作,在这之前,从来就没有用过PIC单片机。但经过一段时间在了解了PIC单片机的特点后,我就被其深深地吸引住了,时常发出这样的感叹:要是我以前做的一些设计换成现在的PIC单片机,系统的体积和成本要降低多少?可靠性又能提升多少?
几年来在具体从事Microchip产品技术支持工作的过程中,对现在工程师的状况也有了一些体会。绝大部分现在用PIC单片机的工程师都是从别的单片机体系结构中转过来的.自然而然就有先人为主的惯性,在学习PIC单片机时自觉或不自觉地与其它单片机做简单的横向对比,而不注重掌握其内在的结构特点。其实这样做的结果是在用PIC单片机“模拟”其它单片机,根本就不能充分发挥出PIC单片机的固有特点和优点。在这个现实的世界上,几乎不可能有完美的东西,至少在众多型号的单片机中,没有一种型号是完美的,是可以用来包打天下的。作为我们设计工程师的职责就是选择一款最合适的芯片,充分发挥其固有的特点,实现产品的最优化设计。这就要求我们在进行设计时对芯片要有较深入细致的了解。
近几年来,针对PIC单片机的设计和应用,国内也陆续出版了一些参考书籍,这对PIC单片机的推广起了很大作用。在这一方面北航出版社走在了前面。但与介绍51系列的书籍相比,无论是数量还是质量方面都不能相提并论,这在一定程度上限制了PIC单片机的应用普及和技术提高。随着网络技术的发展,有了网上技术论坛,这给工程师们提供了一个可以相互交流的平台。我本人也热衷于参加各类技术讨论的活动,希望在技术上共同提高,但逐渐发现网上论坛中绝大部分的话题都是重复的、初级的,或基本概念性的问题。与其每次都要重复回答相同的问题倒不如先写下来,然后在需要时复制,或放到某一个地方作为参考。正好,北航出版社的胡晓柏编辑与我联系,约我写点关于PIC单片机开发和应用方面的东西,这与我前面的想法不谋而合,于是就有了这本书。
至于具体选题,考虑良久还是决定以PIC中档系列单片机为基础。因为PIC中档系列单片机的型号众多,价格适中,在国内的应用面最广;本地化的开发工具支持力度也最大,对广大初学用户而言进入门槛较低。针对编程语言的介绍将重点强调汇编语言编程的技巧,以便使读者更深入地体会PIC单片机体系结构和精简指令的优点。
作为技术工作者之一,我写这本书的出发点是想和大家一起分享在实际工作过程中积累的一些比较实用的经验体会,而不是什么教科书。对芯片数据手册上已经介绍的或别的参考书籍中已经讲到的内容将不作太多重复的介绍,大家在具体开发过程中一定要仔细阅读厂家提供的芯片数据手册。本书中如果出现与芯片数据手册描述相矛盾的地方,以数据手册为准;
书中的绝大部分代码实例都通过实际电路验证,但不能保证没有错误,读者在引用这些代码或电路时必须自己负责验证,本人恕不承担任何连带责任。
感谢北航出版社的马广云博士和胡晓柏编辑在这整个写书过程中给我的支持和关心。也感谢安捷伦公司提供混合信号示波器,书中所有的电路波形即用安捷伦54622D混合信号示波器实测得到。由于我工作性质的原因决定了此书只能利用我个人的业余时间编写,因此原本属于我和女儿嬉戏的时间就全部变成了我写书的时间,心里颇感内疚。我六岁的女儿也非常乖巧懂事,当我坐在电脑前敲击键盘写书时,从不会跑过来撒娇纠缠,因此我打心底里感谢她,爱她。
诚然,本人的经验和水平有限,时间上也比较匆忙,书中的错误和不妥之处在所难免,恳请广大读者批评指正。我的电子邮件是;Paul.Zhang@microchip.com。另外,有兴趣的读者可以登录http://WWW。21icbbs.com中嵌入式系统开发的PIC单片机论坛,或http://forum.microchip.com进入微芯公司的中文论坛,与我分享您相关的知识、经历及阅读心得。也可以从微芯公司网站主页http://WWW.microchip.com上获取更多资料。
张明峰
2004年5月于上海