前面我们介绍了8051的串行通讯,对串行通讯有了一定的了解,现在通过实现8051与ESP32CAM通信。
首先了解下esp32 cam的引脚图。
如上图,我们看到ESP32 CAM的串口0引脚分别为GPIO 3(RxD)、GPIO 1(TxD),而GPIO 16引脚只是串口2的一个接收引脚。但是ESP32 CAM 有三个串口(Serial、Serial1、Serial2),可以软件映射其TxD和RxD。
ESP32 测试代码
在Arduino IDE中我们使用下面代码测试ESP 32 CAM的串口,短接上板子上的GPIO 0和GPIO 16,给esp32 cam上电,打开Arduino IDE的串口监视器,就可以看到数据自发自收。
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);
}
从串口监控窗口中看到累加的 “count” 的值。如下图:
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看到数字自增(只显示一位,有需要自己扩展)。
实现esp32 cam与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);”,通电就可以看到:8051 开发板上的1602 LCD显示esp32 cam发来的数据,Arduino IDE串口监视器显示来自8051的数据。
以上只为测试8051与esp32 cam的串口通讯,并不完善。