⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 安装在车上
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************




******************************************************************************/
#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 + -