1.硬件
通过蓝牙通讯 使用手机来控制 单片机 上 LED 灯的亮灭。
1)硬件使用 SMT32 单片机 2)蓝牙模块(HC-05) 3) Android 手机一部(含蓝牙助手,可自行开发APP)
手机 —(蓝牙连接)—> HC-05 ----(串口通信)–> 单片机 -----> LED
2.硬件连接?
1)蓝牙模块VCC、GND、TXD、RXD 2)单片机VCC、GND、RXD、TXD
蓝牙模块上的 VCC 接 到开发板上的 VCC 针脚,蓝牙模块的 GND 接到开发板上的 GND 针脚,蓝牙模块的 TXD 接到开发板上的 RXD 针脚,蓝牙模块的 RXD 接到开发板上的TXD针脚。 单片机上电之后,手机会搜索到 一个蓝牙名称为 “HC-05” 的蓝牙信号,就是这个蓝牙模块。;连接输入密码1234,连接成功。
?3.代码(mian.c)
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "hc05.h"
#include "usart2.h"
#include "string.h"
#include "key.h"
void HC05_Role_Show(void)
{
if(HC05_Get_Role()==1)LCD_ShowString(30,140,200,16,16,"ROLE:M"); //主
else LCD_ShowString(30,140,200,16,16,"ROLE:S "); //从
}
void HC05_Sta_Show(void)
{
if(HC05_LED)LCD_ShowString(120,140,120,16,16,"STA:C "); //连接成功
else LCD_ShowString(120,140,120,16,16,"STA:S"); //连接失败
}
int main(void)
{
uint8_t rx=0;
u8 t;
u8 key;
u8 sendmask=0;
u8 sendcnt=0;
u8 sendbuf[20];
u8 reclen=0;
u16 data;
delay_init();
uart_init(9600);
LED_Init();
KEY_Init();
LCD_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
POINT_COLOR=RED;
LCD_ShowString(30,30,200,16,16," STM32 ^_^");
LCD_ShowString(30,50,200,16,16,"HC05 ");
LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");
while(HC05_Init())
{
LCD_ShowString(30,90,200,16,16,"HC05 Error!");
delay_ms(500);
LCD_ShowString(30,90,200,16,16,"Please Check!!!");
delay_ms(100);
}
LCD_ShowString(30,90,200,16,16,"WK_UP:ROLE KEY0:SEND/STOP");
LCD_ShowString(30,110,200,16,16,"ATK-HC05 Standby!");
LCD_ShowString(30,160,200,16,16,"Send:");
LCD_ShowString(30,180,200,16,16,"Receive:");
POINT_COLOR=BLUE;
HC05_Role_Show();
while(1)
{
key=KEY_Scan(0);
if(key==WKUP_PRES)
{
key=HC05_Get_Role();
if(key!=0XFF)
{
key=!key;
if(key==0)HC05_Set_Cmd("AT+ROLE=0");
else HC05_Set_Cmd("AT+ROLE=1");
HC05_Role_Show();
HC05_Set_Cmd("AT+RESET");
}
}else if(key==KEY0_PRES)
{
sendmask=!sendmask;
if(sendmask==0)LCD_Fill(30+40,160,240,160+16,WHITE);
}else delay_ms(10);
if(t==50)
{
if(sendmask)
{
sprintf((char*)sendbuf,"ALIENTEK HC05 %d\r\n",sendcnt);
LCD_ShowString(30+40,160,200,16,16,sendbuf);
u2_printf("ALIENTEK HC05 %d\r\n",sendcnt);
sendcnt++;
if(sendcnt>99)sendcnt=0;
}
HC05_Sta_Show();
t=0;
LED0=!LED0;
}
if(USART2_RX_STA&0X8000)
{
LCD_Fill(30,200,240,320,WHITE);
reclen=USART2_RX_STA&0X7FFF;
USART2_RX_BUF[reclen]=0;
if(reclen==9||reclen==8)
{
if(strcmp((const char*)USART2_RX_BUF,"+LED1 ON")==0)LED1=0; //打开LED1
if(strcmp((const char*)USART2_RX_BUF,"+LED1 OFF")==0)LED1=1;//关闭LED1
}
LCD_ShowString(30,200,209,119,16,USART2_RX_BUF);
USART2_RX_STA=0;
}
if(USART_ReceiveData(USART2) == '1')
{
LED1=0;
delay_ms(10);
}
else
{
LED1=1;
delay_ms(10); //其他情况灯灭
}
t++;
}
}
|