首页 > 其他分享 >项目一 51单片机蓝牙控制继电器

项目一 51单片机蓝牙控制继电器

时间:2022-12-11 22:00:54浏览次数:47  
标签:case Commd 蓝牙 51 INIT break 单片机 Flag buf


前言:作者想要帮助一些童鞋和爱好者进行项目构建,但自知能力有限,不喜可论,创作不易,勿喷。

系统由STC89C51单片机、4路继电器、蓝牙模块及电源组成。
可以说是一个非常简单的设计,但这里我来说明一些内容。
第一,项目第一步我们应该干什么?
画图?写程序?还是画仿真?这些都不是。我认为第一步应该清楚我们需要干什么,这是画图,写程序之前需要理解的。
第二,我们做这些需要用到什么?这其中包括软件需要用到什么硬件需要用到什么,还有相应的单片机端口应该怎样选择?
第三,如果我们想要做成这个东西,那么我们中间遇到问题应该怎么办?需要哪些平台?

针对这三个问题,我一一来解答,对于这个系统来说:
第一,我们需要干什么?
从设计要求来看,就是利用蓝牙模块来控制4个继电器的开断。
好,那么问题就来了。蓝牙是否能够直接控制继电器,如同esp8266一样?答案显然是不能的。那么蓝牙要通过单片机控制继电器。现在我们就有一个很简单的一个模型。

手机蓝牙 (通信) ==> 板载蓝牙 (通信) ==> STC89C51单片机(控制) ==>继电器;

当然继电器模型后面还可以跟其他外设,但是我们这里就不继续添加,理解好电气原理即可。

第二,我们需要用到什么?

软件方面

编程软件 keil4

烧录软件 stc-isp-15xx-v6.86q.exe

链接:https://pan.baidu.com/s/1hsGnfBAvfWlGXgPjhYXsyg

提取码:6666

画图软件 AD20

链接:https://pan.baidu.com/s/1Fyxh-PHZftNI1HIAMSTZPw

提取码:6666

这个工程无法仿真模拟,所以没有仿真

硬件方面

项目一 51单片机蓝牙控制继电器_嵌入式


打板子
可以在嘉立创或捷配。(两家都行,仁者见仁)
第三 遇到了问题可以参考csdn、51黑电子论坛等。当然如果在学校老师是不二之选。

第一步树立思路已经好了,第二步就是画图,刚刚说了,画图用AD20,但是有一些库我们是没有的,除了自己构建库之外,以下两个网站也是很好的途径。

PCBlibAD官网

项目一 51单片机蓝牙控制继电器_嵌入式_02


项目一 51单片机蓝牙控制继电器_单片机_03


第二步图已经画好了,送去打板焊接之后。

项目一 51单片机蓝牙控制继电器_初始化_04


那么第三步就开始要写程序了。

#include <reg52.h> 
#include <intrins.h>
#include <stdio.h>
#include "delay.h"
// 操作方法
// 蓝牙发送字符 CX或cX 表示关闭x位灯, x取值1-8
// 蓝牙发送字符 OX或oX 表示关闭x位灯, x取值1-8

#define INIT 0xFF //定义常量
#define OPEN 0x22
#define CLOSE 0x33

unsigned long times_5ms=0; //定时计数
unsigned char Commd_Flag=INIT; //初始化命令接收标志

sbit relay1=P1^0; //初始化relay对应引脚
sbit relay2=P1^1;
sbit relay3=P1^2;
sbit relay4=P1^3;
sbit relay5=P1^4;
sbit relay6=P1^5;
sbit relay7=P1^6;
sbit relay8=P1^7;

void Init_Timer0(void);//定时器初始化

void UART_Init(void); //函数声明
void SendByte(unsigned char dat);
void SendStr(unsigned char *s,unsigned char length);

void main (void)
{

Init_Timer0(); //定时器0初始化
UART_Init(); //蓝牙 串口 波特率9600

P1=0x00;
DelayMs(200); //延时有助于稳定 上电检测下硬件
P1=0xff;

while(1) //主循环
{
;//蓝牙的接收处理 均在中断中处理 请查看串口中断
}
}

void Init_Timer0(void)
{
//**All notes can be deleted and modified**//
TMOD |= 0x10; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-10000)/256; //重新赋值 20ms
TL0=(65536-10000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void UART_Init(void)
{
//**All notes can be deleted and modified**//
SCON = 0x05; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
TL1 = TH1;
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
ES = 1; //打开串口中断
}

void Timer0_isr(void) interrupt 1
{
TH0=(65536-5000)/256; //重新赋值 5ms
TL0=(65536-5000)%256;
times_5ms++; //定时5ms

}

void UART_SER (void) interrupt 4 //串行中断服务程序
{
unsigned char R_buf;
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
R_buf=SBUF;
if((R_buf=='O')||(R_buf=='o'))
{
Commd_Flag=OPEN; //接收到打开灯标志
}
else if((R_buf=='C')&&(R_buf=='c'))
{
Commd_Flag=CLOSE; //接收到 关闭灯标志
}
else if((R_buf!='1')&&(R_buf!='2')&&(R_buf!='3')&&(R_buf!='4')&&(R_buf!='5')&&(R_buf!='6')&&(R_buf!='7')&&(R_buf!='8')&&(R_buf!='a')&&(R_buf!='A'))
{
Commd_Flag=INIT; //否则 初始化接受标志
}

if(Commd_Flag==OPEN) //根据命令值进行打开相应的灯
{
switch(R_buf)
{
case '1':relay1=0;Commd_Flag=INIT;break; //打开相应的灯 并恢复命令标志
case '2':relay2=0;Commd_Flag=INIT;break;
case '3':relay3=0;Commd_Flag=INIT;break;
case '4':relay4=0;Commd_Flag=INIT;break;
case '5':relay5=0;Commd_Flag=INIT;break;
case '6':relay6=0;Commd_Flag=INIT;break;
case '7':relay7=0;Commd_Flag=INIT;break;
case '8':relay8=0;Commd_Flag=INIT;break;
case 'A':relay1=0;relay2=0;relay3=0;relay4=0;relay5=0;relay6=0;relay7=0;relay8=0;Commd_Flag=INIT;break;
case 'a':relay1=0;relay2=0;relay3=0;relay4=0;relay5=0;relay6=0;relay7=0;relay8=0;Commd_Flag=INIT;break;
default:break; //此处错误判断 不可恢复命令标准
}
}
else if(Commd_Flag==CLOSE)//根据命令值进行关闭相应的灯
{
switch(R_buf)
{
case '1':relay1=1;Commd_Flag=INIT;break; //关闭相应的灯 并恢复命令标志
case '2':relay2=1;Commd_Flag=INIT;break;
case '3':relay3=1;Commd_Flag=INIT;break;
case '4':relay4=1;Commd_Flag=INIT;break;
case '5':relay5=1;Commd_Flag=INIT;break;
case '6':relay6=1;Commd_Flag=INIT;break;
case '7':relay7=1;Commd_Flag=INIT;break;
case '8':relay8=1;Commd_Flag=INIT;break;
case 'A':relay1=1;relay2=1;relay3=1;relay4=1;relay5=1;relay6=1;relay7=1;relay8=1;Commd_Flag=INIT;break;
case 'a':relay1=1;relay2=1;relay3=1;relay4=1;relay5=1;relay6=1;relay7=1;relay8=1;Commd_Flag=INIT;break;
default:break; //此处错误判断 不可恢复命令标准
}
}
SBUF=R_buf; //返回接收到的数据
}
if(TI) //如果是发送标志位,清零
TI=0;
}

代码书写完成后,通过烧录软件烧录hex文件,可以进行板子运行。
第四步手机蓝牙连接,下载我所上传的蓝牙软件。即可匹配板载蓝牙。通过相应指令进行蓝牙信息通信,进而控制继电器。


标签:case,Commd,蓝牙,51,INIT,break,单片机,Flag,buf
From: https://blog.51cto.com/u_15680096/5928760

相关文章

  • 代码随想录算法训练营Day18|513. 找树左下角的值、112. 路径总和、106. 从中序与后序
    代码随想录算法训练营Day18|513.找树左下角的值、112.路径总和、106.从中序与后序遍历序列构造二叉树513.找树左下角的值513.找树左下角的值假设二叉树中至少有一......
  • STM32单片机的最小系统的组成详解
    经常使用STM32开发的工程师对于它的开发环境的最小系统是必须要有所了解的,特别是硬件工程师在设计硬件的时候对这个最小系统就要更加的深入了解了,如果最小系统的搭建都有问......
  • 归并排序应用——剑指 Offer 51. 数组中的逆序对
    (文章目录)题目1.在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例1:输入:[7,5,6......
  • 51单片机-案例程序源码-笔记
    最近整了块单片机,这里分享一下源码,供师兄弟们一起学习研究。如果会c语言的话,可能觉得这些代码实在是太简单了,而且不够优雅......
  • 手把手讲解51单片机最小系统焊接、流水灯(跑马灯)编写以及烧录
    (1)首先当然是要购买“51单片机最小系统的散件”,淘宝上面卖的比较多,散件的话一般二、三十元左右,其次还需要购买一个电烙铁,一般30瓦的就足够了,这里我就讲一讲51单片机散件的焊......
  • 在proteus软件80C51芯片隐藏电源接口VCC
    下面是proteus软件中80C51单片机芯片图:很奇怪为什么没有VCC引脚,百度了一下,原来很奇怪为什么没有VCC引脚,百度了一下,原来PROTEUS里面已经默认接上电源了,所以把电源脚隐藏了,所......
  • ASEMI电磁炉整流桥KBJ2510参数和性能
    编辑-ZASEMI电磁炉整流桥KBJ2510参数和性能怎么样呢?ASEMI采用波峰的GPP大芯片,工艺制造,稳定性高,抗冲击性强。KBJ2510具体参数为:正电流:25A,反向耐压:1000V,反向电流:10uA,正向压......
  • wince 蓝牙 学习
    蓝牙命令1.向蓝牙设备发送命令bccmd-tbcsp-d/dev/ttymxc1psload-r/etc/bluetooth/BC6QFN.psr-t指定通讯协议bcsp为蓝牙核心串口协议-d指定执行命令的......
  • (51)C# 查看本机安装的NET Framework 版本
     ​​https://docs.microsoft.com/zh-cn/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed#net_a​​通过查看注册表来查找.NETFramewo......
  • Micropython——UART串口(蓝牙)
    文章目录​​HC-06蓝牙模块​​​​接线​​​​连接手机APP调试​​​​调试注意事项​​​​测试代码​​​​测试发送代码​​​​测试接收代码​​​​发送数据​​​​......