文章目录[隐藏]
目录:
part1 作业要求
part2 材料准备
part3 基本知识
part4 实现思路
part5 实际应用
作业要求:
上电后:
1. 单片机驱动蜂鸣器响3声,点阵液晶屏显示“欢迎使用求助机”
2. 单片机通过ESP32模块建立(2.4G)Wi-Fi连接,点阵液晶屏显示“WiFi连接成功”
3. 按下4个按钮中的一个(4个按钮分别对应4条文字信息“我生病了”;“失火了”;“电路故障”;“其他求助”),把对应的文字信息显示到点阵液晶屏上,同时蜂鸣器响1声。
材料准备:
面包板、杜邦线(公/母均需)、51单片机(包括最小应用系统的电容、电阻、晶振)、按钮(开关)
编程器
液晶显示屏、滑动变阻器(液晶屏接线要用到)
esp32模块
基本知识:
1.esp32是什么:
ESP32(模块)是由乐鑫发布的新一代WiFi芯片,是ESP8266的升级版,准确来说是ESP8266的完整版,双核,wifi,蓝牙,低功耗,更多管脚外设。
芯片和单片机:
芯片:芯片是大规模的微电子集成电路。即微缩到纳米(百万分之一毫米)级的印刷电路版,具有某一种固定的功能
单片机和芯片的区别:单片机和芯片的区别吗
(esp32)模块和开发板:
▲首先说明一下引脚 排针 PCB 面包板的概念:
引脚:从集成电路(芯片)内部电路引出与外围电路的接线,所有的引脚构成了芯片的接口
排针:万用连接器,广泛应用于PCB的连接
PCB:印制电路板,电子元器件之间相互连接的载体,面包板也用于连接电子元件,区别是PCB使用印制电路且需要焊接,面包板用杜邦线连接不同原件,两者都需要电子元件引脚已经由排针引出
下图为esp8266模块,是一种芯片
下图为esp8266开发板(图中可看出,芯片已经被焊接到板子上,已焊好排针把引脚引出),开发板已经集成了部分功能,可以独立作为单片机使用(如esp32开发板就是以esp32为主功能模块的的集成多个功能的单片机板)
下图为esp32举例(源自安信可科技 左图为模块,右图为开发板):
2.esp32有什么用:
esp32 WiFi模块广泛应用于物联网,即实现智能设备、万物互联,把各种物件连上WiFi实现通信
esp8266/esp32等WiFi模块有三种基础工作模式:
①STA:esp8266作为client(客户端)通过接收路由器的信号而连接互联网(接入的一般是2.4GWiFi),可以实现对硬件设备的远程控制(通过网络远程通讯)(应用如智能家居)
②AP:esp8266作为server(服务器)可以被其他设备连接,工作模式像热点。该模式下手机、电脑等设备可以和8266进行局域网的无线通信(应用如智能车-用手机操控带有esp8266模块的智能车,有距离限制)
③STA+AP:以上两种模式共存
3.esp32(此处说的是焊好排针的)怎么用:
①使用AT指令进入工作模式:
AT固件和AT指令
固件是具有软件功能的硬件。是一种把软件固化在硬件之中的器件。
例如,乐鑫提供的AT固件已经烧录好相关命令软件使得AT指令可以直接使用:
以上产品均已烧录入AT相关软件成为AT固件,可用AT指令直接调试
AT指令串口调试工具
安信可官方串口调试工具、XCOM、Iot studio、SSCOM、COMTool等均可
(我们使用现成的XCOM)
我们使用AT指令配置模块进入工作模式,使模块esp32模块连接WiFi以便以后与服务器之间消息的传输
在串口调试工具中发送如下AT指令:
AT+UART=9600,8,1,0,0 //波特率设为9600(51单片机波特率为9600,波特率相同时实现通信)AT+RST //重启 用新设置的波特率工作
AT+CWMODE=1 //进入工作模式1
AT+CWJAP="luckin","030708" //接入WiFi
AT+CIPSTART="UDP","xx.xxx.xx.xxx",xxxx //连接服务器/端口号
②esp32模块串口接线
接线方案:编程器(USB转串口)
编程器是为可编程的集成电路写入数据的工具
之前上课用的51单片机的编程器(就是把单片机连到电脑上的,有一个USB接口和四条引线分别是电源正负极/RXD/TXD的器件),这个器件用于将WiFi模块连接到PC,然后在串口调试助手中发送AT指令
模块的内置USB转串口芯片是CH340,该驱动十一上课的时候老师在需要安装的文件中已经提供给我们:
本次作业使用ESP32-S2-wroom开发板使用了CP2102作为板载的USB转串口,因此需要安装串口驱动才能使用。
CP210x是silab公司的芯片,它的驱动下载地址如下:
CP210x USB to UART Bridge VCP Drivers - Silicon Labs
该USB线用于下载固件/烧录程序(用mycropython编程等)
实现思路:
①连接esp32模块到PC端,打开串口调试助手(XCOM)(设置好波特率 换行发送),发送AT指令给模块,设置好工作模式(STA),连接到服务器
②单片机及相关组件接线
单片机作为上位机,esp32开发板仅作为模块,供电并连接RXD TXD即可
液晶接线方式和代码参照:[51单片机] 1602液晶显示控制代码 - beautifulzzzz - 博客园
③写单片机程序
程序逻辑为:
定义四个液晶显示函数show0、1、2、3、4(不同显示函数显示不同字符)
void show()
{
初始化函数
显示位置
显示内容
}
定义串口通信函数(单片机用串口发送消息给esp32,经过上面的AT指令配置,esp32会直接把发来的消息发给服务器,我们只需要用串口发简单的字符1.2.3等,在服务器端收到1.2.3等后在服务器端部署程序翻译为字符即可)
void send()
{
串口初始化设置
通信函数(参数为发送内容)
}
定义驱动蜂鸣器响三声的函数
void voice()
{
打开蜂鸣器
延时
关闭蜂鸣器
}
主程序
void main()
{
voice();//调用函数:上电后蜂鸣器响3声
show0();//调用函数:上电后显示welcome
while(1)
{
if(P11==0)
{show1();P10=0;delay();P10=1;send1();}
if(P12==0)
{show2();P10=0;delay();P10=1;send2();}
if(P13==0)
{show3();P10=0;delay();P10=1;send3();}
if(P14==0)
{show4();P10=0;delay();P10=1;send4();}
}
//每个按钮对应不同显示及消息内容
}
实际应用
AT指令配置esp32模块反馈如下:
测验串口是否能成功发送消息,代码如下:
#include <STC89C5xRC.H>
#include <intrins.h>
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void PutString(unsigned char TXStr) //定义函数同时定义参数变量
{
SBUF=TXStr; //发送内容放入寄存器,发送
while(TI==0);
TI=0; //清空占用
}
void main()
{
TMOD|=0X20; //设置计数器工作方式2 ==============串口
SCON=0X50; //设置为工作方式1
PCON=0X80; //波特率加倍
TH1=0xfa; //计数器初始值设置 9600bps
TL1=0xfa;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
while(1)
{
PutString(0x01); //括号内是函数参数,即要发送的字符
Delay1000ms(); //延时1秒,每一秒发送一条字符
}
}
连接单片机到PC端,打开xcom串口调试助手,即可看到发送来的消息
单片机的消息靠RXD TXD直连输入输出,所以当不接PC而直接esp32模块时,串口消息对应发送给模块,由AT指令配置好后的模块会直接将接收到的消息发给服务器
编写程序烧入单片机
#include <STC89C5xRC.H>
#include <intrins.h>
void delay()
{unsigned int x=0;
while(x<20000)
{x=x+1;}
}
//设置延时函数
unsigned int a=0;
void voice()
{
while(a<4)
{
P10=0;delay();
P10=1;delay();
a=a+1;
}
}
//P10引脚驱动蜂鸣器连响三下
void PutString(unsigned char TXStr)
{
SBUF=TXStr;
while(TI==0);
TI=0;
}
void send1()
{
TMOD|=0X20; //设置计数器工作方式2:串口
SCON=0X50; //设置为工作方式1
PCON=0X80; //波特率加倍
TH1=0xfa; //计数器初始值设置 9600bps
TL1=0xfa;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
PutString(0x01);
}
void send2()
{
TMOD|=0X20; //设置计数器工作方式2:串口
SCON=0X50; //设置为工作方式1
PCON=0X80; //波特率加倍
TH1=0xfa; //计数器初始值设置 9600bps
TL1=0xfa;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
PutString(0x02);
}
void send3()
{
TMOD|=0X20; //设置计数器工作方式2:串口
SCON=0X50; //设置为工作方式1
PCON=0X80; //波特率加倍
TH1=0xfa; //计数器初始值设置 9600bps
TL1=0xfa;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
PutString(0x03);
}
void send4()
{
TMOD|=0X20; //设置计数器工作方式2:串口
SCON=0X50; //设置为工作方式1
PCON=0X80; //波特率加倍
TH1=0xfa; //计数器初始值设置 9600bps
TL1=0xfa;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
PutString(0x04);
}
sbit RS = P2^4; //定义端口
sbit RW = P2^5;
sbit EN = P2^6;
#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
#define DataPort P0
//延时函数
void DelayUs2x(unsigned char t)
{
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
DataPort= 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return (bit)(DataPort & 0x80);
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{
// while(LCD_Check_Busy()); //忙则等待
DelayMs(5);
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
//while(LCD_Check_Busy()); //忙则等待
DelayMs(5);
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x); //表示第一行
}
else
{
LCD_Write_Com(0xC0 + x); //表示第二行
}
while (*s)
{
LCD_Write_Data( *s);
s ++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
LCD_Write_Data( Data);
}
/*------------------------------------------------
初始化函数
------------------------------------------------*/
void LCD_Init(void)
{
LCD_Write_Com(0x38); /*显示模式设置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08); /*显示关闭*/
LCD_Write_Com(0x01); /*显示清屏*/
LCD_Write_Com(0x06); /*显示光标移动设置*/
DelayMs(5);
LCD_Write_Com(0x0C); /*显示开及光标设置*/
}
/*------------------------------------------------
主函数[上面已经把显示功能封装好了,今后再写其他显示就直接调用]
------------------------------------------------*/
void show()
{
LCD_Init();
LCD_Clear();//清屏
LCD_Write_Char(7,0,'o');
LCD_Write_Char(8,0,'k');
LCD_Write_String(1,1,"welcome");
}
void show1()
{
LCD_Init();
LCD_Clear();//清屏
LCD_Write_Char(7,0,'o');
LCD_Write_Char(8,0,'k');
LCD_Write_String(1,1,"sick");
}
void show2()
{
LCD_Init();
LCD_Clear();//清屏
LCD_Write_Char(7,0,'o');
LCD_Write_Char(8,0,'k');
LCD_Write_String(1,1,"line false");
}
void show3()
{
LCD_Init();
LCD_Clear();//清屏
LCD_Write_Char(7,0,'o');
LCD_Write_Char(8,0,'k');
LCD_Write_String(1,1,"conflagration");
}
void show4()
{
LCD_Init();
LCD_Clear();//清屏
LCD_Write_Char(7,0,'o');
LCD_Write_Char(8,0,'k');
LCD_Write_String(1,1,"else");
}
void main()
{
show();
unsigned int a=0;
while(1)
{
if(P11==0)
{show1();P10=0;delay();P10=1;send1();}
if(P12==0)
{show2();P10=0;delay();P10=1;send2();}
if(P13==0)
{show3();P10=0;delay();P10=1;send3();}
if(P14==0)
{show4();P10=0;delay();P10=1;send4();}
}
}
//按按钮使液晶屏显示 wifi模块发送消息给服务器
烧录完程序后,接上esp32模块
单片机上电,即可应用
版权声明:本文为CSDN博主「zhuaishao_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhuaishao_/article/details/121683155
暂无评论