甲乙采用方式1双向串行通讯

问题1:甲机的k1按键可通过串行口控制工乙机的LED1点亮、LED2灭,甲机的k2按键控制乙机的LED1 灭、LED2点亮,甲机的k3按键控制乙机的LED1和 LED2全亮
问题2:
乙机的k4按键可控制串行口向甲机发送k4按键按下的次数,并显示在甲机PO口的数码管上。

  • 这篇博客: 甲、乙机之间采用方式 1 双向串行通信,具体要求如下: (1)甲机的 k1 按键可通过串行口控制乙机的 LEDI 点亮、LED2 灭,甲机的 k2 按键控制 乙机的 LED1中的 以下是实验代码(分甲乙两机程序 不会编写请移步资源下载 里边是全部代码和仿真文件) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • //甲机
    #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
如果回答有帮助,望采纳。