问题1:甲机的k1按键可通过串行口控制工乙机的LED1点亮、LED2灭,甲机的k2按键控制乙机的LED1 灭、LED2点亮,甲机的k3按键控制乙机的LED1和 LED2全亮
问题2:
乙机的k4按键可控制串行口向甲机发送k4按键按下的次数,并显示在甲机PO口的数码管上。
//甲机
#include<reg51.h>
unsigned char j=10;
char sign=1;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
void delay(unsigned char k){
unsigned char i,j,h;
for(h=0;h<k;h++){
for(i=0;i<25;i++){
for(j=0;j<20;j++);
}
}
}
void twoDigitDisplay(unsigned char num,unsigned char time,unsigned char portNumber){
unsigned char box[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0xf82,0xf8,0x80,0x90};
unsigned char k;
if(portNumber==0){
if(num<0||num>99||time<0){
for(k=0;k<40;k++){
P2=0x00;
}
}else{
for(k=0;k<time;k++){
unsigned char numR = num%10;
unsigned char numL = num/10;
P2=0x11;
P0=box[numL];
delay(12);
P2=0x22;
P0=box[numR];
delay(12);
}
}
}
}
void main(){
unsigned char sum=0;
TR0=1;
EA=1;
ET0=1;
TMOD=0x21;
TH0=0xee;
TL0=0x00;
while(1){
if(sign==1){
//执行数据发送
TR1=1;
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
SCON=0x40;
PCON=0x00;
}
while(sign==1){
//发送数据SBUF
if(P10==0){SBUF=0xfe;while(TI==0);TI=0;continue;}
if(P11==0){SBUF=0xfd;while(TI==0);TI=0;continue;}
if(P12==0){SBUF=0xfc;while(TI==0);TI=0;continue;}
SBUF=0xff;
}
if(sign==-1){
//执行数据接收
TR1=1;
TL1=0xfd;
TH1=0xfd;
SCON=0x50;
PCON=0x00;
}
while(sign==-1){
//接收数据SBUF
if(SBUF==0xf0){
sum++;
twoDigitDisplay(sum,5,0);
}
if(SBUF==0x0f){
twoDigitDisplay(sum,5,0);
}
}
}
}
void int0() interrupt 1 {
j--;
if(j==0){
TF0=0;
TH0=0xee;
TL0=0x00;
sign=sign*(-1);
j=10;
}
}
//乙机
#include<reg51.h>
unsigned char j=10;
char sign=1;
sbit P10=P1^0;
void main(){
unsigned char increment=0;
TR0=1;
EA=1;
ET0=1;
TMOD=0x21;
TH0=0xee;
TL0=0x00;
if(sign==1){
//执行数据接收
TR1=1;
TL1=0xfd;
TH1=0xfd;
TMOD=0x20;
SCON=0x50;
PCON=0x00;
}
while(sign==1){
//接收数据SBUF
P2=SBUF;
}
if(sign==-1){
//执行数据发送
TR1=1;
TL1=0xfd;
TH1=0xfd;
SCON=0x40;
PCON=0x00;
}
while(sign==-1){
//发送数据SBUF
if(P10==0){
SBUF=0xf0;
while(TI==0);TI=0;
}else{
SBUF=0x0f;
while(TI==0);TI=0;
}
}
}
void int0() interrupt 1 {
j--;
if(j==0){
TF0=0;
TH0=0xee;
TL0=0x00;
sign=sign*(-1);
j=10;
}
}
该回答内容部分引用GPT,GPT_Pro更好的解决问题
解答:
甲机和乙机采用双向串行通讯进行控制。
首先,甲机的K1按键控制乙机的LED1点亮、LED2灭,K2按键控制乙机的LED1 灭、LED2点高,K3按键控制乙机的LED1和 LED2全亮,可以采用以下代码实现:
//甲机代码
//定义控制字符
#define K1_ON 0x01
#define K1_OFF 0x02
#define K2_ON 0x03
#define K2_OFF 0x04
#define K3_ON 0x05
#define K3_OFF 0x06
//定义控制变量
uint8_t k1,k2,k3;
//定义发送数据变量
uint8_t send_data;
void setup(){
//串行口初始化
Serial.begin(9600);
}
void loop(){
//读取K1键的状态
k1 = digitalRead(K1);
//读取K2键的状态
k2 = digitalRead(K2);
//读取K3键的状态
k3 = digitalRead(K3);
if (k1 == HIGH) { //K1按键按下,向乙机发送K1_ON信号
send_data = K1_ON;
Serial.write(send_data);
} else { //K1按键松开,向乙机发送K1_OFF信号
send_data = K1_OFF;
Serial.write(send_data);
}
if (k2 == HIGH) { //K2按键按下,向乙机发送K2_ON信号
send_data = K2_ON;
Serial.write(send_data);
} else { //K2按键松开,向乙机发送K2_OFF信号
send_data = K2_OFF;
Serial.write(send_data);
}
if (k3 == HIGH) { //K3按键按下,向乙机发送K3_ON信号
send_data = K3_ON;
Serial.write(send_data);
} else { //K3按键松开,向乙机发送K3_OFF信号
send_data = K3_OFF;
Serial.write(send_data);
}
delay(200); //延时200ms
}
//乙机代码 //定义控制字符 #define K1_ON 0x01 #define K1_OFF 0x02 #define K2_ON 0x03 #define K2_OFF 0x04 #define K3_ON 0x05 #define K3_OFF 0x06 //定义读取数据变量 uint8_t readData; void setup(){ //串行口初始化 Serial.begin(9600); //IO端口初始化 pinMode(LED1,OUTPUT); pinMode(LED2,OUTPUT); } void loop(){ //读取串行数据 if (Serial.available() > 0){ readData = Serial.read(); if (readData == K1_ON){ digitalWrite(LED1,HIGH); digitalWrite(LED2,LOW); } else if (readData == K1_OFF){ digitalWrite(LED1,LOW); digitalWrite(LED2,HIGH); } else if (readData == K3_ON){ digitalWrite(LED1,HIGH); digitalWrite(LED2,HIGH); } else if (readData == K3_OFF){ digitalWrite(LED1,LOW); digitalWrite(LED2,LOW); } } delay(200); //延时200ms }
其次:乙机的K4按键可控制串行口向甲机发送k4按键按下的次数,并显示在甲机PO口的数码管上。代码如下:```//甲机代码 //定义控制字符 #define K4 0x07 //定义计数器 uint16_t count=0; //定义显示数字 uint8_t number=0; void setup(){ //串行口初始化 Serial.begin(9600); //数字盘初始化 pinMode(DIGIT0, OUTPUT); pinMode(DIGIT1, OUTPUT); pinMode(DIGIT2, OUTPUT); pinMode(DIGIT3, OUTPUT); pinMode(PO0, OUTPUT); pinMode(PO1, OUTPUT); pinMode(PO2, OUTPUT); pinMode(PO3, OUTPUT); pinMode(PO4, OUTPUT); pinMode(PO5, OUTPUT); pinMode(PO6, OUTPUT); pinMode(PO7, OUTPUT); } void loop(){ //读取串行数据 if (Serial.available() > 0) { uint8_t readData = Serial.read(); if (readData == K4) { count++; } } if (count >= 10000) count = 0; number = count % 10; digitalWrite(DIGIT0, LOW); digitalWrite(DIGIT1, LOW); digitalWrite(DIGIT2, LOW); digitalWrite(DIGIT3, LOW); digitalWrite(PO0, number & 0x01 ); digitalWrite(PO1, number & 0x02 ); digitalWrite(PO2, number & 0x04 ); digitalWrite(PO3, number & 0x08 ); delay (5 ); number = (count / 10) % 10; digitalWrite(DIGIT0, HIGH ); digitalWrite(DIGIT1, LOW ); digitalWrite(DIGIT2, LOW ); digitalWrite(DIGIT3, LOW ); digitalWrite(PO4 , number & 0x01 ); digitalWrite
如果回答有帮助,望采纳。