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

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

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

#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= 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)
{                           // 写入指令数据到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=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显示_第2张图片
51单片机解析卫星定位数据源码+DHT11,1602显示_第3张图片

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

测试视频地址:点击进入


    感谢一直关注着禾灮成长进步的朋友们。你们的信任、支持和鼓励,鞭策着我们一路走到了今天。
    
    感谢所有的合作伙伴,我们相互促进,共同见证了彼此的成长。

    感谢所有曾经在禾灮彼此倚靠、相互鼓励、携手同心、砥砺同行的兄弟姐妹。这里承载了我们的青春与热血。

                禾灮,感谢有你。

    未来,我们将一如既往,砥砺前行。

                                        禾灮·小楊
                                       2018.08.10

你可能感兴趣的:(51单片机解析卫星定位数据源码+DHT11,1602显示)