一个蓝牙串口模块,用51单片机通信。
单片机源程序如下:
- #include <intrins.h>
- #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
- typedef unsigned int u16; //对数据类型进行声明定义
- 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]; //定义发送的字节数
- 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循环
- if(u8FLAG==1)break;
- //判断数据位是0还是1
-
- // 如果高电平高过预定0高电平值则数据位为 1
-
- u8comdata<<=1;
- u8comdata|=u8temp; //0
- }//rof
-
- }
- void RH(void)
- {
- //主机拉低18ms
- rec=0;
- Delay(180);
- rec=1;
- //总线由上拉电阻拉高 主机延时20us
- Delay_10us();
- Delay_10us();
- Delay_10us();
- Delay_10us();
- //主机设为输入 判断从机响应信号
- rec=1;
- //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
- if(!rec) //T !
- {
- u8FLAG=2;
- //判断从机是否发出 80us 的低电平响应信号是否结束
- while((!rec)&&u8FLAG++);
- u8FLAG=2;
- //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
- while((rec)&&u8FLAG++);
- //数据接收状态
- 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;
- //数据校验
-
- 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; //设置为工作方式1
- TMOD=0X20; //设置计数器工作方式2
- PCON&=0X7f;
- TH1=0XFd;
- TL1=0XFd;
- ES=1; //打开接收中断
- EA=1; //打开总中断
- TR1=1; //打开计数器
- }
- void main()
- {
-
- UsartInit(); // 串口初始?
- //SendData(str) ; //发送到串口
- 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) ; //发送到串口
- Delay(20000);
- flag=0;
- }
- }
- }
- /*******************************************************************************
- 串口通信中断函数
- *******************************************************************************/
- void Usart() interrupt 4
- {
- if(RI==1)
- {
- u8 receiveData;
- receiveData=SBUF;
- if(receiveData==0)flag=1;
- else if(receiveData==1)flag=2;
- RI = 0;//清除接收中断标志位
- }
-
- if(TI==1) //发送中断
- {
- TI=0;
- if(count!=5) //发送完5位数据
- {
- SBUF= outdata[count];
- count++;
- }
- }
- }
复制代码
所有资料51hei提供下载:
51单片机蓝牙控制.zip
(71.21 KB, 下载次数: 49)
|