以前、8051のシリアル通信を紹介し、シリアル通信についてある程度理解していましたが、現在は8051を実装してESP32CAMと通信しています。
まず、esp32カムのピン配列を理解します。
上に示したように、ESP32CAMのシリアルポート0ピンはGPIO3(RxD)とGPIO 1(TxD)であり、GPIO16ピンはシリアルポート2の単なる受信ピンであることがわかります。ただし、ESP32 CAMには3つのシリアルポート(Serial、Serial1、Serial2)があり、そのTxDとRxDはソフトウェアでマッピングできます。
ESP32テストコード
Arduino IDEでは、次のコードを使用してESP 32 CAMのシリアルポートをテストし、ボード上のGPIO0とGPIO16を短絡し、esp32 camの電源を入れ、ArduinoIDEのシリアルモニターを開きます。データが自発的に送受信されていることがわかります。
void setup() {
Serial.begin(9600);//用于电脑监控
Serial1.begin(9600,SERIAL_8N1, 0, 16);//用于 和8051通讯,0为RxD,16为TxD
}
unsigned char count = 0;
void loop() {
Serial1.println(count ++);//给8051发送数据
if(Serial1.available()>0){//接收8051发送的数据
Serial.print("from 8051: ");
Serial.println(Serial1.read());
}
delay(500);
}
シリアルモニターウィンドウから累積された「カウント」値を確認します。以下に示すように:
8051シリアルポートテストコード:
#include <REGX51.H>
sbit lcd_rs = P0^7;
sbit lcd_rw = P0^6;
sbit lcd_en = P0^5;
void delay(unsigned int ms){
int k,l;
for(k=0;k<ms;k++)
for(l=0;l<120;l++);
}
void cmdwrt (unsigned char x)
{
P2=x;
lcd_rs=0;
lcd_rw=0;
lcd_en=1;
delay(1);
lcd_en=0;
}
void lcd_init(){
unsigned char i = 0;
unsigned char cmd[]={0x38,0x01,0x06,0x0c,0x80};//1602初始化命令
for(i=0;i<5;i++){
cmdwrt (cmd[i]);
delay (1);
}
}
void lcd_data(unsigned char disp_data) //向LCD发送显示数据的函数
{
lcd_init();
delay(1);
P2 = disp_data;
lcd_rs = 1;
lcd_rw=0;
lcd_en=1;
delay(1);
lcd_en=0;
}
void uart_init(){
TMOD = 0x20; // 定时器1,模式2(8位自动装载)
TR1=1;//启用Timer 1
TH1 = 0xfd; // 在Timer 1,mode 2, 11.0952MHz下,设定9600比特率
SCON = 0x50; //uart mode1,接收使能
}
unsigned char sData;
void uart_send(){//发送给esp32 cam
delay(500);
SBUF = sData++;
if(TI == 0) return;
TI=0;
}
void uart_read() // 读取从 esp32 cam 发送的的数据
{
// 等到收到字节
if(RI==0) return;
lcd_data(SBUF + ‘0’);
RI=0; //清除RI以接收下一个字节
}
void main(){
uart_init();
while(1){
uart_send();
uart_read();
}
}
8051のシリアルポートトランシーバーピンP3.0およびP3.1を短絡すると、電源投入後にLCDにデジタル自動インクリメントが表示されます(1桁しか表示されないため、自分で拡張する必要があります)。
esp32カムと8051シリアルポート間の通信を実現します
8051のRxD(P3.0)、TxD(P3.1)、およびGNDをそれぞれESP32 CAMのTxD(GPIO 16)、RxD(GPIO 0)、およびGNDに接続し、上記の8051テストを行います。 uart_read()関数のプログラム。 "lcd_data(SBUF + '0');"が "lcd_data(SBUF);"に変更され、電源を入れた後に表示されます。 ArduinoIDEシリアルモニターは8051データからのデータを表示します。
上記は8051とesp32cam間のシリアル通信をテストするためだけのものであり、完全ではありません。