查看: 1336|回复: 0
打印 上一主题 下一主题

程序转向的语句

[复制链接]
跳转到指定楼层
沙发
发表于 2015-10-15 08:07:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于本人一向散漫,随写随发的感觉不错,等到以后再整理不迟。发现错误不能编辑时在下一贴里纠正

这回再说一个程序转向的语句,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指令的数目会很多,程序虽简单但是臃肿, 这没有关系,我们主要是在学习程序, 弄清楚道理是目的。
要想使得程序不臃肿我们有的是办法,这就必须再学习新的指令.



如果此前我讲的你基本都弄明白了,那你现在已经抓住单片机入门的门把手了, 还需轻轻的推开.转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表