基于51单片机的通讯聊天系统

文章目录

    • 一、实践的目的
    • 二、实践内容
    • 三、实践依托的实验设备与软件
    • 四、硬件原理图
    • 五、主要算法流程图及描述
    • 六、问题的分析与编写程序步骤与实现的过程
      • 1、通过蓝牙模块与手机APP“SPP蓝牙串口”实现连接
      • 2、创建工程与编写OLED显示字符串的程序
      • 3、通过串口通断实现发送信息于OLED屏幕显示
      • 4、 OLED显示光标与按键控制光标移动
      • 5、光标处的字符发送给电脑串口助手显示与流水灯
    • 七、总结

一、实践的目的

通过编写51单片机通讯聊天程序,掌握51单片机的各个模块的知识点和运用C语言编写51单片机的能力。

二、实践内容

用51单片机与口袋开发板设计实现一个单片机与电脑串口助手实现通讯功能的程序。程序的主要功能如下:
1 OLED初始化显示Welcome to Bluetooth communication! 字符串。
2 程序开始时处于接收信息模式, 电脑串口助手发送信息时,将从初始化字符第一个开始显示,电脑串口助手发送信息后,蜂鸣器响铃2秒左右。
3 每次同时按下左右键时,可以轮流切换接收/发送信息模式
4 在发送信息模式时,可以显示光标(第一次处于发送信息模式时光标显示在OLED的左上角),可以通过左右键、上下键控制光标移动
5 在发送信息模式下, 每次同时按下上下键, 可以将光标选中的字符发送到电脑串口助手,发送完字符后, led流水灯流动两次。

三、实践依托的实验设备与软件

  1. 口袋实验室
  2. Aultium Designer
  3. 使用的开发软件 : keil4、stc-isp-15xx-v6.28烧录软件
  4. PC电脑

四、硬件原理图

二、相关元器件特性分析

原器件名称 元器件特性简介
单片机 Stc89c52 系统运行的的核心
手柄板 系统运行的基础
OLED 可以显示字符或字符串
蜂鸣器 接收信息时,可以响铃
LED灯 D1-D8 发送信息后,流水灯流动两次后熄灭
独立按键 切换接收/发送模式,发送信息时控制光标移动
蓝牙模块 与手机实现通讯,显示单片机发送的字符或字符串

五、主要算法流程图及描述

在Main.c源文件中编写如下代码

编译程序,将生成的.hex文件用STC烧写软件-ISP-V6.82E软件将烧入到单片机中,单片机运行的效果如下图所示

中断处理程序编写完成,现在我们进行蜂鸣器在单片机接收信息后响铃2秒左右。在Main.h中定义sbit beep = P1^5; // 蜂鸣器,定义UINT beepTime = 300; UINT flagReceive = 0; 两个变量,分别对蜂鸣器响铃的时间进行控制、串口中断接收信息的标志控制蜂鸣器响铃,当flagReceive为1时就让蜂鸣器响铃。现在要改变串口中断处理程序的代码,将
dataString[index] = dataChar; // 单片机接收的数据存放与数组中
index++;
改成如下代码

现在在main函数中编写如下代码:在OLED_Fill(0x00); 语句的后面加入timer_portInit();语句,完成定时串口中断初始化。然后在while(1)循环中加入如下的代码

现在编译程序,将生成的hex文件烧入单片机中,电脑串口助手发送信息后的效果如下图所示

基于51单片机的通讯聊天系统

现在已经实现了通过串口通断实现发送信息于OLED屏幕显示,并且蜂鸣器响铃的功能了。

4、 OLED显示光标与按键控制光标移动

上一步我们通过实现了串口通断发送信息于OLED屏幕显示的功能,现在我们要实现系统处于发送模式时:OLED 屏幕显示光标;用按键进行接收/发送模式的切换;用按键控制光标的移动来选择我们要发送给电脑串口助手的字符数据。
首先是要实现的是发送/接收信息模式的功能,这个功能的实现是要用按键来处理模式转换的功能。在Main.h中我们定义按键的处理变量如下

这里我们定义了开发板上的按键A4、A5、A6、A7分别是变量left、right、up、down,完成了左右、上下键的的定义。进行模式切换时,是每次通过同时按下左右键可以进行接收/发送模式的转换。
现在我们要实现的是OLED屏幕显示光标。显示光标的功能是通过调用Oled.c文件中的OLED_WrDat(0xFF)函数来实现的。0xFF表示写入OLED的数据是在OLED屏幕上显示的是白底。它与OLED_Fill(0xFF);写入OLED命令的功能是一样的,在OLED屏幕上全屏显示白底的功能。用这个OLED_WrDat来显示光标的功能,提前就要设置光标显示在OLED 屏幕的何处。比如通过调用Oled.c文件中的OLED_Set_Pos(0,0)函数就设置了OLED的坐标于屏幕的左上角的开始位置处。然后通过调用OLED_WrDat(0xFF)就可以在屏幕的左上角的位置处显示一条细细的竖直线。我们显示的字符的宽度是8*16的字体,所以我们通过for循环来调用OLED_WrDat()函数就可以在OLED屏幕的显示字符处显示与字符同样大小的光标了。现在我们在Main.h文件中定义如下的数组变量并初始化

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年6月11日
下一篇 2022年6月11日

相关推荐