天天看点

2021-10-25

蓝牙控制单片机小灯亮灭(51)

我是一个初学的,在学51。板子用的是清祥电子51AVR单片机最小系统那个板子,然后做的是蓝牙控制小灯亮灭。因为是初学,一开始有很多的困惑都没解决,不多说了,先说说我的经历。

我用的是hc-06的蓝牙模块,然后就是用的普中科技的PZ-ISP这个串口调试助手,首先蓝牙模块的VCC,GND与单片机的相连,然后就是蓝牙模块的RXD连接单片机的RXD,蓝牙模块的TXD连接单片机的TXD,

2021-10-25

然后就打开串口调试助手,把波特率调到9600,然后打开串口,在发送区输入AT然后加上换行,

2021-10-25

再点击发送,如果接收区收到ok就表示🉑了。然后输入AT+BAUD4(将波特率改成9600),

2021-10-25

这里我想跟大家讲一下,串口调的是蓝牙的波特率,我们在keil上面写的文件里面的内容才是去修改单片机波特率的。输入完之后,显示OK,就表示可以了。接下来就是文件部分了。

我用的是keil5然后具体就如下

#include <reg51.h>
unsigned char k;
typedef unsigned int u16;
sbit led1=P1^0;
sbit led2=P1^1;
void InitUART(void)
{    TMOD = 0x20;  
  SCON = 0x50;   
   TH1 = 0xF3;   
    TL1 = 0xF3;   
     PCON = 0x00;    
     EA = 1;    
     ES = 1;   
      TR1 = 1;}
      void delay(u16 i)
      {    unsigned char j;  
        for(i; i > 0; i--)        
           for(j = 255; j > 0; j--);}
           void main(void)
           {		k=0; 
              InitUART();	
              while(1)
              	{		
              	if(k==0)	
              		{		
              			led1=0;		
              				led2=1;		
              				}		else if (k==1)		
              				{		
              					led1=1;		
              						led2=0;;		}		
              						else if (k==2)		
              						{			led1=1;			led2=1;	}	
              							else 		{			led1=1;			led2=1;		}	
              							}
              							}
  void UARTInterrupt(void) interrupt 4
  {    if(RI)   
   {        RI = 0;	
   	k++;		
   	if(k>2)		
   		k=0;    }    
   		else        TI = 0;}
           

这个图我是根据发送数据的次数去控制小灯的亮灭的,我也是看了很多博主的文章去琢磨的(我才学不是很会)。

#include "reg52.h"			
typedef unsigned int u16;	 
 typedef unsigned char u8;
 u8 receivedata;
 sbit led1=P1^0;
 sbit led2=P1^1;
 sbit led3=P1^2;
 void UsartInit()
 {	
 SCON=0X50;			//设置为工作方式1	
 TMOD=0X20;			//设置计数器工作方式2	
 PCON=0X80;			//波特率加倍	
 TH1=0XFA;				//计数器初始值设置,注意波特率是9600的	
 TL1=0XFA;	
 ES=1;						//打开接收中断	
 EA=1;						//打开总中断	
 TR1=1;					//打开计数器}
 void main()
 {		
 UsartInit();  //	串口初始化	
 while(1);		}
 void contrl()
 {	if(receivedata=='1')	
 {		led1=0;	}	
 if(receivedata=='2')	{		led2=0;	}	
 if(receivedata=='3')	{		led3=0;	}	
 if(receivedata=='4')	{		led1=~led1;	}	if(receivedata=='5')	{		led2=~led2;	}	if(receivedata=='6')	{		led3=~led3;	}	if(receivedata=='7')	{		P1=0xf0;	}	if(receivedata=='8')	{		P1=0xff;	}
 }
 void Usart() interrupt 4
 {	receivedata=SBUF;//出去接收到的数据	
 RI = 0;	
 SBUF=receivedata;//将接收到的数据放入到发送寄存器	contrl();	
 while(!TI);			 //等待发送数据完成	TI=0;						 //清除发送完成标志位}
           

这一个程序是根据发送的具体的数字去判断小灯的亮灭,要写这个程序可以先去把串口通信那些学了,之前我一直都没搞懂怎么样才可以收到具体数值然后去让小灯亮灭,其实最主要就是里面的接受数据那里,我在这里定义了一个全局变量receivedata,然后让中断函数里面SBUF接受的数据和receivedata相等,最后控制函数里面引用的时候就是你发送的数据。(我表述可能不太清楚,但大概是这个样子,多多指教。)

继续阅读