单片机学习-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");
}
}