PIC单片机程序设计需要注意的一些问题及看法

2020-02-08来源: eefocus关键字:PIC单片机  程序设计  列表指令

一、区分指令的大小写

编写PIC单片机的源程序,除了源程序的开始处需要严格的列表指令外,还须注意源程序中字母符号的大小写规则,否则在PC机上汇编程序时不会成功。在源程序中都会使用伪指令INCLUDE。这条指令将列表中指定的单片机文件(在MPLAB中)渎入源程序作为源程序的一部分,所以凡是MPLAB中有关该单片机已有的寄存器在源程序中无须再用赋值指令(EQU)赋值,这就使所建立的源程序大为简化。


此外,由于有了伪指令INCLUDE,所以根据MPLAB软件中的格式,在源程序中的操作数凡是涉及MPLAB已规定的寄存器名称的,其字母一律只能大写,不能小写。其余操作码、符号字母可任意大小写,但0x中的X应小写。否则汇编不会成功。鉴于上述原因,为了书写方便,在使用MPLAB软件时,PIC单片机的源程序均用大写字母为宜(0x例外)。


以下举例有关机器人控制的实现。控制部分采用PIC16F7X系列单片机,运用汇编语言编程,运行速度较快,能够达到系统的要求。


二、动作标志位的使用

在整个控制中,组合的动作很多,当所有动作定位都通过光电开关控制时,在程序编写上就有一些问题。如要求左手上升到鼓掌位、右手上升到举手位(手初始位置在最下的放下位),光电开关0有效(即为0时是挡住),到达正确位置。用简单的理解可以写成下面的程序:

list P=16c73

call lefthandup

call righthandup

L0 call readinsignal

bdss csl_v,lefthandligbts

call lefthandstop

bfsc csl_v,righthandlight4

goto L0

call righthandstop

L1 call readinsignal

bfsc csl_v,lefthandlight3

goto L1

call lefthandstop


lefthandlight表示光电开关,由此判断是否到相应的位置。1表示在手臂最下面的位置;2表示在手臂的握手位置;3表示在手臂的鼓掌位置;4表示在手臂的高举手位置。上面程序描写左手臂上升到举手位置和右手臂上升到鼓掌位置并停止的过程。先判断左手到达否,到达则左手停止,接着看右手是否到达举手位,到达则停止,否则循环上述的检测,直到左手到达鼓掌位,右手到达举手位。


注意,这里的3,4表示的就是鼓掌位、举手位。经过循环检测可以让手臂停在各位上,然而机械动作是有惯性的,机械停止位可能在该位的上一点或下一点,这就影响下面动作的进行,可能在若干动作后机械动作出现失常,也就是程序没法正常地运行。在此情况下,需要修改程序的编写方式,采用标志位来控制动作的进行。如果采用控制标志位,一定要在动作子函数中对标志位置零。


三、区分GOTO和CALL指令的使用场合

在PIC的汇编程序中,CALL与GOTO指令的使用比较多、且容易混淆,一般情况下,在于程序与主程序之间大多用CALL指令;而状态转换模块之间大多用GOTO指令,即由此状态进入另一种状态不需返回。由于PIC单片机的堆栈有限,在程序中,不能无止境地使用GOTO语句,否则会使堆栈溢出,程序无法正常运行。各个小程序内部循环占用堆栈的级数不多,使用GOTO指令是可行的,但在大的程序中用GOTO则无法返回到调用前程序的下一条指令。CALL指令完成调用完子程序后返回到调用前的程序。如在超声检测中程序如下:

list D=16c76

start:call setcpu

call automaflsmstate1

L3 call readinsignal

bfsc es2_v,ultrasonicdetect1

goto L3

goto automatlsmstate2:

automatlsmstate2:

return

automafismstate1、automatlsmstate2表示两种状态,ultrasonicdetect1表示一个输入超声检测信号。上面程序描写调用automatlstmstatei状态,执行完后进行下面的检测uhrasonicdetect1,没有触发就一直循环检测,触发就进入automatlsmstate2状态,执行完也不再回到下面的程序。


由于PIC单片机的堆栈有限,在程序中不能无止境地使用GOTO指令,否则会使堆栈溢出,程序无法正常运行。但是在有些时候,例如当程序出现分支时,则不得不使用GOTO指令。对于PIC16F7X系列单片机,程序出现分支时只能通过STATUS寄存器的z位或c位进行判断。这时在两种情况的前一种情况下,必须使用GOTO指令进行转移;否则在执行完第一种情况后,紧接着又执行第二种情况。因此,在使用汇编语言进行程序设计时,应该将程序分解成一级级的子程序;然后在程序之间进行调用,尽量将GOTO指令跳转的范围缩小。


四、注意状态标志位Z、C的不同使用情况

在进行判断标志位时,Z(零标志)、C(借位标志)是不同的。Z为1时,表示上面的结果为0,Z为0时,则结果不为0。C为1时,借位,C为0时,没有借位。在使用定时器的时候,一般使用C标志位,这是由于当完成某一动作去检查定时器时,时间可能没到,或是正好,或是已经超过时间,只要到了或超过时间,都要按照要求关闭定时器,如下面程序所述。如果用Z标志位,等于0时可能没有检测到,无法判断停止的状态,而用Z可以很好地控制时间定时。进行一般的计算时大多用Z,如前面的动作标志位中就是如此使用的。

list D=16c76

call openfimer0

L4 movlw d'30'

subwf t0_v2,W

bfsc status,c

goto L4

call dosetimer0

程序检测时间是否到达1.5s,没有则循环等待,到了或检测时间过了就关闭定时器,执行下面的程序。


总之,在PIC单片机的编程中采用合适的方法,可以使整个程序运行稳定,而且程序空间的使用也将有所减小,避免了调试中的Bug。

关键字:PIC单片机  程序设计  列表指令 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic487568.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:关于PIC单片机之探讨低功耗
下一篇:PIC单片机振荡电路中怎样选择晶体?

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

PIC单片机入门_MPLAB 集成开发环境和 MPASM编译器
1.七大汇编指令1.1 #INCLUDE语法:  #include “文件名.*” 或<文件名.*> 或无括号 或 引号示例:   #INCLUDE p12f675.inc1.2 #DEFINE用于定义变量和分配初始值;用户友好的名字被分配给常数,寄存器 ,管脚名等. 使程序易读;例:   #DEFINE MYCONSTANT H’5A’1.3 _ _CONFIG设置配置位1.4 ORG语法: ORG   <address>例: ORG 0x0000描述:  定义起始地址(0x0000).1.5 EQU语法:  &nbs
发表于 2020-03-09
PIC单片机入门_MPLAB 集成开发环境和 MPASM编译器
PIC单片机的第一个例程
今天白天在网上找软件找了好久,在官网下了MPLAB,和PICC还要注册比较麻烦。今天用的软件Protues仿真的。 第一个程序点亮一盏灯,电路很简单。下面贴出程序。 #include <pic.h>//包含头文件int main(void){    TRISB=0x00;//PortB方向寄存器,PortB为输出         while(1)    {         
发表于 2020-03-09
PIC单片机存储器拓展
择备用电池顶替上,改为备用电池供电,确保感应水龙头能正常工作不受影响。英锐恩开发芯片PIC16F684是Microchip的8位单片机产品,其功能特性主要有以下几点:增强中程核心,49个指令,16个堆栈级别具有自读写功能的FLASH程序存储器96 LCD段驱动支持内32 MHz振荡器集成电容mTouch传感模块综合温度指示器MI2C,SPI,EUSART W/AUTOW3 ECCP和2 CCP(增强/捕获比较PWM)可选电压基准的比较器14路电压基准10b模数转换器25 mA源/槽电流I/O四个8位定时器(TMR 0/TMR 2/TMR 4/TMR 6)一个16位定时器(TMR 1)扩展看门狗定时器(EWDT)增强型断电复位棕色复位
发表于 2020-03-08
如何在PIC单片机的GPIO引脚上生成PWM信号
T_OFF, 如上所示。T_OFF = T_TOTAL – T_ON鉴于这些公式,我们可以开始编程PIC单片机。该程序涉及PIC定时器模块 和PIC ADC模块 ,根据POT的ADC值,根据变化的占空比创建PWM信号。编程PIC在GPIO引脚上生成PWM在本节中,让我们了解程序的实际编写方式。像所有程序一样,我们首先设置配置位。我已经使用了memory views选项为我设置它。// CONFIG#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)#pragma config WDTE
发表于 2020-03-08
如何在PIC单片机的GPIO引脚上生成PWM信号
PIC单片机的新开发环境--MPLAB X IDE
自从学习pic单片机开始所有的历程全部是以MPLAB  IDE为编译环境,然MPLAB  IDE即便是最新的版本在win7 64位下运行也会出现挂载不上picc编译器的情况,这就导致了作为初学者的我选择了更换电脑系统的下下策。我安装了win7 32位系统,首先说32位系统会吞掉将近一个多G的内存分配给显卡,而且32位系统最多识别4个G的内存所以家内存条也解决不了问题,也就是说实际电脑使用的时候能用到的内存只有2个多G,这将对我们电脑的工作产生非常大的影响。于是我在网上搜罗发现Microchip公司推出的新版本的编译环境MPLAB X IDE是可以在windows7-10之间畅游的,所以便打起了这个家伙的主意
发表于 2020-03-05
PIC单片机之硬件仿真的配置字问题
注意:本实验的芯片是PIC24FJ256DA210,用到的开发环境是:MPLAB IDE v8.92   编译工具是xc16-gcc.exePIC单片机在硬件仿真的时候如果配置字配置不好,会出现不能仿真的后果,会有下面提示:PK3Err0040: The target device is not ready for debugging.Please check your configuration bit settings and programthe device before proceeding.如下图:这时候我的配置字是这样的:        _CONFIG1
发表于 2020-03-04
PIC单片机之硬件仿真的配置字问题
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved