51单片机解析卫星定位数据源码+DHT11,1602显示
文章图片
什么都不多说,直接看代码:
#include
#include
#include
////////////========================================================================================/*
1602A(16*2)模拟口线接线方式
连接线图:
---------------------------------------------------
|LCM-----51|LCM-----51|LCM------51|
--------------------------------------------------|
|DB0-----P0.0 |DB4-----P0.4 |RW-------P1.5|
|DB1-----P0.1 |DB5-----P0.5 |RS-------P1.4|
|DB2-----P0.2 |DB6-----P0.6 |E--------P1.6|
|DB3-----P0.3 |DB7-----P0.7 |V0接10K电阻到GND |
---------------------------------------------------
温湿度DHT11接线:模块data接P3^2
******************/
sbit Data= https://www.it610.com/article/P3^2;
//定义数据线温湿度传感器DHT11数据接入
unsigned char rec_dat[9];
//用于显示的接收数据数组unsigned charflag_rec=0;
unsigned charnum_rec=0;
unsigned char code kaijihuamian[]="BeiDou_DHT11";
//开机显示
unsigned char code kaijihuamian2[]="AnShan_17-12-01";
unsigned char code receiving[]="Receiving!";
unsigned char code nodata[]="No BD data!";
unsigned char code LCD_161[]="BD_HeGuang Studios";
unsigned char code LCD_162[]="TEL:15117255049";
char code TIME_AREA= 8;
//时区
unsigned char flag_data;
//数据标志位//BD数据存储数组
unsigned char JD[10];
//经度
unsigned char JD_a;
//经度方向
unsigned char WD[9];
//纬度
unsigned char WD_a;
//纬度方向
unsigned char date[6];
//日期
unsigned char time[6];
//时间
unsigned char time1[6];
//时间
unsigned char speed[5]={'0','0','0','0','0'};
//速度
unsigned char high[6];
//高度
unsigned char angle[5];
//方位角
unsigned char use_sat[2];
//使用的卫星数
unsigned char total_sat[2];
//天空中总卫星数
unsigned char lock;
//定位状态//串口中断需要的变量
unsigned char seg_count;
//逗号计数器
unsigned char dot_count;
//小数点计数器
unsigned char byte_count;
//位数计数器
unsigned char cmd_number;
//命令类型
unsigned char mode;
//0:结束模式,1:命令模式,2:数据模式
unsigned char buf_full;
//1:整句接收完成,相应数据有效。0:缓存数据无效。
unsigned char cmd[5];
//命令类型存储数组sbit rs = P1^4;
sbit rw = P1^5;
sbit ep = P1^6;
//-----------------------------------------------------------------------------------------------
//延时子程序
void delayms(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0;
i < 120;
i++);
}
}bit lcd_bz(void)
{// 测试LCD忙碌状态
bit result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P0 & 0x80);
ep = 0;
return result;
}void lcd_wcmd(unsigned char cmd)
{// 写入指令数据到LCD
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}void lcd_pos(unsigned char pos)
{//设定显示位置
lcd_wcmd(pos | 0x80);
}void lcd_pos_2(unsigned char pos)
{//设定显示位置
lcd_wcmd(pos | 0xC0);
}void lcd_wdat(unsigned char dat)
{//写入字符显示数据到LCD
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
void lcd_string(unsigned char *ptr,unsigned char pos)
{unsigned char i;
lcd_pos(pos);
while(*(ptr+i) != '\0')
{// 显示字符"welcome!"
lcd_wdat(*(ptr+i));
i++;
}}lcd_init()
{//LCD初始化设定
lcd_wcmd(0x38);
//
delayms(1);
lcd_wcmd(0x0c);
//
delayms(1);
lcd_wcmd(0x06);
//
delayms(1);
lcd_wcmd(0x01);
//清除LCD的显示内容
delayms(1);
}
//-----------------------------------------------------------------------------------------------
//延时子程序
void delaym(unsigned int ms)
{
unsigned int i,j;
for(i = 0;
i < ms ;
i++)
{
for(j = 0;
j < 125 ;
j++)
;
}
}void DHT11_delay_us(unsigned char n)
{
while(--n);
}void DHT11_delay_ms(unsigned int z)
{
unsigned int i,j;
for(i=z;
i>0;
i--)
for(j=110;
j>0;
j--);
}void DHT11_start()
{
Data=https://www.it610.com/article/1;
DHT11_delay_us(2);
Data=0;
DHT11_delay_ms(20);
//延时18ms以上
Data=1;
DHT11_delay_us(30);
}
//-----------------------温湿度读取-----------------------------------unsigned char DHT11_rec_byte()//接收一个字节
{
unsigned char i,dat=0;
for(i=0;
i<8;
i++)//从高到低依次接收8位数据
{
while(!Data);
////等待50us低电平过去
DHT11_delay_us(8);
//延时60us,如果还为高则数据为1,否则为0
dat<<=1;
//移位使正确接收8位数据,数据为0时直接移位
if(Data==1)//数据为1时,使dat加1来接收数据1
dat+=1;
while(Data);
//等待数据线拉低
}
return dat;
}void DHT11_receive()//接收40位的数据
{
unsigned char R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
DHT11_start();
if(Data==0)
{
while(Data==0);
//等待拉高
DHT11_delay_us(40);
//拉高后延时80us
R_H=DHT11_rec_byte();
//接收湿度高八位
R_L=DHT11_rec_byte();
//接收湿度低八位
T_H=DHT11_rec_byte();
//接收温度高八位
T_L=DHT11_rec_byte();
//接收温度低八位
revise=DHT11_rec_byte();
//接收校正位DHT11_delay_us(25);
//结束if((R_H+R_L+T_H+T_L)==revise)//校正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
/*数据处理,方便显示*/
rec_dat[0]='0'+(RH/10);
rec_dat[1]='0'+(RH%10);
rec_dat[2]='R';
rec_dat[3]='H';
rec_dat[4]=' ';
rec_dat[5]=' ';
rec_dat[6]='0'+(TH/10);
rec_dat[7]='0'+(TH%10);
rec_dat[8]='C';
}
}//-------------------------<初始化设置 结束>-------------------------------------
void DHT11_main(unsigned int zxi){
lcd_init();
//初始化1602
lcd_wcmd(0x01);
//清除LCD的显示内容
delaym(1);
//============温湿度读取============================================================
DHT11_delay_ms(1500);
//DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令
DHT11_receive();
lcd_pos(3);
// 设置显示位置
for(zxi = 0;
zxi<6;
zxi++)
{
lcd_wdat(kaijihuamian[zxi+6]);
// 显示字符dht11
}
zxi = 0;
delayms(100);
lcd_pos_2(2);
while(rec_dat[zxi] != '\0'){
lcd_wdat(rec_dat[zxi]);
//显示
zxi++;
}
delaym(1000);
}
//==================================================================================
//发送字节
void sendbyte(unsigned char ptr)
{
SBUF=ptr;
while(TI==0);
TI=0;
}
//---------------------------------------------------------------------------
//发送数据流
void sendstring(unsigned char *ptr,unsigned char len)
{int i=0;
while(i=4)
{//如果类型数据接收完毕,判断类型
if(cmd[0]=='G')
{
if(cmd[1]=='N')
{
if(cmd[2]=='G')
{
if(cmd[3]=='G')
{
if(cmd[4]=='A')
{
cmd_number=1;
//data type
mode=2;
seg_count=0;
byte_count=0;
}
}
else if(cmd[3]=='S')
{
if(cmd[4]=='V')
{
cmd_number=2;
mode=2;
seg_count=0;
byte_count=0;
}
}
}switch (cmd_number)
{
case 1://类型1数据接收。GNGGA————北斗与GPS组合数据
switch(seg_count)
{
case 2://纬度处理
if(byte_count<9)
{
WD[byte_count]=tmp;
}
break;
case 3://纬度方向处理
if(byte_count<1)
{
WD_a=tmp;
}
break;
case 4://经度处理
if(byte_count<10)
{
JD[byte_count]=tmp;
}
break;
case 5://经度方向处理
if(byte_count<1)
{
JD_a=tmp;
}
break;
case 6://定位判断
if(byte_count<1)
{
lock=tmp;
}
break;
case 7://定位使用的卫星数
if(byte_count<2)
{
use_sat[byte_count]=tmp;
}
break;
case 9://高度处理
if(byte_count<6)
{
high[byte_count]=tmp;
}
break;
}
break;
}
byte_count++;
//接收数位加1
break;
}
}
}
相关测试结果:
文章图片
文章图片
文章图片
测试视频地址:点击进入 【51单片机解析卫星定位数据源码+DHT11,1602显示】
感谢一直关注着禾灮成长进步的朋友们。你们的信任、支持和鼓励,鞭策着我们一路走到了今天。感谢所有的合作伙伴,我们相互促进,共同见证了彼此的成长。感谢所有曾经在禾灮彼此倚靠、相互鼓励、携手同心、砥砺同行的兄弟姐妹。这里承载了我们的青春与热血。禾灮,感谢有你。未来,我们将一如既往,砥砺前行。禾灮·小楊
2018.08.10
推荐阅读
- Quartz|Quartz 源码解析(四) —— QuartzScheduler和Listener事件监听
- Java内存泄漏分析系列之二(jstack生成的Thread|Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析)
- [源码解析]|[源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3)
- Android系统启动之init.rc文件解析过程
- 小程序有哪些低成本获客手段——案例解析
- Spring源码解析_属性赋值
- Android下的IO库-Okio源码解析(一)|Android下的IO库-Okio源码解析(一) 入门
- 08_JVM学习笔记_类命名空间解析
- WebSocket|WebSocket 语法解析
- jvm|【JVM】JVM08(java内存模型解析[JMM])