单片机.docx
《单片机.docx》由会员分享,可在线阅读,更多相关《单片机.docx(18页珍藏版)》请在冰豆网上搜索。
单片机
PIC系列单片机简介
一、引言
据统计,我国的单片机年容量已达1-3亿片,且每年以大约16%的速度增长,但相对于世界市场我国的占有率还不到1%。
这说明单片机应用在我国才刚刚起步,有着广阔的前景。
培养单片机应用人才,特别是在工程技术人员中普及单片机知识有着重要的现实意义。
当今单片机厂商琳琅满目,产品性能各异。
针对具体情况,我们应选何种型号呢?
首先,我们来弄清两个概念:
集中指令集(CISC)和精简指令集(RISC)。
采用CISC结构的单片机数据线和指令线分时复用,即所谓冯.诺伊曼结构。
它的指令丰富,功能较强,但取指令和取数据不能同时进行,速度受限,价格亦高。
采用RISC结构的单片机数据线和指令线分离,即所谓哈佛结构。
这使得取指令和取数据可同时进行,且由于一般指令线宽于数据线,使其指令较同类CISC单片机指令包含更多的处理信息,执行效率更高,速度亦更快。
同时,这种单片机指令多为单字节,程序存储器的空间利用率大大提高,有利于实现超小型化。
属于CISC结构的单片机有Intel8051系列、Motorola和M68HC系列、Atmel的AT89系列、台湾Winbond(华邦)W78系列、荷兰Pilips的PCF80C51系列等;属于RISC结构的有Microchip公司的PIC系列、Zilog的Z86系列、Atmel的AT90S系列、韩国三星公司的KS57C系列4位单片机、台湾义隆的EM-78系列等。
一般来说,控制关系较简单的小家电,可以采用RISC型单片机;控制关系较复杂的场合,如通讯产品、工业控制系统应采用CISC单片机。
不过,RISC单片机的迅速完善,使其佼佼者在控制关系复杂的场合也毫不逊色。
根据程序存储方式的不同,单片机可分为EPROM、OTP(一次可编程)、QTP(掩膜)三种。
我国一开始都采用ROMless型单片机(片内无ROM,需片外配EPROM),对单片机的普及起了很大作用,但这种强调接口的单片机无法广泛应用,甚至走入了误区。
如单片机的应用一味强调接口,外接I/O及存储器,便失去了单片机的特色。
目前单片机大都将程序存储体置于其内,给应用带来了极大的方便。
值得一提的是,以往OTP型单片机的价格是QTP的3倍,而现在已降至1.5-1.2倍,选用OTP型以免订货周期、批量的麻烦是可取的。
二、PIC系列单片机有什么优势?
自从我95年接触PIC单片机以来,便一直热衷于这种单片机的开发与应用。
有不少朋友问我:
PIC到底有什么优势?
也许你也会有这样的疑问,所以我在这里略谈几点自己的看法。
1)PIC最大的特点是不搞单纯的功能堆积,而是从实际出发,重视产品的性能与价格比,靠发展多种型号来满足不同层次的应用要求。
就实际而言,不同的应用对单片机功能和资源的需求也是不同的。
比如,一个摩托车的点火器需要一个I/O较少、RAM及程序存储空间不大、可靠性较高的小型单片机,若采用40脚且功能强大的单片机,投资大不说,使用起来也不方便。
PIC系列从低到高有几十个型号,可以满足各种需要。
其中,PIC12C508单片机仅有8个引脚,是世界上最小的单片机,如图1所示:
图1PIC12C508单片机外型
该型号有512字节ROM、25字节RAM、一个8位定时器、一根输入线、5根I/O线,市面售价在3-6元人人民币。
这样一款单片机在象摩托车点火器这样的应用无疑是非常适合。
PIC的高档型号,如PIC16C74(尚不是最高档型号)有40个引脚,其内部资源为ROM共4K、192字节RAM、8路A/D、3个8位定时器、2个CCP模块、三个串行口、1个并行口、11个中断源、33个I/O脚。
这样一个型号可以和其它品牌的高档型号媲美。
2)精简指令使其执行效率大为提高。
PIC系列8位CMOS单片机具有独特的RISC结构,数据总线和指令总线分离的哈佛总线(Harvard)结构,使指令具有单字长的特性,且允许指令码的位数可多于8位的数据位数,这与传统的采用CISC结构的8位单片机相比,可以达到2:
1的代码压缩,速度提高4倍。
3)产品上市零等待(Zerotimetomarket)。
采用PIC的低价OTP型芯片,可使单片机在其应用程序开发完成后立刻使该产品上市。
4)PIC有优越开发环境。
OTP单片机开发系统的实时性是一个重要的指标,象普通51单片机的开发系统大都采用高档型号仿真低档型号,其实时性不尽理想。
PIC在推出一款新型号的同时推出相应的仿真芯片,所有的开发系统由专用的仿真芯片支持,实时性非常好。
就我个人的经验看,还没有出现过仿真结果与实际运行结果不同的情况。
5)其引脚具有防瞬态能力,通过限流电阻可以接至220V交流电源,可直接与继电器控制电路相连,无须光电耦合器隔离,给应用带来极大方便。
6)彻底的保密性。
PIC以保密熔丝来保护代码,用户在烧入代码后熔断熔丝,别人再也无法读出,除非恢复熔丝。
目前,PIC采用熔丝深埋工艺,恢复熔丝的可能性极小。
7)自带看门狗定时器,可以用来提高程序运行的可靠性。
8)睡眠和低功耗模式。
虽然PIC在这方面已不能与新型的TI-MSP430相比,但在大多数应用场合还是能满足需要的。
PIC8位单片机汇编语言常用指令的识读(上)
各大类单片机的指令系统是没有通用性的,它是由单片机生产厂家规定的,所以用户必须遵循厂家规定的标准,才能达到应用单片机的目的。
PIC8位单片机共有三个级别,有相对应的指令集。
基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PIC系列芯片共有指令58条,每条指令是16位字长。
其指令向下兼容。
在这里笔者介绍PIC8位单片机汇编语言指令的组成及指令中符号的功能,以供初学者阅读相关书籍和资料时快速入门。
一、PIC汇编语言指令格式
PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下:
标号 操作码助记符 操作数1,操作数2;注释
指令格式说明如下:
指令的4个部分之间由空格作隔离符,空格可以是1格或多格,以保证交叉汇编时,PC机能识别指令。
1标号 与MCS-51系列单片机功能相同,标号代表指令的符号地址。
在程序汇编时,已赋以指令存储器地址的具体数值。
汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。
标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。
在无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。
指令助记符不能占用标号的位置,否则该助记符会被汇编程序作标号误处理。
书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面可以跟英文和数字字符、冒号(:
)制符表等,并可任意组合。
再有标号不能用操作码助记符和寄存器的代号表示。
标号也可以单独占一行。
2操作码助记符 该字段是指令的必选项。
该项可以是指令助记符,也可以由伪指令及宏命令组成,其作用是在交叉汇编时,“指令操作码助记符”与“操作码表”进行逐一比较,找出其相应的机器码一一代之。
3操作数 由操作数的数据值或以符号表示的数据或地址值组成。
若操作数有两个,则两个操作数之间用逗号(,)分开。
当操作数是常数时,常数可以是二进制、八进制、十进制或十六进制数。
还可以是被定义过的标号、字符串和ASCⅡ码等。
具体表示时,规定在二进制数前冠以字母“B”,例如B10011100;八进制数前冠以字母“O”,例如O257;十进制数前冠以字母“D”,例如D122;十六进制数前冠以“H”,例如H2F。
在这里PIC8位单片机默认进制是十六进制,在十六进制数之前加上Ox,如H2F可以写成Ox2F。
指令的操作数项也是可选项。
PIC系列与MCS-51系列8位单片机一样,存在寻址方法,即操作数的来源或去向问题。
因PIC系列微控制器采用了精简指令集(RISC)结构体系,其寻址方式和指令都既少而又简单。
其寻址方式根据操作数来源的不同,可分为立即数寻址、直接寻址、寄存器间接寻址和位寻址四种。
所以PIC系列单片机指令中的操作数常常出现有关寄存器符号。
有关的寻址实例,均可在本文的后面找到。
4注释 用来对程序作些说明,便于人们阅读程序。
注释开始之前用分号(;)与其它部分相隔。
当汇编程序检测到分号时,其后面的字符不再处理。
值得注意:
在用到子程序时应说明程序的入口条件、出口条件以及该程序应完成的功能和作用。
二、清零指令(共4条)
1寄存器清零指令
实例:
CLRW;寄存器W被清零
说明:
该条指令很简单,其中W为PIC单片机的工作寄存器,相当于MCS-51系列单片机中的累加器A,CLR是英语Clear的缩写字母。
2看门狗定时器清零指令。
实例:
CLRWDT;看门狗定时器清零(若已赋值,同时清预分频器)
说明:
WDT是英语WatchdogTimer的缩写字母。
CLR见上述说明。
注意该两条指令无操作数。
3寄存器f清零指令。
指令格式:
CLRFf
实例:
CLRFTMRO;对TMRO清零
说明:
在PIC系列8位单片机中,常用符号F(或f)代表片内的各种寄程器和F的序号地址。
F取值按PIC系列不同型号而不同,一般为Ox00~Ox1F/7F/FF。
TMRO代表定时器/计数器TMRO,所以CLRF对寄程器清零,采用了直接寻址方式直接给出要访问的寄存器TMRO。
4位清零指令。
指令格式BCFf,b
实例:
BCFREG1,2;把寄存器REG1的D2位清零
说明:
BCF是英语BitClearF的缩写。
指令格式中的F,同上说明;符号b是表示PIC片内某个8位数据寄存器F的位号(或位地址),所以b的取值为0~7或D0~D7。
实例中REG是Register的缩写。
实例中的2代表指令格式中的b=2即寄存器REG1的D2位。
通过上述四条清零指令格式和实例,可以说明,学习PIC系列8位单片机的指令时应首先了解指令的助记符意义(功能),再有就是它的表达方式。
初学者没有必要死记指令,重要是理解和实践。
成都 史为
竞赛试题:
10有一RB(8位)寄存器,其工作状态RB=OxB8,对它执行指令:
BCFRB,4
执行后的RB=B ;Ox ;O 和D 。
11指令中的标号是可选项,在什么条件下可派上用场?
Windows下PIC8位单片机源程序汇编和固化
(一)
单片机本身没有开发编程能力,所以要把单片机变成一种应用产品,必须借助于硬件开发和软件开发两种工具。
在进行软件开发时,首先利用相关的编辑软件,按照相应的格式建立PIC单片机的源程序(助记符程序),然后对源程序进行汇编。
在完成汇编之后,用户可以利用模拟调试软件(价位低)或者硬件在线仿真器(价位高)对其目标程序(机器代码)进行运行调试,以发现其错误并修改之。
在经过调试、修改、再汇编之后,即可将修改后的目标程序用硬件(工具)编程器将目标代码烧写到用户的PIC芯片中。
最后将烧写后(即固化)的芯片插入到用户板(实验板)脱机运行,如还有问题(通常是多条程序的条件下),就检查硬件电路和软件的设计,找出错误并修改、再汇编、调试直到脱机运行正常为止。
Microchip公司在推出PIC系列单片机产品的同时,也推出了相对应的软件开发和硬件开发工具,例如PIC在线仿真器、MPLAB集成开发软件、MPSIM软件仿真器、MPASM宏汇编程序以及PIC通用编程器等。
不仅如此,国内开发PIC系列单片机的工作也很迅速,许多公司或研究所也推出了相应的开发装置,其中既有适用于初学者、低价位的软件仿真和编程器,也有适用于产品开发的高中档开发应用装置。
有些高档的开发器还能支持C编译器(如MP-C)与模糊逻辑开发系统等。
这些开发装置既可独立运行,也可以和PC机联机运行。
总之,开发PIC系列单片机的工具不仅十分成熟也是多种多样的。
在PC机上对PIC系列单片机的源程序汇编时,既可以在DOS条件下,也可以在Windows条件下进行。
以下将介绍Windows下源程序汇编的方法和步骤。
1Windows下PIC集成开发软件MPLAB
MPLAB是Microchip公司为PIC系列单片机开发产品提供的适用于PC机Windows的集成开发软件。
MPLAB的版本从早期到现在已发展到多种:
如MPLABV301版、V302版、V40版、V499和V50版等。
各版本之间向下兼容,所以尽管PIC系列单片机品种如此之多,用户只需选择相应版本的MPLAB集成开发软件,均可达到开发目的。
(1)MPLAB的特性和安装
MPLAB是一种易学易用的PIC系列单片机产品的集成开发工具软件。
该软件由MPLAB编辑程序、MPLAB项目管理程序(Projectmanager)、MPASM汇编程序(Windows版)和MPLAB-SIM模拟调试程序等工具软件组成。
MPLAB能帮你调试源代码,观察程序流程、调试以及优化固件生产设计的PIC单片机应用程序。
上述的各种软件将在本报下几期通过实例介绍其功能和用法。
MPLAB集成开发软件对计算机系统的硬件与软件配置要求如下:
MicrosoftWindows3.X版、95版和98版均可;标准键盘和鼠标;4MB(最好是16MB以上)的内存和VGA以上显示器等。
MPLAB的安装简单,只要熟悉PC机的用户均可利用磁盘或光盘CD-ROM中MPLAB的SETUPEXE文件和相关的提示语句进行安装。
若是初学者,可请电脑行家进行安装。
安装MPLAB软件时,最好在显示屏上粘贴Microchip/MPLAB的快捷图标,以使操作方便。
(2)MPLAB的桌面系统
Windows操作系统与DOS操作系统的最大区别就是广泛使用了图形化操作界面,因此对话框是用户在操作Windows过程中最经常接触的东西。
MPLAB的所有功能都可通过MPLAB桌面(对话框)中的菜单命令来操作。
当你的PC机上安装了MPLAB集成开发软件之后,打开PC机,用鼠标点击显示器上的快捷图标Microchip即可在显示器上看到MPLAB的桌面,如附图所示(V499版)。
该桌面是一个大小可变的窗口。
MPLAB桌面顶部的左边字符为标题栏(MPLAB);标题栏的下面为菜单栏(MENU),菜单栏的下面为工具栏,底部为状态栏。
桌面窗口中的菜单栏是下拉式的。
MPLAB共有多个菜单选项(V322、V499有9个,V301是8个)。
所有的MPLAB功能均可通过下拉式菜单来访问,菜单中加有下划线的字符表示加速键(KeyAccelerators),在菜单下拉时,用鼠标点击该字符键可立即执行该项功能。
MPLAB的各种菜单的功能,笔者将会通过具体的程序汇编应用实例加以详细说明。
成都 丁锦源
知识竞赛试题:
26给单片机PIC16C54的工作寄存器W送数0x08,请写出相应的源程序清单。
R3 EQU 0X03
PORT5 EQU 0X05
PORT6 EQU 0X06
R3 EQU 0X03
KEY_STATUS EQU 0X10 ;低半字节为按键标志,高半字节为控制标志
SIGNAL_LOW EQU 0X11 ;信号电平低计数器
SIGNAL_HIGH EQU 0X12 ;信号电平高计数器
DATA_RECORDER EQU 0X13 ;接收码数据字节
CODE_RECORDER2 EQU 0X14 ;接收码地址高字节
CODE_RECORDER1 EQU 0X15 ;接收码地址低字节
CODE_TOTAL EQU 0X16 ;接收数据位计数器
KEY_COUNTER EQU 0X17 ;两次按键检测计数器
/**********************KEY_STATUS标志位定义***********************************/
AUTORUN_KEY EQU 0 ;遥控键标志
LOCK_KEY EQU 1 ;防盗键标志
SEARCH_KEY EQU 2 ;寻车键标志
OPEN_KEY EQU 3 ;解除键标志
PRESS_FLAG EQU 4 ;有键按下标志
CHECK_FLAG EQU 5 ;校验标志
/***********************CONSTANT DEFINE*************************************/
CODE_ADDRESS1 EQU 0B10001100 ;遥控器地址码,更改常数即可实现其他遥控器收码
CODE_ADDRESS2 EQU 0B00101100
AUTORUN_VALUE EQU 0B00000011 ;遥控器相应键值,改变相应数值即可更改其功能
LOCK_VALUE EQU 0B00001100
SEARCH_VALUE EQU 0B00110000
OPEN_VALUE EQU 0B11000000
/**********************当PORT6.2口电平为高时调用该程序收码******************/
;PORT6.2为信号输入口
collect_2262:
mov a,@0xf0
And KEY_STATUS,a
clr code_total
clr signal_high
collect1:
inc signal_high
MOV A,SIGNAL_HIGH
SUB A,@30
JBS R3,0
RET
clr signal_low
call delay20us
jbs port6,2
jmp collect_low
jmp collect1
collect_low:
mov a,signal_high ;信号高电平宽度<80US时滤除
sub a,@4
jbc r3,0
ret
mov a,@20 ;信号高电平宽度在80—400US时为采集为0
sub a,signal_high ;信号高电平宽度在400US以上时为采集为1
rrc data_recorder
rrc code_recorder2
rrc code_recorder1
inc code_total
clr signal_high
mov a,@24
xor a,code_total
jbc r3,2
jmp collect_end
input_low:
inc signal_low
mov a,signal_low ;信号低电平宽度大于800US时滤除
sub a,@40
jbs r3,0
ret
call delay20us
jbs port6,2;3
jmp input_low
jmp collect1
collect_end:
mov a,code_recorder1 ;校验低字节地址
xor a,@code_address1
jbs r3,2
ret
mov a,code_recorder2 ;校验高字节地址
xor a,@code_address2
jbs r3,2
ret
jbs KEY_STATUS,check_flag ;是否是第一串收码?
jmp storage_data
bc KEY_STATUS,check_flag
mov a,com_data_rec
xor a,data_recorder
jbs r3,2
jmp storage_data
mov a,data_recorder
xor a,@autorun_value ;是启动键?
jbs r3,2
jmp key1
bs KEY_STATUS,autorun_key ;置启动键标志
bs KEY_STATUS,press_flag ;置有键按下标志
clr key_counter ;清除按键间隔计数器
ret
key1:
mov a,data_recorder
xor