您的位置 首页 分销

通俗易懂讲PIC单片机:从一无所知到入门前进

单片机入门不难——谈PIC系列(转自矿石收音机论坛—崂山)十年前的老帖子,讲得通俗易懂,分享之。请看图1这个8条腿的小螃蟹就是我们的第一顿饭,只要把它吃下去,以后的大餐就好

  单片机入门不难——谈PIC系列(转自矿石收音机论坛—崂山)十年前的老帖子,讲得通俗易懂,共享之。

  请看图1

    

  这个8条腿的小螃蟹便是咱们的榜首顿饭,只要把它吃下去,往后的大餐就好办了。

  第1、8条腿接电源 +5V 和 地线。头两条腿是螃蟹钳子,好吃的很。 现在剩余了 6 条腿

  第2、3条腿 运用时外接一个晶振的东西 咱们接一个 4 MHz的。

  第4条腿是复位脚,是一个信号输入脚。单片机正常运转时接高电平。当有一个低电平脉冲输入到这个脚时单片机就复位。所谓复位便是单片机内部一切的作业部件通通回到规则的状况,程序也复位到头一句上开端逐条运转。例如,你规划的一个报警确定的 LED红灯亮后,当需求免除报警时,用一个按钮给这个脚瞬时接地一下,相当于给它一个夫脉冲,体系就复位了,led灯就平息了,程序从头开端。

  以上5个脚,简直一切单片机都有,包括国际上最杂乱的,和国际比较简略的单片机—–PIC12CE519

  轮究竟几条腿啦?奥是第5条腿,这条叫单片机的 I/O 脚。便是输入输出脚。你可通进程序动态地操控它作为输入或输出,作为输出时能够程序操控它的输出电平为高1或低0。所以,他的作业状况有四种:输入0,输入1,输出0,输出1

  剩余的两条腿和第5脚功用一个样。

  上边咱们现已把8条腿消化掉了,其实咱们要弄了解的也就3只腿,咱们再简略一些,先整了解两条腿,即GP0,GP1.这两条腿初级一点的用法,能够操控继电器,LED灯,高档一些的用法能够进行I2C总线,RS232总线的通讯,作为扩展输入能够模仿出来A/D转化器(6–7bit),能够丈量一个电阻的大略值。作为输出也能够直接推进扬声器奏出音乐。这是后话暂时不提。

  现在要操控运用这两只腿,我这个三脚猫功夫的平话的不得不讲一下软件了,要想讲了解软件又不得不触及到单片机的内部结构。那位说啦,你可别提这软件和结构了,从前俺便是让它们打败的,现在听到这个心里就打鼓。嘿嘿,没联系,果然如你所说,那你就无妨跟着我再失利一次, 横竖吗多一次失利又不交税,嘿嘿。不过你也要有思想准备,彻底弄了解是个渐进的进程。

  要说这程序和单片机内部结构,还真是老大难,不过蟹黄蟹肉都可都在里边。我现在要是给你说PIC单片机是哈佛结构的,51系列是冯-诺伊曼结构的,恐怕你要立马扎走人了。所以我得用点心思不让你溜号。

  好在PIC系列的制造商(microchip 微芯公司 美国)了解我等苦衷,悉数只要35条指令,而且有一些指令咱们一般很少运用,常用的也就十几句,用的时分查手册,无需回忆。就算咱们两天学习一句,也就两三个月时刻,总比到老了还怕它们强啊。废话少说先看下面的两个例语:

  my_name006: movlw 02h '常数2进入w

  movwf GPIO 'W 的数进入 寄存器GPIO

  这便是咱们编的程序里的两个句子,也叫源程序。有以下特色

  每行只能写一句话

  每句话由四部分组成:

  标号: 操作指令 操作数 '程序注释

  下面我结合比方把这四部分解释一下。

  榜首部分 my_name006: 叫做标号,它是由字母或数字组成,由冒号完毕。标号可有可无,比方第二句就没有标号。

  第二部分movlw 叫做操作指令。它是有必要有的,不能省掉。PIC 系列的单片机共有 35 条指令。

  第三部分02h 叫做操作数。有的指令没有操作数或许操作数是默许的,也不必写。

  第四部分是程序注释,有必要以单引号最初,首要作用是提示和备忘。注释也是可有可无。

  第二个例句中,省掉了标号,当然注释也能够省掉。他的指令是movwf, 操作数是GPIO。操作数纷歧定是数字,也或许是一个由字母组成的字符串。

  知道了句子格局往后,咱们下面就学习一些常用句子。咱们先把这两个例句弄清楚。

  这两句话的作用是把 2 这个常数写入到 GPIO 这个寄存器里。

  单片机里有一些部件需求咱们运用和操作,都是经过读写寄存器来完结的。每个部件都对应有操控它的寄存器,例如咱们要操控运用的管脚GP0,GP1 这两个管脚对应的寄存器就叫做GPIO。对GPIO寄存器读操作,实践等效观察管脚电平的凹凸;对GPIO寄存器相应的位写1操作,实践等校让管脚输出高电平。写0,输出低电平。

  每个寄存器能够贮存一个八位的二进制数。这八个位的每个位都有称号,从左向右的称号是:

  左端第首位称号叫D7,

  左端第二位称号叫D6,

  左端第三位称号叫D5,

  左端第四位称号叫D4,

  左端第五位称号叫D3,

  左端第六位称号叫D2,

  左端第七位称号叫D1,

  最终一位叫D0,

  而每一个位对应一个管脚的电平,例如当GPIO寄存器的D0位等于1时表明管脚GP0 的电平是高电平。D0位等于0时表明管脚GP0 的电平是低电平。常数2的八位二进制表明是“00000010” 所以,GPIO寄存器寄存的8位2进制数的每个位的值以及管脚电平是:

  D7对 应于内部总线管脚的电平 D7=0 内部总线管脚输出低电平

  D6对应于内部总线管脚的电平 D6=0 内部总线管脚输出低电平

  D5对应于GP5 管脚的电平 D5=0 GP5 管脚输出低电平

  D4对应于GP4 管脚的电平 D4=0 GP4 管脚输出低电平

  D3对应于GP3 管脚的电平 D3=0 GP3 管脚输出低电平

  D2对应于GP2 管脚的电平 D2=0 GP2 管脚输出低电平

  D1对应于GP1 管脚的电平 D1=1 GP1 管脚输出低电平

  D0对应于GP0 管脚的电平 D0=0 GP0 管脚输出低电平

  GP0—GP5管脚咱们能够从上一讲的图1硬件中查出所对应的管脚。d7 d6 对应的内部时钟和数据总线咱们现在暂时不要管它。往后本事大了在调教它们。在咱们的例句中,向GPIO寄存器写入了2,常数2的八位二进制表明是“00000010” 因而假设此刻GP0, Gp1等都现已被界说成输出的话,那么GP1输出高电平(接LED灯亮),GP0 输出低电平(所接led灯熄) 。

  截止到现在,你现已学会怎么操控管脚的电平凹凸了。尽管还有一些疑问,比方怎样界说管脚为输出脚(往后会说),我得说假设事前gp1,gp0这两个管脚处于输入状况,这两个例句无效,是操控不了电平的。

  无论怎么,这一会儿,你就学会了两个指令,35条我看也没啥难的。

  '——————————————————————————

  再加深一下对寄存器的知道:

  要把一个常数存储到,或许说写到一个寄存器中,仅用一条指令是办不到的,有必要经过一个特别的寄存器W,把数据倒过去. 这就应该运用到两个句子。

  movlw 02H 指令的意思是把一个常数存入特别寄存器W, 这个常数是3,后边的H是表明十六进制

  movwf GPIO 指令的意思是把特别寄存器W的数值存入寄存器. 这个寄存器的称号是 GPIO

  这儿触及到两个概念,常数和寄存器.

  常数好说,比方说十进制数 35, 26 但要留意,在单片机体系里咱们一般不必十进制,而运用十六进制. 有关数制转化方面的常识,是计算机的根底,有必要会娴熟地在二进制、十六进制、十进制之间转化,我就不罗索了.

  寄存器也叫单片机的内存。

  一个寄存器能够存储的数值规模是0–255,用十六进制表明便是 0—FFH.用二进制表明便是00000000—-11111111.

  往后要养成习惯用十六进制表明数.

  那么,一个单片机里有多少个这样的寄存器哩,pic12ce512里边有1024个这样的寄存器能够供你运用,为了运用便利生产商现已给它们编上了号码,榜首号码是000H,往下依照次第为 001H,002H……..3FFH.(怎么样,开端用十六进制说事了吧,假设你不熟悉熟制转化赶忙补课来得及)

  有了编号就像咱们寓居的房间有了房间号码,运用就便利的多了.房间号码在邮政职业叫地址,因而咱们称这些号码叫做寄存器地址,或称地址数 例如 称号为 GPIO 的寄存器,他的地址,或地址数是 06H 。所以咱们的两个例句彻底等同于:

  my_name006: movlw 02h '常数2进入w

  movwf 06H 'W 的数进入 寄存器GPIO

  '—————————————–

  有两个寄存器比较特别,它们没有地址,一个姓名叫做 W, 另一个叫做 TRIS. 所以他们两个在存储数据的时分比较快,一个指令就能够解决问题,例如: movlw 03H 一条指令就把常数3写入到W寄存器了。关于TRIS寄存器,咱们往后用到它再说.

  除了他们两个以外的其他一切寄存器,在写入数据时一般都要用两条指令进行。

  今日就扯到这儿,尽管只要两个指令,但首要意图是要同学们触摸一下指令,树立寄存器的概念以及他们同硬件部件的联络。增强学习的决心。能有这些领会,这一节就算过关了。

  跟着往后的深化,你会发现小小单片机里边是一个大国际,爱好也由此而生。

  咱们上一次讲的两个指令是是怎么操控管脚电平的凹凸。条件是一切管脚现已被界说成输出了(OUT)假设被界说成了输入,则前次的指令尽管也能运转,但运转后一点点不能改动管脚电平凹凸,因为此刻管脚是输入状况,电平取决于外部输入,指令无法改动。

  在PIC单片机系列中,改动I/O口的输入输出依托写入寄存器TRIS的值,相应位写0,表明对应管脚被界说成了输出,写1,便是输入。

  现在假设预把GP1、GP2管脚界说成输出,其他脚满是输入。那就应该向TRIS 寄存器写入二进制数 11111001,换算成十六进制便是

  F9H.

  依照从前咱们学到的常识,在PIC系列单片机里,原本应该用下列的句子来完结咱们的设定:

  movlw 0F9H '常数进W 以字母最初的常数前面有必要加0

  movwf TRISA '把W内的数仿制到TRIS

  实践上PIC系列的单片机也都是这么写的,后边加的A,表明榜首个8位的口(有的单片机不只一个口,还有好几个8位的I/O口如TRISB TRISC TRISD等等) .

  可是,记住了, PIC12系列的单片机有必要改写成为:

  movlw 0F9H '常数进W 以字母最初的常数前面有必要加0

  tris GPIO '把W内的数仿制到TRIS 往后凡见到这个指令一概了解成 movwf TRISA

  写法不同,意思是相同的. 这样你就又学了一个指令TRIS,不过这个指令的本质仍是你从前学过的movwf 仅仅写法不同算了.

  在PIC12系列里TRIS作为指令, 在其他系列(PIC161718)里把 TRIS 作为一般寄存器看待.

  因为咱们现在讲的便是PIC12CE519,所以咱们暂时用

  tris GPIO

  这个格局,等往后进入PIC16C877 咱们再写成 movwf TRISA , 至于了解依照后者进行.

  '———–

  假设咱们要操控GP1 GP2管脚的输出电平, 其他管脚作为输入.而且让GP1输出低电平,GP2输出高电平.完好的程序如下:

  movlw 0F9H '常数进W

  tris GPIO '把W内的数仿制到TRIS ,GP1 GP2为输出,其他为输入

  '此行无指令,起到的作用是简单读懂程序

  movlw 04H '常数4的二进制是 00000100 ,GP1=0 GP2=1

  movwf GPIO 'W内的数进GPIO 输出收效,本来界说成输入的脚的电平,不会受该句影响

  上面现已学会了三条指令,可是8位寄存器的概念概念一定要树立起来,程序经过写入寄存器不同的数据

  操控管脚作为输入运用仍是输出运用,作为输出时是输出高电平仍是低电平。

  这样的操作又一个特色,便是每次写入数据,一起操控的往往不是一个管脚,而是好几个个.最多一次可

  以操控8个管脚.在单片机里往往每8个脚叫做一个口,如口A, 口B,用英文表明便是GPIO PORTA PORTB PORTC 等.

  更多的状况是:某个口内的某一个管脚需求改动电平,其他脚电平不变.例如咱们仅需求GPIO口上的GP1

  这个管脚的电平拉高,其他管脚电平不发生改动.这时分位操作指令为咱们供给了便利,假设咱们事前现已把GP1管脚界说过输出了(办法见前面讲过的):

  bcf GPIO,GP1 '注释 GPIO口上GP1管脚电平拉低,咱们行话叫 铲除。

  bSf GPIO,GP1 '注释 GPIO口上GP1管脚电平拉高,咱们行话叫 置位。

  怎么样,这样操控某一个管脚的电平就便利多了,你的编程功率大大提高啊.

  记住:PIC一切单片机一切寄存器都是能够位操作的,这在51的单片机上是不能彻底完结的.

  不只如此,PIC一切单片机一切管脚的单腿驱动输出电流能够高达 25mA,所以假设你驱动一个 5到10mA电流的LED发光二极管,底子不必加三极管,串个电阻直接挂在单片机上就得了,这在51的单片机上也是不能完结的,要加驱动三极管或驱动芯片.

  怎么样,学PIC有优点吧. 也别急,优点还有那,且听我慢慢地文言。

  一不小心,你现已会 5 个指令了,还有30个,加油啊。

  持续

  单片机的大部分指令,或许说单片机所做的大部分作业,大都在写入或读出寄存器。关于寄存器的开端概念我想咱们现已树立起来了,它是一个能够存储8位二进制数据(最大255 = 0FFH) 的单元 每个单元都有它的编号,咱们叫做它的地址,或地址编码. 地址编码也是十六进制的. 别的寄存器里的数据掉电就会丢掉。

  寄存器的英文是RAM 也要记住.

  PIC12CE519 里边共有有48个寄存器供咱们操作运用, 它们每一个都有固定的地址编码。

  地址编码并不是接连的号码,而是分红了两段:

  榜首段: 从00H 开端, 依次是01H, 02H, 03H ….0AH, 0BH……到1FH 完毕. 计32个寄存器

  第二段: 从30H 开端, 依次是31H, 32H, ………………….到3FH 完毕 计16个寄存器

  这种地址不接连编号, 而是要跳过去一段的做法, 关于咱们新手来说很是不习惯. 为了让咱们简单入门, 咱们暂时先不论第二段RAM, 只当它不存在, 一切程序咱们只触及到榜首段接连的ram 地址. 等咱们娴熟的把握好了ram 的运用,再触及第二段地址的RAM, 那时,你就会了解单片机规划者把它们分红两段的苦心了.

  为了标准,咱们往后一概把RAM的分段, 叫做分页. 榜首地址段叫00页面, 第二地址段叫01页面.

  例如: 咱们学过的 I/O 口电平操控寄存器 GPIO, 它的地址编码是 06H, 归于00页面.

  '—————–

  一切这32+16=48个寄存器除了在地址上分红了两个页面以外,又把它们分红两类:

  一类专用寄存器,一类通用寄存器.

  所谓专用,便是这个寄存器的功用现已由体系分配好了.例如 地址为06H 的称号就做GPIO寄存器的功用,是它的每个位,都对应到一个I/O脚的电平.

  另一类 是通用寄存器,你能够了解成它的功用体系没有事前预订,而是由你在编程序的时分随机运用.

  pic12ce519 的专用寄存器有 7 个, 方位在咱们第00叶面的最前面. 这7个专用寄存器的地址编码是: 00H,01H, 02H, —-06 H

  剩余的一切寄存器包括一切第01页面, 悉数都是通用寄存器.

  比方: 在两个通用寄存器 09H, 0AH 内, 写入常数 FC H

  movlw 0FCH '常数进W

  movwf 9H '仿制W内的数到通用寄存器09H

  movwf 0AH '仿制W内的数到通用寄存器0AH 因为此刻W内并没有改动,W不必再进常数.

  '———————————————-

  下面是P%&&&&&%12CE519的 寄存器ram的地址地图:

  图最上端的 00 01 表明的是页面号码,或叫页面地址。

  左边 从00 — 1FH 是00页面, 右侧是01页面。

  从00H 到 06H 都现已起好了称号 ,它们是专用寄存器,用处各有不同。往后咱们会逐一介绍它们

  剩余的都是通用寄存器 或许叫一般寄存器 General Purpose Registers 意思是一般用处的寄存器

  地址从20H 到 2FH 也不是“空泛”,也不是不能拜访,仅仅读写它们的时分等于读写它们左边对应的00页面。这一点咱们或许有些利诱,弄不了解也没有联系,往后跟着程序了解的深化,会搞清楚的。

  内存图谱,不要求记下来,可是应该有个大体形象,用的时分会观察就能够了。等编程时刻一长

  就那么几个字节,天然就记住了。

  所谓字节是衡量二进制数据长度的一个单位。一个寄存器刚好能记住一个字节的数据。假设你要存储的数据比较大超过了255,那就要占2个存储器乃至更多。描绘的时分一般咱们不说这个数值占了多少个寄存器,而是说这个数据是几个字节的。

  字节的英文是byte 一个二进制数的一位,叫比特 英文bit 1 byte 包括 8 bit

  持续

  下面咱们学习一条新指令,叫做空操作指令

  nop '什么事情也不做,但履行这个指令也要消耗掉一点时刻。它没有操作数。

  '不要了解成程序停了,实践上程序仍在正常运转。履行一连串的空操作指令,单片机

  '白消耗时刻,什么活也不干,往往用于延时

  假设你需求一个很短时刻的延时,能够选用一连串的空操作。留意每个 nop 也是占一行, 例如:

  movlw 0F9H '常数进W

  tris GPIO '把W内的数仿制到TRIS ,GP1 GP2为输出,其他为输入

  bsf GPIO,GP1 '管脚GP1输出高电平点亮LED灯(假设你现已接上灯的话)

  nop

  nop

  nop

  nop

  nop

  … .

  bcf GPIO,GP1 '管脚GP1输出低电平封闭LED灯

  nop

  nop

  nop

  nop

  …

  运转的作用是接在管脚GP1上的LED灯先亮一段时刻,再平息一段时刻的闪耀。

  这回再说一个程序转向的句子,goto 指令,学过basic 和 c 等言语的对它不生疏。

  单片机对程序的履行是逐句自上而下进行。当它运转到某个方位,假设你不期望持续运转它下面的句子,而是期望它无条件的强行转到某一句上,就能够运用goto句子。

  咱们仍是经过比方来阐明goto 的运用办法。

  已知外部晶振的频率为4 MHz, 规划程序从pic12ce512 单片机的GP1管脚上输出一个方波信号,信号频率固定并计算出频率的值。

  movlw 0F9H '常数进W

  tris GPIO '把W内的数仿制到TRIS ,GP1 GP2为输出,其他为输入

  myWAVE: bsf GPIO,GP1 '管脚GP1输出高电平点亮LED灯(假设你现已接上灯的话)

  nop

  nop

  nop

  nop

  nop

  nop

  nop

  bcf GPIO,GP1 '管脚GP1输出低电平封闭LED灯

  nop

  nop

  nop

  nop

  nop

  goto myWAVE 'myWAVE是标号,某行有必要有这个标号,不然程序通不过

  nop '因为goto的存在,以下句子得不到运转

  nop

  nop

  当程序自上而下运转到goto 句子时, 不再持续运转它底下的句子, 而是让程序强行转向到标号为myWAVE的句子上,并持续运转.

  这样一来的成果,程序会永远在标号myWAVE的这一句 bsf GPIO,GP1 到goto之间循环, 打转转.

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/158936.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部