基于51单片机的手机蓝牙控制8位LED灯亮灭设计
- 1、项目简介
- 1.1 系统构成
- 1.2 系统功能
- 2、部分电路设计
- 2.1 STC89C52单片机核心系统电路设计
- 2.2 LED电路设计
- 2.3 蓝牙模块电路设计
- 3、部分代码展示
- 3.1 定时器初始化以及中断处理
- 3.2 串口初始化
- 3.3 串口中断处理
1、项目简介
- 选题指导,项目分享: https://gitee.com/lighter-z/embedded-base/tree/master
- 点击查看详细资料
1.1 系统构成
本设计由STC89C52单片机电路+8位LED灯电路+蓝牙模块电路+电源电路组成。
1.2 系统功能
- 1、通过手机APP可以控制8路LED灯的亮灭。
- 2、通过手机APP可以控制8路LED灯的亮度。每个灯的亮度有3档。
- 3、可以发送指令控制8个灯全灭和全亮。
- 蓝牙发送数据内容:
ON // 打开所有灯 大写字母’O’
SN // 关闭所有灯
Ax //一档打开 第x个灯 x为1-8中的一个数 如A2表示把led2灯打开的亮度为1挡
Bx //二档打开 第x个灯 x为1-8中的一个数 如A2表示把led2灯打开的亮度为2挡
Cx //三档打开 第x个灯 x为1-8中的一个数 如A2表示把led2灯打开的亮度为3挡
- 蓝牙发送数据内容:
2、部分电路设计
2.1 STC89C52单片机核心系统电路设计
STC89C52单片机最小系统电路由复位电路、时钟电路和电源电路。拥有这三部分电路后,单片机即可正常工作。
单片机最小系统原理图如下图所示:
2.2 LED电路设计
LED电路由8个LED构成,通过上拉电阻连接在51单片机的P0端口。
其具体电路原理图如下图所示:
实物图如下图所示:
2.3 蓝牙模块电路设计
本设计中使用JDY-30蓝牙模块,将蓝牙模块的RX引脚连接在51单片机的P31引脚,TX引脚连接在单片机的P30引脚。
蓝牙模块是指集成蓝牙功能的芯片基本电路集合,用于无线网络通讯。本蓝牙模块就是为了只能无线数据传输而专门打造的,本模块支持串行接口,支持SP蓝牙串口协议,具有成本低、体积小、收发灵敏性高等特点,只需配备少许的外围元件就能实现大功能。
其具体电路原理图如下图所示:
实物图如下:
3、部分代码展示
3.1 定时器初始化以及中断处理
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-10000)/256; //重新赋值 20ms
TL0=(65536-10000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1
{
TH0=(65536-5000)/256; //重新赋值 5ms
TL0=(65536-5000)%256;
times_5ms++;
}
3.2 串口初始化
void UART_Init(void)
{
SCON = 0x50; // 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; //打开串口中断
}
3.3 串口中断处理
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=='S')||(R_buf=='s'))
{
Commd_Flag=CLOSE; //接收到 关闭灯标志
}
else if((R_buf=='A')||(R_buf=='a'))
{
Commd_Flag=DAGN01; //接收到 关闭灯标志
}
else if((R_buf=='B')||(R_buf=='b'))
{
Commd_Flag=DAGN02; //接收到 关闭灯标志
}
else if((R_buf=='C')||(R_buf=='c'))
{
Commd_Flag=DAGN03; //接收到 关闭灯标志
}
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!='N'))
{
Commd_Flag=INIT; //否则 初始化接受标志
}
if((Commd_Flag==OPEN)||(Commd_Flag==DAGN01)) //根据命令值进行打开相应的灯
{
switch(R_buf)
{
case '1':pwmLed01=3;Commd_Flag=INIT;break; //打开相应的灯 并恢复命令标志
case '2':pwmLed02=3;Commd_Flag=INIT;break;
case '3':pwmLed03=3;Commd_Flag=INIT;break;
case '4':pwmLed04=3;Commd_Flag=INIT;break;
case '5':pwmLed05=3;Commd_Flag=INIT;break;
case '6':pwmLed06=3;Commd_Flag=INIT;break;
case '7':pwmLed07=3;Commd_Flag=INIT;break;
case '8':pwmLed08=3;Commd_Flag=INIT;break;
case 'N':pwmLed01=3;pwmLed02=3;pwmLed03=3;pwmLed04=3;pwmLed05=3;pwmLed06=3;pwmLed07=3;pwmLed08=3;Commd_Flag=INIT;break;
default:break; //此处错误判断 不可恢复命令标准
}
}
else if(Commd_Flag==CLOSE)//根据命令值进行关闭相应的灯
{
switch(R_buf)
{
case '1':pwmLed01=1;Commd_Flag=INIT;break; //打开相应的灯 并恢复命令标志
case '2':pwmLed02=1;Commd_Flag=INIT;break;
case '3':pwmLed03=1;Commd_Flag=INIT;break;
case '4':pwmLed04=1;Commd_Flag=INIT;break;
case '5':pwmLed05=1;Commd_Flag=INIT;break;
case '6':pwmLed06=1;Commd_Flag=INIT;break;
case '7':pwmLed07=1;Commd_Flag=INIT;break;
case '8':pwmLed08=1;Commd_Flag=INIT;break;
case 'N':pwmLed01=1;pwmLed02=1;pwmLed03=1;pwmLed04=1;pwmLed05=1;pwmLed06=1;pwmLed07=1;pwmLed08=1;Commd_Flag=INIT;break;
default:break; //此处错误判断 不可恢复命令标准
}
}
else if(Commd_Flag==DAGN02)//根据命令值进行关闭相应的灯
{
switch(R_buf)
{
case '1':pwmLed01=6;Commd_Flag=INIT;break; //打开相应的灯 并恢复命令标志
case '2':pwmLed02=6;Commd_Flag=INIT;break;
case '3':pwmLed03=6;Commd_Flag=INIT;break;
case '4':pwmLed04=6;Commd_Flag=INIT;break;
case '5':pwmLed05=6;Commd_Flag=INIT;break;
case '6':pwmLed06=6;Commd_Flag=INIT;break;
case '7':pwmLed07=6;Commd_Flag=INIT;break;
case '8':pwmLed08=6;Commd_Flag=INIT;break;
default:break; //此处错误判断 不可恢复命令标准
}
}
else if(Commd_Flag==DAGN03)//根据命令值进行关闭相应的灯
{
switch(R_buf)
{
case '1':pwmLed01=9;Commd_Flag=INIT;break; //打开相应的灯 并恢复命令标志
case '2':pwmLed02=9;Commd_Flag=INIT;break;
case '3':pwmLed03=9;Commd_Flag=INIT;break;
case '4':pwmLed04=9;Commd_Flag=INIT;break;
case '5':pwmLed05=9;Commd_Flag=INIT;break;
case '6':pwmLed06=9;Commd_Flag=INIT;break;
case '7':pwmLed07=9;Commd_Flag=INIT;break;
case '8':pwmLed08=9;Commd_Flag=INIT;break;
default:break; //此处错误判断 不可恢复命令标准
}
}
SBUF=R_buf; //返回接收到的数据
}
if(TI) //如果是发送标志位,清零
TI=0;
}