❶ 藍牙與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的容量足夠,可以不需要外擴內存,否則就需要外擴內存,以保存更多數據;