|
一個藍(lán)牙串口模塊,用51單片機(jī)通信。
0.png (44.62 KB, 下載次數(shù): 18)
下載附件
2018-6-1 01:42 上傳
單片機(jī)源程序如下:
- #include <intrins.h>
- #include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
- typedef unsigned int u16; //對數(shù)據(jù)類型進(jìn)行聲明定義
- typedef unsigned char u8;
- #define Data_0_time 4
- sbit rec = P2^1 ;
- sbit out=P2^0;
- u8 u8FLAG,k;
- u8 u8count,u8temp;
- u8 u8T_data_H,u8T_data_L,u8RH_data_H,u8RH_data_L,u8checkdata;
- u8 u8T_data_H_temp,u8T_data_L_temp,u8RH_data_H_temp,u8RH_data_L_temp,u8checkdata_temp;
- u8 u8comdata;
- u8 outdata[5]; //定義發(fā)送的字節(jié)數(shù)
- u8 indata[5];
- u8 count, count_r=0;
- u8 str[5]={"ok000"};
- u8 flag =0;
- u16 u16temp1,u16temp2;
- void SendData(u8 *a)
- {
- outdata[0] = a[0];
- outdata[1] = a[1];
- outdata[2] = a[2];
- outdata[3] = a[3];
- outdata[4] = a[4];
- count = 1;
- SBUF=outdata[0];
- }
- void Delay(u16 j)
- { u8 i;
- for(;j>0;j--)
- {
- for(i=0;i<27;i++);
- }
- }
-
- void Delay_10us(void)
- {
- u8 i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
-
- void COM(void)
- {
-
- u8 i;
-
- for(i=0;i<8;i++)
- {
-
- u8FLAG=2;
- while((!rec)&&u8FLAG++);
- Delay_10us();
- Delay_10us();
- Delay_10us();
- u8temp=0;
- if(rec)u8temp=1;
- u8FLAG=2;
- while((rec)&&u8FLAG++);
- //超時則跳出for循環(huán)
- if(u8FLAG==1)break;
- //判斷數(shù)據(jù)位是0還是1
-
- // 如果高電平高過預(yù)定0高電平值則數(shù)據(jù)位為 1
-
- u8comdata<<=1;
- u8comdata|=u8temp; //0
- }//rof
-
- }
- void RH(void)
- {
- //主機(jī)拉低18ms
- rec=0;
- Delay(180);
- rec=1;
- //總線由上拉電阻拉高 主機(jī)延時20us
- Delay_10us();
- Delay_10us();
- Delay_10us();
- Delay_10us();
- //主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號
- rec=1;
- //判斷從機(jī)是否有低電平響應(yīng)信號 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行
- if(!rec) //T !
- {
- u8FLAG=2;
- //判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號是否結(jié)束
- while((!rec)&&u8FLAG++);
- u8FLAG=2;
- //判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
- while((rec)&&u8FLAG++);
- //數(shù)據(jù)接收狀態(tài)
- COM();
- u8RH_data_H_temp=u8comdata;
- COM();
- u8RH_data_L_temp=u8comdata;
- COM();
- u8T_data_H_temp=u8comdata;
- COM();
- u8T_data_L_temp=u8comdata;
- COM();
- u8checkdata_temp=u8comdata;
- rec=1;
- //數(shù)據(jù)校驗(yàn)
-
- u8temp=(u8T_data_H_temp+u8T_data_L_temp+u8RH_data_H_temp+u8RH_data_L_temp);
- if(u8temp==u8checkdata_temp)
- {
- u8RH_data_H=u8RH_data_H_temp;
- u8RH_data_L=u8RH_data_L_temp;
- u8T_data_H=u8T_data_H_temp;
- u8T_data_L=u8T_data_L_temp;
- u8checkdata=u8checkdata_temp;
- }
- }
- }
- void UsartInit()
- {
- SCON=0X50; //設(shè)置為工作方式1
- TMOD=0X20; //設(shè)置計(jì)數(shù)器工作方式2
- PCON&=0X7f;
- TH1=0XFd;
- TL1=0XFd;
- ES=1; //打開接收中斷
- EA=1; //打開總中斷
- TR1=1; //打開計(jì)數(shù)器
- }
- void main()
- {
-
- UsartInit(); // 串口初始?
- //SendData(str) ; //發(fā)送到串口
- Delay(1); //延時100US(12M晶振)
- while(1)
- {
-
- if(flag==1)
- {out=!out;
- flag=0;
- }
- if(flag==2)
- {
- RH();
- str[0]=u8RH_data_H;
- str[1]=u8RH_data_L;
- str[2]=u8T_data_H;
- str[3]=u8T_data_L;
- str[4]=u8checkdata;
- SendData(str) ; //發(fā)送到串口
- Delay(20000);
- flag=0;
- }
- }
- }
- /*******************************************************************************
- 串口通信中斷函數(shù)
- *******************************************************************************/
- void Usart() interrupt 4
- {
- if(RI==1)
- {
- u8 receiveData;
- receiveData=SBUF;
- if(receiveData==0)flag=1;
- else if(receiveData==1)flag=2;
- RI = 0;//清除接收中斷標(biāo)志位
- }
-
- if(TI==1) //發(fā)送中斷
- {
- TI=0;
- if(count!=5) //發(fā)送完5位數(shù)據(jù)
- {
- SBUF= outdata[count];
- count++;
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
51單片機(jī)藍(lán)牙控制.zip
(71.21 KB, 下載次數(shù): 49)
2018-5-31 21:23 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|