PIC12C5××系列单片机是Microchip公司推出的世界上第一种8位的8脚单片机,本文将以PIC12C508为例,通过用PIC12C508设计低功耗的无线收发控制系统,让读者了解学习PIC12C508的看门狗定时器(WDT)和低功耗方式(SLEEP)的特点与应用。
一、 硬件特点
PIC12C508单片机的引脚图见图1。

它有别于其他处理器的地方在于其特殊的电路可以应付实时应用的需要,而且具有诸多的特殊性以最大限度提高系统的可靠性,并通过减少外部元件以降低使用成本,还提供省电工作方式和代码保护。它的宽工作电压(2.5V~5.5V)和低功耗(在4MHz和5V工作条件下,工作电流<2mA,睡眠方式工作电流典型值<1μA),使它非常适合于电池供电、低功耗的应用场合。关于PIC12C508的一些硬件资源,可以到网站http://www.microchip.com.cn查阅它的数据手册,这里不进行详述。
二、 硬件设计原理
PIC12C508单片机主要应用于车库门等一些安全系统以及遥控玩具中。由于使用了单片机,发送的数据可进行各种处理,如滚动编码,产生随机码等,大大地提高了安全性和可靠性,即使相同产品也不会互相干扰。通过图2硬件框图可以看到此系统的外围电路十分简单。以PIC12C508为核心的低功耗无线收发控制系统分成两个部分:发送部分和接收部分,两部分电路如图2(a)、(b)所示。发送部分图(a)的PIC12C508,平时处于节电的SLEEP状态,当SB1、SB2或SB3按下时,进入正常工作,检测是哪个按键按下,并发送对应键的数据串,发送完再进入SLEEP状态。接收部分图(b)的PIC12C508,平时也处于节电的SLEEP状态,如果接收脚GP3有信号输入,便从SLEEP状态唤醒,开始接收数据串,判断接收数据正确否,如正确则根据命令完成相应的控制操作,然后再进入SLEEP状态,如不正确,可能是干扰信号,忽略此次接收数据,再进入SLEEP状态。这套系统可工作在3V电压,可由电池供电。

三、 软件设计原理
发送部分的程序流程如图3所示,发送部分程序的主要功能是PIC12C508芯片初始化后处于低功耗方式,当有按键按下时,唤醒芯片并检测按键,以1kHz的速率发送该按键对应的一串数据,然后再进入低功耗方式。接收部分的程序流程如图4所示,接收部分程序的主要功能是PIC12C508上电完成系统初始化后,进入低功耗方式。当接收脚有信号输入时,唤醒芯片并开始接收数据。数据被正确接收后,根据不同按键命令完成相应的控制操作,然后再进入低功耗方式。如果出现干扰信号或接收到错误数据,程序会在2.3秒内继续重新接收,超过2.3秒还没有接收到正确信号,系统会产生报警或提示,然后再进入睡眠状态。


在编写源程序时,要特别注意一个问题:PIC12C508只有两级硬件堆栈,子程序调用不能超过两级,否则程序就会走飞。下面结合部分程序段介绍如何进行WDT的设置、SLEEP功能的唤醒及判断、发送和接收子程序等。详细的发送、接收源程序清单请从无线电杂志网站上下载。
1.变量名、芯片等的定义
本程序中使用EQU、LIST、INCLUDE等伪指令定义寄存器、芯片类型。
OFFSET EQU 10H ;定义通用寄存器
SEND_BUF EQU 11H
SEND_COUNTER EQU 12H
TEMP EQU 13H
DELAY_BUF0 EQU 14H
DELAY_BUF1 EQU 15H
TEMP2 EQU 16H
KEY_BUFFER EQU 17H
LIST P=PIC12C508A ;定义芯片
INCLUDE“P12C508A.INC” ;定义芯片
特殊功能寄存器
2.看门狗定时器(WDT)的设置
看门狗定时器WDT有两个作用:其一,在正常运作时防止程序死循环。在程序中适时地加入CLRWDT指令清零WDT和预分频器,以防止WDT不必要的超时引起器件复位,而如果出现死机,WDT将会超时引起器件复位,保证程序正常运行。其二,在低功耗方式下,WDT工作,可以定时唤醒低功耗方式进入正常工作状态,完成控制操作后可再次进入低功耗方式,这样可节省系统的功耗。
WDT的额定超时周期为18ms(未预分频),如果希望较长的超时周期,可通过写OPTION特殊功能寄存器,将预分频器分配给WDT,它最高可产生1∶128的分频器,这样额定超时时间可为2.3秒。这个时间随温度、V\(_{DD}\)不同而有所不同。
看门狗定时器(WDT)无需任何外部元件在片内振荡器控制下即可进行工作。在PIC12C508单片机中RC振荡器与GP5/OSC1/CLKIN上的外部RC振荡器以及内部4MHz振荡器分离。这就意味着即使GP5/OSC1/CLKIN和GP4/OSC2引脚上的时钟停止,WDT也照常工作。正常运行或SLEEP期间,WDT复位或唤醒复位引起器件复位。如果WDT使能,要根据需要定时地清零WDT,防止WDT不必要的超时复位。
WDT的关闭和开启是在烧写芯片时设置,如果程序中使用WDT功能,烧写时就选择WDT使能,否则选择关闭。在程序中是通过给OPTION寄存器赋值来设置WDT的参数。OPTION的最低三位是WDT的预分频值,最大128。第四位是选择将预分频给WDT还是T0定时器,1为选择给WDT。
MOVLW B’11001111’;预分频给WDT,设置超时周期为18ms×128=2.3s,“B”表示二进制数
OPTION ;写入 OPTION寄存器
3.低功耗方式(SLEEP)
这种方式非常适用于便携式、电池供电的产品。它可以使器件处于低功耗方式并可通过唤醒SLEEP进入正常功耗状态。执行一条SLEEP指令就进入低功耗方式,WDT如被使能,则WDT被清零但仍然保持工作,振荡器驱动电路关闭,I/O端口将保持执行SLEEP指令前的状态。
可通过3种方式唤醒SLEEP状态:GP3/MCLR/V\(_{PP}\)引脚上有外部复位输入、WDT超时复位、引脚GP0、GP1和GP3上的引脚电平变化。通过在程序复位时检测状态寄存器中的TO、PD和GPWUF位,就可以确定发生复位的原因,以便程序根据不同的复位原因进行相应的操作。这三位在各种复位时的状态见表1。由于引脚电平变化可以唤醒SLEEP,这样就可以很方便的利用这些引脚作为按键输入,因此只要有按键按下就会唤醒SLEEP。复位时判断复位原因的程序段如下:
START BTFSC STATUS,GPWUF ;是引脚电平变化唤醒SLEEP吗?
GOTO WAKE_UP ;是的,转到接收数据
BTFSC STATUS,NOT_TO ;是WDT超时?
GOTO POWER_ON ;不是,是上电复位
BTFSS STATUS,NOT_PD
GOTO WDT_WAKE_SLEEP ;是WDT从睡眠状态唤醒SLEEP
GOTO TIMER_5S ;是不在SLEEP状态下的WDT超时
POWER_ON ;初始化PIC12C508A
4.发送、接收字节的实现
发送、接收数据的速率为1K,即每位数据的传输是1ms的时间。每个字节8位数据位,一个启始位(高电平),一个停止位(低电平)。高位在前,低位在后。1ms延时由软件延时子程序完成。
SEND_BYTE MOVLW 0FBH ;发送子程序
TRIS GPIO ;GP2输出
BSF GPIO,2 ;启始位
CALL DELAY1MS ;调用延时子程序
MOVLW 8
MOVWF TEMP
SEND_BYTE1 RLF SEND_BUF,1 ;左移一位
BTFSS STATUS,C ;判断是高电平还是低电平
GOTO SEND_LOW
BSF GPIO,2
GOTO SEND_BYTE2
SEND_LOW BCF GPIO,2
SEND_BYTE2 CALL DELAY1MS
DECFSZ TEMP,1 ;8位发送完吗?
GOTO SEND_BYTE1 ;没有,转到发下一位
BCF GPIO,2 ;是的,发停止位
CALL DELAY1MS
RETLW 0 ;子程序返回
RECEIVE_BYTE ;接收字节子程序
MOVF GPIO,0
WWW BTFSS GPIO,0 ;等待启始位
GOTO WWW
MOVLW 07BH ;延时500μS
MOVWF DELAY_BUF1
DEL_500 NOP
DECFSZ DELAY_BUF1,1
GOTO DEL_500
WWW1 BTFSS GPIO,O ;再次检测启始位
GOTO WWW1
CALL DELAY_1MS ;延时1ms
CLRF RECEIVE_BUF ;清接收缓冲器
MOVLW 8 ;接收位数
MOVWF TEMP2
RECEIVE_BYTE_1
MOVF GPIO,0
BTFSS GPIO,0
GOTO RECEIVE_LOW
BSF STATUS,C
GOTO RECEIVE_BYTE_2
RECEIVE_LOW BCF STATUS,C
RECEIVE_BYTE_2 RLF RECEIVE BUF,1
;左移一位并存放接收数据
CALL DELAY_1MS
DECFSZ TEMP2,1 ;8位数据接收完吗?
GOTO RECEIVE_BYTE_1 ;没有
RETLW 0 ;接收完,返回
下期,我们将以PIC16C58单片机的应用为例,为大家介绍关于PIC单片机定时器,内部RAM和I/O口的知识与应用。
(陈伟)