📄 voltage.c
字号:
#include "at89x52.h"
#include "absacc.h"
#include "ledcode.c"
#define sck5 p26 //74hc595
#define data5 p27
#define oe5 p24
#define lock5 p25
#define sck6 p17 //24c256
#define data6 p16
#define sck2 p21 //定义2543接口.
#define datain2 p22
#define dataout2 p23
#define eoc2 p20
#define cs2 p13
#define relay1 p11
#define relay2 p12
unsigned char data sbufs[16], vol[4];
unsigned char isbufs=0, sbuf; //sbufs 计算
unsigned int vol12,total;
unsigned long voltemp;
bit keysign=0,failsign=0;
//************子函数开始************************************
void mdelay(unsigned int delay)
{ unsigned int delay1;
for (;delay>0;delay--)
for (delay1=0;delay1<125;delay1++);
}
/*void send232(void)
{ EA=0;
TI = 0;
SBUF = sbuf;
while(!TI); // 是0等发送完毕
TI=0;
EA=1;
//SBUF=((unsigned char *)&v)[0];
}
void receive232(void) interrupt 4
{
RI=0;
EA=0;
if (isbufs>=12) isbufs=0;
sbufs[isbufs]=SBUF;
isbufs++;
EA=1;
} */
void read2543(unsigned char j)
{ unsigned char i=12,k=2;
while(k--)
{i=12;
j<<=4; //j=0x10; high 4bits choice the channel
vol12=0;
cs2=1;
dataout2=1;
sck2=0;
cs2=0;
while(i--)
{ vol12<<=1;
if (dataout2) vol12 |=0x01;
datain2=(bit)(j&0x80);
sck2=1;
j<<=1;
sck2=0;
}
cs2=1;
while(!eoc2);
}
}
int send595(j) unsigned char j;
{ unsigned char i=8;
lock5=1;
oe5=0;
sck5=1;
while (i--)
{ sck5=0;
data5=(j & 0x80);
j<<=1;
sck5=1;
}
}
void send595_4vol(void)
{ unsigned char i;
i=voltemp/1000; voltemp%=1000;
send595(ledcode[i] | 0x80);
i=voltemp/100; voltemp%=100;
send595(ledcode[i]);
i=voltemp/10; voltemp%=10;
send595(ledcode[i]);
i=voltemp;
send595(ledcode[i]);
lock5=0; //Latch上升沿有效
lock5=1;
// oe5=0; // 595 /G有效, 输出.
}
void keypress(void)
{ while (!p10)
{ mdelay(100);
while(!p10)
{ while(!p10);
keysign=1;
}
}
}
void readvol(void) //依次读电压.判断范围,显示
{ unsigned char i,k,j=8,t=0;
failsign=0;
for (k=0;k<j;k++)
{ do
{ read2543(k);
if (k==0) vol12<<=1;
voltemp=((unsigned long)vol12*5000)/0xfff;
if (voltemp<Lspc[t] || voltemp>Hspc[t])
{p14=0;p15=1;}
else {p14=1;p15=0;}
send595_4vol();
for (i=0;i<10;i++)
{ mdelay(30);
if(!p10)
{ while(!p10);
goto exit;
}
}
}
while (keysign);
exit: if (p14==0) failsign=1;
t++;
if (t==6) {relay1=0;relay2=1;}
if (t==7) {relay1=1;relay2=1;k--;};
if (t==8) {relay1=0;relay2=1;k--;};
if (t==9){relay1=1;relay2=0;};
mdelay(30);
}
relay2=1;relay1=1;
}
void showresult(void)
{ unsigned char i,j,k;
if (failsign) {i=4;p14=0;p15=1;} //Show FALL
else
{i=0; //Show PASS
total++; //pass总数
p14=1;
p15=0;
}
while(1)
{for (j=0;j<4;j++)
send595(ledcodechar[i+j]);
lock5=0; lock5=1;
for (k=0;k<15;k++)
{ mdelay(50);
if (p10==0)
{ while(!p10); goto exits; }
}
voltemp=total;
send595_4vol();
for (k=0;k<15;k++)
{ mdelay(50);
if (p10==0)
{ while(!p10); goto exits; }
}
}
exits: ;
}
void main(void)
{ unsigned int a=2, b=6,c=7;
c=(a>b)? a:b;
TMOD = 0x20; // 记数器0 计数器1 都以 16 位 记数
SCON = 0x50;
PCON = 0x00; // 1001 0001 EA=1中断允许, 外部中断使能, 串口中断使能
TL1 = 0xfd; // 中断优先权寄存器
TH1 = 0xfd;
TR1=1;
ES=1;
EA=1;
keypress();
while(1){ readvol(); //依次读取9个电压数据并判断范围
showresult();
mdelay(200);
// sbuf=(unsigned char)vol12;
// send232();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -