?? 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 + -