📄 11.c
字号:
#include<all.h> /*GAE328.717 2500KN 开度 一路荷重-四位显示,传感器为meyle输入,MA输入*/
/* 按键声音提示 继电器输出 */
#define MAXDATA 9999 /*加减变量的最大数*/
#define VARNUMBER 7 /*预置变量个数*/
#define LEDBIT1 7
#define DBNUMBER 1 /*定标变量个数*/
#define MAX7219CHIPNUMBER 2 /*MAX7219芯片的个数*/
#define MAX7219BITNUMBER 4 /*MAX7219显示的位数*/
#define adsetlowwA 80
#define adsethighwA 82
#define adsetlowwB 84
#define adsethighwB 86
//#define A 0x00 /*tlv2544 A路输入*/
//#define B 0x20 /*tlv2544 B路输入*/
#define BCDL12 0x3fff
#define BCDH34 0x4fff
#define BCDL56 0x6fff
#define BCDH78 0x7fff
#define CGL 0x1fff
#define CGH 0x2fff
#define IDE 0x0fff /*功能选择及定标(或从机地址)的地址*/
#define JDQ 0xafff /*继电器的地址*/
#define AVERAGENUMBER 1 /*荷重传感器输入软件滤波次数*/
sbit MAX7219_CLK =P3^5;
sbit MAX7219_DIN =P1^2;
sbit MAX7219_LOAD=P1^7;
sbit X25045_CS=P1^0;
sbit X25045_SCK=P1^1;
sbit X25045_SI=P1^2;
sbit X25045_SO=P1^3;
sbit MAX490_RO=P3^4;
sbit MAX490_DI=P3^3;
sbit AD420_CLK=P2^2; /*P33*/
sbit AD420_DIN=P1^2; /*P34*/
sbit AD420_LATCH=P1^6; /*P35*/
sbit AD7705_CS=P1^5;
sbit AD7705_SCLK=P2^1;
sbit AD7705_DIN=P1^2;
sbit AD7705_DOUT=P1^3;
void delay(unsigned int delaytime );
void bin_bcdK(unsigned int temp);
void bin_bcdA(unsigned int temp); /*二进制转换为四位BCD码*/
void warn();
void key_press();
union word_bytes{unsigned int word;struct{unsigned char b0;unsigned char b1;}bytes;};
void max7219_init();
void max7219_input_8_bit(unsigned char inputaddress,unsigned char inputdata);
void max7219_disp(unsigned char dispdata[],unsigned char n);
void ad7705_in();
void x25045_init();
void x25045_write_word(unsigned int address,unsigned int indata);
unsigned int x25045_read_word(unsigned int address);
int coder_jb5(); /*变型码4095传感器译码*/
//bit saveorder;
bit press;
bdata unsigned char zw; /*传感器取值位变量;高位*/
bdata unsigned char yw; /*传感器取值位变量;中位*/
bdata unsigned char xw; /*传感器取值位变量;低位*/
bdata unsigned char bzw;/*传感器取值位变量;高位*/
bdata unsigned char byw; /*传感器取值位变量;中位*/
bdata unsigned char bxw; /*传感器取值位变量;低位*/
sbit z0=zw^0;sbit z1=zw^1;sbit z2=zw^2;sbit z3=zw^3;/*传感器24位格雷码分别对应为*/
sbit z4=zw^4;sbit z5=zw^5;sbit z6=zw^6;sbit z7=zw^7;/*低x0-x7-y0-y7-z0-z7高*/
sbit y0=yw^0;sbit y1=yw^1;sbit y2=yw^2;sbit y3=yw^3;/*首先接收数据首位z7 */
sbit y4=yw^4;sbit y5=yw^5;sbit y6=yw^6;sbit y7=yw^7;/*最后接收数据末位x0 */
sbit x0=xw^0;sbit x1=xw^1;sbit x2=xw^2;sbit x3=xw^3;/*一个位置数据共24位 */
sbit x4=xw^4;sbit x5=xw^5;sbit x6=xw^6;sbit x7=xw^7;/* 格雷码 */
sbit bz0=bzw^0;sbit bz1=bzw^1;sbit bz2=bzw^2;sbit bz3=bzw^3;/*传感器24位二进制分别对应为*/
sbit bz4=bzw^4;sbit bz5=bzw^5;sbit bz6=bzw^6;sbit bz7=bzw^7;/*低bx0-bx7-by0-by7-bz0-bz7高*/
sbit by0=byw^0;sbit by1=byw^1;sbit by2=byw^2;sbit by3=byw^3;/*首先接收数据首位bz7 */
sbit by4=byw^4;sbit by5=byw^5;sbit by6=byw^6;sbit by7=byw^7;/*最后接收数据末位bx0 */
sbit bx0=bxw^0;sbit bx1=bxw^1;sbit bx2=bxw^2;sbit bx3=bxw^3;/*一个位置数据共24位 */
sbit bx4=bxw^4;sbit bx5=bxw^5;sbit bx6=bxw^6;sbit bx7=bxw^7;/*4096*4096=16777216 */
unsigned long pfdatadone();
void ad420_out();
unsigned char adout[4];
int c;
unsigned char varidentify;
bdata unsigned char ledbyte1; /*报警触点及指示灯*/
bdata warnbyte;
sbit warn0=warnbyte^0;
sbit warn1=warnbyte^1;
sbit warn2=warnbyte^2;
sbit warn3=warnbyte^3;
sbit warn4=warnbyte^4;
sbit warn5=warnbyte^5;
sbit warn6=warnbyte^6;
sbit warn7=warnbyte^7;
sbit leda1=ledbyte1^0;
sbit ledb1=ledbyte1^1;
sbit ledc1=ledbyte1^2;
sbit ledd1=ledbyte1^3;
sbit lede1=ledbyte1^4;
sbit ledf1=ledbyte1^5;
sbit ledg1=ledbyte1^6;
sbit leddp1=ledbyte1^7;
unsigned int idata chiefdataA; /*主数据*/
unsigned int idata chiefdata; /*主数据*/
unsigned int idata chiefdataB; /*主数据*/
unsigned int idata var[VARNUMBER]; /*预置变量*/
unsigned char dispdataAB[8];
unsigned char dispdataK[8];
unsigned int adbufferA[AVERAGENUMBER]; /*A路传感器值缓冲区*/
unsigned int adbufferB[AVERAGENUMBER]; /*B路传感器值缓冲区*/
unsigned int idata adsetlowA,adsethighA;
unsigned int idata adsetlowB,adsethighB;
/*主程序开始++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
main() /*主程序*/
{
char i,akey,cc;
long k;
float adfloat;
int old;
press=0;
x25045_init(); /*看门狗初始化*/
X25045_CS=0;delay(1);X25045_CS=1; /*喂狗*/
//X25045_CS=0;delay(1);X25045_CS=1; /*喂狗*/
for(i=0;i<VARNUMBER;i++) var[i]=x25045_read_word(i*2); /*取EEPROM中的变量值*/
adsetlowA=x25045_read_word(adsetlowwA);
adsethighA=x25045_read_word(adsethighwA);
adsetlowB=x25045_read_word(adsetlowwB);
adsethighB=x25045_read_word(adsethighwB);
while(1)
{
X25045_CS=0;delay(1);X25045_CS=1; /*喂狗*/
max7219_init(); /*MAX7219初始化*/
if((~IDE)&0x1){key_press();} /*若选择键按下,调用按键处理程序*/
if((~IDE)&0x8)
{
i=press;
if (akey==0)
{
switch (i)
{
case 1: press=0;break;
case 0: press=1;break;
default:
break;
}
}
akey=1;
}
else akey=0;
cc=~IDE ;
AD7705_CS=0;
for(i=1;i<=40;i++)
{AD7705_SCLK=0;
AD7705_DIN=1;
AD7705_SCLK=1;
}
AD7705_CS=1;
X25045_CS=0;delay(1);X25045_CS=1; /*喂狗*/
ad7705_in();
k=0;
for(i=0;i<AVERAGENUMBER;i++)
{k=adbufferA[i]+k;
}
k=k/AVERAGENUMBER;
if(k<=adsetlowA) k=0;
else k=(k-adsetlowA)*(var[6]-var[5])/(adsethighA-adsetlowA)+var[5];
chiefdataA=(int)(k);
X25045_CS=0;delay(1);X25045_CS=1; /*喂狗*/
for(i=0;i<AVERAGENUMBER;i++)
{k=adbufferB[i]+k;
}
k=k/AVERAGENUMBER;
if(k<=adsetlowB) k=0;
else k=(k-adsetlowB)*(var[6]-var[5])/(adsethighB-adsetlowB)+var[5];
chiefdataB=(int)(k);
X25045_CS=0;delay(1);X25045_CS=1; /*喂狗*/
old=coder_jb5(); /*调用接触式传感器输入程序*/
if(old>8000) chiefdata=0;
else if(old>5465.575) chiefdata=(int)((old-5465.575)*0.860543+4440);
else if(old>2671.57) chiefdata=(int)((old-2671.57)*0.828427+2125);
else chiefdata=(int)(old*0.794664);
bin_bcdK(chiefdata);
// BCDL12=dispdataK[1]*16+dispdataK[0];
delay(1);
// BCDH34=dispdataK[3]*16+dispdataK[2];
dispdataK[2]=dispdataK[2]|0x80;
bin_bcdA(chiefdataA);
// BCDL56=dispdataAB[1]*16+dispdataAB[0];
delay(1);
// BCDH78=dispdataAB[3]*16+dispdataAB[2];
dispdataAB[1]=dispdataAB[1]|0x80;
for(i=0;i<8;i++)
{
MAX7219_LOAD=0;
max7219_input_8_bit(i+1,dispdataAB[i]);
max7219_input_8_bit(i+1,dispdataK[i]);
MAX7219_LOAD=1;
}
warn(); /*调用报警子程序*/
if(chiefdata<=0x0) {adout[0]=0x00;adout[1]=0x00;}
else if(chiefdata>=6300) {adout[0]=0xFF;adout[1]=0xFF;}
else {adfloat=65535*(float)(chiefdata-0x0)/(float)(6300-0x0);
adout[0]=(char)adfloat;adout[1]=(char)(adfloat/256);}
if(chiefdataA<=0x0) {adout[2]=0x00;adout[3]=0x00;}
else if(chiefdataA>=2500) {adout[2]=0xFF;adout[3]=0xFF;}
else {adfloat=65535*(float)(chiefdataA-0x0)/(float)(2500-0x0);
adout[2]=(char)adfloat;adout[3]=(char)(adfloat/256);}
ad420_out(); /*调用4-20MA输出程序*/
}
}
/*主程序结束++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void delay(unsigned int delaytime) /*延迟dealytime个毫秒*/
{unsigned char j;
while(delaytime--)
{
for (j=0;j<125;j++)
{;}
}
}
/*二进制转换为BCD码模块开始++++++++++++++++++++++++++++++++++++++++++*/
void bin_bcdK(unsigned int temp) /*二进制转换为四位BCD码*/
{
dispdataK[3]=temp/1000; /*高位*/
temp= temp - dispdataK[3]*1000;
dispdataK[2]=temp/100;
temp=temp-dispdataK[2]*100;
dispdataK[1]=temp/10;
dispdataK[0]=temp%10; /*低位*/
}
void bin_bcdB(unsigned int temp) /*二进制转换为四位BCD码*/
{
dispdataAB[7]=temp/1000; /*高位*/
temp=temp-dispdataAB[7]*1000;
dispdataAB[6]=temp/100;
temp=temp-dispdataAB[6]*100;
dispdataAB[5]=temp/10;
dispdataAB[4]=temp%10; /*低位*/
}
void bin_bcdA(unsigned int temp) /*二进制转换为四位BCD码*/
{
dispdataAB[3]=temp/1000; /*高位*/
temp=temp-dispdataAB[3]*1000;
dispdataAB[2]=temp/100;
temp=temp-dispdataAB[2]*100;
dispdataAB[1]=temp/10;
dispdataAB[0]=temp%10; /*低位*/
}
/*二进制转换为BCD码模块结束++++++++++++++++++++++++++++++++++++++++++*/
void dingshi(void)interrupt 1 using 1
{
c++;
if(c<6000)
{
TH0=-(10000/256);
TL0=-(10000%256);
}
else
{
varidentify=0;c=0;TR0=0;ET0=0;
ledbyte1=0;ledb1=1;
MAX7219_LOAD=0;
max7219_input_8_bit(LEDBIT1,ledbyte1); /*0x5为指示灯位于MAX7219中的位置*/
MAX7219_LOAD=1;
}
}
/*按键处理模块开始++++++++++++++++++++++++++++++++++++++++++++++++++*/
void key_press() /*按键处理子程序*/
{
char i;
char keyindata; /*按键*/
//uchar varidentify=0; /*变量标识*/
int temp; /*变量增减中间计数器*/
char selelongpress=0; /*选择键是否持续按下 0--N 1--Y*/
char times=0; /*用于按键加速的记数变量*/
TCON=0x00;
TMOD=0x01;
TR0=1;
ET0=1;
TH0=-(10000/256);
TL0=-(10000%256);
EA=1; //EA 为CPU 的中断开放标志位,EA=1,CPU 开放中断,EA=0,CPU 屏蔽所有中断
ES0=0; //ES 为串行口中断允许位,ES=1,允许串行口中断,ES=0,禁止串行口中断
varidentify=0; /*变量标识*/
c=0;
while(1) /*用GOTO跳出*/
{ X25045_CS=0;delay(1);X25045_CS=1;
keyindata=~IDE; /*取按键*/
switch(selelongpress)
{
case 1:
if (!(keyindata&0x01)) selelongpress=0;
break;
case 0:
if(keyindata&0x01)
{
delay(1);delay(1);delay(98);delay(1);/*消抖*/
X25045_CS=0;delay(1);X25045_CS=1;
//keyindata=~IDE;
ledbyte1=0; /*清所有指示灯*/
selelongpress=1; /*持续按下标志置位*/
if(!(keyindata&0x01)) break;
if(varidentify<VARNUMBER) varidentify++; /*变量标识+1*/
else goto endless;
temp=var[varidentify-1];/*中间计数器赋值*/
switch (varidentify) /*置相应的指示灯*/
{
case 1:
ledb1=1;
warn7=1;
JDQ=warnbyte;
delay(8);
warn7=0;
JDQ=warnbyte;
break;
case 2:
ledc1=1;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;break;
case 3:
ledd1=1;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;break;
case 4:
lede1=1;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;break;
case 5:
ledf1=1;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;break;
case 6:
ledg1=1;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;break;
case 7:
leddp1=1;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;break;
default:leda1=1;break; /*运行灯*/
}
times=0; /*按键加速计数器清零*/
TH0=-(10000/256);
TL0=-(10000%256);
}
else if(keyindata&0x2) /*加键*/
{
if(times<15) {times++;temp++;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;delay(100);}
else if(times<150) {times++;temp=temp+5;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;delay(15);}
else {times=151;temp=temp+10;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;}
if(temp>MAXDATA){temp=0;}
TH0=-(10000/256);
TL0=-(10000%256);
}
else if(keyindata&0x4)/*减键*/
{
if(times<15) {times++;temp--;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;delay(100);}
else if(times<150) {times++;temp=temp-5;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;delay(15);}
else {times=151;temp=temp-10;warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;}
if(temp>MAXDATA){temp=MAXDATA;}
TH0=-(10000/256);
TL0=-(10000%256);
}
else if(keyindata&0x8) /*确认*/
{
var[varidentify-1]=temp; /*中间计数器的值赋给相应的变量*/
x25045_write_word((varidentify-1)*2,temp); /*存入EEPROM中*/
if(varidentify==6)
{ad7705_in();
x25045_write_word(adsetlowwA,adbufferA[AVERAGENUMBER-1]);
adsetlowA=adbufferA[AVERAGENUMBER-1];
x25045_write_word(adsetlowwB,adbufferB[AVERAGENUMBER-1]);
adsetlowB=adbufferB[AVERAGENUMBER-1];
}
if(varidentify==7)
{ad7705_in();
x25045_write_word(adsethighwA,adbufferA[AVERAGENUMBER-1]);
adsethighA=adbufferA[AVERAGENUMBER-1];
x25045_write_word(adsethighwB,adbufferB[AVERAGENUMBER-1]);
adsethighB=adbufferB[AVERAGENUMBER-1];
}
warn7=1;JDQ=warnbyte;delay(8);warn7=0;JDQ=warnbyte;delay(200); /*按键加速计数器清零*/
TH0=-(10000/256);
TL0=-(10000%256);
}
else times=0; /*按键加速计数器清零*/
default:
break;
}
if(varidentify==0) goto endless;
else
{MAX7219_LOAD=0;
max7219_input_8_bit(0x0c,0x00);
max7219_input_8_bit(0x0c,0x01);/*00--关断 01--正常*/
MAX7219_LOAD=1;
for(i=0;i<MAX7219BITNUMBER;i++)
{MAX7219_LOAD=0;
bin_bcdK(temp);
if(varidentify<4)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -