📄 main.c
字号:
/******************************************************************************
******************************************************************************/
#include "pic16f7x.h"
#include "pic.h"
__CONFIG(XT&WDTDIS&PWRTDIS&BORDIS&UNPROTECT) ;
/******************************************************************************
管脚定义
******************************************************************************/
#define UPDOWN_CHECK_IO RB2 //上水与退水检测管脚
#define HEAT_CHECK_IO RB1 //加热与常温检测管脚
#define CUP_CHECK_IO RB0 //水杯检测管脚
#define W_HIGH_CHECK_IO RB4 //高水位检测管脚,负逻辑
#define W_LOW_CHECK_IO RB5 //低水位检测管脚,负逻辑
#define ALARM_IO RC0 //报警管脚,负逻辑
#define PWR_LED_IO RB3 //电源灯
#define NORMAL_LED_IO RC7 //常温灯
#define HEAT_LED_IO RC6 //加热灯
/******************************************************************************
常数定义
******************************************************************************/
#define BASE_TMR0 100 //定时器中断间隔-10ms
#define BASE_NO_BODY_TIME 12000 //无人值守等待时间-2分钟
#define BASE_UP_WATER_TIME 4500 //上水等待时间-45秒
#define BASE_DOWN_WATER_TIME 3100 //退水等待时间-30秒
#define BASE_HEAT_WATER_TIME 150000 //加热等待时间-25分钟
#define WATER_TEMP 95 //加热温度
#define BASE_ALARM_ONE_TIME 10 //
#define BASE_HEAT_LED_TIME 30 //
#define BASE_ALARM_CNT 40 //报警间隔
#define UPDOWN_VAR_ENABLE {RC4=1;RC5=0;} //上退水使能[阀控制]
#define UPDOWN_VAR_UNABLE {RC4=0;RC5=0;} //上/退水禁止[阀控制]
#define UP_MOTOR_ENABLE {RC2=1;RC3=0;} //上水使能[电机控制]
#define UP_MOTOR_UNABLE {RC2=0;RC3=0;} //上水禁止[电机控制]
#define DOWN_WATER_ENABLE {RC2=0;RC3=1;} //退水使能[电机控制]
#define DOWN_WATER_UNABLE {RC2=0;RC3=0;} //退水禁止[电机控制]
#define DRINK_MOTOR_ENABLE {RC2=0;RC3=1;} //接水使能[电机控制]
#define DRINK_BACK_ENABLE {RC2=1;RC3=0;} //接水回水使能[电机控制]
#define DRINK_MOTOR_UNABLE {RC2=0;RC3=0;} //接水禁止[电机控制]
#define HEAT_WATER_ENABLE {RC1=1;} //加热使能
#define HEAT_WATER_UNABLE {RC1=0;} //加热禁止
#define DRINK_VAR_ENABLE {RC4=0;RC5=1;} //接水阀使能
#define DRINK_VAR_UNABLE {RC4=0;RC5=0;} //接水阀禁止
#define N_SAMPLE 10 //AD采样数据个数
/******************************************************************************
变量定义
*****************************************************************************/
unsigned char updown_key_value ; //上水退水按键采样
unsigned char heat_key_value ; //加热常温按键采样
unsigned char cup_key_value ; //水杯检测
unsigned char key_flag ; //有键按下标志
unsigned char cup_flag ; //有水杯接水标志
unsigned char ad_flag ; //A/D转换完成标志
unsigned char alarm_one_flag ; //按一次按键蜂鸣器响一次
unsigned char up_water_flag ; //
unsigned char down_water_flag ; //
unsigned char heat_water_flag ; //
unsigned char alarm_flag ; //
unsigned char alarm_time ; //
unsigned char alarm_cnt ; //
unsigned char up_alarm_flag ;
unsigned int up_alarm_time ;
unsigned char no_body_flag ; //无人值守标志
unsigned char state ; //系统状态
unsigned char temp_sample[N_SAMPLE] ; //温度采样平均值
unsigned int temp_all ; //温度采样平均值
unsigned char temp_avr ; //温度采样平均值
unsigned char sample_cnt ; //温度采样计数器
unsigned int no_body_time ; //无人值守等待时间寄存器
unsigned int up_water_time ; //上水等待时间寄存器
unsigned int down_water_time ; //退水等待时间寄存器
unsigned int no_water_time ; //无人延时到,退水延时寄存器
unsigned int time ;
unsigned long heat_water_time ; //加热等待时间寄存器
unsigned char alarm_one_time ;
unsigned char heat_led_time ; //加热LED闪烁时间寄存器
unsigned char heat_led_flag ;
unsigned char avr ;
unsigned char chk_time ;
bit up_down_bit ; //上水,退水标志 0-退水 1-上水
bit heat_common_bit ; //加热,常温标志 0-常温 1-加热
/******************************************************************************
定时器T0中断服务程序
******************************************************************************/
void interrupt isr()
{
if(T0IF)
{
T0IF = 0 ;
TMR0 = BASE_TMR0 ;
chk_time-- ;
if(time)
{
time-- ;
}
//上水,退水按键检测
updown_key_value = updown_key_value<<1 ;
if(UPDOWN_CHECK_IO)
{
updown_key_value = updown_key_value|0x01 ;
}
updown_key_value = updown_key_value&0x0f ;
if(updown_key_value==0x0c)
{
key_flag = 'U' ; //按键抬起
}
//加热,常温按键检测
heat_key_value = heat_key_value<<1 ;
if(HEAT_CHECK_IO)
{
heat_key_value = heat_key_value|0x01 ;
}
heat_key_value = heat_key_value&0x0f ;
if(heat_key_value==0x0C) key_flag = 'H' ;
//水杯按键检测
cup_key_value = cup_key_value<<1 ;
if(CUP_CHECK_IO)
{
cup_key_value = cup_key_value|0x01 ;
}
cup_key_value = cup_key_value&0x07 ;
if(cup_key_value==0x07) cup_flag = 'C' ;
//上水定时检测
if(up_water_time)
{
up_water_time-- ;
if(up_water_time==0)
{
up_water_flag ='U' ;
}
}
//退水定时检测
if(down_water_time)
{
down_water_time-- ;
if(down_water_time==0)
{
down_water_flag = 'D' ;
}
}
//加热定时检测
if(heat_water_time)
{
heat_water_time-- ;
if(heat_water_time==0)
{
heat_water_flag = 'H' ;
}
}
//无人值守定时检测及退水
if(no_body_time)
{
no_body_time-- ;
if((no_body_time==10000)||(no_body_time==1000))
{
alarm_flag = 'A' ;
alarm_time =10 ;
alarm_cnt = BASE_ALARM_CNT ;
}
else if(no_body_time==0)
{//无人值守开始退水
unsigned char i ;
up_down_bit = 0 ;//默认为上水
NORMAL_LED_IO = 0 ; //退水时,所有灯灭
HEAT_LED_IO = 0 ;
PWR_LED_IO = 0 ;
UPDOWN_VAR_ENABLE ; //退水时,退水阀门打开
for(i=0;i<10;i++) ;
DOWN_WATER_ENABLE ; //退水时,打开电机
no_water_time = BASE_DOWN_WATER_TIME ; //退水延时定时
}
else
{
}
}
if(no_water_time)
{
no_water_time-- ;
if(no_water_time==0)
{//无人值守退水禁止
DOWN_WATER_UNABLE ;
UPDOWN_VAR_UNABLE ;
}
}
//按一次按键蜂鸣器响一次
if(alarm_one_flag=='O')
{
ALARM_IO = 0 ;
alarm_one_time-- ;
if(alarm_one_time==0)
{
ALARM_IO = 1 ;
alarm_one_flag = 0 ;
}
}
//加热时,LED闪烁控制
if(heat_led_flag=='H')
{
heat_led_time-- ;
if(heat_led_time==0)
{
heat_led_time = BASE_HEAT_LED_TIME ;
HEAT_LED_IO = !HEAT_LED_IO ;
}
}
//报警控制
if(alarm_flag=='A')
{
alarm_cnt-- ;
if(alarm_cnt==0)
{
alarm_cnt = BASE_ALARM_CNT ;
ALARM_IO = !ALARM_IO ;
alarm_time-- ;
if(alarm_time==0)
{
ALARM_IO = 1 ;
alarm_flag = 0 ;
}
}
}
//上水报警
if(up_alarm_flag=='U')
{
up_alarm_time--;
if(up_alarm_time==0)
{
up_alarm_time = 40 ;
PWR_LED_IO = !PWR_LED_IO ;
NORMAL_LED_IO = !NORMAL_LED_IO ;
}
}
}
else if(ADIF)
{
ADIF = 0 ;
ad_flag = 'A' ;
}
else
{
}
}
/******************************************************************************
系统上电初始化
******************************************************************************/
void InitSystem(void)
{
unsigned char i ;
//PORTA设置为输入
ADCON0 = 0x48 ; //采样8分频,通道1
ADCON1 = 0x04 ; //RA0 RA1 RA3为模拟输入管脚,参考电压为VDD
PORTA = 0x00 ;
TRISA = 0xff ;
//PORTB的RB3为输出,其余为输入
PORTB = 0x00 ;
TRISB = 0xf7 ;
OPTION = (OPTION&0xbf) ; //RB上拉不允许,不允许RB0中断
//PORTC全部为输出
T1CON = 0x00 ; //Timer1-RC0
RCSTA = 0x00 ; //USART-RC6 RC7
SSPCON = 0x00 ; //SPI-RC3 RC4 RC5
CCP1CON = 0x00 ;
PORTC = 0x01 ;
TRISC = 0x00 ;
OPTION = (OPTION&0xc0)|0x15 ; //定时器T0-外部晶振 128分频
no_body_time = BASE_NO_BODY_TIME ; //无人值守定时
no_water_time = 0 ;
up_water_time = 0 ;
down_water_time = 0 ;
heat_water_time = 0 ;
updown_key_value = 0xff ;
heat_key_value = 0xff ;
cup_key_value = 0x00 ;
up_water_flag = 0 ;
down_water_flag = 0 ;
heat_water_flag = 0 ;
no_body_flag = 0 ;
key_flag = 0 ;
ad_flag = 0 ;
cup_flag = 0 ;
alarm_one_flag = 0 ;
heat_led_flag = 0 ;
alarm_flag = 0 ;
up_alarm_flag = 0 ;
up_alarm_time = 1 ;
state = 0 ;
up_down_bit = 0 ;
heat_common_bit = 0 ;
sample_cnt = 0 ;
temp_all = 0 ;
temp_avr = 0 ;
avr = 0 ;
time = 0 ;
NORMAL_LED_IO = 0 ;
for(i=0;i<N_SAMPLE;i++)
{
temp_sample[i] = 0 ;
}
TMR0 = BASE_TMR0 ;
ADIF = 0 ;
ADON = 1 ; //启动AD模块
ADGO = 1 ; //启动AD转换
INTCON = 0xe0 ; //开中断GIE PEIE T0IE
PIE1 = 0x40 ; //开中断ADIE
}
/******************************************************************************
延时
******************************************************************************/
void TimeDelay(unsigned char t)
{
unsigned char i,j,time ;
time = t ;
for(i=0;i<time;i++)
{
for(j=0;j<50;j++)
{
no_body_time = BASE_NO_BODY_TIME ; //无人值守定时
no_water_time = 0 ;
}
}
}
/******************************************************************************
延时
******************************************************************************/
void DownDelay(unsigned char t)
{
unsigned char i,j,time ;
time = t ;
for(i=0;i<time;i++)
{
for(j=0;j<50;j++) ;
}
}
/******************************************************************************
系统冗余初始化
******************************************************************************/
void RefInitSystem(void)
{/*
if((INTCON&0xe0)!=0xe0)
{
INTCON = INTCON|0xe0 ;
}
if(ADCON0!=0x48)
{
ADCON0 = 0x48 ;
}
if(ADCON1!=0x04)
{
ADCON1 = 0x04 ;
}
*/
}
/******************************************************************************
上水
******************************************************************************/
void UpWater(void)
{
no_body_time = BASE_NO_BODY_TIME ; //无人值守定时
no_water_time = 0 ;
if(W_HIGH_CHECK_IO)
{//水位到,停止上水
chk_time=50 ;
while(chk_time)
if(W_HIGH_CHECK_IO)
{
chk_time=50 ;
while(chk_time)
if(W_HIGH_CHECK_IO)
{
state = 0 ;
up_water_time = 0 ;
up_water_flag = 0 ;
heat_common_bit = 0 ; //上水后,默认加热按键
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -