资讯详情

通俗易懂讲PIC单片机:从一窍不通到入门进步

单片机入门不难——谈单片机入门不难—PIC十年前的一系列老帖子(转自矿石收音机论坛-崂山)很容易理解和分享。请看图1

这只八条腿的小螃蟹是我们的第一顿饭,只要吃了,以后的大餐就好办了。一、八条腿接电源 5V和 地线。前两条腿是蟹钳,很好吃。 现在剩下了 6 条腿第2、3条腿 使用时外接晶振的东西我们接一个 4 MHz的。第四条腿是复位脚,是信号输入脚。单片机正常运行时接高电平。当低电平脉冲输入脚时,单片机会复位。所谓复位,就是单片机内所有工作部件都回到规定状态,程序也复位到最后一句,开始一个接一个地运行。例如,您设计的报警 LED红灯亮后,当需要解除报警时,用按钮瞬间接地脚,相当于给它一个夫脉冲,系统会复位,led灯熄灭了,程序从头开始。几乎所有的单片机都有以上五只脚,包括世界上最复杂和简单的单片机-----PIC12CE519轮到底有多少条腿?奥是第五条腿,叫单片机。 I/O 脚。是输入输出脚。您可以通过程序动态控制它作为输入或输出,程序可以控制它的输出电平高1或低0。因此,他有四种工作状态:输入0、输入1、输出0、输出1剩下的两条腿和第五条一样。我们已经消化了上面的八条腿。事实上,我们只需要三条腿来理解。我们更简单。首先,我们应该理解两条腿,即GP0,GP1.这两条腿的低级用法可以控制继电器,LED灯,一些先进的用法可以执行I2C总线,RS232总线的通信,作为扩展输入可以模拟出来A/D转换器(6--7bit),电阻的粗略值可以测量。音乐也可以作为输出直接推动扬声器。也可以直接推动扬声器作为输出演奏音乐。这是以后再也不提了。现在要控制这两条腿的使用,我的三脚猫功夫说书必须谈谈软件,要理解软件,必须涉及单片机的内部结构。那个人说,你不能提这个软件和结构,我以前是让他们打败的,现在听到这个心就打鼓。嘿嘿,没关系,如果你说的话,你不妨再跟着我失败一次, 反正多一次失败不纳税,呵呵。但是,你也要做好心理准备,彻底理解是一个渐进的过程。说这个程序和单片机的内部结构真的很难,但是蟹黄蟹肉都可以在里面。如果我现在告诉你的话PIC单片机是哈佛结构的,51系列是冯-诺伊曼结构的,恐怕你会马上离开。所以我必须小心不要让你溜走。好在PIC系列制造商(microchip 微芯公司 美国)理解我的困难,只有35个指令,有些指令我们通常很少使用,通常只有十几个字,检查手册,不需要记住。即使我们两天学习一个句子,也只有两三个月,总是比害怕他们更好。废话少看以下两个例子:my_name006: movlw02h '常数2进入w movwfGPIO 'W 的数进入 寄存器GPIO这是我们编程中的两个句子,也叫源程序。具有以下特点每行只能写一句话每句话由四部分组成:标号:操作指令 操作数 '程序注释让我结合例子来解释这四个部分。第一部分 my_name006: 称为标号,由字母或数字组成,以冒号结束。标号是可有可无的,例如,第二句没有标号。第二部分movlw 叫操作指令。必须有,不能省略。PIC 单片机共有系列 35 条指令。第三部分02h 称为操作数。有些指令没有操作数或默认操作数,也不需要写。第四部分是程序注释,必须从单引号开始,主要作用是提醒和备忘。注释也是可有可无的。在第二个例句中,标签被省略,注释也可以省略。他的指示是movwf, 操作数是GPIO。操作数不一定是数字,也可能是由字母组成的字符串。在了解了句子的格式之后,我们将在下面学习一些常用的句子。让我们先弄清楚这两个例子。这两句话的作用是把 2 这个常数写入 GPIO 这个寄存器。单片机中的一些部件需要我们使用和操作,这些部件是通过读写寄存器实现的。每个部件都对应于控制它的寄存器,例如我们需要控制使用的管脚GP0,GP1 这两个管脚对应的寄存器就叫做GPIO。对GPIO寄存器读取操作,实际等效观察管脚电平;对GPIO相应的位写寄存器操作,实际等校让管脚输出高电平。写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, 这个常数是2,后面的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  以字母开头的常数前面必须加0movwf    TRISA      '把W内的数复制到TRIS  实际上PIC系列的单片机也都是这么写的,后面加的A,表示第一个8位的口(有的单片机不仅一个口,还有好几个8位的I/O口如TRISB  TRISC  TRISD等等) .  但是,记住了,       PIC12系列的单片机必须改写成为:  movlw    0F9H      '常数进W  以字母开头的常数前面必须加0tris         GPIO      '把W内的数复制到TRIS       以后凡见到这个指令一律理解成 movwf     TRISA  写法不同,意思是一样的.  这样你就又学了一个指令TRIS,不过这个指令的实质还是你曾经学过的movwf 只是写法不同罢了.在PIC12系列里TRIS作为指令, 在其他系列(PIC16\17\18)里把  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    '常数进Wmovwf     9H      '复制W内的数到通用寄存器09Hmovwf     0AH     '复制W内的数到通用寄存器0AH  由于此时W内并没有改变,W不用再进常数.'----------------------------------------------  下面是PIC12CE519的 寄存器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之间循环,  打转转.  客观运行的结果是 GP1管脚电平不停地一会高,一会低, 就输出了方波信号.  要计算方波的频率,我们必须知道单片机每运行一条指令需要多少时间.这个时间的单位不以通常的秒 毫秒 或微秒作为单位, 而是以”机器周期” 为单位.  以后凡是我们讨论单片机内部的时间问题都要以机器周期作为时间单位.  至于一个机器周期究竟是多少微妙或毫秒, 取决于单片机的品牌和振荡频率频率大小, 等一会我们再用公式计算我们PIC12CE512在4MHz震荡频率下的机器周期是多少个微妙。  我们先看看我们的程序中GP1脚的高电平低电平都是用了多少个机器周期.  PIC单片机所有指令都是单机器周期的指令,例外的情况是goto 语句要用2个机器周期  还有一个call指令用的时间也不完全是一个机器周期(待后续)   其他品牌的某些单片机可不是这样,一条指令往往要用几个周期……  从bsf 到bcf有8个指令,都是单周期指令,所以GP1高电平时间长度是8个机器周期从bcf 到bsf有7条指令,其中6条是单周期指令  1条双周期指令(goto). 所以GP1低电平时间长度也是8个机器周期  这样,我们输出方波的周期长度就是16 个机器周期.  Pic品牌的机器周期 = 4/振荡频率          (公式)  所以,在我们的例子当中         1个机器周期=4/4MHz= 1 uS也就是说,我们的例子中,执行一条指令仅需要1微秒的时间.  这样,我们输出的方波周期就是16微秒, 频率是            f  =1/16   =0.0625 兆赫     =62.5 KHz  如果这个方波的频率比较低,你再接一个扬声器到GP1脚上你就可以听到声音了频率降低到几赫兹的时候, 接一个led灯, 就会不停的闪烁.  当然, 频率太低你用的nop指令的数目会很多,程序虽简单但是臃肿, 这没有关系,我们主要是在学习程序, 弄清楚道理是目的。要想使得程序不臃肿我们有的是办法,这就必须再学习新的指令.  如果此前我讲的你基本都弄明白了,那你现在已经抓住单片机入门的门把手了, 还需轻轻的推开.  当你坐在家里吃着月饼,惬意地用电视遥控器选择电视频道,不停地用 +/- 键盘调节电视音量到合适的时候,你可曾想过,此时崂山也许正钻在在温度高达35摄氏度以上的树丛里,忍耐蚊子蚂蚁的叮咬,研究用什么样的通信线更好地防止雨水侵蚀和动物的啃咬。  也许你从没有留意你按下的节目频道、音量等这些 标有 + / - 符号的键盘是怎样工作控制大小的。    下面我们学习两个新指令 incf  和  decf  ,它们都是对某一个寄存器进行增1 或减1  操作,例句中假如我们要操作的寄存器是 09H  movlw    02H   '常数2进入W    movwf    09H   '把w 内的数2 复制到09H 这个寄存器                            '现在09H 寄存器内存储的数是2   incf         09H     '寄存器09H内存储的数 增加1                            '现在09H内存储的数变成3   decf       09H     '寄存器09H内存储的数 减掉1                             '现在09H内存储的数变成2     movlw    0FFH     '常数255进入W   movwf    09H       '把w 内的数255 复制到09H 这个寄存器                              '现在09H 寄存器内存储的数是255     incf     09H          '寄存器09H内存储的数 增加1                              '现在09H内存储的数变成0     decf     09H            '寄存器09H内存储的数 减掉1                                '现在09H内存储的数又变成255  如果你事先定义好了地址为09H 的这个寄存器里存储的数字大小,代表电视机节目频道的话,你会很喜欢这两个指令的。并且当节目频道到达最大值255  或最小值0的时候无需担心,寄存器在0时减1 会得255, 255状态下增1 会得0  至于为什么会这样,学过环形计数器的人不会感到奇怪的。你要是没有学过计数器电路也不要紧,记住一个寄存器的最大存储数值是255  = 0FFH   就可以了,加减法都会导致它“进位”  当然控制音量时这个程序不能使用,因为它在0和255之间变化,音量忽大忽小怎们行。  为解决这个问题, 我们必须再学习两条指令    incfsz 和 decfsz  它们与上两个功能基本相同,不同的是: 寄存器增1 或减1操作以后,该指令会自动判定寄存器内的结果是否为零,如果不为零,继续正常执行该指令后面的语句.   但如果结果为零的话,则程序会 "跳一步" .绕过紧挨着它下面的一条指令,继续执行更下面的语句,举例子说明  假定我们操作的寄存器还是09H:     movlw    0FDH   '常数253进入W   movwf    09H   '把w 内的数253 复制到09H 这个寄存器                           '现在09H 寄存器内存储的数是253     incfsz    09H   '寄存器09H内存储的数 增加1,结果变成254   结果不等于0,故程序继续执行下一指令   nop                 '该句得到执行(因为上一句寄存器09H的计算结果不等于0)   incf      09H      '寄存器09H内存储的数 增加1,结果是255   incfsz    09H     '寄存器09H内存储的数 增加1,结果变成0                           '因为结果等于0,故程序要跳过下面的一句(不运行下面的一句).   incf      09H      '由于上一句的存在并结果为0,该句得不到执行,被忽略   incf      09H      '程序跳入这一句继续运行 寄存器09H内存储的数 增加1   nop                  '因此现在 09H寄存器存储的数是1   nop                  '继续运行        .        .        .        .        .  思考题:设计一段程序代码,当用户连续按下音量减小键后,判定音量寄存器09H的存储音量数值,防止该寄存器的值从0 变成255,以免震惊到用户。     .        .        .        .SMALL_SOUND:  nop      '标号可以任意写的,此前用户一旦按下音量减,就把程                                                                                ' 序引导到这一句上来                   decfsz    09H   '寄存器09H内存储的数 减1,如果结果为0 就跳一步                   goto      OK    '如果上一句结果不为0,执行该句后,程序去了ok语句                   movlw     01H   '跳到这一步说明寄存器结果是0                   movwf     09    '强行把 09H内的数值写成1,仍然是小音量,这样音量不会被因为 减小而变成255  OK:             nop     '继续运行      .        .思考题:利用decfsz 指令设计一段延时代码,使得延时时间可以在10个机器周期到65535个机器周期之间,可以通过程序任意控制在这个例子中,设我们要控制的延时时间大约是24086个及其周期,用16进制表是就是 5E16 H.如果用到通用寄存器,请使用 0AH, 0BH  yanshi:   movlw              5EH             ' 常数5E进W 标号是延时              movwf              0BH    ,        '0B寄存器数为5EH              movlw              16H              '常数16进W              movwf              0AH              '0A寄存器数为16H  jixu:         decfsz             0AH             '0A寄存器内的数减1,如果结果为0跳步                           goto                jixu              '结果不为0,继续  decfsz             0BH            '0B寄存器内的数减1,如果结果为0跳步                           goto                jixu               '结果不为0,继续    nop             '延时完毕         .        .        .        .       你现在可以只用这几个简单句子完成任意时间的延时程序了。  下面介绍单片机汇编语言里的一个概念      “子程序”  下面我介绍 “子程序”我先打个比方,如果你做一顿饭,要做汤,炒菜,炖鱼,汆丸子, 奥,忘了还有炒小螃蟹(大螃蟹现在都叫人吃的逮不着了:))期间有一个动作在我看来不断的重复,这个动作就是放盐  放盐的过程描述是这样的:  放盐:  用一把小勺子深入盐罐        舀出氯化钠适量 。

标签: 052d4脚继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台