51单片机学习-HC-05蓝牙模块-LCD12864显示

简介: 51单片机学习-HC-05蓝牙模块-LCD12864显示

单片机学习-HC-05蓝牙模块-LCD12864显示

简介

1.硬件部分
HC-05蓝牙模块 STC12C5A60S2(51系列单片机) LCD12864
2.软件部分
Keil软件 串口调试软件

硬件部分

蓝牙模块

蓝牙HC05是主从一体的蓝牙串口模块,简单的说,当蓝牙设备与蓝牙设备配对连接成功后,我们可以忽视蓝牙内部的通信协议,直接将将蓝牙当做串口用。当建立连接,两设备共同使用一通道也就是同一个串口,一个设备发送数据到通道中,另外一个设备便可以接收通道中的数据。
在这里插入图片描述

调试部分(百度搜索)

AT指令集调试配置

软件部分

/*-----------------------------------------------------------------------------
* 实 验 名         : HC05蓝牙模块LCD12864显示
* 实验说明     : 普中单片机蓝牙串口接收数据控制灯亮灭和LCD12864显示
* 连接方式     : 
* 注    意         : 该试验使用的晶振是12MHZ
*******************************************************************************/

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int


#define jingzhen     12000000UL             /*使用12.0M晶体*/    
#define botelv   4800UL                   /*波特率定义为4800*/

uchar PuZh[] = "www.1234567890.com";

//--定义使用的IO--//
 /**********************************************************************************************************
                    端口定义
************************************************************************************************************/

sbit RS=P2^6; //命令/数据选择  
sbit RW=P2^5;  //读写口 
sbit  E=P2^7;      //锁存控制  
sbit RES = P2^0; 
sbit PSB = P2^2;

sbit LED1=P2^3;
sbit LED2=P2^4;




//--声明全局函数--//   
void UsartConfiguration();
void Delay_1ms(uint i);
void delay(unsigned int time);

void DELAY_nUS(unsigned int Time);

void DELAY_nMS(unsigned int time);


/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms
* x * 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
   
   
  uchar x,j;

  for(j=0;j<i;j++)
    for(x=0;x<=148;x++);
}

void DELAY_nMS(unsigned int time)
{
   
   
  unsigned int  i,j;             
  for(i=0;i<time;i++)    
     for(j=0;j<939;j++); 
}

void DELAY_nUS(unsigned int Time)
{
   
   
    while(--Time);
}


void delay(unsigned int time)              //int型数据为16位,所以最大值为65535            
 {
   
                                              //0.1ms
   unsigned int  i,j;                  //定义变量i,j,用于循环语句 
   for(i=0;i<time;i++)         //for循环,循环50*time次
     for(j=0;j<50;j++);       //for循环,循环50次
 }

 /**********************************************************
LCD12864部分

 *************************************************************/
 void checkbusy(void)           
{
   
   
   RS=0;                   
   RW=1;                  
   E=1;                    
   while((P0&0x80)==0x80); 
   E=0;                   
}

void wcode(unsigned char cmdcode)
{
   
   
   checkbusy();           
   RS=0;                   
   RW=0;                   
   E=1;                  
   P0=cmdcode;            
   delay(10);               
   E=0;                    
}
void wdata(unsigned char dispdata)
{
   
   
   checkbusy();           
   RS=1;                  
   RW=0;                  
   E=1;                   
   P0=dispdata;           
   delay(10);              
   E=0;                    
}


void LCD12864_InitLCD(void)
   {
   
   
         PSB=1;            
         RES=0;
         delay(10);         
         RES=1;             
         wcode(0x30);       
         wcode(0x0c);       
         wcode(0x01);       
         wcode(0x06);           
}  

void LCD12864_Display_Char(unsigned char x,unsigned char y,unsigned char  Char)   
{
   
                                       
  switch(y)                              
     {
   
    
            case 0: wcode(0x80+x);break;    //第1行
        case 1: wcode(0x90+x);break;    //第2行
        case 2: wcode(0x88+x);break;    //第3行
        case 3: wcode(0x98+x);break;    //第4行
      default:break;
       }
     wdata(Char);


}

void LCD12864_Display_String(unsigned char x,unsigned char y,unsigned char  *s)   
{
   
                                       
 switch(y)                                     
     {
   
    
            case 0: wcode(0x80+x);break;   
            case 1: wcode(0x90+x);break;    
            case 2: wcode(0x88+x);break;   
            case 3: wcode(0x98+x);break;    
                default:break;
     }
   while(*s>0)                        
     {
   
     
                wdata(*s);                     
                delay(10);                     
                s++;                         
     }
}

void LCD12864_Display_UnsignedInt(unsigned char x,unsigned char y,unsigned int Number,unsigned char Count)
{
   
   
    unsigned char NumbArray[6]={
   
   0};    

    NumbArray[0]=(Number/10000)%10+0x30; 
    NumbArray[1]=(Number/1000) %10+0x30;
    NumbArray[2]=(Number/100)  %10+0x30;
    NumbArray[3]=(Number/10)   %10+0x30;
    NumbArray[4]=(Number/1)    %10+0x30; 
    NumbArray[5]= 0;

    LCD12864_Display_String(x,y,&NumbArray[5-Count]);
}


void Display_SignedInt(unsigned char x,
                       unsigned char y,
                       signed int Number,
                       unsigned char Count)
{
   
   
    unsigned char NumberArray[7]={
   
   0};    
    signed int Number_Temp;

    Number_Temp = Number;
    if(Number_Temp<0)
    {
   
   
        Number_Temp = 0 - Number_Temp;
    }

    NumberArray[0]='+'; 
    NumberArray[1]=(Number_Temp/10000)%10+0x30; 
    NumberArray[2]=(Number_Temp/1000) %10+0x30;
    NumberArray[3]=(Number_Temp/100)  %10+0x30;
    NumberArray[4]=(Number_Temp/10)   %10+0x30;
    NumberArray[5]=(Number_Temp/1)    %10+0x30;
    NumberArray[6]=0;

    if(Number>0)
    {
   
   
        NumberArray[5-Count] = '+';
    }
    else
    {
   
   
        NumberArray[5-Count] = '-';
    }

    LCD12864_Display_String(x, y, &NumberArray[5-Count]);
}



/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无 * 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4
{
   
   
    uchar i;
  uchar receive_data;

  EA = 0;

  if(RI == 1) //当硬件接收到一个数据时,RI会置位
    {
   
            
            RI = 0;
            receive_data = SBUF;//接收到的数据

        if(receive_data == '1')     
        {
   
   
                LED1=0;
              DELAY_nMS(200);
              LED1=1;
              DELAY_nMS(200);
              LCD12864_Display_String(0,1,"led1");
              DELAY_nMS(500);
              wcode(0x01);
                LED2=1;
              DELAY_nMS(200);
              LED2=0;
              DELAY_nMS(200);
              LCD12864_Display_String(0,2,"led2");
              DELAY_nMS(500);
              wcode(0x01);
        }
        else if(receive_data == '2')     
        {
   
   
              LED2=1;
              DELAY_nMS(200);
              LED2=0;
              DELAY_nMS(200);
              LCD12864_Display_String(8,2,"led2");
              DELAY_nMS(500);
              wcode(0x01);
                LED1=0;
              DELAY_nMS(200);
              LED1=1;
              DELAY_nMS(200);
              LCD12864_Display_String(8,1,"led1");
              DELAY_nMS(500);
              wcode(0x01);


        }
        else 
        {
   
   
             LCD12864_Display_String(0,3,"error");
             DELAY_nMS(500);
             wcode(0x01);
        }

    }

        for(i=0; i<36; i++)
        {
   
   
            SBUF = PuZh[i];   //将要发送的数据放入到发送寄存器
            while(!TI);            //等待发送数据完成
            TI=0;                    //清除发送完成标志位
            Delay_1ms(1);
        }
        EA = 1;
}

/*******************************************************************************
* 函 数 名       : UsartConfiguration()
* 函数功能           : 设置串口
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/


void  UsartConfiguration(void)                //串口初始化
{
   
   
         EA=0;            //暂时关闭中断
         TMOD&=0x0F;      //定时器1模式控制在高4位
         TMOD|=0x20;      //定时器1工作在模式2,自动重装模式
         SCON=0x50;       //串口工作在模式1
         TH1=256-jingzhen/(botelv*12*16);  //计算定时器重装值
         TL1=256-jingzhen/(botelv*12*16);
         PCON|=0x80;    //串口波特率加倍
         ES=1;         //串行中断允许
         TR1=1;        //启动定时器1
         REN=1;        //允许接收 
         EA=1;         //允许中断
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能           : 主函数
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/

void main()
{
   
   

    UsartConfiguration();//初始化串口
    LCD12864_InitLCD();
    //LCD12864_Display_String(0,1,"test");
    while(1)
    {
   
   
        //LCD12864_Display_String(0,0,"test");
    }
}
目录
相关文章
|
6月前
|
芯片
毕业设计 基于51单片机的手机蓝牙控制8位LED灯亮灭设计
毕业设计 基于51单片机的手机蓝牙控制8位LED灯亮灭设计
|
4月前
蓝桥杯之单片机学习(终)——关于之前文章的错误及更正(附:第十四届蓝桥杯单片机赛题)
蓝桥杯之单片机学习(终)——关于之前文章的错误及更正(附:第十四届蓝桥杯单片机赛题)
|
5月前
|
物联网 Linux 芯片
学习嵌入式是选择单片机还是Linux?
单片机通常指的是一种集成了处理器、存储器和各种外设接口的微控制器芯片,常见的有STC、51系列、AVR、ARM Cortex-M等。单片机具有低成本、低功耗、实时性强等特点,适用于对资源要求较低、功耗要求较低、实时性要求较高的嵌入式系统。学习单片机开发可以让您深入了解嵌入式系统的底层原理和硬件编程,对于对嵌入式系统底层开发感兴趣的人来说,是一个很好的选择。
138 4
|
6月前
|
语音技术 物联网 程序员
51单片机智能小车(循迹、跟随、避障、测速、蓝牙、wifie、4g、语音识别)总结-2
51单片机智能小车(循迹、跟随、避障、测速、蓝牙、wifie、4g、语音识别)总结-2
51单片机智能小车(循迹、跟随、避障、测速、蓝牙、wifie、4g、语音识别)总结-2
|
6月前
|
语音技术 传感器
51单片机智能小车(循迹、跟随、避障、测速、蓝牙、wifie、4g、语音识别)总结-1
51单片机智能小车(循迹、跟随、避障、测速、蓝牙、wifie、4g、语音识别)总结-1
51单片机智能小车(循迹、跟随、避障、测速、蓝牙、wifie、4g、语音识别)总结-1
|
6月前
|
C++
【51单片机】添加模块代码的常见问题(图示&代码演示)
【51单片机】添加模块代码的常见问题(图示&代码演示)
|
6月前
|
存储 搜索推荐 IDE
新手如何快速上手学习单片机?
新手如何快速上手学习单片机?
124 0
|
6月前
|
存储 编译器 C语言
单片机学习之路一些常见的疑问也是我的个人学习总结
单片机学习之路一些常见的疑问也是我的个人学习总结
132 0
|
6月前
|
C语言
###51单片机学习-----如何通过C语言运用延时函数设计LED流水灯
###51单片机学习-----如何通过C语言运用延时函数设计LED流水灯
277 0
|
存储 开发框架 前端开发
单片机与HC-05蓝牙模块通信
单片机与HC-05蓝牙模块通信
157 0