#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
/********************
#define xw P2//数码管选位
#define xs P0//数码管数据位
**********************/
sbit lykz=P3^3;//蓝牙控制位 0继电器吸合 蓝牙得电
/***************************
uchar code xsb[11]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0xff}; //共阳数码管
***************************/
bit lyflag=0;//蓝牙标志位 为1时可查询时间或温度
bit fsflag=0;//发送标志位 使串口只发送一次数据
bit jieshouflag=0;//接收标志位 为1时可接收来自从机的数据
uchar wbwdshuju[5];//存放来自从机的温度 第一位为校验位 后四位分别为温度数值
void zhujicsh();//主机初始化
void lychaxun();//蓝牙查询子程序
void clshuju();//处理来自从机的数据子程序
uchar wblyshuju,zja,cja;//存放蓝牙数据 主机a 使得主机发送4次温度值到蓝牙 从机a 同主机a
uchar p=0,sjnum,lymiao;//p为存放从机温度时 存放在那一位 sjnum为定时器溢出次数 ly_miao即几秒
/*********lcd***********/
#define sjk P0 //数据口
sbit RS=P1^7;
sbit RW=P1^6;
sbit E=P2^4;
void lcd_init();//初始化lcd
void lcd_w_cmd(uchar com);//写命令字
void lcd_w_dat(uchar dat);//写数据
bit lcd_r_cmd();//读命令字
void ys1ms(uchar t);//延时t*1ms
uchar wd_disp4[6];
uchar code sjb_disp1[13]={"0123456789: ."};//显示数据表
void ys1ms(uchar x)//延时t*1ms
{
uchar q;
while(x--)
{
for(q=0;q<10;q++);
}
}
void lcd_init()//初始化lcd
{
lcd_w_cmd(0x3c);//设置工作方式 8位数据口 2行 5*7
lcd_w_cmd(0x0e);//设置显示状态 开显示 显示光标 光标位字符不闪烁
lcd_w_cmd(0x01);//清零
lcd_w_cmd(0x06);//设置输入方式 增量方式右移 不移位
lcd_w_cmd(0x80);//从80H地址开始显示
}
bit lcd_r_cmd()//读命令字
{
bit resule;
RS=0;
RW=1;
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
resule=(bit)(sjk&0x80);
E=0;
return(resule);
}
void lcd_w_cmd(uchar com)//写命令字
{
uchar k;
do//查lcd是否处于“忙”
{
k=lcd_r_cmd();//读取读状态字
k=k&0x80;//留下最高位
ys1ms(15);
} while(k!=0);//判断lcd是否忙 忙则继续查询 否则退出循环
RW=0;//写
ys1ms(1);
RS=0;//命令字
ys1ms(1);
E=1;
ys1ms(1);
sjk=com;
ys1ms(1);
E=0;
ys1ms(1);
RW=1;
ys1ms(15);
}
void lcd_w_dat(uchar dat)//写数据
{
uchar k;
do//查lcd是否处于“忙”
{
k=lcd_r_cmd();//读取读状态字
k=k&0x80;//留下最高位
ys1ms(15);
} while(k!=0);//判断lcd是否忙 忙则继续查询 否则退出循环
RW=0;//写
ys1ms(1);
RS=1;//数据
ys1ms(1);
E=1;
ys1ms(1);
sjk=dat;
ys1ms(1);
E=0;
ys1ms(1);
RW=1;
ys1ms(15);
}
void zhujicsh()
{
EA=1; //开启总中断
ES=1;//开启串口中断
ET0=1;
TMOD=0X21;//选择方式2
SCON=0X50;//设置串口
TH1=0xfd;//设置初值
TL1=0xfd;
TH0=15536/256;
TL0=15536%256;
TR0=1;
TR1=1;//开启定时器1 产生波特率
lykz=1;
}
void main()
{
uchar i;
zhujicsh();//初始化
sjk=0xff;//复位
lcd_init();//初始化
while(1)
{
lychaxun();//查询蓝牙
clshuju();//处理从机数据
if(wbwdshuju[1]==0)
wd_disp4[0]=sjb_disp1[11];
else
wd_disp4[0]=sjb_disp1[wbwdshuju[1]];//百位
wd_disp4[1]=sjb_disp1[wbwdshuju[2]];//十位
wd_disp4[2]=sjb_disp1[wbwdshuju[3]];//个位
wd_disp4[3]=sjb_disp1[12];//一个点
wd_disp4[4]=sjb_disp1[wbwdshuju[4]];//小数
wd_disp4[5]=0xdf;//显示°
lcd_w_cmd(0xc2);//定位光标位第二行第三列
ys1ms(15);
for(i=0;i<6;i++)//送出字符显示
{
lcd_w_dat(wd_disp4[i]);
ys1ms(15);
}
/***************************
if(wbwdshuju[1]==0)
{
xw=0xfe;
xs=0xff;
}
else
{
xw=0xfe;
xs=xsb[wbwdshuju[1]];//百位温度
}
ys1ms(1);
xw=0xfd;
xs=xsb[wbwdshuju[2]];//十位温度
ys1ms(1);
xw=0xfb;
xs=xsb[wbwdshuju[3]]&0x7f;//个位温度 0x7f是一个点
ys1ms(1);
xw=0xf7;
xs=xsb[wbwdshuju[4]];//小数
ys1ms(1);
xw=0xef;
xs=0x9c;//显示°
ys1ms(1);
/***************************/
}
}
void clshuju()//处理从机数据
{
if(jieshouflag==1)
{
if(wbwdshuju[p]==0xaa)//校验位 第一位若为0xaa 则下面为温度值
{
p=1;//把存放温度数据移到第二位
jieshouflag=0;//关闭从机接收位 等待下次发送
}
else
{
if(p>=1&&p<5)//存放温度
{
p++;
jieshouflag=0;//关闭从机接收位 等待下次发送
}
else
{
p=0;//把存放温度数据再次移到第一位
jieshouflag=0;//关闭从机接收位 等待下次发送
lykz=0;//打开蓝牙控制
lyflag=1;//开启蓝牙接收
}
}
}
}
void lychaxun()//查询蓝牙
{
if(lyflag==1)
{
if(fsflag==1)
{
if(wblyshuju==0xfe)//查询主机温度 依次发送4次数据
{
if(zja==0)
SBUF=0;
if(zja==1)
SBUF=4;
if(zja==2)
SBUF=1;
if(zja==3)
{
SBUF=2;
fsflag=0;
}
}
if(wblyshuju==0xfd)//查询从机温度
{
if(cja==0)
SBUF=wbwdshuju[1];
if(cja==1)
SBUF=wbwdshuju[2];
if(cja==2)
SBUF=wbwdshuju[3];
if(cja==3)
{
SBUF=wbwdshuju[4];
fsflag=0;
}
}
}
}
}
void dsq0()interrupt1
{
if(lyflag==1)
{
TH0=15536/256;
TL0=15536%256;
sjnum++;
if(sjnum>=20)
{
sjnum=0;
lymiao++;
if(lymiao>=10)
{
lykz=1;//蓝牙控制位关闭
lymiao=0;//清零
lyflag=0;//关闭蓝牙查询
}
}
}
}
void ck()interrupt4
{
if(RI==1)
{
RI=0;
fsflag=1;//发送标志位 发送一次
jieshouflag=1;//允许接收
wbwdshuju[p]=SBUF;//把从机发送过来的数据依次存放到数组
wblyshuju=wbwdshuju[p];//存放蓝牙数据
}
else
{
TI=0;
if(wblyshuju==0xfe)
{
zja++;//若收到该命令 则依次发送4个数据
if(zja==4)
zja=0;
}
if(wblyshuju==0xfd)
{
cja++;//若收到该命令 则依次发送4个数据
if(cja==4)
cja=0;
}
}
}