采用c51芯片和和adc0809芯片拥有五根导线,十一个led 其端口位置为#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit CLK =P3^4; sbit ST =P1^0; sbit OE =P1^1; sbit EOC =P1^2; sbit A =P1^3; sbit B =P1^4; sbit C =P1^5; sbit Buzz = P3^2; sbit LED0 = P2^0; sbit LED1 = P2^1; sbit LED2 = P3^2; sbit LED3 = P2^3; sbit LED4 = P2^4; sbit LED5 = P2^5; sbit LED6 = P2^6; sbit LED7 = P2^7; sbit LED8 = P3^7; sbit LED9 = P3^6; sbit LED10 = P3^5;可以准确检测排线的任意两根或多根连线的短路,并用LED灯提示短路位置; (3)可以准确检测排线的任意导线的断路,并用LED灯提示断路位置; (4)可以准确检测排线的任意两根或多根连线的错位连接,并用LED灯提示错连位置; (5)当排线连接正确时,蜂鸣器发出正确提示声。 (6)当排线连接有误时,蜂鸣器发出断续报警声。 (7) 能够判断故障的种类。短路故障时,排线LED常亮;开路故障时,排线LED闪亮;错连故障时,排线左边LED常亮,右边LED闪亮。的代码
时间: 2024-02-02 22:05:31 浏览: 110
基于51单片机的ADC0809代码
4星 · 用户满意度95%
以下是一个基于C51和ADC0809的排线测试程序,可以检测排线的短路、断路和错连,并使用LED灯和蜂鸣器提示故障类型和位置:
```C
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit CLK = P3^4;
sbit ST = P1^0;
sbit OE = P1^1;
sbit EOC = P1^2;
sbit A = P1^3;
sbit B = P1^4;
sbit C = P1^5;
sbit Buzz = P3^2;
sbit LED0 = P2^0;
sbit LED1 = P2^1;
sbit LED2 = P3^2;
sbit LED3 = P2^3;
sbit LED4 = P2^4;
sbit LED5 = P2^5;
sbit LED6 = P2^6;
sbit LED7 = P2^7;
sbit LED8 = P3^7;
sbit LED9 = P3^6;
sbit LED10 = P3^5;
uchar code LED_PIN[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20}; // LED灯对应的引脚
void delay(uint ms) {
uint i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 125; j++);
}
}
void writeLED(uchar index, uchar value) {
if (index < 8) {
P2 &= ~(1 << index);
P2 |= (value << index);
} else if (index < 11) {
P3 &= ~(1 << (index - 8));
P3 |= (value << (index - 8));
}
}
void resetLED() {
P2 = 0xFF;
P3 &= 0x1F;
}
uchar readADC(uchar channel) {
uchar value;
A = channel & 0x01;
B = channel & 0x02;
C = channel & 0x04;
OE = 0;
ST = 1;
ST = 0;
OE = 1;
while (!EOC);
CLK = 1;
value = P1;
CLK = 0;
return value;
}
void testWire() {
uchar i, j, k;
for (i = 0; i < 5; i++) {
for (j = i + 1; j < 5; j++) {
if (readADC(i) == readADC(j)) {
// 发现短路故障
writeLED(i, 1);
writeLED(j, 1);
LED0 = 1;
Buzz = 1;
delay(500);
LED0 = 0;
Buzz = 0;
} else {
writeLED(i, 0);
writeLED(j, 0);
}
}
if (readADC(i) > 200) {
// 排线导通
writeLED(i, 1);
} else {
// 排线断开
writeLED(i, 0);
LED1 = 1;
Buzz = 1;
delay(500);
LED1 = 0;
Buzz = 0;
}
}
resetLED();
}
void testConnection() {
uchar i, j, k;
for (i = 0; i < 5; i++) {
for (j = i + 1; j < 5; j++) {
if (readADC(i) == readADC(j)) {
// 发现短路故障
writeLED(i, 1);
writeLED(j, 1);
LED0 = 1;
Buzz = 1;
delay(500);
LED0 = 0;
Buzz = 0;
} else {
writeLED(i, 0);
writeLED(j, 0);
}
}
if (readADC(i) > 200) {
// 排线导通
writeLED(i, 1);
} else {
// 排线断开
writeLED(i, 0);
LED1 = 1;
Buzz = 1;
delay(500);
LED1 = 0;
Buzz = 0;
}
}
resetLED();
}
void testReverse() {
uchar i, j, k;
for (i = 0; i < 5; i++) {
for (j = i + 1; j < 5; j++) {
if (readADC(i) == readADC(j)) {
// 发现短路故障
writeLED(i, 1);
writeLED(j, 1);
LED0 = 1;
Buzz = 1;
delay(500);
LED0 = 0;
Buzz = 0;
} else if ((i == 0 && j == 1) || (i == 2 && j == 3) || (i == 1 && j == 2) || (i == 3 && j == 4)) {
if (readADC(i) > 200 && readADC(j) < 50) {
// 发现错连故障
writeLED(i, 1);
writeLED(j, 0);
LED0 = 1;
LED1 = 1;
Buzz = 1;
delay(500);
LED0 = 0;
LED1 = 0;
Buzz = 0;
delay(500);
LED0 = 1;
LED1 = 0;
delay(1000);
LED0 = 0;
LED1 = 1;
delay(1000);
writeLED(i, 0);
writeLED(j, 1);
LED1 = 0;
} else {
writeLED(i, 0);
writeLED(j, 0);
}
}
}
if (readADC(i) > 200) {
// 排线导通
writeLED(i, 1);
} else {
// 排线断开
writeLED(i, 0);
LED1 = 1;
Buzz = 1;
delay(500);
LED1 = 0;
Buzz = 0;
}
}
resetLED();
}
void main() {
while (1) {
testWire();
testConnection();
testReverse();
}
}
```
这个程序使用了C51单片机和ADC0809芯片来读取排线上每个导线的电压值,并根据电压值来判断故障类型和位置。需要注意的是,ADC0809芯片的输入电压范围是0-5V,需要根据实际情况设置参考电压和电阻分压比,以保证测量精度和稳定性。另外,程序中使用了简单的延时函数和LED输出函数,实际应用中可能需要进行一些优化和改进。
阅读全文