蓝牙花式点灯制作
本产品是基于51单片机金沙滩开发板并结合UART串口通信,进行制作。
注:本教材是利用App Inventor进行安卓应用开发,所以要求学者具备一定的App Inventor的使用能力。建议读者到网易云公开课学习App Inventor课程。
1、 资料准备:
HC06蓝牙模块 1个
51 单片机最小系统 1个
手机(安卓系统) 1台
LED灯 若干个
2、 手机安卓程序代码
① 首先登陆网 http://app.gzjkw.net/login/ ② 然后用QQ登陆
③ 安卓开发程序
④ 下载程序到手机中
⑤ 然后用手机扫描二维码即可下载并安装应用
3、 程序代码
mian.c程序:
#include <reg52.h>
//74HC138译码器引脚定义
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
//全局变量定义
//串口接收和发送的字符
unsigned char ch;
//选择那个灯的形式标志位
unsigned char flagls = 0;
//函数声明
//串口配置函数
void ConfigUART(unsigned int baud);
//第一个 左移
extern void leftLED();
//第二个 右移
extern void rightLED();
//第三个 来回移动
extern void BothWay();
//第四个 1 3 5 7 灯闪烁
extern void LED1();
//第五个 2 4 6 8 灯闪烁
extern void LED2();
//第六个 自左向右移动,每次加一个灯
extern void LED3();
//第七个,自右向左移动,每次加一个灯
extern void LED4();
//第八个,全部灯闪烁
void main()
{
//74HC138译码器选择LED灯
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
//使能总中断打开
EA = 1;
//设置波特率9600
ConfigUART(9600);
while(1)
{
//第一个 左移
if(flagls == 1)
{
leftLED();
}
//第二个 右移
if(flagls == 2)
{
rightLED();
}
//第三个 来回移动
if(flagls == 3)
{
BothWay();
}
//第四个 1 3 5 7 灯闪烁
if(flagls == 4)
{
LED1();
}
//第五个 2 4 6 8 灯闪烁
if(flagls == 5)
{
LED2();
}
//第六个 自左向右移动,每次加一个灯
if(flagls == 6)
{
LED3();
}
//第七个,自右向左移动,每次加一个灯
if(flagls == 7)
{
LED4();
}
}
}
void ConfigUART(unsigned int baud)
{
//选择串口通讯模式1
SCON = 0x50;
//选择定时器工作模式2
TMOD &= 0x0F;
TMOD |= 0x20;
//计算T1重载值
TH1 = 256 - (11059200/12/32)/baud;
//初值等于重载值
TL1 = TH1;
//禁止T1中断
ET1 = 0;
//使能串口中断
ES = 1;
//启动T1定时器
TR1 = 1;
}
void InterruptUART() interrupt 4
{
//接收到字节
if(RI)
{
//手动清零接收中断标志位
RI = 0;
//将接收到数据发送给ch
ch = SBUF;
switch(ch)
{
case'a': flagls=1; break;
case'b': flagls=2; break;
case'c': flagls=3; break;
case'd': flagls=4; break;
case'e': flagls=5; break;
case'f': flagls=6; break;
case'g': flagls=7; break;
default: break;
}
}
//字节发送完毕
if(TI)
{
//手动清零发送中断标志位
TI = 0;
}
}
led.c程序:
#include <reg52.h>
//定义循环变量i,用于软件延时
unsigned int i = 0;
//定义移位方向变量dir,用于控制移位的方向
unsigned char dir = 0;
//定义循环移位变量shift,并赋初值0x01
unsigned char shift = 0x01;
unsigned int cnt = 0;
//LED左移函数
void leftLED()
{
P0 = ~(0x01 <<cnt);
for(i=0; i<23000; i++);
cnt++;
cnt = cnt & 0x07;
}
//LED右移函数
void rightLED()
{
P0 = ~(0x80 >>cnt);
for(i=0; i<23000; i++);
cnt++;
cnt = cnt & 0x07;
}
//来回移动
void BothWay()
{
//P0等于循环移位变量取反,控制8个LED
P0 = ~shift;
//软件延时
for (i=0; i<23000; i++);
//移位方向变量为0时,左移
if (dir == 0)
{
//循环移位变量左移1位
shift = shift << 1;
//左移到最左端后,改变移位方向
if (shift == 0x80)
{
dir = 1;
}
}
//移位方向变量不为0时,右移
else
{
//循环移位变量右移1位
shift = shift >> 1;
//右移到最右端后,改变移位方向
if (shift == 0x01)
{
dir = 0;
}
}
}
//第一个 左移
void LED1()
{
P0 = 0xAA;
for(i=0; i<23000; i++);
P0 = 0xFF;
for(i=0; i<23000; i++);
}
//第二个 右移
void LED2()
{
P0 = 0x55;
for(i=0; i<23000; i++);
P0 = 0xFF;
for(i=0; i<23000; i++);
}
//第三个 来回移动
void LED3()
{
P0 = 0xFE;
for(i=0; i<23000; i++);
P0 = 0xFC;
for(i=0; i<23000; i++);
P0 = 0xF8;
for(i=0; i<23000; i++);
P0 = 0xF0;
for(i=0; i<23000; i++);
P0 = 0xE0;
for(i=0; i<23000; i++);
P0 = 0xC0;
for(i=0; i<23000; i++);
P0 = 0x80;
for(i=0; i<23000; i++);
P0 = 0x00;
for(i=0; i<23000; i++);
P0 = 0x00;
for(i=0; i<23000; i++);
P0 = 0xFF;
for(i=0; i<23000; i++);
}
//第四个 1 3 5 7 灯闪烁
void LED4()
{
P0 = 0x7F;
for(i=0; i<23000; i++);
P0 = 0x3F;
for(i=0; i<23000; i++);
P0 = 0x1F;
for(i=0; i<23000; i++);
P0 = 0x0F;
for(i=0; i<23000; i++);
P0 = 0x07;
for(i=0; i<23000; i++);
P0 = 0x03;
for(i=0; i<23000; i++);
P0 = 0x01;
for(i=0; i<23000; i++);
P0 = 0x00;
for(i=0; i<23000; i++);
P0 = 0x00;
for(i=0; i<23000; i++);
P0 = 0xFF;
for(i=0; i<23000; i++);
}
//第五个 2 4 6 8 灯闪烁
void LED5()
{
P0 = 0xFE;
for(i=0; i<23000; i++);
P0 = 0xFC;
for(i=0; i<23000; i++);
P0 = 0xF8;
for(i=0; i<23000; i++);
P0 = 0xF0;
for(i=0; i<23000; i++);
P0 = 0xE0;
for(i=0; i<23000; i++);
P0 = 0xC0;
for(i=0; i<23000; i++);
P0 = 0x80;
for(i=0; i<23000; i++);
P0 = 0x00;
for(i=0; i<23000; i++);
P0 = 0x7F;
for(i=0; i<23000; i++);
P0 = 0x3F;
for(i=0; i<23000; i++);
P0 = 0x1F;
for(i=0; i<23000; i++);
P0 = 0x0F;
for(i=0; i<23000; i++);
P0 = 0x07;
for(i=0; i<23000; i++);
P0 = 0x03;
for(i=0; i<23000; i++);
P0 = 0x01;
for(i=0; i<23000; i++);
P0 = 0x00;
for(i=0; i<23000; i++);
P0 = 0xFF;
for(i=0; i<23000; i++);
}
//第六个 自左向右移动,每次加一个灯
void LED6()
{
P0 = 0x00;
for(i=0; i<23000; i++);
P0 = 0xFF;
for(i=0; i<23000; i++);
}
//第七个,自右向左移动,每次加一个灯
void LED7()
{
P0 = 0xFF;
}
4、 蓝牙模块HC-06与单片机线连接
蓝牙模块HC-06的
TX --> P3^0(51单片机的RX)
RX --> P3^1(51单片机的TX)
VCC --> +5V
GND --> GND
5、连接完成后即可可以使用安卓手机进行控制LED灯的流动。