📄 m2test_a5_747.c
字号:
// 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 + -