找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4078|回复: 3
打印 上一主题 下一主题
收起左侧

STC89C52单片机做GPS测速 源程序

  [复制链接]
跳转到指定楼层
楼主
单片机源程序如下:

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit EN=P2^7; //LCD使能
  5. sbit RS=P2^6;
  6. sbit KEY=P3^5; //清0键
  7. uchar table[]="0123456789:-";
  8. uchar table1[]={"Wait..."};     //
  9. uchar a,b,c,d,i=0,flag;
  10. uchar table0[62];
  11. float S;
  12. uint Speed_dat,Speed_dat1;
  13. uint Total_distance;
  14. uchar num1=0;
  15. uchar time_flag=0;
  16. void delay(uint z)//延时函数
  17. {
  18.    uint x,y;
  19.    for(x=z;x>0;x--)
  20.       for(y=110;y>0;y--);
  21. }
  22. /*******************1602液晶***********************/

  23. void write_date(uchar date)//写数据
  24. { EN=0;    RS=1;  P0=date;        EN=0;  delay(5); EN=1;}
  25. void write_com(uchar date)//写命令
  26. {    EN=0;RS=0;P0=date;    EN=0;delay(5); EN=1; }
  27. void init_1602()  //LCD初始化
  28. {
  29.     uchar num;
  30.     write_com(0x38); write_com(0x0c);write_com(0x06);
  31.     write_com(0x01); write_com(0x80);
  32.     for(num=0;num<7;num++)      //显示“Wait...”   
  33.     {
  34.         write_date(table1[num]);//通过循环将要显示的字符注意显示出来
  35.     }
  36.     delay(1000);   //等待大约3s
  37. }

  38. void display()
  39. {
  40.     if(flag==1)
  41.     {  
  42.        flag=0;  
  43.        if(table0[4]=='M'&&(table0[18]=='A'))//确定是否收到"GPRMC"这一帧数据    且是否为有效数据
  44.        {   
  45.                if(table0[43]=='E')      //
  46.             {
  47.                 if(table0[46]=='.')  //<10海里每小时
  48.                     S=(table0[45]-48)*100+(table0[47]-48)*10+(table0[48]-48);
  49.                 else if(table0[47]=='.')
  50.                     S=(table0[45]-48)*1000+(table0[46]-48)*100+(table0[48]-48)*10+(table0[49]-48);
  51.             }
  52.             Speed_dat=(uint)(S*1.85);     //把海里/h转换成km/h
  53.             Speed_dat1=(uint)(S*0.514);      //把海里/h转换成m/s 计算总里程中用到
  54.             if(time_flag==1)
  55.             {
  56.                 time_flag=0;
  57.                 Total_distance+=(Speed_dat1/100);    //每秒刷新一次里程单位m
  58.                 TR0=1;
  59.             }     

  60.             write_com(0x80);        //显示速度
  61.             write_date('S');
  62.             write_date('P');
  63.             write_date('E');
  64.             write_date('E');
  65.             write_date('D');
  66.             write_date(':');
  67.             if(Speed_dat/100<10){write_date(' ');write_date(table[Speed_dat/100]);}                     
  68.             else{write_date(table[Speed_dat/1000]);write_date(table[Speed_dat%1000/100]);}      
  69.             write_date('.');
  70.             write_date(table[Speed_dat%100/10]);
  71.             write_date('K');   write_date('m'); write_date('/');  write_date('h');

  72.             write_com(0x80+0x40);        //显示里程
  73.             write_date('J');write_date('O');write_date('U');write_date('R');
  74.             write_date('N');write_date('E');write_date('Y');
  75.             write_date(':');
  76.             write_date(table[Total_distance/10000]);
  77.             write_date(table[Total_distance%10000/1000]);
  78.             write_date('.');
  79.             write_date(table[Total_distance%10000%1000/100]);
  80.             write_date(table[Total_distance%10000%1000%100/10]);
  81.             write_date('K');    write_date('m');
  82.        }
  83.        ES=1; //开串口中断                                                   
  84.    }
  85. }

  86. void init()//初始化
  87. {
  88.        i=0;
  89.        TMOD=0x21;  PCON=0x00;
  90.        TH1=0xfD;   TL1=0xfD;  //波特率9600
  91.        TH0=(65536-50000)/256; //给定时器高四位赋初值
  92.         TL0=(65536-50000)%256; //给定时器第四位赋初值
  93.        ET0=1;        //打开定时器T1中段
  94.         TR0=1;        //启动定时器T0
  95.        SM0=0;       //串行口方式1
  96.        SM1=1;
  97.        REN=1;       ////允许接收
  98.        EA=1;       //开中断
  99.        TR1=1;      //启动T1
  100.        ES=0;       //关闭串行口中断
  101. }
  102. void main()
  103. {                    
  104.       init();     //系统初始化
  105.       init_1602();//LCD1602初始化
  106.       ES=1;          //开串行口中断
  107.       while(1)
  108.       {
  109.           display(); //显示速度
  110.           if(!KEY)     //清0键按下
  111.           {        delay(10);
  112.                 if(!KEY){Total_distance=0;while(!KEY);     }
  113.             }
  114.       }
  115. }

  116. void time0() interrupt  1          //定时器中断0
  117. {
  118.     TH0=(65536-50000)/256; //给定时器高四位赋初值
  119.      TL0=(65536-50000)%256; //给定时器第四位赋初值
  120.     num1++;
  121.     if(num1==20)   //1秒到
  122.     {
  123.         TR0=0;
  124.         num1=0;
  125.         time_flag=1;
  126.     }   
  127. }

  128. void ser() interrupt 4//串口中断、初次分离'

  129. 开头的字符串,并写入接收数组
  130. {
  131.        RI=0;  table0[i]=SBUF;        i++;
  132.        if(table0[0]==0x24)//如果是此字符;马上接收数据
  133.        {
  134.                  if(i==62){ i=0;flag=1;ES=0; }                              
  135.        }
  136.        else          i=0;
  137. }
复制代码

所有资料51hei提供下载:
源程序和pdf格式的原理图.7z (79.33 KB, 下载次数: 8)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:79544 发表于 2020-5-4 18:01 | 只看该作者
感谢楼主分享!学习啦。
回复

使用道具 举报

板凳
ID:343297 发表于 2022-1-11 21:55 | 只看该作者
楼主,GPS模块哪家的都行吗?
回复

使用道具 举报

地板
ID:310441 发表于 2022-2-7 17:45 来自手机 | 只看该作者
解码部分还是得考虑一下容错和兼容吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表