void addselect() /* 量程选择 */
{
CH++; /* 通道号加 */
if ( CH > 7 ) /* 最大到5 符号&:按位与符号,二进制的对应位如果都为1,那么结果的对应位就为1,否则为0 */
CH = 0; /* 清零,一共三个通道0 1 2 对应二进制是0000.0001.0010 */
adda = CH & 0x01; /* 将通道对应的二进制0101&0001,结果就是0001,赋值给adda(引脚只能接受最低位的数据,只有1和0),那么adda引脚就是高电平 */
addb = (CH & 0x02) >> 1;
addc = (CH & 0x04) >> 2;
delay( 5 ); /* 短延时 */
}
uint adtrans() /* AD转换 */
{
addselect();
sum = 0; /* 滤波开始 */
for ( i = 0; i < 5; i++ )
{
ale = 1;
ale = 0;
start = 1; /* 启动AD转换。 */
start = 0;
while ( eoc == 0 )
; /* 等待转换结束。 */
oe = 1;
a[i] = P1; /* 出入转换结果。 */
delay( 5 ); /* //每隔5usAD转换并采集一次数据,将得到的数值存入数组中 */
}
for ( j = 0; j < 4; j++ )
for ( i = 0; i < 4 - j; i++ )
if ( a[i] > a[i + 1] )
{
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
for ( i = 1; i < 4; i++ )
{
sum += a[i];
} /* 采用冒泡法比较,取中间3个数值 */
voltdata[CH] = sum / 3;
delay( 1 );
oe = 0;
voltdata[CH] = 4 * (100 * voltdata[CH]) / 51; /* 处理运算结果。 */
/*
* voltdata[CH]是读取到的ad值,乘以100是让小数点后移两位,乘以4是量程扩大四倍也就是5*4=20V,然后除以51(和乘以0.0196一样)得到实际的电压值
* 8位AD最小分辨率就是0.0196V
*/
return(voltdata[CH]);
}
void disvolt() /* 显示函数 */
{
/* A传感器 */
if ( voltdata[0] > 800 )
{
write_string( 0x80, "Car Anti-theft!!" );
write_string( 0xc0, "A:Appear Person " );
flag = 1;
LED1 = 1;
delay(800);
} else{
LED1 = 0;
}
/* B传感器 */
if ( voltdata[1] > 800 )
{
write_string( 0x80, "Car Anti-theft!!" );
write_string( 0xc0, "B:Car Shake " );
flag = 1;
LED2 = 1;
delay(800);
}else{
LED2 = 0;
}
/* C传感器 */
if ( voltdata[2] > 800 )
{
write_string( 0x80, "Car Anti-theft!!" );
write_string( 0xc0, "C:Door Opening " );
flag = 1;
LED3 = 1;
delay(800);
}else{
LED3 = 0;
}
if ( voltdata[0] < 800 && voltdata[1] < 800 && voltdata[2] < 800 )
{
flag = 0;
}
if ( flag == 0 )
{
BUZZ = 0;
write_string( 0x80, "Car Anti-theft!!" );
write_string( 0xc0, "All Sensor is ok" );
}else{
BUZZ = 1;
}
}
void anjian() /*按键扫描函数 */
{
}
void init() /* 初始化函数 */
{
add = 0;
addselect();
lcd_init(); /* 液晶显示初始化 */
TxBuf[0] = '$';
TxBuf[3] = '.';
TxBuf[7] = '\0';
/* 切换档位 */
TxBuf[6] = CH + 0x31;
}
void main() /* 主程序 */
{
LED1 = 0;
LED2 = 0;
LED3 = 0;
BUZZ = 0;
init(); /* 调用初始化函数 */
Uart_init();
while ( 1 ) /* 进入while循环 */
{
anjian(); /* 扫描按键 */
adtrans(); /* ad函数 */
disvolt(); /* 显示电压 */
}
}
void timer0() interrupt 1
{
TH0 = 0x4c;
TL0 = 0x00;
t0Count++;
if ( t0Count >= 40 )
{
t0Count = 0;
if ( flagAu == 1 )
{
if ( add == 0 )
add = 4;
else
add = 0;
}
}
}
资料下载地址