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

单片机上电,即可应用

版权声明:本文为CSDN博主「zhuaishao_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhuaishao_/article/details/121683155

生成海报
点赞 0

zhuaishao_

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

51单片机+ LCD1602+PCF8574转IIC接口+DHT11数据显示

51单片机+ LCD1602+PCF8574转IIC接口+DHT11数据显示 在做这个实验的时候又一次被自己的不注意,掉坑里面去了,调试了好久都不出数据,结果在延时函数和引脚定义上被自己坑了一把。希望大家在写代码的时候多加注意。 LCD1602

51单片机温度报警

器件:   基于普中51A2单片机 用到的模块:LCD1602、蜂鸣器、4个独立按键、DS18B20温度传感器。现象说明: LCD1602可以显示两行数据,每行可以显示16个字符&#xff

51单片机实战教程(33 步进电机的驱动与控制)

步进电机虽然同为电机的一种,但不能像直流电机或者交流电机那样按额定电压与电流给线圈通上直流或交流电机就可正常运转。它需要专用的驱动器或驱动电路供电,才可正常工作。每给驱动器一个脉冲信号,电机就转动一定角

51单片机学习笔记4 -- 蜂鸣器控制

1.蜂鸣器简介 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器