找回密码
 立即注册

QQ登录

只需一步,快速开始

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

两个C语言for循环(1、GPS解析;2、温度)只会执行其中一个,为何?

  [复制链接]
跳转到指定楼层
楼主
ID:408809 发表于 2020-1-5 23:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是我写的 一块 1602LCD 分两屏显示  GPS信息和温度信息。但是只会执行温度的循环,GPS 解析的不会显示。如果只有GPS解析的循环则可以正常显示GPS 的信息。请教前辈这是咋回事?改怎么解决?  
单片机:STC12C5A60S2    晶振:11.0592MHz      显示屏:1602  IIC 数据传输      

代码如下:
//--------------------------------------------------------------------------------------------------------------------------------------------------
*******************************************************************************/
#include "reg52.h"
#include "1602IIC.h"
#include "GPS.h"
#include "18b20.h"


/********************************************************/


void Delay1s(uchar A)                //  STC15C5A60S2 单片机1秒延时,主要用来做欢迎词延时
{
        
        while(A--)
        {
        unsigned char i, j, k;


        i = 43;
        j = 6;
        k = 203;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
        
}
}






//****************************************************
//主函数
//****************************************************
void main()


   {


        Init_Lcd();                                        //LCD初始化
        Uart_Init();                                        //串口初始化
        LCD_write_command(0x01);                        //  清屏
        LCD_write_command(0x80);
        LCD_write_word("   Good  Luck   ");
        LCD_write_command(0xc0);
        LCD_write_word("Happy  ever  day");               
        Delay1s(1);
        LCD_write_command(0x01); //  清屏
               




        while(1)


          {
                unsigned char t;
               
                                
                for(t=15;t;t--)
                {


                        GPS_JieXi(); //解析GPS信息(海拔、速度、使用卫星数量)
                        
                }
               
//                Delay1s(5);
               
                LCD_write_command(0x01); //  清屏        
               
                for(t=15;t;t--)
                {
                        LCD_write_command(0x80);            
                        LCD_write_word("n:");        
                        LCD_write_command(0x85);
                        LCD_write_word(".");
                        LCD_write_command(0x88);
                        LCD_write_word("H:");        
                        LCD_write_command(0xc0);
                        LCD_write_word("w:");        
                        LCD_write_command(0xc5);
                        LCD_write_word(".");        
                        LCD_write_command(0xc8);
                        LCD_write_word("S:");
                        LCD_write_command(0xce);
                        LCD_write_word(".");
                        
                        datapros(Ds18b20ReadTemp());           //数据处理函数- 温度1
                        dataprosN(Ds18b20ReadTempN());          //数据处理函数- 温度2        
                               dataprosS(Ds18b20ReadTempS());         //数据处理函数- 温度3


                }
               
                LCD_write_command(0x01);        //  清屏




//---------------------------------------------------------------------------               


                        
        }
   }   



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

使用道具 举报

沙发
ID:408809 发表于 2020-1-6 08:38 | 只看该作者
这两个循环和在一起就只能运行温度循环,不管放在前后。但是每一个都能单独运行。
回复

使用道具 举报

板凳
ID:681887 发表于 2020-1-6 09:02 | 只看该作者
没有跳出循环
回复

使用道具 举报

地板
ID:381937 发表于 2020-1-6 09:17 | 只看该作者
ynzsc001 发表于 2020-1-6 08:38
这两个循环和在一起就只能运行温度循环,不管放在前后。但是每一个都能单独运行。

for循环中间是条件表达式
回复

使用道具 举报

5#
ID:168857 发表于 2020-1-6 09:43 | 只看该作者
把 GPS_JieXi();放在dataprosS(Ds18b20ReadTempS()); 后面
回复

使用道具 举报

6#
ID:282850 发表于 2020-1-6 10:12 | 只看该作者
请关注外围设备的速度!必要时加延时。当然你的延时太强,一来就是1S。
回复

使用道具 举报

7#
ID:652296 发表于 2020-1-6 10:15 来自手机 | 只看该作者
循环问题
回复

使用道具 举报

8#
ID:213173 发表于 2020-1-6 10:22 | 只看该作者
ynzsc001 发表于 2020-1-6 08:38
这两个循环和在一起就只能运行温度循环,不管放在前后。但是每一个都能单独运行。

主循环中运行两个for循环本身不会有问题,问题在于for循环中的子程序有毛病,导致退不出来。
回复

使用道具 举报

9#
ID:408809 发表于 2020-1-6 11:19 | 只看该作者
wulin 发表于 2020-1-6 10:22
主循环中运行两个for循环本身不会有问题,问题在于for循环中的子程序有毛病,导致退不出来。

可是我是将GPS解析放在前面的,正常运行的话应该是从前往后,在怎么说也要显示一次GPS解析才对啊。
回复

使用道具 举报

10#
ID:408809 发表于 2020-1-6 11:24 | 只看该作者
hebaobao 发表于 2020-1-6 09:43
把 GPS_JieXi();放在dataprosS(Ds18b20ReadTempS()); 后面

如果是for循环的话在前后都不行。不用的话我又是分屏显示,每一屏显示几秒后转下一屏幕。
回复

使用道具 举报

11#
ID:408809 发表于 2020-1-6 11:29 | 只看该作者
f556 发表于 2020-1-6 10:12
请关注外围设备的速度!必要时加延时。当然你的延时太强,一来就是1S。

我的1秒是显示开机词所使用。
在下功力尚浅,恳请前辈再更详细指点!!!
回复

使用道具 举报

12#
ID:408809 发表于 2020-1-6 11:32 | 只看该作者
wulin 发表于 2020-1-6 10:22
主循环中运行两个for循环本身不会有问题,问题在于for循环中的子程序有毛病,导致退不出来。

在下功力尚浅,恳请前辈再详细指点!!!
回复

使用道具 举报

13#
ID:451629 发表于 2020-1-6 12:29 | 只看该作者
问题出现在GPS和温度的处理函数里,应该是没有从函数中退出来
回复

使用道具 举报

14#
ID:160500 发表于 2020-1-6 12:37 | 只看该作者
两个for之间没有足够的延时,造成只会显示一个
回复

使用道具 举报

15#
ID:408809 发表于 2020-1-6 16:21 | 只看该作者
liuzx66 发表于 2020-1-6 12:37
两个for之间没有足够的延时,造成只会显示一个

我在中间加3秒的延时也不行。不管GPS循环在前还是在后都不执行。
回复

使用道具 举报

16#
ID:142699 发表于 2020-1-6 16:50 | 只看该作者
你读取完gps就清屏了,你显示放那儿显示呢
回复

使用道具 举报

17#
ID:408809 发表于 2020-1-6 21:15 | 只看该作者
jianfeii 发表于 2020-1-6 16:50
你读取完gps就清屏了,你显示放那儿显示呢

GPS_JieXi(); //解析GPS信息(海拔、速度、使用卫星数量)
这个子程序里面我已经包含了读取、显示的功能了。
如下:

  1. void GPS_JieXi(void)
  2.         
  3.         {
  4.                 unsigned int i = 0;
  5.                 unsigned int j=0;
  6.                 qian_OK=0;                                                                        //标志变量归零
  7.                 k=0;                                                                                    //累计量归零

  8.                 if (First_Share_OK==0)                                  //让变量j在0~10000之间来回增减,增加到10000时显示". ",减到0时显示" .",实现两点来回闪动
  9.                 {
  10.                         if (jiajian==1)
  11.                         {
  12.                                 j++;
  13.                                 if (j==10000)
  14.                                 {
  15.                                         jiajian=0;
  16.                                         LCD_write_command(0x8e);
  17.                                         LCD_write_data('.');
  18.                                         LCD_write_command(0x8f);
  19.                                         LCD_write_data(' ');               
  20.                                 }
  21.                         }
  22.                         else
  23.                         {
  24.                                 j--;
  25.                                 if (j==0)
  26.                                 {
  27.                                         jiajian=1;
  28.                                         LCD_write_command(0x8e);
  29.                                         LCD_write_data(' ');
  30.                                         LCD_write_command(0x8f);
  31.                                         LCD_write_data('.');
  32.                                 }
  33.                         }        
  34.                 }



  35.                
  36. //------------------------------------------------- 解析海拔 ---------------------------------------------------               

  37.         if (   Flag_GPS_OK  == 1
  38.                                         && RX_Buffer[1] == 'G'
  39.                                         && RX_Buffer[3] == 'G'
  40.                                         && RX_Buffer[4] == 'G'
  41.                                         && RX_Buffer[5] == 'A'
  42.                                         && (RX_Buffer[28] == 'N'|| RX_Buffer[28] == 'S')
  43.                                         && (RX_Buffer[41] == 'E'|| RX_Buffer[41] == 'W') )                //确认是否收到"GPGGA"这一帧完整有效的数据
  44.                 {
  45.                         for( i = 0; i < 67 ; i++)                                                  //必须为i<67,因为要确保Display_GPGGA_Buffer[67]为'\0',便于串口发送
  46.                         {
  47.                                 Display_GPGGA_Buffer[i] = RX_Buffer[i];                  //储存到数组中
  48.                         }
  49.                         Flag_Calc_GPGGA_OK = 1;                                                          //收到完整有效数据后,置为1, (GPGGA完整有效的数据已收到的标志变量)
  50.                 }

  51.                 if(Flag_Calc_GPGGA_OK == 1)                                                          //已收到完整有效的数据,可以进行显示,
  52.                 {
  53.                         Flag_Calc_GPGGA_OK = 0;                                                          //标志位归零

  54.                         if (First_Share_OK == 0)
  55.                         {
  56.                                 First_Share_OK=1;                                                          //"Searching data. "不需再显示,标志变量置为1
  57.                                 LCD_write_command(0x01);                                          //先清屏
  58.                         }
  59.         
  60.                         LCD_write_command(0x80);                                       
  61.                         LCD_write_word("H:");



  62.                         for (i=0;i<68;i++)                                                  //由于海拔有时是1位数有时是2位数有时是3位数,不定
  63.                         {                                                                                  //而确定的是其数值在第9与第10个逗号之间,所以用此算法输出海拔
  64.                                 if ( Display_GPGGA_Buffer[i]==',' )          //逐个检索
  65.                                         k++;                                                          //k计算逗号数量
  66.                                 if (k==9&&qian_OK==0)
  67.                                         qian_a=i,qian_OK=1;                                  //找到第9个,则记录其序号,同时标志变量置为1
  68.                                 if (k==10)                                                          //海拔数据位于第9~10个逗号之间
  69.                                 {
  70.                                         hou_a=i;                                                  //记录第10个的序号
  71.                                         k=0;                                                           //归零
  72.                                         qian_OK=0;                                                  //重置为0
  73.                                         break;                                                          //找到后直接跳出循环
  74.                                 }               
  75.                         }
  76.                         LCD_write_command(0x82);                                                  //准备在第一行第9列输出海拔数据
  77.                         switch(hou_a-qian_a-1)                                                        //计算海拔数据的长度
  78.                         {
  79.                                 case 3:LCD_write_word("   ");break;                //根据海拔数据长度输出对应所需的空格数,使其显示方式为右对齐
  80.                                 case 4:LCD_write_word("  ");break;
  81.                                 case 5:LCD_write_word(" ");break;
  82.                                 case 6:break;
  83.                                 case 7:break;
  84.                         }                        
  85.                         for (i=qian_a+1; i<=hou_a-1; i++)
  86.                                 LCD_write_data(Display_GPGGA_Buffer[i]);            //输出海拔        
  87.                                 LCD_write_data(' ');        
  88.                           LCD_write_data('m');                                                                     //显示单位        

  89.                         
  90.                         LCD_write_command(0x8D);                          
  91.                         LCD_write_data('*');                        
  92.                         LCD_write_command(0x8e);                          
  93.                         LCD_write_data(Display_GPGGA_Buffer[45]);        // 正在使用卫星数量 十位
  94.                         LCD_write_command(0x8f);                          
  95.                         LCD_write_data(Display_GPGGA_Buffer[46]);        // 正在使用卫星数量 个位
  96.                                                                
  97.                 }
  98.                

  99. //---------------------------------------------------------- 解析速度 -----------------------------------------------------------------        
  100.                 if(   Flag_GPS_OK  == 1
  101.                                         && RX_Buffer[1] == 'G'
  102.                                         && RX_Buffer[3] == 'V'
  103.                                         && RX_Buffer[4] == 'T'
  104.                                         && RX_Buffer[5] == 'G')                //确认是否收到"GNVTG"这一帧完整有效的数据
  105.                 {
  106.                         for( i = 0; i < 67 ; i++)
  107.                         {
  108.                                 Display_GNVTG_Buffer[i] = RX_Buffer[i];        
  109.                         }
  110.                           
  111.                         Flag_Calc_GNVTG_OK = 1;
  112.                         
  113.                 }
  114.                

  115.                 if(Flag_Calc_GNVTG_OK == 1)                            //GNVTG数据完整有效则显示
  116.                 {
  117.                         Flag_Calc_GNVTG_OK = 0;

  118.                         if (First_Share_OK == 0)          //已开始LCD显示的标志变量
  119.                         {
  120.                                 First_Share_OK=1;                //已开始LCD显示的标志变量
  121.                                 LCD_write_command(0x01);
  122.                         }
  123.                         
  124.                         LCD_write_command(0xc0);        //        速度显示位置        
  125.                         LCD_write_word("V:");               
  126.                         
  127.                         for (i=0;i<68;i++)                                                                    //由于速度数据也是位数不定,故亦用此算法精确地确定速度数据位置
  128.                         {
  129.                                 if ( Display_GNVTG_Buffer[i]==',' )
  130.                                         k++;
  131.                                 if (k==7&&qian_OK==0)                                                  //速度数据位于第7~8个逗号之间
  132.                                         qian_c=i,qian_OK=1;
  133.                                 if (k==8)
  134.                                 {
  135.                                         hou_c=i;
  136.                                         k=0;
  137.                                         qian_OK=0;
  138.                                         break;
  139.                                 }               
  140.                         }

  141.                         
  142.                         LCD_write_command(0xc2);                                                       //准备在第2行第9列显示
  143.                         switch(hou_c-qian_c-2)                                                            //原式为(hou_c-1)-qian_c-1。由于速度不太准还浮动,故只让它显示一位小数
  144.                         {
  145.                                 case 3:LCD_write_word("");break;                    //使右对齐
  146.                                 case 4:break;
  147.                                 case 5:break;
  148.                         }                        
  149.                         for (i=qian_c+1; i<=hou_c-1; i++)                                              //(原式为hou_c-1-1)、减4刚好取个整数,没有小数点了。
  150.                                 

  151.                         LCD_write_command(0xc2);                        
  152.                         LCD_write_data(Display_GNVTG_Buffer[qian_c+1]);
  153.                         LCD_write_command(0xc3);
  154.                         LCD_write_data(Display_GNVTG_Buffer[qian_c+2]);
  155.                         LCD_write_command(0xc4);
  156.                         LCD_write_data(Display_GNVTG_Buffer[qian_c+3]);
  157.                         
  158.                                 //LCD_write_data(Display_GNVTG_Buffer[i]);        //显示速度        
  159.         LCD_write_command(0xc6);                        
  160.                           LCD_write_word("km/s");                                                              //显示单位                        
  161.                         
  162.                 }
  163.         
  164.         }
复制代码

回复

使用道具 举报

18#
ID:682507 发表于 2020-1-6 21:58 | 只看该作者
延时太短了吧
回复

使用道具 举报

19#
ID:532541 发表于 2020-1-7 09:15 | 只看该作者
硬件问题,液晶需要查询,如何液晶坏了,就退不出温度程序,一直等待液晶的相应。
回复

使用道具 举报

20#
ID:261288 发表于 2020-1-7 10:33 | 只看该作者
for循环省略中间条件表达式,不作处理便进入死循环。
回复

使用道具 举报

21#
ID:408809 发表于 2020-1-7 11:26 | 只看该作者
linzhiqi1 发表于 2020-1-7 09:15
硬件问题,液晶需要查询,如何液晶坏了,就退不出温度程序,一直等待液晶的相应。

如果说不用GPS,我弄三个温度,每屏一个也是没有不显示问题的。
回复

使用道具 举报

22#
ID:497656 发表于 2020-1-7 16:32 | 只看该作者
虽然你外面有循环15次,但是在第一次循环中就把Flag_GPS_OK清零了,而你每一次在循环中显示后又没有适当的延时,而后面的14循环中由于Flag_GPS_OK为0,同样都不会显示内容。
回复

使用道具 举报

23#
ID:408809 发表于 2020-1-7 23:15 | 只看该作者
linzhiqi1 发表于 2020-1-7 09:15
硬件问题,液晶需要查询,如何液晶坏了,就退不出温度程序,一直等待液晶的相应。

我现在换了2004的LCD 都没有写完,应该不存在了。
回复

使用道具 举报

24#
ID:130230 发表于 2020-1-8 11:28 | 只看该作者
你为什么解析15次GPS数据
回复

使用道具 举报

25#
ID:408809 发表于 2020-1-8 15:18 | 只看该作者
wtmkimmy 发表于 2020-1-7 16:32
虽然你外面有循环15次,但是在第一次循环中就把Flag_GPS_OK清零了,而你每一次在循环中显示后又没有适当的 ...

感觉你说的很有道理。
但是“Flag_GPS_OK=0”  会在GPS中断处理里面置1的。
现在在搬水泥呢,晚上回去搞搞看再回复你。
回复

使用道具 举报

26#
ID:408809 发表于 2020-1-8 15:26 | 只看该作者
wtmkimmy 发表于 2020-1-7 16:32
虽然你外面有循环15次,但是在第一次循环中就把Flag_GPS_OK清零了,而你每一次在循环中显示后又没有适当的 ...

昨天晚上我的解决办法是for了60000次后才显示出GPS信息。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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