❶ 蓝牙与51单片机该怎么连接
单片机想使用蓝牙通信,就必须给单片机系统添加一个蓝牙模块;
而蓝牙模块是具有无线通信和有线通信两部分的功能,那么有线通信部分是需要与单片机进行连接的。如何连接,就看看你的蓝牙模块的有线通信部分是采用什么接口,一般有 UART 和 SPI;
然后对应的找出单片机的接口管脚进行连接就是了;
❷ 一个51单片机如图,有两个蓝牙模块,怎么连接单片机和蓝牙并进行工作呢求连接与代码。。
51单片机上的蓝牙模块编程方法如下:
常用的方法有:
1.通过通过电脑上的蓝牙设备给单片机上的蓝牙设备,给单片机指令起到控制作用。
2.通过串口232或485或直接串口通讯链接到单片机的串口通讯引脚给单片机指令从而达到控制单片机。
3.通过电脑上的wifi给单片机上的wifi指令不过这样麻烦。
第一种方法最好把,不过电脑上要有蓝牙设备或外界usb的蓝牙。
第二种方法是有线的,可以通过电脑上的232接口直接跟单片机通讯。
❸ 51单片机,蓝牙
电脑和单片机是否使用了相同的蓝牙模块,如果是,单片机与蓝牙模块的连接问题,如果不是,这个测试没有太大意义,这只能表明,手机蓝牙和pc+蓝牙模块是好,且无法证明问题是出自单片机还是蓝牙模块?
❹ 51单片机蓝牙小车接口和连接方式定义
单片机想使用蓝牙通信,就必须给单片机系统添加一个蓝牙模块。
蓝牙模块是具有无线通信和有线通信两部分的功能,那么有线通信部分是需要与单片机进行连接的,如何连接,就看看你的蓝牙模块的有线通信部分是采用什么接口,一般有 UART 和 SPI,然后对应的找出单片机的接口管脚进行连接就是了。
我简单说一下原理吧,芯片需要慢慢来挑选,这个你可以自己去找,有很多,首先需要解决的是单片机控制小车的问题,要想解决这个问题,首先需要解决智能小车的操作和功能。
单片是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU。
随机存储器RAM,只读存储器ROM,多种I,O口和中断系统、定时器,计数器等功能可能还包括显示驱动电路,脉宽调制电路,模拟多路转换器,AD转换器等电路集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。
从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机,小车必须要有前后左右控制功能,加速,减速,刹车,左转向,又转向和倒车功能,有了这几种功能之后小车才能行动自如。
解决小车的问题,就要将小车的控制功能转于到单片机来实现一般小车内部也会有单片机,实现了这一步,下面就需要做蓝牙的通信。
❺ 如何通过蓝牙将51单片机的数据传送到手机
单片机将数据通过蓝牙传到手机,需要经过以下大约3个步骤:
1,使用蓝牙转串口模块连接51单片机的RX和TX引脚,这一步实现源端数据转换;
2,手机内部进行APP的程序设计,调用蓝牙模块并读取数据;
3,开启手机蓝牙,并打开第二步设计的APP软件,搜索到与单片机相连的蓝牙模块后即可实现数据通信了。
❻ 基于51单片机的蓝牙密码锁汇编程序
用STC52编的,下面是C程序,调试已经成功,自己看程序吧……
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_data P0
sbit SDA=P3^5;
sbit SCL=P3^4;//24C08控制口设置
sbit LCD_RS = P3^3; //寄存器选择输入
sbit LCD_RW = P3^6; //液晶读/写控制
sbit LCD_EN = P3^7; //液晶使能控制
sbit LCD_PSB = P3^2; //串/并方式控制
sbit FM=P2^4;//蜂鸣器控制口
sbit RS=P2^5;
sbit T_CLK = P2^0; //实时时钟时钟线引脚 //
sbit T_IO = P2^1; //实时时钟数据线引脚 //
sbit T_RST = P2^2; //实时时钟复位线引脚 //
sbit ds=P2^3;
sbit EN=P2^6;
sbit ZZ=P2^7;
sbit FZ=P3^1;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
uint temp1,s_temp; //定义整形变量
float f_temp; //定义浮点型变量
uchar time[]=" : : ";
uchar day[]=" 20 / / ( ) ";
uchar temp0[]=" 温度: . 度 ";
uchar num,num1,flag,count,a,b;
uchar unlock_i;//解密标志位
uchar t[4];
uchar t1[4];
void delay()_ms(uint z)//长延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay()() //短延时,大约5us
{
; ;
}
void reshi()
{
if(RS==1)
{ unlock_i=1;
}
else
{
unlock_i=0;
}
}
uchar code mima[]={'0','1','2','3','4','5','6','7','8','9','0','*'};
void lcd_xieping0(uchar x,uchar y,uchar date);
void lcd_xieping(uchar x,uchar y,uchar *str);
//********************************************************
// 开机显示
//********************************************************
void kjxs()
{
uint i,j;
lcd_xieping(0,0,"****************");
lcd_xieping(1,0," 欢迎进入 ");
lcd_xieping(2,0," 密码锁系统! ");
lcd_xieping(3,0,"****************");
delay()_ms(4000);
lcd_xieping(0,0," 系统初始化中 ");
lcd_xieping(1,0," 请稍后… ");
lcd_xieping(2,0,"————————");
lcd_xieping(3,0," ");
for(j=3;j>0;j--)
{
for(i=0;i<8;i++)
{
lcd_xieping(3,i,"*");
delay_ms(250);
}
lcd_xieping(3,0," ");
}
}
//********************************************************
// 12864显示
//********************************************************
void write_cmd(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
P0 = cmd;
delay_ms(5);
LCD_EN = 1;
delay_ms(5);
LCD_EN = 0;
}
void write_dat(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delay_ms(5);
LCD_EN = 1;
delay_ms(5);
LCD_EN = 0;
}
void lcd_xieping0(uchar x,uchar y,uchar date)
{
switch(x)
{
case 0: write_cmd(0x80+y); break;
case 1: write_cmd(0x90+y); break;
case 2: write_cmd(0x88+y); break;
case 3: write_cmd(0x98+y); break;
}
write_dat(date);
}
void lcd_xieping(uchar x,uchar y,uchar *str)
{
switch(x)
{
case 0: write_cmd(0x80+y); break;
case 1: write_cmd(0x90+y); break;
case 2: write_cmd(0x88+y); break;
case 3: write_cmd(0x98+y); break;
}
while (*str)
{
write_dat(*str);
str++;
}
}
void lcd_init()
{
LCD_PSB = 1; //并口方式
write_cmd(0x30); //基本指令操作
delay_ms(5);
write_cmd(0x0C); //显示开,关光标
delay_ms(5);
write_cmd(0x01); //清除LCD的显示内容
delay_ms(5);
}
//**************************************************************
// 键盘扫描函数
//**************************************************************
uchar keyscan1() //矩阵键盘扫描函数
{
uchar temp;
while(!num)
{P1=0xfe; //赋值
temp=P1; //读回数据
temp=temp&0xf0; //与运算
if(temp!=0xf0) //判断
{
delay_ms(2); //延时消抖
temp=P1; //读回数据
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp) //多分支选择
{
case 0x70:num=1;break; //跳出
case 0xb0:num=2;break;
case 0xd0:num=3;break;
case 0xe0:num=4;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}//等待按键释放
}
}
P1=0xfd; //赋值
temp=P1; //读回数据
temp=temp&0xf0; //与运算
if(temp!=0xf0) //判断
{
delay_ms(2); //延时消抖
temp=P1; //读回数据
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp) //多分支选择
{
case 0x70:num=5;break; //跳出
case 0xb0:num=6;break;
case 0xd0:num=7;break;
case 0xe0:num=8;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}//等待按键释放
}
}
P1=0xfb; //赋值
temp=P1; //读回数据
temp=temp&0xf0; //与运算
if(temp!=0xf0) //判断
{
delay_ms(2); //延时消抖
temp=P1; //读回数据
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp) //多分支选择
{
case 0x70:num=9;break; //跳出
case 0xb0:num=10;break;
case 0xd0:num=11;break;
case 0xe0:num=12;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}//等待按键释放
}
}
}
return(num); //返回值
}
uchar keyscan2()
{
uchar temp;
while(!num1)
{P1=0xf7; //赋值
temp=P1; //读回数据
temp=temp&0xf0; //与运算
if(temp!=0xf0) //判断
{
delay_ms(2); //延时消抖
temp=P1; //读回数据
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp) //多分支选择
{
case 0x70:num1=1;break; //跳出
case 0xb0:num1=2;break;
case 0xd0:num1=3;break;
case 0xe0:num1=4;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}//等待按键释放
}
}
}
return(num1);
}
//**************************************************************
// 直流电机
//**************************************************************
void dianjiZZ()
{
EN=1;
ZZ=1;
FZ=0;
}
void dianjiFZ()
{
EN=1;
ZZ=0;
FZ=1;
}
void dianji_stop()
{
EN=0;
}
//**************************************************************
// EPPROM
//**************************************************************
void start() //启动信号
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
}
void stop() //停止信号
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
void respons() //响应信号
{
uchar i;
SCL=1;
delay();
while((SDA==1)&&(i<250))
i++;
SCL=0;
delay();
}
void writebyte(uchar date) //写一个字节
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1; //释放总线
delay();
}
uchar read()byte() //读一个字节
{
uchar i,k;
SCL=0;
delay();
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
delay();
k=(k<<1)|SDA;
SCL=0;
delay();
}
delay();
return(k);
}
void write(uchar add,uchar date) //在一个地址写一个字节
{
start();
writebyte(0xa0);
respons();
writebyte(add);
respons();
writebyte(date);
respons();
stop();
}
uchar read()(uchar add) //在一个地址读一个字节
{
start();
writebyte(0xa0);
respons();
writebyte(add);
respons();
start();
writebyte(0xa1);
respons();
b=read()byte();
respons();
stop();
return(b);
}
//**************************************************************
// 时间日期函数
//**************************************************************
void v_WTInputByte(uchar ucDa)
{
uchar i;
ACC= ucDa;
for(i=8; i>0; i--)
{
T_IO = ACC0; //*相当于汇编中的 RRC
T_CLK = 1;
T_CLK = 0;
ACC =ACC>> 1;
}
}
uchar uc_RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC>>1; //*相当于汇编中的 RRC
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
void v_W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_WTInputByte(ucAddr); /* 地址,命令 */
v_WTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST =0;
}
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_WTInputByte(ucAddr); // 地址,命令 //
ucDa = uc_RTOutputByte(); // 读1Byte数据 //
T_CLK = 1;
T_RST =0;
return(ucDa);
}
void Init1302(void)
{
v_W1302(0x8e,0x00); //控制写入WP=0
v_W1302(0x80,0x80);
v_W1302(0x90,0xa9);
v_W1302(0x80,0x00); //秒
v_W1302(0x82,0x24); //分
v_W1302(0x84,0x12); //时
v_W1302(0x86,0x29); //日
v_W1302(0x88,0x10); //月
v_W1302(0x8a,0x05); //星期
v_W1302(0x8c,0x10); //年 //
v_W1302(0x8e,0x80);
}
void donetime(void)
{
uchar d;
d=uc_R1302(0x87);
day[10]=(d&0x0f)+48;
day[9]=((d>>4)&0x03)+48;
d=uc_R1302(0x89);
day[7]=(d&0x0f)+48;
day[6]=((d>>4)&0x01)+48;
d=uc_R1302(0x8b);
day[13]=(d&0x07)+48;
d=uc_R1302(0x8d);
day[4]=(d&0x0f)+48;
day[3]=(d>>4)+48;
d=uc_R1302(0x81);
time[15]=(d&0x0f)+48;
time[14]=(d>>4)+48;
d=uc_R1302(0x83);
time[12]=(d&0x0f)+48;
time[11]=(d>>4)+48;
d=uc_R1302(0x85);
time[9]=(d&0x0f)+48;
time[8]=(d>>4)+48;
}
//**************************************************************
// 温度检测函数
//**************************************************************
void dsreset(void) //18B20复位,初始化函数
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void) //读1位函数
{
uint i;
bit dat;
ds=0;i++; //i++ 起延时作用
ds=1;i++;i++;
dat=ds; //读数据
i=8;while(i>0)i--;
return (dat);
}
uchar tempread(void) //读1个字节
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
void tempwritebyte(uchar dat) //向18B20写一个字节数据
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01; //判断最后一位是1还是0
dat=dat>>1;
if(testb) //写 1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0; //写 0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void) //DS18B20 开始获取温度并转换
{
dsreset(); //初始化,每次对18B20的操作都首先要初始化
delay_ms(1);
tempwritebyte(0xcc); // 写跳过读ROM指令
tempwritebyte(0x44); // 写温度转换指令
}
void get_temp() //读取寄存器中存储的温度数据
{
uchar a,b;
dsreset(); //初始化
delay_ms(1);
tempwritebyte(0xcc); // 写跳过读ROM指令
tempwritebyte(0xbe); //写读指令
a=tempread(); //读低8位
b=tempread(); //读高8位
temp1=b;
temp1<<=8; //两个字节组合为1个字
temp1=temp1|a;
f_temp=temp1*0.0625; //温度在寄存器中为12位 分辨率位0.0625°
}
//**************************************************************
// 解密函数
//**************************************************************
void unlock()
{
uchar in,i;
if(num==0)
{
lcd_xieping(0,0,"**密码锁系统** ");
lcd_xieping(1,0,"—————————");
lcd_xieping(2,0," 请输入密码: ");
lcd_xieping(3,0," ");
for(i=0;i<4;i++)
{
t1[i]=keyscan1();
lcd_xieping(3,i,"*");
num=0;
}//输密码
}
in=keyscan1();
if(in==12)//in-确定键标志位
{
in=0;
num=0;
if((t1[0]==t[0])&&(t1[1]==t[1])&&(t1[2]==t[2])&&(t1[3]==t[3]))
{
flag=1;//解密成功与否标志位
//unlock_i=1;
a=0;//功能键标志
lcd_xieping(0,0,"**密码锁系统** ");
lcd_xieping(1,0,"——————————");
lcd_xieping(2,0," 密码正确! ");
lcd_xieping(3,0," 您的身份已确认");
delay_ms(1500);
lcd_xieping(1,0,"————————");
lcd_xieping(2,0,"功能 I 开锁 ");
lcd_xieping(3,0," II修改密码");
}
else
{
flag=0;
count++;
if(count==3)
{
count=0;
num=1;
lcd_xieping(1,0,"——————————");
lcd_xieping(2,0,"您的机会已用完 ");
lcd_xieping(3,0,"对不起**无法进入");
FM=0;
delay_ms(1000);
FM=1;
}
}
}
}
//**************************************************************
// 修改密码函数
//**************************************************************
void xiugaimima()
{ uchar i,j,l,im,ib;
uchar t2[4];
uchar t3[4];
num=0;
lcd_xieping(1,0,"————————");
lcd_xieping(2,0,"请输入新密码: ");
lcd_xieping(3,0," ");
for(i=0;i<4;i++)
{
t2[i]=keyscan1();
lcd_xieping0(3,i,mima[num]);
num=0;
}
im=keyscan1();
if(im==12)//im,in,ib,同为确定键标志位
{
im=0;
num=0;
lcd_xieping(1,0,"————————");
lcd_xieping(2,0,"请再次输入新密码");
lcd_xieping(3,0," ");
for(i=0;i<4;i++)
{
t3[i]=keyscan1();
lcd_xieping0(3,i,mima[num]);
num=0;
}
}
ib=keyscan1();
if(ib==12)
{
ib=0;
num=0;
if(t2[0]==t3[0]&&t2[1]==t3[1]&&t2[2]==t3[2]&&t2[3]==t3[3])
{
t[0]=t3[0];
t[1]=t3[1];
t[2]=t3[2];
t[3]=t3[3];
lcd_xieping(1,0,"————————");
lcd_xieping(2,0," 祝贺您! ");
lcd_xieping(3,0," 密码修改成功 ");
flag=0;
for(j=0;j<4;j++)
{
l=j+1;
write(l,t[j]);
delay_ms(10);
}//24C08写数据
delay_ms(1000);
}
else
{
lcd_xieping(2,0,"两次输入密码不同");
lcd_xieping(3,0," 密码修改失败 ");
flag=1;
delay_ms(500);
}
}
}
//**************************************************************
// 显示函数
//**************************************************************
void xianshi()
{
donetime();
tempchange();
get_temp();
s_temp=f_temp*100;
temp0[7]=(s_temp/1000)+48;
temp0[8]=(s_temp%1000/100)+48;
temp0[10]=(s_temp%100/10)+48;
temp0[11]=(s_temp%10)+48;
lcd_xieping(0,0,"**密码锁系统** ");
lcd_xieping(1,0,temp0);
lcd_xieping(2,0,day);
lcd_xieping(3,0,time);
num=0;
}
//**************************************************************
// 开锁函数
//**************************************************************
void kaisuo()
{
uchar i;
lcd_xieping(2,0," 开锁中…… ");
lcd_xieping(3,0,"——耐心等待——");
for(i=3;i>0;i--)
{
FM=0;
delay_ms(100);
FM=1;
delay_ms(100);
flag=0;
}
dianjiZZ();
delay_ms(10000);
dianji_stop();
lcd_xieping(2,0,"—开锁过程结束—");
lcd_xieping(3,0," 请开门 ");
delay_ms(5000);
dianjiFZ();
delay_ms(10000);
dianji_stop();
flag=0;
}
//**************************************************************
// 主函数
//**************************************************************
void main()
{
uchar m;
unlock_i=1;
lcd_init(); //液晶初始化
//Init1302();
kjxs(); //开机显示
for(m=0;m<4;m++)
{
t[m]=read(m+1);
delay_ms(10);
}//24C08读数据
while(1)
{
reshi();
if(!unlock_i)
{
unlock();//解密函数
}
else
{
xianshi();//时间、日期、温度显示函数
}
if(flag==1)
{
num1=0;
a=keyscan2();
if(a==1)
{
kaisuo();//开锁函数
}
if(a==2)
{
xiugaimima();//修改密码函数
}
}
}
}
❼ 基于51单片机的蓝牙开关,共有8路继电器,有光耦隔离,但光耦需要20ma的电流,8路光耦接到p2口
光耦需要20ma的电流,又是8路光耦,你是用单片机直接驱动光耦的吗,这怎么可能都驱动起来呢。全部驱动需要160mA,任何一个单片机都不能办到,就是驱动器芯片也达不到这个要求,整个芯片的电流达160mA。只有ULN2003可以。
本来,单片机是不应该直接驱动光耦的。
另外,你这用是什么光耦,每一路需要20mA,不用这么大吧。
❽ 51单片机与蓝牙模块与手机传输数据
1)单片机与蓝牙模块连接调试好,通常都是通过串口连接;
2)单片机通过蓝牙模块与手机的握手连接及数据传输调试好;
3)单片机如果RAM的容量足够,可以不需要外扩内存,否则就需要外扩内存,以保存更多数据;