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

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显示
文章图片
51单片机解析卫星定位数据源码+DHT11,1602显示
文章图片

51单片机解析卫星定位数据源码+DHT11,1602显示
文章图片

测试视频地址:点击进入 【51单片机解析卫星定位数据源码+DHT11,1602显示】
感谢一直关注着禾灮成长进步的朋友们。你们的信任、支持和鼓励,鞭策着我们一路走到了今天。感谢所有的合作伙伴,我们相互促进,共同见证了彼此的成长。感谢所有曾经在禾灮彼此倚靠、相互鼓励、携手同心、砥砺同行的兄弟姐妹。这里承载了我们的青春与热血。禾灮,感谢有你。未来,我们将一如既往,砥砺前行。禾灮·小楊 2018.08.10

    推荐阅读