part3:单片机显示及与服务器通讯的实现

目录:

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实现通信

利用ESP32可以实现哪些有趣的功能? - 知乎

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模块

单片机上电,即可应用

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值