/***********************************
串口蓝牙接法
RXD -> P3.1
TXD -> P3.0
18B20接P2.2(见ds18b20.h头文件)
************************************/
#include<reg51.h>
#include<intrins.h>
#include<stdlib.h>
#include"ds18b20.h"
#define uint unsigned int
#define uchar unsigned char
sbit led1 = P1^0;
sbit led2 = P1^1;
sbit led3 = P1^2;
sbit led4 = P1^3;
sbit s4 = P3^2; //开关触发外部中断0
sbit s5 = P3^3; //开关触发外部中断1
sbit lcden=P3^4;
sbit lcdrw=P3^6;
sbit lcdrs=P3^5;
//sbit psb=P3^1; //串并方式控制
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
uchar shi,ge; //分离成十位和个位
uchar i,j,t,count,rec=0; //count是定时器1计数变量/rec是接收变量
bit flag,open_flag,close_flag,end_flag;//标志/open标志/close标志/串口结束标志
uchar SenData[10],Sentmp[10]; //接收字符串/暂存字符串
uchar tmp[3];
uchar dis1[]="温度测试程序V1.7"; //第一行显示
uchar code dis2[]={"温度: "}; //第二行显示
uchar code dis3[]={"接收: "}; //第三行显示
uchar code dis4[]={"模式: "}; //第四行显示
uchar dis5[]={"HIGH"}; //温度报警显示
uchar close[]={"掉电模式"};
uchar open[]={"运行模式"};
uchar clear[]={" "};
uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//0-9
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/*写指令(命令)到LCD*/
void write_cmd(uchar cmd)
{
lcdrs=0;
lcdrw=0;
lcden=0;
P0=cmd;
delayms(5);
lcden=1;
delayms(5);
lcden =0;
}
/*写显示数据到LCD*/
void write_dat(uchar dat)
{
lcdrs=1;
lcdrw=0;
lcden=0;
P0=dat;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
/*写显示数据到LCD的第x行第y列*/
void gotoxy(uchar x,uchar y)
{
uchar pos;
if(x==0)
x=0x80;
else if(x==1)
x=0x90;
else if(x==2)
x=0x88;
else if(x==3)
x=0x98;
pos=x+y;
write_cmd(pos);
}
void lcd_init()
{
//psb=1; //并口方式
write_cmd(0x30);
delayms(5);
write_cmd(0x0c); //显示开,关光标
delayms(5);
write_cmd(0x01); //清屏
delayms(5);
}
void keyscan()
{
/*********************
if(s4==0)
{
delayms(5);
if(s4==0)
{
//beep=0; //蜂鸣器响
while (!s4); //按键释放确认
//beep=1; //蜂鸣器关
}
}*/
if(s5==0)
{
delayms(5);
if(s5==0)
{
led1=0;
led2=0;
led3=0;
led4=0;
while(!s5);
led1=1;
led2=1;
led3=1;
led4=1;
}
}
}
void init()
{
TMOD = 0x21; // 定时器1工作于8位自动重载模式, 用于产生波特率 0010
TH1 = 0xFD; //11.0592MHZ晶振 波特率9600
TL1 = 0xFD;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
SCON = 0x50; // 设定串行口工作方式 0101 0000
//SM0=0;SM1=1;REN=1;
PCON &= 0xef; // 波特率不倍增 1110 1111
TR0 = 1;
TR1 = 1; // 启动定时器1
ES = 1;
EA = 1;
EX0 = 1;
EX1 = 1;
ET0 = 1;
//IE = 0x00; // 禁止任何中断
}
void main()
{
uchar i;
init();
lcd_init();
while(1)
{
keyscan();
gotoxy(0,0);
i=0;
while(dis1[i]!='\0')
{
write_dat(dis1[i]);
i++;
}
gotoxy(1,0); //显示第二行第一个字符
i=0;
while(dis2[i]!='\0')
{
write_dat(dis2[i]);
i++;
}
gotoxy(2,0);
i=0;
while(dis3[i]!='\0')
{
write_dat(dis3[i]);
i++;
}
gotoxy(3,0);
i=0;
while(dis4[i]!='\0')
{
write_dat(dis4[i]);
i++;
}
/***********读取一次温度数据**************************/
ReadTemp();
if((b&0xf8)!=0x00)//判断高五位 得到温度正负标志
{
fuhao=1;
a=~a; //低4位取反
b=~b; //高4位取反
tltemp=a+1; //低位加1
a=tltemp;
if(tltemp>255) b++; //如果低8位大于255,向高8位进1
temp_value=b*16+a/16; //实际温度值=(b*256+a)/16,即:b*16+a/16
//这样得出的是温度的整数部分,小数部分被丢弃了
}
else fuhao=0;
/*******************写符号***************************/
if(fuhao==1)
{
gotoxy(1,3);
write_dat(0x2d); //写'-'
shi=temp_value/10;
ge=temp_value%10;
write_dat(0x30+shi);
write_dat(0x30+ge);
}
else
{
gotoxy(1,3);
write_dat(0x2b); //写'+'
shi=temp_value/10;
ge=temp_value%10;
write_dat(0x30+shi);
write_dat(0x30+ge);
}
/**************温度判断*********************/
if(temp_value>=temp_max)
{
beep = 1;
gotoxy(1,5);
i=0;
while(dis5[i]!='\0')
{
write_dat(dis5[i]);
i++;
}
}
else
{
//beep = 0;
gotoxy(1,5);
i=0;
//while(clear[i]!='\0')
while(i<5)
{
write_dat(clear[i]);
i++;
}
}
/************串口判断*********************/
if (flag==1)
{
ES=0;
if(fuhao==1)
tmp[0] = 0x2d;
else tmp[0] = 0x2b;
tmp[1] = 0x30+shi;
tmp[2] = 0x30+ge;
for(i=0;i<3;i++) //发送字符串
{
SBUF=tmp[i];
while(!TI);
TI=0;
}
SBUF=0x0d; //发送回车
while(!TI);
TI=0;
flag=0;
ES=1;
/*每隔一段时间清一次接收数据
gotoxy(2,3);
i=0;
while(clear[i]!='\0')
{
write_dat(clear[i]);
i++;
}*/
gotoxy(2,3);
i=0;
while(SenData[i]!='\0')
{
write_dat(SenData[i]);
i++;
}
//write_dat(SenData);
}
/*************模式判断**********************/
if(open_flag==1&&close_flag==0)
{
gotoxy(3,3);
i=0;
while(open[i]!='\0')
{
write_dat(open[i]);
i++;
}
}
else if(close_flag==1&&open_flag==0)
{
gotoxy(3,3);
i=0;
while(close[i]!='\0')
{
write_dat(close[i]);
i++;
}
PCON = 0x02;
}
/*
if(*SenData == "clear")
{
gotoxy(3,3);
i=0;
while(clear[i]!='\0')
{
write_dat(clear[i]);
i++;
}
PCON = 0x01;
}*/
}
}
void S4_INT0() interrupt 0
{
open_flag=1;
close_flag=0;
PCON = 0;
}
void S5_INT1() interrupt 2
{
//PCON = 0x02;
open_flag=0;
close_flag=1;
}
void timer() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
rec=0;
//for(j=0;j<10;j++)
// Sentmp[j]=0x20;
}
}
/****************************************************
串口中断程序(能接收字符串)
******************************************************/
void ser(void) interrupt 4
{
//if(RI == 1) //RI接受中断标志
//{
if(rec==0)
{
for(j=0;j<10;j++)
SenData[j]=clear[j];
rec++;
}
if(rec!=0&&rec<=10)
{
RI = 0; //清除RI接受中断标志
SenData[rec-1] = SBUF; //SUBF接受/发送缓冲器
//SenData[rec]=Sentmp[rec];
flag=1;
rec++;
}
//}
/************************
RI=0;
t=0;
SenData[t]=SBUF;
for(t=0;t<4;t++)
SenData[t+1]=SenData[t];
flag=1;
*/
}
51单片机基于HC-06的蓝牙串口通信(12864液晶显示)
3星 · 超过75%的资源 需积分: 39 133 浏览量
2016-07-14
18:03:53
上传
评论 7
收藏 41KB RAR 举报
Peng711
- 粉丝: 132
- 资源: 12
最新资源
- 操作简单的Mongodb网页web管理工具,基于Spring Boot2.0支持mongodb集群.zip
- tms-mongodb-web,提供访问mongodb数据的REST API和可灵活扩展的mongodb web 客户端.zip
- SpringBoot整合mongodb学习MongoTemplate和MongoRepository两种方式CRUD使用.zip
- SpringBoot整合MongoDB实现对数据库的CRUD小demo.zip
- Python操作MongoDB数据库的基本一些操作 .zip
- NOSQL数据库监控工具,目前实现了对Redis、MongoDB的监控功能 .zip
- mongoDB数据库的增删改查,以及所需要的配置.zip
- mongodb数据库idea测试.zip
- koa 分别 连接 mysql、mongodb数据库操作.zip
- 基于pytorch实现的人体部件分割源码+模型.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈