什么都不多说,直接看代码:

    #include <REG52.H>#include <stdio.h>#include <intrins.h>========================================================================================/*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= P3^2;   //定义数据线      温湿度传感器DHT11数据接入unsigned char rec_dat[9];   //用于显示的接收数据数组  unsigned char  flag_rec=0;     unsigned char  num_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){                           // 写入指令数据到LCDwhile(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)    {                           //写入字符显示数据到LCDwhile(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=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来接收数据1dat+=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);  //拉高后延时80usR_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();            //初始化1602lcd_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<len){   SBUF=*(ptr+i);               //SUBF接受/发送缓冲器while(TI==0);TI=0;i++;    }num_rec=0;  }void init_all(void) //9600  11.05926{SCON = 0x50;      //REN=1允许串行接受状态,串口工作模式1                  TMOD|= 0x20;      //定时器工作方式2                    PCON|= 0x80;                                                          TH1 = 0xFa;     //baud*2  /* reload value 9600、数据位8、停止位1。效验位无 (11.0592)             TL1 = 0xF3;         TR1  = 1;                                                             ES   = 1;        //开串口中断                  EA   = 1;        // 开总中断lcd_init() ;} //将UTC时间转成BJ时间void trans_time(void){unsigned char temp,hour_shi,hour_ge;temp=(time[0]-'0')*10+(time[1]-'0');if(temp<=16){temp=temp+8;hour_shi=temp/10;hour_ge=temp%10;time[0]=hour_shi+'0';time[1]=hour_ge+'0';    }else{temp=temp+8-24;time[0]='0';time[1]=temp%10+'0';    }} //判断是否有BD数据 有1,无0bit BD_data(void){if(buf_full&0x01!=0)return 1;else return 0;   }//----------------------------------------------------------------------------void main () {   unsigned int X;unsigned char i;init_all(); lcd_wcmd(0x01);         //清除LCD的显示内容delayms(10);i = 0;X = 0;lcd_pos(1);         // 设置显示位置while(kaijihuamian[i] != '\0'){lcd_wdat(kaijihuamian[i]);  // 显示字符时间i++;}delayms(10);i=0  ;lcd_pos_2(0);           // 设置显示位置while(kaijihuamian2[i] != '\0'){lcd_wdat(kaijihuamian2[i]); // 显示字符时间i++;}i = 0;delayms(5000);lcd_wcmd(0x01);         //清除LCD的显示内容delayms(10);while(1){if(flag_data==0)// 如果没有数据{lcd_wcmd(0x01);         //清除LCD的显示内容delayms(10);i=0  ;lcd_pos(2);         // 设置显示位置while(nodata[i] != '\0'){lcd_wdat(nodata[i]);    // 显示字符i++;}delayms(1000);lcd_wcmd(0x01);         //清除LCD的显示内容delayms(10);    //第三页开始==================================================================DHT11_main(i);// 显示字符DHT11 温度 湿度 信息delaym(3000);i = 0;lcd_wcmd(0x01);         delaym(1);//第四页开始==================================================================lcd_pos(0);         // 设置显示位置while(LCD_161[i] != '\0'){lcd_wdat(LCD_161[i]);   // 显示字符禾灮信息i++;}delayms(1);i=0  ;lcd_pos_2(0);           // 设置显示位置while(LCD_162[i] != '\0'){lcd_wdat(LCD_162[i]);   // 显示字符禾灮信息i++;}   //结束==================================================================delayms(5000);lcd_wcmd(0x01);         //清除LCD的显示内容delayms(1);}if(flag_rec==1)             //data 解码完毕{flag_rec=0;  //清数据有效标志位         if (lock==1) //如果已经定位{for(X;X <10;X++){           trans_time();//UTC--BJ TIME转换为北京时间                      lcd_pos_2(0);           // 设置显示位置     lcd_wdat(' ');         //显示 北京时间        lcd_wdat(time[5]);  }delayms(1);          //第一页显示完毕======经纬度+北京时间====定位+授时lcd_wcmd(0x01);         //清除LCD的显示内容delayms(1);X = 0;for(X;X <10;X++){//第二页开始=================================================================================lcd_pos(0);         // 设置显示位置lcd_wdat('H');              // 显示海拔 卫星个数delayms(100);lcd_pos(1);            while(high[i] != '\0'){lcd_wdat(high[i]);  //显示海拔i++;}delayms(100);while(use_sat[i] != '\0'){lcd_wdat(use_sat[i]);   // // 显示 卫星个数i++;}delayms(100);i=0  ;  //delayms(5000);         //第二页显示完毕======显示海拔+卫星个数===速度+方位//lcd_wcmd(0x01);           //清除LCD的内容while(angle[i] != '\0'){lcd_wdat(angle[i]); // // 显示 方位角    i++;}i=0  ;  }delayms(10);         //第二页显示完毕======显示海拔+卫星个数===速度+方位lcd_wcmd(0x01);         //清除LCD的显示内容delayms(1);X = 0;//第三页开始==================================================================DHT11_main(i);// 显示字符DHT11 温度 湿度 信息delaym(3000);i = 0;lcd_wcmd(0x01);         delaym(1);//第四页开始==================================================================lcd_pos(0);         // 设置显示位置while(LCD_161[i] != '\0'){lcd_wdat(LCD_161[i]);   // 显示字符禾灮信息i++;}delayms(1);i=0  ;lcd_pos_2(0);           // 设置显示位置while(LCD_162[i] != '\0'){lcd_wdat(LCD_162[i]);   // 显示字符禾灮信息i++;}   //结束==================================================================delayms(5000);delayms(1);         //显示完毕======显示禾灮信息lcd_wcmd(0x01);         //清除LCD的显示内容delayms(1); }else if(lock==0){      //未定位    //display relative message              lcd_wcmd(0x01);         //清除LCD的显示内容delayms(10);i=0  ;lcd_pos(3);         // 设置显示位置while(receiving[i] != '\0'){lcd_wdat(receiving[i]); // 显示字符时间i++;}delaym(1000);lcd_wcmd(0x01);         //清除LCD的显示内容delaym(10);                 X = 0;//第三页开始==================================================================DHT11_main(i);// 显示字符DHT11 温度 湿度 信息delaym(3000);i = 0;lcd_wcmd(0x01);         delaym(1);//第四页开始==================================================================lcd_pos(0);         // 设置显示位置while(LCD_161[i] != '\0'){lcd_wdat(LCD_161[i]);   // 显示字符禾灮信息i++;}delayms(1);i=0  ;lcd_pos_2(0);           // 设置显示位置while(LCD_162[i] != '\0'){lcd_wdat(LCD_162[i]);   // 显示字符禾灮信息i++;}   //结束==================================================================delayms(5000);delayms(1);                         }                   }           }}//--------------------------------------------------------------------//串口中断程序void ser_int (void) interrupt 4 using 1{unsigned char tmp;if(RI){RI=0;tmp=SBUF;switch(tmp){case '$':cmd_number=0;       //命令类型清空mode=1;             //接收命令模式byte_count=0;       //接收位数清空flag_data=1;flag_rec=1;     //数据标志位置一break;case ',':seg_count++;        //逗号计数加1byte_count=0;break;case '*':switch(cmd_number){case 1:buf_full|=0x01;break;case 2:buf_full|=0x02;break;case 3:buf_full|=0x04;break;}mode=0;break;default:if(mode==1) //命令种类判断{cmd[byte_count]=tmp;            //接收字符放入类型缓存if(byte_count>=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 typemode=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++;       //接收数位加1break;}}       }

相关测试结果:

测试视频地址:点击进入


    感谢一直关注着禾灮成长进步的朋友们。你们的信任、支持和鼓励,鞭策着我们一路走到了今天。感谢所有的合作伙伴,我们相互促进,共同见证了彼此的成长。感谢所有曾经在禾灮彼此倚靠、相互鼓励、携手同心、砥砺同行的兄弟姐妹。这里承载了我们的青春与热血。禾灮,感谢有你。未来,我们将一如既往,砥砺前行。禾灮·小楊2018.08.10

51单片机解析卫星定位数据源码+DHT11,1602显示相关推荐

  1. bmp280c语言程序,51单片机读取BMP280 180 280气压值1602显示程序

    //*************************************** // BMP085 IIC测试程序 // 使用单片机STC89C51 // 晶振:11.0592M // 显示:LC ...

  2. 51单片机课程设计:基于DHT11的温湿度报警器

    51单片机课程设计:基于DHT11的温湿度报警器 本程序适用于51系列单片机,主要用于读取DHT11温湿度模块数值,显示在数码管上,同时还具备温湿度报警功能,当超出预设值,蜂鸣器报警,可在吉林农业大学 ...

  3. Modbus RTU 51单片机从机工程源码与昆仑通泰触摸屏测试工程文件。支持485和232串口通信

    Modbus RTU 51单片机从机工程源码与昆仑通泰触摸屏测试工程文件.支持485和232串口通信,该从机源码支持51系列和STC12系列单片机,支持功能码01,02,03,04,05,06,15, ...

  4. Modbus RTU 51单片机从机工程源码与昆仑通泰触摸屏测试工程文件

    Modbus RTU 51单片机从机工程源码与昆仑通泰触摸屏测试工程文件. 支持485和232串口通信,该从机源码支持51系列和STC12系列单片机,支持功能码01,02,03,04,05,06,15 ...

  5. Modbus RTU 51单片机从机源码与组态软件通信支持485和232串口通信,该从机源码可直接用于51系列和STC12系列单片机的

    Modbus RTU 51单片机从机源码与组态软件通信支持485和232串口通信,该从机源码可直接用于51系列和STC12系列单片机的,支持功能码01,02,03,04,05,06,0F,10等常用功 ...

  6. 51单片机modbus通讯源码

    51单片机modbus通讯源码 编号:779655439312452自动化大学仕

  7. 51单片机LCD1602 定时器时钟 实现年月日时分秒显示

    实现功能:利用51单片机的定时器原理制作时钟,显示使用LCD1602,可以显示时分秒年月日和星期 ,识别平年闰年,按键可调整时间日期,整点报时. 1.定时器中断实现时钟基本原理 若系统晶振为12MHZ ...

  8. 基于51单片机的简易电子计算器——有温度显示和万年历等额外功能

    基于51单片机的简易电子计算器--有温度显示和万年历等额外功能 设计实际所实现的功能 模式一可显示日期.时钟.温度,模式二可进行计算器的计算,且显示日期温度模式和计算器模式可随意切换,模式三可以滚动显 ...

  9. 利用51单片机+0.96寸iic接口oled显示图片或动图

    利用51单片机+0.96寸iic接口oled显示图片或动图 前言:之前讲过如何使用oled显示数字以及字符,但并未讲述如何显示BMP格式的图片, 这篇将在之前的基础上加以封装一些函数用来显示图片 硬件 ...

最新文章

  1. python学会后月薪-零基础python培训后薪资有多少?
  2. Windows 安装android studio的完整教程
  3. linux下代码写错了怎么更改_AWS全面上市开源Linux发行版,专为容器操作系统设计...
  4. Kali Linux 秘籍 翻译完成!
  5. 操作系统—进程的定义、组成和组织方式(思维导图)
  6. 葡萄酒酒进销存单机版_葡萄酒销售问题| 找到销售葡萄酒的最大利润
  7. 特斯拉如何饕餮中国红利?
  8. js中this指向的三种情况
  9. 微信小程序如何引入视频插件,解决文娱资质问题(uni-app 同样适用) 解决bindtimeupdate 不生效问题!
  10. java 调用软键盘_关于Java:可靠地隐藏软键盘
  11. 电商后台系统:管理后台之账号管理(一)
  12. python -使用pytesseract识别文字时遇到的问题
  13. 知行合一ArduPilot | ArduPilot系统框架简述
  14. ubuntu下在终端中用命令重命名文件
  15. 苹果系统java小游戏_Mac自带小游戏怎么玩?
  16. Simscape Multibody入门指南3-单摆模型
  17. PTC Creo 4.0 M150
  18. 【ae】图层亮度遮罩
  19. 硬件仿真加速器与原型验证平台
  20. c语言炒股软件公式,操盘手等超贵软件指标公式

热门文章

  1. android获取系统使用的字体,android - 我如何获取已安装的Android系统字体列表并将其应用于自定义键盘 - 堆栈内存溢出...
  2. 五线城市房价已大幅下跌,房地产泡沫破裂或由此开始
  3. 四六级万能写作模板(整理)
  4. 【236】◀▶IEW-Unit01
  5. 深度学习与自然语言处理教程(7) - 问答系统(NLP通关指南·完结)
  6. Echarts 打不开或者打开很慢的解决方案
  7. 让所有美术生头疼的素描静物,快看你画过没?
  8. 蓝汛之5377D2脚位图
  9. 蓝汛之TWS之间的通信:【篇】
  10. Linux中PS1的用法