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

📄 m2test_a5_747.c

📁 PIC 16F系列制作的 空调控制器 测试机
💻 C
📖 第 1 页 / 共 2 页
字号:
// UPDATA 071128   全部功能OK
// 16F747

  
/*****PIC16F747引脚分配************************
PORTA:0B00111111
		  0:AD,S1_FB,伺服电机1反馈输入
  		  1:AD,S2_FB,伺服电机2反馈输入
  		  2:AD,S3_FB,伺服电机3反馈输入
  		  3:AD,AN3,参考电压(VREF)或鼓风机控制电压(FAN_CT)输入
  		  4:IO,AC_Q,AC请求输入
 	 	  5:AD,FAN_FB,鼓风机反馈电压输入
PORTB:0B11111111
         0:IO,key_illegal,不合格按键输入
         1:IO,key_next,继续按键输入
         2:IO,RDEF_Q,后除霜请求信号输入
         3:IO,key_reset,复位按键输入
         4:IO,key_selftest,自检按键输入
         5:IO,key_auto,自动按键输入
         6:PGC,用于调试
         7:PGD,用于调试
PORTC:0B10000010
         0:IO,SUN,阳光传感器输出
         1:IO,ILL,背景灯信号输入
         2:IO,SPEED,车速信号输出
         3:IO,G_SCK,4094时钟信号输出
         4:IO,G_EN,4094片选信号输出
         5:IO,G_SDO,4094数据信号输出
         6:IO,RDEF_FB,后除霜反馈信号输出  
         7:IO,BAK_IO,备用IO端口 
PORTD:0B11111111
         0:IO,SB_M+,伺服电机B,M+控制信号输入
         1:IO,SB_M-,伺服电机B,M-控制信号输入
         2:IO,S2_M+,伺服电机2,M+控制信号输入
         3:IO,S2_M-,伺服电机2,M-控制信号输入
         4:IO,S1_M+,伺服电机1,M+控制信号输入
         5:IO,S1_M-,伺服电机1,M-控制信号输入
         6:IO,S3_M+,伺服电机3,M+控制信号输入  
         7:IO,S3_M-,伺服电机3,M-控制信号输入 
PORTE:0B00000111
         0:AD,SB_FB,伺服电机B反馈输入
         1:AD,BAK_AD,备用AD端口
         2:AD,S_VDD,伺服电机参考电压输入

4094端口
U100:
		1:蒸发器电阻3
		2:外气电阻1
		3:外气电阻2
		4:外气电阻3
		5:蒸发器电阻1
		6:蒸发器电阻2
		7:ontest,在测
		8:
U101:
		1:内气电阻3
		2:CB电阻3
		3:CB电阻2
		4:CB电阻1
		5:内气电阻1
		6:内气电阻2
		7:illegal,不合格
		8:legal,合格

***********************************************/

#include <pic.h>
__CONFIG (0x3f22); 
//预定义
#define Uchar	unsigned char
#define Uint	unsigned int
#define bitset(var, bitno) ((var) |=  (1<<(bitno)))
#define bitclr(var, bitno) ((var) &= ~(1<<(bitno)))


//温度电阻选择定义
//ER1	AC开
//ER2	AUTO开ECON关
//ER3	AC关
#define ER1		U100_4094&=0xCE;U100_4094|=0x10
#define ER2		U100_4094&=0xCE;U100_4094|=0x20
#define ER3		U100_4094&=0xCE;U100_4094|=0x01
//IR1	内气20度
//IR2	内气24度
//IR3	内气30度
#define IR1		U101_4094&=0xCE;U101_4094|=0x10
#define IR2		U101_4094&=0xCE;U101_4094|=0x20
#define IR3		U101_4094&=0xCE;U101_4094|=0x01
//OR1	外气-5度
//OR2	外气25度
//OR3	外气35度
#define OR1		U100_4094&=0xF1;U100_4094|=0x02
#define OR2		U100_4094&=0xF1;U100_4094|=0x04
#define OR3		U100_4094&=0xF1;U100_4094|=0x08
#define CR1		U101_4094&=0xF1;U101_4094|=0x08
#define CR2		U101_4094&=0xF1;U101_4094|=0x04
#define CR3		U101_4094&=0xF1;U101_4094|=0x02

//指示灯定义
#define ON_ONTEST	U100_4094|=0x80
#define OFF_ONTEST	U100_4094&=~0x80
#define ON_LEGAL	U101_4094|=0x80
#define OFF_LEGAL	U101_4094&=~0x80
#define ON_ILLEGAL	U101_4094|=0x40
#define OFF_ILLEGAL	U101_4094&=~0x40


//按键定义
#define key_reset		RB3
#define key_next		RB1
#define key_illegal		RB0
#define key_selftest	RB4
#define key_auto		RB5

//输出端口定义
#define speed		RC2
#define rdef_fb		RC6
#define sun			RC0

//输入端口定义
#define rdef_q		RB2
#define ac_q		RA4
#define ill			RC1

#define in_air		RD6
#define out_air		RD7


//变量定义
Uchar U100_4094,U101_4094;
Uchar AD_s1fb,AD_s2fb,AD_s3fb,AD_sbfb;
Uchar AD_s1,AD_s2,AD_s3;
Uchar AD_fanct,AD_fanfb;
Uchar AD_fct,AD_ffb;
Uchar AD_vdd,AD_bak;
Uchar AD_N;
Uchar key;
Uint	timeover;
bit sp_state;
bit modeok;
bit tempok;
bit frok;
bit auto_test;
bit fanok;
bit acok;
bit is_inair;


//判断范围定义
//鼓风机控制电压、反馈电压与AD值对应公式
//AD=(V*255*4.7)/(14.7*5)
//V=(AD*14.7*5)/(255*4.7)
//const Uchar fanctl[]={0,0,0,0,0,0};
//const Uchar fancth[]={0xff,0xff,0xff,0xff,0xff,0xff};
//12V 150K与100K
//0档0xF7 1档0xB4 2档0x8E 3档0x68 4档0x36 5档0x1A
const Uchar fanfbl[]={0Xef,0xac,0x86,0x60,0x2e,0x12,0xef};
const Uchar fanfbh[]={0xff,0xbc,0x96,0x70,0x3e,0x22,0xff};

//伺服电机反馈电压与AD值对应公式

//mode 吹脸0xA4 吹全身0x7E 吹脚0x48  除霜吹脚0x2B 全除霜0x0A
//const Uchar model[]={0x9c,0x76,0x40,0x23,0x02,0x9c};
//const Uchar modeh[]={0xac,0x86,0x50,0x33,0x12,0xac};
//20071022
//mode 吹脸0x96 吹全身0x7E 吹脚0x48  除霜吹脚0x2B 全除霜0x0A
const Uchar model[]={0x8e,0x76,0x40,0x23,0x02,0x8e};
const Uchar modeh[]={0x9e,0x86,0x50,0x33,0x12,0x9e};
//temp   冷0x98   热0x0c
const Uchar templ[]={0x90,0x24,0x04,0x24,0x90};
const Uchar temph[]={0xa0,0x80,0x14,0x80,0xa0};







//函数说明
void key_test(void);
void Delayms(Uint ms);
void AD_init(void);
void Time1_init(void);
void Set4094(void);
void mode_test(void);
void fr_test(void);
void temp_test(void);
void fan_test(void);
void ac_test(void);
void test_35_20(void);
void test_35_24(void);
void test_35_30(void);
void test_25_20(void);
void test_25_24(void);
void test_25_30(void);
void test_06_20(void);
void test_06_24(void);
void test_06_30(void);


//4094输出
#define	EN_0	bitclr(PORTC,4)
#define EN_1	bitset(PORTC,4)
#define SCK_0	bitclr(PORTC,3)
#define SCK_1	bitset(PORTC,3)
#define SDO_0	bitclr(PORTC,5)
#define SDO_1	bitset(PORTC,5)
void Set4094()		//状态输出
{
	Uchar j;
	Uchar V;
    SCK_0;
    EN_0;
   	V=U101_4094;
    for(j=8;j>0;j--)	//U100_4094输出
    {
        if(V&0x80)
        	SDO_1;
        else
        	SDO_0;
		V=V<<1;
        SCK_1;
		NOP();
        SCK_0;
    }
    V=U100_4094;		//U101_4094输出
    for(j=8;j>0;j--)
    {
        if(V&0x80)
        	SDO_1;
        else
        	SDO_0;
		V=V<<1;
        SCK_1;
        NOP();
        SCK_0;
    }
    EN_1;	//一次性送出U100_4094与U101_4094数据
    EN_0;
 }

void key_test(void)
{
	if(key_illegal==1)key=2;
	else if(key_auto==1)key=3;
	else if(key_selftest==1)key=4;
	else if(key_next==1)key=5;
//	return(key);
}

void key_dispose(void)
{
	if(((key==2)&&(key_illegal==1))||((auto_test==1)&&(key==6)))	//key6 超时出错判断
	{
		U100_4094=0;
		U101_4094=0;
		ER1;
		IR1;
		OR2;
		ON_ILLEGAL;
		Set4094();
		while(1);
	}
	key=0;					//按键处理完
}


//延时ms毫秒
 void Delayms(Uint ms)	//延时ms
 {
	Uchar i;
    for(ms;ms>0;ms--)
    	for(i=100;i>0;i--);
 }

//AD初使化
void AD_init(void)		//AD启动,开AD中断
{
	ADCON0=0xC1;   			//RC振荡
//	ADCON1=0;    			//全部分配AD端口,VDD参考电压  16F74
	ADCON1=0x07;    		//全部分配AD端口,VDD参考电压  17F747
    bitclr(PIR1,6);         //clear ADIF bit        
    bitset(PIE1,6);         //set ADIE bit
    bitset(INTCON,6);       //set PEIE bit
    bitset(INTCON,7);       //set GIE bit
}

void Time1_init(void)		//AD启动,开AD中断
{
	T1CON=0;    			//定时,预分频1:1
    bitclr(PIR1,0);         //clear ADIF bit        
    bitset(PIE1,0);         //set ADIE bit
    bitset(INTCON,6);       //set PEIE bit
    bitset(INTCON,7);       //set GIE bit
	TMR1L=0;
	TMR1H=0;
}

void ac_test(void)
{
//	Uchar i;
	//初使状态下AC关
	while(1)			//等待AC关
	{
		key_test();
		if(key)key_dispose();
		if(!ac_q)
		{
			Delayms(1);
			if(!ac_q)break;
		}
	}
	//AC开,1.AC强制开  2.AUTO状态下AC开		
	while(1)			//等待AC开
	{
		key_test();
		if(key)key_dispose();
		if(ac_q)
		{
			Delayms(1);
			if(ac_q)break;
		}
	}
	
	Delayms(6000);

	ER3;				//AUTO状态下 AC关
	Set4094();

	Delayms(6000);

	ER2;				//AUTO状态开,ECON状态关
	Set4094();
	//AUTO状态下AC开
	while(1)			//等待AC开
	{
		key_test();
		if(key)key_dispose();
		if(ac_q)
		{
			Delayms(1);
			if(ac_q)break;
		}
	}
	//ECON状态下AC关
	while(1)			//等待AC关
	{
		key_test();
		if(key)key_dispose();
		if(!ac_q)
		{
			Delayms(1);
			if(!ac_q)break;
		}
	}

	Delayms(6000);

	ER1;
	Set4094();
	//ECON状态下AC开
	while(1)			//等待AC开
	{
		key_test();
		if(key)key_dispose();
		if(ac_q)
		{
			Delayms(1);
			if(ac_q)break;
		}
	}	
	acok=1;
}

void fan_test(void)				//风量测试
{
	Uchar i;
	for(i=0;i<7;)
	{
		do
		{
			AD_ffb=AD_fanfb;
			Delayms(5);											//延时判断电机停止	
			key_test();
			if(key)key_dispose();
		}
		while(!(((AD_ffb-AD_fanfb)<3)||((AD_fanfb-AD_ffb)<3)));
		if((AD_ffb>fanfbl[i])&&(AD_ffb<fanfbh[i]))i++;			//鼓风机电机第I个状态
																//0关 (1-5)1-5档
	}
	fanok=1;
}


void mode_test(void)			//模式测试
{
	Uchar i;
	for(i=0;i<5;)
	{
		do
		{
			AD_s1=AD_s1fb;
			Delayms(5);											//延时判断伺服电机停止	
			key_test();
			if(key)key_dispose();
		}
//		while(1);
		while(!(((AD_s1-AD_s1fb)<3)||((AD_s1fb-AD_s1)<3)));
		if((AD_s1>model[i])&&(AD_s1<modeh[i]))i++;				//模式伺服电机第I个状态
																//0吹脸1吹全身2吹脚3吹脚除霜4全除霜
	}
	modeok=1;
}


void fr_test(void)				//内外气测试(不带反馈)
{
	while(!((in_air==1)&&(out_air==0))){key_test();	if(key)key_dispose();}
	while(!((in_air==0)&&(out_air==1))){key_test();	if(key)key_dispose();}
	while(!((in_air==1)&&(out_air==0))){key_test();	if(key)key_dispose();}
	frok=1;
}



void temp_test(void)			//温度测试
{
	Uchar i;
	for(i=0;i<5;)
	{
		do
		{
			AD_s2=AD_s2fb;
			Delayms(5);											//延时判断伺服电机停止
			key_test();
			if(key)key_dispose();	
		}
		while(!(((AD_s2-AD_s2fb)<3)||((AD_s2fb-AD_s2)<3)));
		if((AD_s2>templ[i])&&(AD_s2<temph[i]))i++;				//模式伺服电机第I个状态
																//0冷1中间2热3中间4冷
	}
	tempok=1;
}

//中断函数
void interrupt	PIC_ISR(void)
{
 	if((PIR1&0x40)==0x40)
    {
		if((ADCON0&0x38)==0)		//伺服电机1反馈 AN0
		{
			if(AD_N>1)
			{
				AD_N=0;
				AD_s1fb=ADRESH;
				ADCON0=0x81;
				ADCON0|=0x08;
			}
			else
				AD_N++;
		}
		else if((ADCON0&0x38)==0x08)//伺服电机2反馈 AN1
		{
			if(AD_N>1)
			{
				AD_N=0;
				AD_s2fb=ADRESH;
				ADCON0=0x81;
				ADCON0|=0x10;
			}
			else
				AD_N++;	
		}
		else if((ADCON0&0x38)==0x10)//伺服电机3反馈 AN2
		{
			if(AD_N>1)
			{
				AD_N=0;
				AD_s3fb=ADRESH;
				ADCON0=0x81;
				ADCON0|=0x18;
			}
			else
				AD_N++;			
		}
        else if((ADCON0&0x38)==0x18)//鼓风机控制信号 AN3
		{
			if(AD_N>1)
			{
				AD_N=0;
				AD_fanct=ADRESH;
				ADCON0=0x81;
				ADCON0|=0x20;
			}
			else
				AD_N++;	
		}
		else if((ADCON0&0x38)==0x20)//鼓风机反馈信号 AN4
		{
			if(AD_N>1)
			{
				AD_N=0;
				AD_fanfb=ADRESH;
				ADCON0=0x81;
				ADCON0|=0x28;
			}
			else
				AD_N++;
		}
		else if((ADCON0&0x38)==0x28)//伺服电机b反馈 AN5
		{
			if(AD_N>1)
			{
				AD_N=0;
				AD_sbfb=ADRESH;
				ADCON0=0x81;
				ADCON0|=0x30;
			}
			else
				AD_N++;
		}
		else if((ADCON0&0x38)==0x30)//备用AD AN6
		{
			if(AD_N>1)
			{
				AD_N=0;
				AD_bak=ADRESH;	
				ADCON0=0x81;
				ADCON0|=0x38;
			}
			else
				AD_N++;
		}
		else if((ADCON0&0x38)==0x38)//伺服电机参考电压 AN7
		{
			if(AD_N>1)
			{
				AD_N=0;
				AD_vdd=ADRESH;
				ADCON0=0x81;
			}
			else
				AD_N++;
		}
		else
			ADCON0=0x81;
        bitclr(PIR1,6);         //clear ADIF bit
		bitset(ADCON0,2);			//启动A/D转换
	}
    if((PIR1&0x01)==0x01)
	{
		speed=sp_state;
		sp_state=!sp_state;
		bitclr(PIR1,0);         //clear TMR1IF bit
		if(++timeover>3000)key=6;
	}
}

/**************************************************************
***************************************************************/ 
//主程序
void main()
{
//变量定义

//	Uchar i;

//端口方向定义
    TRISA=0B00111111;
    TRISB=0B11111111;
    TRISC=0B10000010;
	TRISD=0B11111111;
	TRISE=0B00000111;

//状态初使化
    AD_init();			//AD初使化
	Time1_init();		//Time1初使化
	bitset(INTCON,4);	//开RB0中断输入
	
	sp_state=0;
    U100_4094=0;	//关在测灯
    U101_4094=0;	//关合格不合格灯
	ER1;		//蒸发器4度,AUTO开ECON关
	IR1;		//内气24度
	OR2;		//外气25度
	OFF_ONTEST;	//关在测灯
	OFF_LEGAL;	//关不合格灯
	OFF_ILLEGAL;//关合格灯

	speed=0;	//车速信号0V(无车速信号)
	rdef_fb=0;	//后除霜反馈关
	sun=0;		//阳光传感器0V(无阳光信号)
//	sun=1;		//阳光传感器1.5V(有阳光信号)
	key=0;		//无按键按下
	is_inair=0;
	auto_test=0;
	             
    bitset(ADCON0,2);               //启动A/D转换
	bitset(T1CON,0);				//启动Time1
	Set4094();


//	自检功能测试
//	while(1)			//自检功能测试用
//	{
		if(key_selftest)
		{
			Delayms(5);
			if(key_selftest)
			{
				ON_ONTEST;
				Set4094();
				sun=1;
				while(1)
				{
					key_test();
					if(key==2)key_dispose();		//不合格按键,屏蔽时间
					if(key_next)
					{
						Delayms(5);
						if(key_next)break;
					}
				}
			}
			ON_LEGAL;
			Set4094();
			while(1);
		}
//	}



		//手动功能测试
//	while(1)				//手动功能测试用
//	{
		if(key_next)
		{
			Delayms(5);
			if(key_next)
			{
				ON_ONTEST;
				Set4094();

				//模式伺服电机测试
				modeok=0;
				mode_test();

				ON_LEGAL;
				Set4094();
				Delayms(1000);
				OFF_LEGAL;
				Set4094();

				//温度伺服电机测试
				tempok=0;
				temp_test();

				ON_LEGAL;
				Set4094();
				Delayms(1000);
				OFF_LEGAL;
				Set4094();

				//内外气伺服电机测试
				frok=0;
				fr_test();

				ON_LEGAL;
				Set4094();
				Delayms(1000);
				OFF_LEGAL;
				Set4094();

				//鼓风机测试
				fanok=0;
				fan_test();
	
				ON_LEGAL;
				Set4094();
				Delayms(1000);
				OFF_LEGAL;
				Set4094();

				//后除霜测试
				while(1)			//等待后除霜按键按开
				{
					key_test();
					if(key)key_dispose();
					if(!rdef_q)
					{
						Delayms(1);
						if(!rdef_q)break;
					}
				}
				rdef_fb=1;			//后除霜反馈信号

				ON_LEGAL;
				Set4094();
				Delayms(1000);
				OFF_LEGAL;
				Set4094();

				//AC功能测试
				acok=0;
				ac_test();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -