(李中泽 陈伟)PIC58BS单片机共有32条语句,全部采用BASIC语句的形式,可以完成算术逻辑运算、循环转移、输入/输出、调试程序等操作。
一、语言系统概述
1.语句格式 标号:语句定义符 语句体 ′注释
标号:PIC58BS语句用标号来表示程序地址,这一点有别于BASIC语言中的行号。标号必须以字母开头,后面跟字母或数字;但不能用变量名和语句名。标号后面紧跟冒号。
符号(Symbol):在程序开始时,可以定义一些符号,将变量或常量定义为一个名字。
例如:Symbol RS=l ′定义RS为常数1
语句定义符、语句体:它们是语句的核心,二者之间用空格分开。语句定义符用便于记忆的英文单词(或缩写)表示;语句体定义语句的操作对象(或操作方式)。某些语句无语句体。
注释:对该语句的解释,可有可无。主要是便于阅读,属非处理部分。注释以撇号开始。也可在程序行中以REM开始,后面的内容为注释。另外,可以把多条语句写成一行,语句之间用“:”隔开。
2.常量
PIC58BS语句中的常量可以用二进制数、十进制数、十六进制数及ASCII字符表示。其形式如下例:
100 ′十进制数
$64 ′十六进制数,以$作前缀
%01100100 ′二进制数,以%作前缀
"d" ′ASCII字符"d",需加双引号
"Yes" ′ASCII字符"Y"、"e"、"s"
语句中的常数均为整数,最大为65535(2\(^{16}\)—1)。
3.变量
PIC58BS提供了16个变量存储单元。其中一个表示引脚,名为pins(pin0~pin7);一个用于I/O控制,名为dirs(dir0~dir7);其余14个可作为通用变量存储数据。其用法相当灵活,既有位变量(bit0~bit15),也有字节变量(b0~b13),还可用作字变量(W0~W6)。存储单元设置如图1所示。

变量pins的使用:读pins(pin0~pin7),则I/O口内容直接读入。例如:语句let b2=pins执行时,引脚P0~P7的内容读入变量b2中。写入Pins,其内容将出现在I/O端口锁存器中。例如语句pins=%00000101执行后,当I/O执行输出操作时,则其内容将出现在该端口上。
变量dirs的使用:定义I/O口的状态(输入或输出态)。
将数据写入dirs时,“0”定义相应的端口输入态,“1”定义为输出态。例如:语句dirs=10(也可表示为%00001010)执行后,定义P1,P3口为输出态,其余端口为输入态。
变量W0~W6(或b0~b13)均可用于存放数据。
当执行转子程序语句gosub时,变量W6用作堆栈。存放主程序GOSUB下一条语句的地址,以便子程序返回时继续执行。
PIC58BS语言系统可以识别上几种变量名。用户也可以用符号(Label)定义自己的变量名。
4.算术逻辑表达式
PIC58BS语句运算符共有如下几种:
加 &逻辑与
减 |逻辑或
乘(取低位字) ^逻辑异或
乘(取高位字) &/逻辑与非
/ 除(取商) |/逻辑或非
除(取余数) ^| 逻辑异或非
MIN 使变量不小于某一常数
MAX 使变量不大于某一常数
例如:LET b3=b3Max100′使变量b3不大于100。
算术逻辑表达式由变量、常量、运算符组成。语句中的算术运算按从左到右的顺序进行,没有优先原则。例如:1+6*7表示(1+6)×7=49而不是1+6×7=43。
二、语句介绍
1.输入/输出语句
格式:inPut 引脚′置I/O口为输入态
格式:output 引脚′置I/O口为输出态
格式:reverse 引脚′输入/输出状态转置
格式:high 引脚′I/O口输出高电平
格式:low 引脚′I/O口输出低电平
格式:toggle 引脚′I/O口触发输出
例:low 5′PS口输出低电平
toggle 5′PS口触发为高电平
注意:若连续执行toggle语句,则出现周期为2ms的方波。
格式:pulsin引脚,状态,变量
功能:以10微秒为单位测量输入脉冲的宽度并存入字变量或字节变量中。当状态为“0”时,测量负脉冲;为“1”时,测量正脉冲。测量范围为(1~65535)×10μs。
例:pulsin 4,0,w2′测量P4口出现的负脉冲宽度并存入字变量W2中
格式:pulsout引脚,时间
功能:以10微秒为单位输出一脉冲,最大为655350μs。
例:1ow2 ′P2口输出低电平
pulsout 2,3 ′p2口输出30μs脉宽的高电平脉冲
格式:button引脚,状态,延时,重复率,字节变量,目标状态,目标地址
功能:检测按键状态,转入相应的分支或执行自动重复。
.状态:规定键按下时读到的逻辑状态。“0”为低电平,“1”为高电平。
.延时和重复率:用于自动重复前延时和按键去抖。延时时间=“延时”×BUTTON语句的循环周期。延时结束后,若键仍处于压下状态,则开始自动重复。重复时间间隔=“重复率”×循环周期。如果“延时”设置为0,则认为既没有按键去抖,也没有延时。“重复率”为0,则没有重复。
.字节变量:button语句的工作空间。第一次使用前,必须先清零。
.目标状态:指定button语句产生跳转的按键状态,“0”表示无按键,则跳转;“1”表示有按键则跳转。
.目标地址:跳转地址
例:b2=0
lp:button 3,0,50,10,b2,1,a
pause 10 ′若P3脚的键按下(接低电平)。则延
goto lp ′时50×10ms,同时实现按键去抖,
a:low 0 ′然后转向a处执行。PO脚出现30μs
pulsout 0,3 ′的高电平脉冲。若继续按下,则每
goto lp ′10×10ms,程序认为重按了一次键。
2.模拟量输入/输出
格式:pot引脚,可调值,变量
功能:读取电位值,将其相对值存入8位字节变量中。电位器(或热敏电阻、光敏电阻)范围为5k~50k。针对某一电位器有一个最佳的调整值,可以将整个量程的电阻值尽可能的细分为256等分。在编程的过程中,按Alt—P键,调整电位器值,可以找到最佳的“可调值”。
例:Potol,100,b2′读取与P1相连的电位器的相对值
格式:pwm引脚,占空比,循环次数′模拟电压输出
功能:输出脉冲宽度调制信号。通过与之相连的电阻向电容充电,可以输出模拟电压。PWM指令需循环执行几次,以使电压稳定。每次执行的时间为5ms左右。占空比为0~255之间的常数/变量,它决定模拟电压输出量。Vout=占空比/255×Vcc
例:pwm 1,35,5′P1口输出电压35/255×Vcc
格式:sound引脚,(音调,时间,音调,时间…)
功能:音频输出。频率=12kHz÷(256-“音调”)。持续时间=“时间”×22ms。
例:b2=250 ′依次产生频率为2kHz和60Hz的声音,持续1.1s。
sound 1,(b2,50,56,50)
3.数据操作语句
格式:{let}变量={-}数值 运算符 数值…
其中{ }中的内容为可选项
功能:let指令可以完成按语言系统格式规定的算术逻辑运算、比较操作。
例:let b2=b2/2 ′b2中的值除以2,取商存入b2。
b2=b2+3 ′b2中的值加3,存入b2。
格式:lookup序号,(数值0,数值1,…,数值N),变量
功能:序号查表。将括号中的选择项按序号(0~N)选出并存入变量。
例:lookup b2,(30,31),b3 ′b2=0,则b3=30。
′b2=1,则b3=31。
格式:lookdown目标值,(数值0,数值1,…,数值N)变量
功能:目标字序号查询。目标值如果与括号中的可选数值相同,则将其序号存入变量中。
例:lookdown 32,(30,31,32),b2 ′将2存入b2中
格式:random字变量
功能:类似BASIC语言中的随机函数。利用字变量产生随机数。指令执行后,字变量中的数定义一组随机数的初始值;初始值相同,则随机数的序列不变。
例:lp:random w1 ′在w1中产生一16位随机数。
sound 1,(b2,10) ′在P1口产生一随机的声音。
goto lp
4.串行输入/输出
格式:serin引脚,波特率,(同步符,同步符,…)
serin引脚,波特率,{#}变量,{#}变量,…
serin引脚,波特率,(同步符,同步符,…)
{#}变量,{#}变量,…
功能:建立一串行输入口,然后等待同步符输入。如果没有同步符,则将接收的数据直接存入变量;如果给出同步符,则只有接收到同步符后,程序方可继续执行。变量前的任选符“#”表示只接收数字字符(0 9)字符的ASCII码,并把它们转换成相应的数值存入变量。接收时,若数字字符之前有非数字字符,则被摒弃;若中间有非数字字符,则作为结束符。
波特率:指数据传送的速率,即每秒传送的位数。
PIC58BS串行通信的波特率有如下几种:
T2400 T1200 T600 T300 N2400 N1200 N600 N300
或 0 1 2 3 4 5 6 7
其中前缀“T”表示正常的数据接收;前缀“N”表示接收的数据为串行输入的反码。
例1:serin 0,T300,(“AB”) b2
′当接收到ASCII字符“A”、“B”后,将下一个
′接收的数据存入b2中。
例2:serin 1,T2400,#b1,
′假设依次收到35,37(数字5,7的ASCII码)
′和一个非数字字符,则b1中存入57
格式:serout引脚,波特率,({#}数据,{#}数据,…)
功能:建立一串行输出口,以发送数据。“#”表示发送数字字符的ASCII码。对非数字字符,则把它的ASCII码换算成十进制数,然后拆开,按数字字符的ASCII码发送。
例:serout 1,N300,(#“A”)′发送36,35(即数字6和5的ASCII码)
5.循环转移语句
格式:goto 地址标号 ′地址转移
格式:gosub 地址标号 ′子程序调用
格式:return ′子程序返回
例:gosub ab ′将下一条地址存入W6,主程序调
b3=40 ′用标号地址为ab的子程序。运
ab:… ′行完毕,再返回主程序,继续执
return ′行下一条语句。
格式:branch分支,(地址1,地址2,…)
功能:分支转移
例:branch 2(a,b,c)′程序转向分支2指定的地址
a:…
b:…
c:…
格式:if变量运算符数值或运算式then地址
功能:条件成立则转向目标地址:运算符有=、≠、>、<、≥、≤共六种。
例:dirs=255 ′置I/O为输出态
if b2≤30then abc ′b6小于等于30,则程序
… ′转向abc处执行。
abc:…
格式:for变量=初值to终值{step增量}
??.
next
功能:与BASIC语言中的FOR…NEXT语句相同。
例:FOR b2=0 TO 255′建立一FOR…NEXT的循环,
PINS=b2 ′ b2中的值依次出现在P0~P7
NEXT ′ 端口上
6.程序延时
格式:pause时间(0~65535)
功能:延时,时间的单位为毫秒。
例:pause 6000′ 延时约一分钟
7.EEPROM操作语句
格式:eeprom{地址},(数据,数据,…)
功能:运行BASIC程序前向eeprom中直接写入数据,以供程序调用。如地址不给出,则数据存入下一个可用的存储单元中。
例:EEPROM 9,(5,6,8)′将数据依次存入EEPROM的9、10、11单元中
格式:read 地址,变量
格式:write地址,变量
功能:读语句是将指定地址的EEPROM的内容读出,并存放入变量中;写语句把变量的内容(或常数)写入指定地址的EEPROM中。EEPROM既可作程序存储器,也可作数据存储器。而255单元中存有程序最后一条语句的地址值。这样,其余的空间可用于数据存储。
例:read 255,b2 ′读出最后一条语句的地址存放于b2
lp:b2=b2-1 ′指向下一个存储单元
serin 0,T300,b3 ′将PO口接收数据存入b3中
write b2,b3 ′将接收到的数据存放于EEPROM下一个地址
if b2>othen lp ′存满剩余的空间
该程序的存储映像如图2。

8.睡眠语句
格式:naP时间参数
功能:短时进入睡眠状态,电流消耗大约为20μA。时间参数t为0~7。具体时间为2\(^{t}\)×18ms。
例:nap 5 ’进入睡眠。时间为2\(^{5}\)×18ms=576ms
格式:sleep时间
功能:进入低功耗的睡眠状态,时间为(1~65535)×1.15s。
例:sleep 3130 ′进入睡眠一小时左右
格式:end ′程序结束
功能:进入不确定的睡眠状态。重新上电后,PIC58BS将被唤醒。
9.调试语句
格式:debug
功能:类似于BASIC语言中的PRINT。将变量中的内容传送到PC机中,以便调试修改。其形式如下:
debug变量 ′输出变量=变量值
debug #变量 ′输出变量值
debug“字符串”,变量 ′输出“字符串”+变量=变量值
debug #%变量 ′输出二进制变量值
debug“字符串”,变量1,变量2,cr
′输出“字符串”+变量名1+变量值十变量名2
′=变量值+回车+换行
bebug@变量 ′变量=“字符”
debug #@变量 ′“字符”