/**********************************************************************/
/* */
/* 轮胎自动充放机 */
/* */
/* 标准款 */
/* */
/* 2007/11/14 15:09 */
/* BY:SX */
/* */
/**********************************************************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
/**********************************************************************/
#define MaxQY 53 //最大气压值
//----标定传感器--------------------------------------------------------
//#define ZERO_FLOAT 23 //零票值
#define LINE_SLOPE 181 //斜率
//----通用部分----------------------------------------------------------
#define HIGH 1
#define LOW 0
#define TRUE 1
#define FALSE 0
#define MSB 0x80
#define LSB 0x01
//----max7219寄存器定义-------------------------------------------------
#define DECODE_MODE 0x09
#define INTENSITY 0x0A
#define SCAN_LIMIT 0x0B
#define SHUT_DOWN 0x0C
#define DISPLAY_TEST 0x0F
//----EEPROM------------------------------------------------------------
//#define Set_Val_Add 0x2A00
#define ZERO_Val_Add 0x2A00
//---指示灯定义---------------------------------------------------------
#define LED_Work 5
#define LED_N2 1
#define LED_KEY 4
#define LED_BC 3
//---STC硬件看门狗-------------------------------------------------------
#define Watdog WDT_CONTR=0x3c;//喂狗,使用时不用加分号
/******************************STC define*******************************/
sfr P1M0 = 0x91;
sfr P1M1 = 0x92;
sfr WDTRST = 0xA6;
sfr ADC_LOW2 = 0xBE;
sfr ADC_CONTR = 0xC5;
sfr ADC_DATA = 0xC6;
sfr CLK_DIV = 0xC7;
sfr WDT_CONTR = 0xe1;
sfr isp_data = 0xe2;
sfr isp_addrh = 0xe3;
sfr isp_addrl = 0xe4;
sfr isp_cmd = 0xe5;
sfr isp_trig = 0xe6;
sfr isp_contr = 0xe7;
/******************************I/O define*******************************/
sbit LOAD = P3^5; //MAX7219 Load-Data Input: rising edge pin 12
sbit DIN = P3^3; //MAX7219 Serial-Data Input: rising edge pin 1
sbit CLK = P3^4; //MAX7219 Serial-Clock Input: maximum 10MHz pin 13
//key
sbit Stop = P2^1;
sbit Add = P2^3;
sbit Dec = P2^2;
sbit Zero = P2^4;
sbit N2A = P2^6;
sbit Check= P2^5;
sbit Psi = P2^7;
//Ctrl
sbit CQ = P1^3;
sbit FQ = P1^2;
sbit DQ = P1^4;
sbit BEEP = P1^5;
/***************************function define*****************************/
void Write_Max7219(uchar address,uchar dat);//写入max7219一个命令和一个数据
void Write_Max7219_byte(uchar temp);//写入max7219一字节
void Init_Max7219(void);//Initize max7219
void Close_LED(uchar num);//关数码管
void Disp_num(uchar dispbit,uchar num);//显示数字
void Disp_d(uchar num);//大段数码管显示
void Disp_x(uchar num);//小段数码管显示
void LED_Ctrl(uchar lednum,bit light);//指示灯控制
void del(uint i); //延时程序
uchar Cov_Val(uchar n);//AD采样值转换气压值
bit del_key(uchar i); //按键键延时
uchar Ad_Change(uchar channel);//AD通道切换
void CQ_Animation(uchar snum);//充气过程动画
void FQ_Animation(uchar snum);//放气过程动画
void Disp_d_PSI(uchar num);//显示PSI单位数值
uchar eeprom_read(uint addres);//读取EEPROM
void eeprom_write(uint address,uchar wdata);//写入EEPROM
void eeprom_eares(uint addres);//擦除EEPROM
/*****************************data define*******************************/
uchar code Tab[]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B,0x77,0x1F,0x4E,0x3D,0x4F,0x47};//共阴数码管
uchar code display_AD_channel_ID[8] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};//AD通道数据表
uchar led_state=0,ZERO_FLOAT;
/****************************main function******************************/
void main(void)
{
uint i,Time_Val,count;
uchar Set_Val,buf,buf2;
uchar n,count_ani;
uint sum;
bit temp,Selet_N2=0;
Init_Max7219();
Close_LED(1);
for(n=1;n<9;n++){Write_Max7219(n,0);}
Watdog//喂狗,使用时不用加分号
ADC_CONTR=0x80;
del(20);
Set_Val=25;
//Set_Val=eeprom_read(Set_Val_Add);
ZERO_FLOAT=eeprom_read(ZERO_Val_Add);
/*-------开机自检----------------------
开机按住"T"键后小数码管显示零票值,松开正常工作
若此时按住"T"的同时再按下"?"键则会自动检测传感器的零票并存储
--------------------------------------*/
if(!Stop)
{del(8);
if(!Stop)
{
sum=0;
for(n=0;n<32;n++)
{
sum+=Ad_Change(7);
}
buf=sum/32;
Disp_d(ZERO_FLOAT);
Disp_x(buf);
while(!Stop)Watdog
}
}
if(!Check)
{del(8);
if(!Check)
{
while(!Check)Watdog
}
eeprom_eares(ZERO_Val_Add);
eeprom_write(ZERO_Val_Add,buf);
ZERO_FLOAT=eeprom_read(ZERO_Val_Add);
Disp_d(ZERO_FLOAT);
Disp_x(buf);
}
/*-------主循环(待机过程)-----------*/
Start_Wait:
while(1)
{
sum=0;
Disp_d(Set_Val);
Watdog
for(n=1;n<=128;n++)
{
//----采样32次取平均值
sum+=Ad_Change(7);
if(n%32==0)
{
sum/=32;
buf=Cov_Val(sum);
sum=0;
}
//----显示校准---------------
/*
当轮胎压力与设定压力相差0.1bar时,小视窗显示设定值压力
当轮胎压力与设定压力相差0.2bar时,小视窗显示值与设定值差0.1
(只是显示做了修饰,不影响自动充放)
*/
if(buf){if(buf-Set_Val<=1|buf-Set_Val>=255)Disp_x(Set_Val);
else{if(Set_Val>buf&Set_Val<buf+3)Disp_x(buf+1);
else if(Set_Val<buf&Set_Val>buf-3)Disp_x(buf-1);
else Disp_x(buf);}}else Close_LED(1);
/*--------------功能按键-------------*/
//----设定值+1-------------------------
/*
Stop,Add,Dec按住超过600ms可以连续增减
*/
if(!Stop)
{del(8);
if(!Stop)
{
LED_Ctrl(LED_KEY,1);
Set_Val+=10;
if(Set_Val>MaxQY){Set_Val=0;}
Disp_d(Set_Val);
temp=del_key(150);
if(!temp){del(32);LED_Ctrl(LED_KEY,0);continue;}
while(!Stop|temp)
{
temp=0;
Set_Val+=10;
if(Set_Val>MaxQY){Set_Val=0;}
Disp_d(Set_Val);
del(120);
}
//eeprom_eares(Set_Val_Add);
//eeprom_write(Set_Val_Add,Set_Val);
LED_Ctrl(LED_KEY,0);
}
}
//----设定值+0.1-----------------------
if(!Add)
{del(8);
if(!Add)
{
LED_Ctrl(LED_KEY,1);
Set_Val++;
if(Set_Val>MaxQY){Set_Val=0;}
Disp_d(Set_Val);
temp=del_key(150);
if(!temp){del(32);LED_Ctrl(LED_KEY,0);continue;}
while(!Add|temp)
{
temp=0;
Set_Val++;
if(Set_Val>MaxQY){Set_Val=0;}
Disp_d(Set_Val);
del(120);
}
// eeprom_eares(Set_Val_Add);
// eeprom_write(Set_Val_Add,Set_Val);
LED_Ctrl(LED_KEY,0);
}
}
//----设定值-0.1-----------------------
if(!Dec)
{del(20);
if(!Dec)
{
LED_Ctrl(LED_KEY,1);
Set_Val--;
if(Set_Val>MaxQY){Set_Val=0;}
Disp_d(Set_Val);
temp=del_key(150);
if(!temp){del(32);LED_Ctrl(LED_KEY,0);continue;}
while(!Dec|temp)
{
temp=0;
Set_Val--;
if(Set_Val>MaxQY){Set_Val=0;}
Disp_d(Set_Val);
del(120);
}
// eeprom_eares(Set_Val_Add);
// eeprom_write(Set_Val_Add,Set_Val);
LED_Ctrl(LED_KEY,0);
}
}
//----检测轮胎内压力----------------------------
if(!Check){del(20);if(!Check)
{
while(!Check)Watdog
del(20);
while(1)
{
for(count=0;count<32;count++)
{
sum+=Ad_Change(7);
if(n%32==0)
{
sum/=32;
buf=Cov_Val(sum);
sum=0;
}
if(!Check){del(20);if(!Check){Close_LED(1);while(!Check)Watdog goto Start_Wait;}}
}
Disp_x(0);
if(buf==0)continue;
//----显示校准-------------------------
if(buf){if(buf-Set_Val<=1|buf-Set_Val>=255)Disp_x(Set_Val);
else{if(Set_Val>buf&Set_Val<buf+3)Disp_x(buf+1);
else if(Set_Val<buf&Set_Val>buf-3)Disp_x(buf-1);
else Disp_x(buf);}}else{Close_LED(1);goto Start_Wait;}
}
}}
//----零气压充气爆充-------------------
if(!Zero)
{del(20);
if(!Zero)
{
if(del_key(200))
{
LED_Ctrl(LED_BC,1);