⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gps_ok.c

📁 在51单片机上实现GPS的源码!!很不错!!值得一看
💻 C
📖 第 1 页 / 共 2 页
字号:

    cmdh=0xe0;
    cmdl=i;
    cmdSend();
}

void jianp()        //获取按键状态 改变状态值  anjian_z   1 insert; 2 del; 3 sel_next
{
    anjian_z=0;
    if(insert==0&&insert_flag==1)
    {
      delay(50);              //去抖
      if(insert==0&&insert_flag==1)
      {
         anjian_z=1 ;
         insert_flag=0;
      }
    }
    else if(insert==1&&insert_flag==0)
    {
      insert_flag=1;
    }


    else if(del==0)
    {
      delay(50);              //去抖
      if(del==0&&del_flag==1)
      {
         anjian_z=2 ;
         del_flag=0;
      }
    }
    else if(del==1&&del_flag==0)
    {
      del_flag=1;
    }


    else if(sel_nex==0)
    {
      delay(50);              //去抖
      if(sel_nex==0&&sel_nex_flag==1)
      {
         anjian_z=3 ;
         sel_nex_flag=0;
      }
    }
    else if(sel_nex_flag==0)
    {
       sel_nex_flag=1;
    }

}

void f_insert()
{
     Mcu_init();
     LCD12864_string(1,1,"增加站点");
     gps_t[0]++;

     gps_t[1+zhand_num*4]=gps_x;
     gps_t[2+zhand_num*4]=gps_y;

     cmdh=0xa0;
     cmdl=gps_t[4+ zhand_num*4];
     cmdSend();

     while(anjian_z!=2)
         jianp();
     Stop();
                //将XY和地址写入24c02
     write_iic_data(&gps_t[0],0,8);
     delay(20);
     write_iic_data(&gps_t[8],8,8);
     delay(20);
     write_iic_data(&gps_t[16],16,8);
     delay(20);

     Mcu_init();
     LCD12864_picture((unsigned char*)gImage_test);
     zhand_num++;
}
void f_del()
{
      uchar del_num=0,ai;
      uchar tx,ty,th,tl;
      //显示:第一个站 语音提示
      Mcu_init();
      LCD12864_string(1,1,"删站点");

      cmdh=gps_t[3];
      cmdl=gps_t[4];
      cmdSend();

      //如果next就更新显示 语音提示;如果insert 就删除
      while(del_num<zhand_num)
      {
          jianp();
          if(anjian_z==3)
          {
                del_num++;
                //显示:第del_num个站 语音提示
                cmdh=gps_t[3+del_num*4];
                cmdl=gps_t[4+del_num*4];
                cmdSend();
          }
          else if(anjian_z==1)
          {
                //删除信息
                //更新24c02
                gps_t[0]--;
                tx=gps_t[1+del_num*4];
                ty=gps_t[2+del_num*4] ;
                th=gps_t[3+del_num*4];
                tl=gps_t[4+del_num*4] ;
                for(ai=del_num;ai<zhand_num-1;ai++)
                {
                    gps_t[1+ai*4]=gps_t[5+ai*4];
                    gps_t[2+ai*4]=gps_t[6+ai*4];
                    gps_t[3+ai*4]=gps_t[7+ai*4];
                    gps_t[4+ai*4]=gps_t[8+ai*4];
                }
                gps_t[1+ai*4]= tx;
                gps_t[2+ai*4]= ty;
                gps_t[3+ai*4]= th;
                gps_t[4+ai*4]= tl;

                zhand_num--;
                write_iic_data(&gps_t[0],0,8);
                delay(20);
                write_iic_data(&gps_t[8],8,8);
                delay(20);
                write_iic_data(&gps_t[16],16,8);
                delay(20);

          }
      }

                Mcu_init();
                LCD12864_picture((unsigned char*)gImage_test);
                return;
}
void f_select()
{
     uchar sel_num=1;
     Mcu_init();
     LCD12864_string(1,1,"查询站点");
      cmdh=gps_t[3];
      cmdl=gps_t[4];
      cmdSend();
     //显示:第一个站 语音提示
     while(sel_num<zhand_num)
     {
          jianp();
          if(anjian_z==3)
          {
                cmdh=gps_t[3+sel_num*4];
                cmdl=gps_t[4+sel_num*4];
                sel_num++;
                cmdSend();
                //显示:第del_num个站 语音提示
          }
     }

     Mcu_init();
     LCD12864_picture((unsigned char*)gImage_test);
     return;
      //显示地图;
}

void main(void)
{
    uchar i;
    bit baozh_flag=1,mos;
     // write_iic_data(&gps_t[0],0,8);
     //  write_iic_data(&gps_t[8],8,8);
     //write_iic_data(&gps_t[16],16,8);
    mos=1;
    jianp();
    if(anjian_z==3)
    {
        mos=0;
    }
        serial_int();

    du24c02();
    Mcu_init();
    LCD12864_picture((unsigned char*)gImage_test);
    powerup();
    while(mos)
    {
        while(RI == 0);
        RI =0;
        cs_temp[0]=   SBUF;
        if(SBUF==88)
        {
         while(RI == 0);
         RI =0;
         cs_temp[0]=SBUF;
         while(RI == 0);
         RI =0;
         gps_x=SBUF;
         while(RI == 0);
         RI =0;
         gps_y=SBUF;

        }
          lcd_gps_wei(gps_x,gps_y);
           for(i=0;i<zhand_num;i++)       //zhand_num  站点数 保存在24c02第一个数据
           {
             if(gps_x==gps_t[1+i*4] && gps_y==gps_t[2+i*4])
                  {
                          //根据 gps_temp[i].ddrl,gps_temp[i].ddrh 改变cmdh,cmdl
                          if(baozh_flag)
                               baozhan(gps_t[4+i*4]);
                          baozh_flag=0;
                          break;
                  }

           }
           if(i==zhand_num )
             baozh_flag=1;

             jianp();
             if(anjian_z==1)
             {
                f_insert();
             }
             else if(anjian_z==2)
             {
                f_del();
             }
             else if(anjian_z==3)
             {
                f_select();
             }
             //gps函数得到真正的   gps_x,gps_y
          // gps_x ++   ;

      }
      while(!mos)
      {

           Mcu_init();
           serial_int();
           while(1){
             serial();
             xssj();  //显示数据 日期时间经度纬度
            }
      }
}



//*************************************24c02*************************************


/* iic延时       */
void iic_wait(void)
{
  _nop_();
  _nop_();
  _nop_();
  _nop_();
}
/* 开启iic总线   */
void iic_start(void)
{
  SDA = 1;
  SCL = 1;
  iic_wait();
  SDA = 0;
  iic_wait();
  SCL = 0;
}
/* 关闭iic总线   */
void iic_stop(void)
{
  SDA=0;
  SCL=0;
  iic_wait();
  SCL=1;
  iic_wait();
  SDA=1;
}
/* 发送ACK信号   */
void iic_ack(void)
{
  SDA=0;
  iic_wait();
  SCL=1;
  iic_wait();
  SCL=0;
}
/* 发送NOACK信号 */
void iic_no_ack(void)
{
  SDA=1;
  iic_wait();
  SCL=1;
  iic_wait();
  SCL=0;
}
/********************************************************************
函 数 名:iic_wait_ack
功    能:等待ACK信号
说    明:
入口参数:
返 回 值:1-ACK         0-ERROR
设    计:蓝海微芯
***********************************************************************/
bit iic_wait_ack(void)
{
  uchar errtime=255;
  //uint errtime = 1000;

  SDA=1;
  iic_wait();
  SCL=1;
  iic_wait();

  while(SDA)
  {
    errtime--;
    if(!errtime)
    return 0;
  }
  SCL=0;
  return 1;
}
/********************************************************************
函 数 名:iic_send_byte
功    能:MCU向iic设备发送一个字节
说    明:
入口参数:sbyte                  待发送的字节数据
返 回 值:
设    计:蓝海微芯
***********************************************************************/
void iic_send_byte(uchar sbyte)
{
  uchar i = 8;

  while(i--)
  {
    SCL = 0;
    _nop_();
    SDA = (bit)(sbyte&0x80);
    sbyte <<= 1;
    iic_wait();
    SCL = 1;
    iic_wait();
  }
 SCL=0;
}
/********************************************************************
函 数 名:iic_receive_byte
功    能:MCU从iic设备接收一个字节
说    明:
入口参数:
返 回 值:ddata   接收数据
设    计:蓝海微芯
***********************************************************************/
uchar iic_receive_byte(void)
{
  uchar i=8;
  uchar ddata=0;

  SDA=1;
  while(i--)
  {
    ddata <<= 1;
    SCL=0;
    iic_wait();
    SCL=1;
    iic_wait();
    ddata |= SDA;
  }
  SCL=0;
  return ddata;
}
/********************************************************************
函 数 名:write_iic_data
功    能:向iic设备写入N个字节
说    明:
入口参数:write_data              存放写入字节的数组
          address                 指定从address处开始写入
          num                     写入的字节数
返 回 值:无
设    计:蓝海微芯
***********************************************************************/
void write_iic_data(uchar write_data[], uchar address, uchar num)
{
  uchar n;

  iic_start();
  iic_send_byte(0xa0);
  iic_wait_ack();
  iic_send_byte(address);
  iic_wait_ack();

  for(n=0; n<num; n++)
  {
    iic_send_byte(write_data[n]);
    iic_wait_ack();
  }
  iic_stop();
}
/********************************************************************
函 数 名:read_iic_data
功    能:从iic设备读取N个字节
说    明:
入口参数:read_data               存放读取字节的数组
          address                 指定从address处开始读取
          num                     读取的字节数
返 回 值:无
设    计:蓝海微芯
***********************************************************************/
void read_iic_data(uchar read_data[], uchar address, uchar num)
{
  uchar n;
  uchar *pread_data;
  pread_data = read_data;
  iic_start();
  iic_send_byte(0xa0);
  iic_wait_ack();
  iic_send_byte(address);
  iic_wait_ack();
  iic_start();
  iic_send_byte(0xa1);
  iic_wait_ack();

  for (n=0; n<num; n++)
  {
    *pread_data = iic_receive_byte();
    pread_data++;

    if (n != (num - 1))     //最后一个数据不应答
    {
      iic_ack();
    }
  }
  iic_no_ack();
  iic_stop();
}

//isd4002

void delay(uchar ms)
{							// 延时子程序
	uchar i;
	while(ms--) {
		for(i = 0; i<99; i++){
			_nop_();
			_nop_();
		}
	}
}
void spi_send(uchar isdcmd)
{
	uchar is;
	sclk=0;
	for(is=0;is<8;is++)
	{
	if ((isdcmd&0x01)==1)
		mosi =1;
	else
		mosi =0;
	isdcmd=isdcmd>>1;
	sclk=1;
	_nop_();
	_nop_();
	sclk=0;
	_nop_();
	_nop_();
	}
}


void cmdSend()
{
        int ai;
        sclk=0;
        ss=0;
        _nop_();
        _nop_();
	_nop_();
        spi_send(cmdl);
        spi_send(cmdh);
        _nop_();
	_nop_();
        ss=1;
}

void powerup()
{
        cmdh=0x20;
        cmdl=0x00;
        cmdSend();
}
void Stop()
{
        cmdh=0x30;
        cmdl=0x00;
        cmdSend();
        delay(90);
}

void Play()
{
        cmdh=0xe0;
        cmdl=0x40;
        cmdSend();
        //判断stop停止
}


void Reco()
{
        cmdh=0xa0;
        cmdl=0x40;
        cmdSend();
        //判断stop停止
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -