基于PIC12F675单片机的可编程多功能时间继电器的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于PIC12F675单片机的可编程多功能
时间继电器的设计
摘要:定时控制是最基本的自动控制方式,由单片机制作的定时控制,具有定时精确,电路简单等诸多优点,能够实现多种定时模式,利用MCU内部的多个TMR模块,可以设计成多个集成的时间继电器,利用MCU内部的多路ADC转换模块通过各自的电位器独立调整延时时间,而且各定时模块可以级联控制,实现电动机控制电路的简化,如果通过IO口连接外部信号,便于实现多种简单的自动控制。
关键词:MCU、定时器、AD转换、级联控制
1、引言
常用的电子时间继电器普遍使用CD4060振荡计数分频CMOS集成电流构成,一般采用外部RC振荡器,定时精度低、控制功能单一。由于这种电子时间继电器内部带有小功率稳压电源模块,用引脚较少的单片机取代原数字电路芯片,可以实现多个定时器集成在一起,或者多个定时级联控制。如果用较少引脚的单片机构成时间继电器,则提高定时精度,而且实现多个时间继电器的集成,通过编程可以实现多个时间继电器的级联控制。从而可以大大简化控制电路,节省了线材。
2、单片机及选型
单片机又称微控器MCU,生产厂家和品牌很多。众所周知proteus是开发单片机产品最好用的仿真软件,不但能够进行单片机仿真,而且能够进行电路仿真和PCB电路设计,因此选型时首先考虑容易购置且在proteus中有仿真模型的MCU产品。经典的普林斯顿构架的51单片机,内部资源少,引脚多,不适合单片机产品的开发。
PIC单片机虽然品种繁多,但是一个IDE软件可以通吃,而且在proteus仿
真软件有丰富的仿真模型,这样便于电路研发设计。其中有PIC12F675[1]单片机
是PICF12系列单片机中内部资源较为丰富的品种。其内部有两个可编程定时器
模块TMR0和TMR1,还具有4路10位ADC转换模块和比较器模块,比较适合制作
时间继电器的控制电路。
选用PIC单片机的另一个好处是有廉价的替代品,台湾的麦肯单片机质优价廉,可以直接取代。
1.基于PIC675单片机的一次定时的时间继电器
去掉原电子时间继电器的数字集成电路芯片,用PIC12F675取代,借用原电
路接口,可制作单路、两路多功能时间继电器。
3.1 程序算法
时间调节仍然使用原有的电位器,利用内部的ADC模块的转换结果控制定时
器的设定值,达到调节时间的目的。
在定时要求不很高的情况下,通过配置字设置可以使用内部复位和内部振荡器,这样可以节省宝贵的IO端口,实际上内部高精度振荡器可以满足几乎所有
定时要求。
PIC12F675单片机内集了10位的ADC[2]模块,占用了两个字节的转换数据寄
存器ADRESH和ARSEL,选择左对齐方式,仅取用ADRSEH就相当于8位ADC模块,已经能够满足要求。
PIC12F675单片机内集了8位定时/计数器TMR0和16位的定时/计数器TMR1,在一次定时用的时间继电器中,可选用其中任意一个。
如果采用中断方式工作,定时时间越长,则中断的次数越少。因此首先考虑
选用TMR1模块。
TMR1[1]定时计数模块带有3bit的预分频器,最大分频比8,如果选择4MHz
的内部时钟,由于PIC单片机一个机器周期有4个时钟周期,定时计数脉冲频率
是系统时钟的4分频,因此计时时钟为1MHz。
TMR1一次中断最大定时间隔为:,适当选取设定值可得
0.5秒的时间间隔。
TMR1H的设定值256-244=12,TMR1L的设定值256-36=220即可满足要求。将ADC转换结果做软件计数的上限,仅取高8位时,最长定时时间128秒,如果取
10位转换结果做软件计数的上限,则最长延时时间512秒。
3.2程序设计:
#include"pic12rf675.h"
__CONFIG=0x0004;
unsigned char m;
unsigned int n;
void main()
{
CMCON=0x07; //关闭比较器功能,低4位为数字IO
ANSEL=0x51; //设为GP1、GP2、GP5普通数字I/O口,GP0为模拟量输入口
ADCON0=0; //选择转换通道0
TRISIO=0x21; //设置GP0、GP5为输入,其它为输
出。
ADCON0=0x01; //使能ADC模块
T1CON=0x39; //设定分频比8,定时器模式,使能TMR1。
TMR1H=12; //设定计数器的计数初始值,一次中断时间0.5秒
TMR1L=220;
GIE=1; //开放全局中断
PEIE=1; //开放第一外设中断
TMR1IE=1; //开TMR1溢出中断
n=0; //初始化软件计数器计数值
m=0xFF;
while(1)
{
while (GPIO5==1) //如果复位开关断开
{
if(n
else
{
GPIO1=1; //否则继电器得电,软件计数器停止。
n>m;
}
}
if(GPIO5==0) //如果复位按键按
下
{
GPIO1=0; //继电器失电
n=0; //软件计数器复位
}
}
}
void interrupt ISR() //定时器TMR1中断服务函数
{
TMR1H=12; //重装计数器初始值
TMR1L=220;
n ++; //软件计数器加1
TMR1IF=0; //复位TMR1定时器重新计数
GPIO2=~GPIO2; //指示灯反转,亮灭一次1秒钟。
ADCON0|=0x02; //启动AD转换
while (ADCON0&0x02==1); //等待转换完成
m=ADRESH; //将转换值读入存储器m中。
}
3.3proteus仿真