proteus实现多个传感器模拟

#设计三个光发射,两个光敏接收(硬件限制),根据不同接收结果判断光的吸收情况
#方波发生器(作为光发射器供电)

img

因软件限制,故用电阻模拟发射装置,LED模拟光敏电阻情况,通过取得光敏电阻上的电压信号来提取光信号,之后经过时分复用,

img

img

判断出没个光的接收状况,最后产生的信号是方波

img

下一步设想是将信号传给上位机,进行物质判断,但这其中一直没设计AD模数转换,也没涉及汇编,不知是否正确

以下答案引用自GPT-3大模型,请合理使用:
#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <time.h>

#define PI 3.14159265358979323846

#define MAX_INT 2147483647

#define MAX_DELAY 1000000

unsigned char led = 7;

unsigned char inPin1 = 2;

unsigned char inPin2 = 3;

unsigned char inPin3 = 4;

unsigned char inPin4 = 5;

unsigned char inPin5 = 6;

unsigned char outPin = 0;

unsigned char counter = 0;

unsigned char transmitter = 0;

unsigned char receiver = 0;

unsigned char state = 0;

unsigned char sum = 0;

unsigned char data = 0;

unsigned char result = 0;

unsigned char signal = 0;

unsigned char time = 0;

void setup()

{

pinMode(led, OUTPUT);

pinMode(inPin1, INPUT);

pinMode(inPin2, INPUT);

pinMode(inPin3, INPUT);

pinMode(inPin4, INPUT);

pinMode(inPin5, INPUT);

pinMode(outPin, OUTPUT);

digitalWrite(led, HIGH);

}

void loop()

{

if (counter > 0)

{

transmitter = counter;

counter = 0;

}

else

{

transmitter = 0;

}

if (state == 0)

{

digitalWrite(outPin, HIGH);

delayMicroseconds(transmitter);

digitalWrite(outPin, LOW);

}

else

{

digitalWrite(outPin, HIGH);

delayMicroseconds(transmitter);

digitalWrite(outPin, LOW);

delayMicroseconds(MAX_DELAY);

}

sum = 0;

for (int i = 0; i < 8; i++)

{

data = (unsigned char)i;

result = data * signal + sum;

sum = result / (MAX_INT / 8);

}

signal = result;

time = millis();

if (time > (MAX_DELAY))

{

state++;

if (state > 3)

{

state = 0;

}

}

else

{

if (inPin1 == HIGH && inPin2 == LOW && inPin3 == HIGH && inPin4 == LOW)

{

receiver = 1;

}

if (inPin1 == HIGH && inPin2 == HIGH && inPin3 == LOW && inPin4 == LOW)

{

receiver = 2;

}

if (inPin1 == LOW && inPin2 == HIGH && inPin3 == LOW && inPin4 == HIGH)

{

receiver = 3;

}

if (inPin1 == LOW && inPin2 == LOW && inPin3 == HIGH && inPin4 == HIGH)

{

receiver = 4;

}

}

if (inPin1 == HIGH && inPin2 == LOW && inPin3 == HIGH && inPin4 == HIGH)

result = 1;

if (inPin1 == HIGH && inPin2 == HIGH && inPin3 == LOW && inPin4 == HIGH)

result = 2;

if (inPin1 == LOW && inPin2 == HIGH && inPin3 == LOW && inPin4 == HIGH)

result = 3;

if (inPin1 == LOW && inPin2 == LOW && inPin3 == HIGH && inPin4 == HIGH)

result = 4;

printf("%d
", result);

}