標(biāo)題: 兩個C語言for循環(huán)(1、GPS解析;2、溫度)只會執(zhí)行其中一個,為何? [打印本頁]

作者: ynzsc001    時間: 2020-1-5 23:08
標(biāo)題: 兩個C語言for循環(huán)(1、GPS解析;2、溫度)只會執(zhí)行其中一個,為何?
這是我寫的 一塊 1602LCD 分兩屏顯示  GPS信息和溫度信息。但是只會執(zhí)行溫度的循環(huán),GPS 解析的不會顯示。如果只有GPS解析的循環(huán)則可以正常顯示GPS 的信息。請教前輩這是咋回事?改怎么解決?  
單片機(jī):STC12C5A60S2    晶振:11.0592MHz      顯示屏:1602  IIC 數(shù)據(jù)傳輸      

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


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


void Delay1s(uchar A)                //  STC15C5A60S2 單片機(jī)1秒延時,主要用來做歡迎詞延時
{
        
        while(A--)
        {
        unsigned char i, j, k;


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






//****************************************************
//主函數(shù)
//****************************************************
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信息(海拔、速度、使用衛(wèi)星數(shù)量)
                        
                }
               
//                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());           //數(shù)據(jù)處理函數(shù)- 溫度1
                        dataprosN(Ds18b20ReadTempN());          //數(shù)據(jù)處理函數(shù)- 溫度2        
                               dataprosS(Ds18b20ReadTempS());         //數(shù)據(jù)處理函數(shù)- 溫度3


                }
               
                LCD_write_command(0x01);        //  清屏




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


                        
        }
   }   




作者: ynzsc001    時間: 2020-1-6 08:38
這兩個循環(huán)和在一起就只能運(yùn)行溫度循環(huán),不管放在前后。但是每一個都能單獨(dú)運(yùn)行。
作者: 陳澤顏    時間: 2020-1-6 09:02
沒有跳出循環(huán)
作者: 1112y    時間: 2020-1-6 09:17
ynzsc001 發(fā)表于 2020-1-6 08:38
這兩個循環(huán)和在一起就只能運(yùn)行溫度循環(huán),不管放在前后。但是每一個都能單獨(dú)運(yùn)行。

for循環(huán)中間是條件表達(dá)式
作者: hebaobao    時間: 2020-1-6 09:43
把 GPS_JieXi();放在dataprosS(Ds18b20ReadTempS()); 后面
作者: f556    時間: 2020-1-6 10:12
請關(guān)注外圍設(shè)備的速度!必要時加延時。當(dāng)然你的延時太強(qiáng),一來就是1S。
作者: 1234c    時間: 2020-1-6 10:15
循環(huán)問題
作者: wulin    時間: 2020-1-6 10:22
ynzsc001 發(fā)表于 2020-1-6 08:38
這兩個循環(huán)和在一起就只能運(yùn)行溫度循環(huán),不管放在前后。但是每一個都能單獨(dú)運(yùn)行。

主循環(huán)中運(yùn)行兩個for循環(huán)本身不會有問題,問題在于for循環(huán)中的子程序有毛病,導(dǎo)致退不出來。
作者: ynzsc001    時間: 2020-1-6 11:19
wulin 發(fā)表于 2020-1-6 10:22
主循環(huán)中運(yùn)行兩個for循環(huán)本身不會有問題,問題在于for循環(huán)中的子程序有毛病,導(dǎo)致退不出來。

可是我是將GPS解析放在前面的,正常運(yùn)行的話應(yīng)該是從前往后,在怎么說也要顯示一次GPS解析才對啊。
作者: ynzsc001    時間: 2020-1-6 11:24
hebaobao 發(fā)表于 2020-1-6 09:43
把 GPS_JieXi();放在dataprosS(Ds18b20ReadTempS()); 后面

如果是for循環(huán)的話在前后都不行。不用的話我又是分屏顯示,每一屏顯示幾秒后轉(zhuǎn)下一屏幕。
作者: ynzsc001    時間: 2020-1-6 11:29
f556 發(fā)表于 2020-1-6 10:12
請關(guān)注外圍設(shè)備的速度!必要時加延時。當(dāng)然你的延時太強(qiáng),一來就是1S。

我的1秒是顯示開機(jī)詞所使用。
在下功力尚淺,懇請前輩再更詳細(xì)指點(diǎn)。!
作者: ynzsc001    時間: 2020-1-6 11:32
wulin 發(fā)表于 2020-1-6 10:22
主循環(huán)中運(yùn)行兩個for循環(huán)本身不會有問題,問題在于for循環(huán)中的子程序有毛病,導(dǎo)致退不出來。

在下功力尚淺,懇請前輩再詳細(xì)指點(diǎn)。!
作者: 時間蒼白了誓言    時間: 2020-1-6 12:29
問題出現(xiàn)在GPS和溫度的處理函數(shù)里,應(yīng)該是沒有從函數(shù)中退出來
作者: liuzx66    時間: 2020-1-6 12:37
兩個for之間沒有足夠的延時,造成只會顯示一個
作者: ynzsc001    時間: 2020-1-6 16:21
liuzx66 發(fā)表于 2020-1-6 12:37
兩個for之間沒有足夠的延時,造成只會顯示一個

我在中間加3秒的延時也不行。不管GPS循環(huán)在前還是在后都不執(zhí)行。
作者: jianfeii    時間: 2020-1-6 16:50
你讀取完gps就清屏了,你顯示放那兒顯示呢
作者: ynzsc001    時間: 2020-1-6 21:15
jianfeii 發(fā)表于 2020-1-6 16:50
你讀取完gps就清屏了,你顯示放那兒顯示呢

GPS_JieXi(); //解析GPS信息(海拔、速度、使用衛(wèi)星數(shù)量)
這個子程序里面我已經(jīng)包含了讀取、顯示的功能了。
如下:

  1. void GPS_JieXi(void)
  2.         
  3.         {
  4.                 unsigned int i = 0;
  5.                 unsigned int j=0;
  6.                 qian_OK=0;                                                                        //標(biāo)志變量歸零
  7.                 k=0;                                                                                    //累計量歸零

  8.                 if (First_Share_OK==0)                                  //讓變量j在0~10000之間來回增減,增加到10000時顯示". ",減到0時顯示" .",實現(xiàn)兩點(diǎn)來回閃動
  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') )                //確認(rèn)是否收到"GPGGA"這一幀完整有效的數(shù)據(jù)
  44.                 {
  45.                         for( i = 0; i < 67 ; i++)                                                  //必須為i<67,因為要確保Display_GPGGA_Buffer[67]為'\0',便于串口發(fā)送
  46.                         {
  47.                                 Display_GPGGA_Buffer[i] = RX_Buffer[i];                  //儲存到數(shù)組中
  48.                         }
  49.                         Flag_Calc_GPGGA_OK = 1;                                                          //收到完整有效數(shù)據(jù)后,置為1, (GPGGA完整有效的數(shù)據(jù)已收到的標(biāo)志變量)
  50.                 }

  51.                 if(Flag_Calc_GPGGA_OK == 1)                                                          //已收到完整有效的數(shù)據(jù),可以進(jìn)行顯示,
  52.                 {
  53.                         Flag_Calc_GPGGA_OK = 0;                                                          //標(biāo)志位歸零

  54.                         if (First_Share_OK == 0)
  55.                         {
  56.                                 First_Share_OK=1;                                                          //"Searching data. "不需再顯示,標(biāo)志變量置為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位數(shù)有時是2位數(shù)有時是3位數(shù),不定
  63.                         {                                                                                  //而確定的是其數(shù)值在第9與第10個逗號之間,所以用此算法輸出海拔
  64.                                 if ( Display_GPGGA_Buffer[i]==',' )          //逐個檢索
  65.                                         k++;                                                          //k計算逗號數(shù)量
  66.                                 if (k==9&&qian_OK==0)
  67.                                         qian_a=i,qian_OK=1;                                  //找到第9個,則記錄其序號,同時標(biāo)志變量置為1
  68.                                 if (k==10)                                                          //海拔數(shù)據(jù)位于第9~10個逗號之間
  69.                                 {
  70.                                         hou_a=i;                                                  //記錄第10個的序號
  71.                                         k=0;                                                           //歸零
  72.                                         qian_OK=0;                                                  //重置為0
  73.                                         break;                                                          //找到后直接跳出循環(huán)
  74.                                 }               
  75.                         }
  76.                         LCD_write_command(0x82);                                                  //準(zhǔn)備在第一行第9列輸出海拔數(shù)據(jù)
  77.                         switch(hou_a-qian_a-1)                                                        //計算海拔數(shù)據(jù)的長度
  78.                         {
  79.                                 case 3:LCD_write_word("   ");break;                //根據(jù)海拔數(shù)據(jù)長度輸出對應(yīng)所需的空格數(shù),使其顯示方式為右對齊
  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]);        // 正在使用衛(wèi)星數(shù)量 十位
  94.                         LCD_write_command(0x8f);                          
  95.                         LCD_write_data(Display_GPGGA_Buffer[46]);        // 正在使用衛(wèi)星數(shù)量 個位
  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')                //確認(rèn)是否收到"GNVTG"這一幀完整有效的數(shù)據(jù)
  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數(shù)據(jù)完整有效則顯示
  116.                 {
  117.                         Flag_Calc_GNVTG_OK = 0;

  118.                         if (First_Share_OK == 0)          //已開始LCD顯示的標(biāo)志變量
  119.                         {
  120.                                 First_Share_OK=1;                //已開始LCD顯示的標(biāo)志變量
  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++)                                                                    //由于速度數(shù)據(jù)也是位數(shù)不定,故亦用此算法精確地確定速度數(shù)據(jù)位置
  128.                         {
  129.                                 if ( Display_GNVTG_Buffer[i]==',' )
  130.                                         k++;
  131.                                 if (k==7&&qian_OK==0)                                                  //速度數(shù)據(jù)位于第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);                                                       //準(zhǔn)備在第2行第9列顯示
  143.                         switch(hou_c-qian_c-2)                                                            //原式為(hou_c-1)-qian_c-1。由于速度不太準(zhǔn)還浮動,故只讓它顯示一位小數(shù)
  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剛好取個整數(shù),沒有小數(shù)點(diǎn)了。
  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.         }
復(fù)制代碼


作者: szy2799    時間: 2020-1-6 21:58
延時太短了吧
作者: linzhiqi1    時間: 2020-1-7 09:15
硬件問題,液晶需要查詢,如何液晶壞了,就退不出溫度程序,一直等待液晶的相應(yīng)。
作者: 冰純    時間: 2020-1-7 10:33
for循環(huán)省略中間條件表達(dá)式,不作處理便進(jìn)入死循環(huán)。
作者: ynzsc001    時間: 2020-1-7 11:26
linzhiqi1 發(fā)表于 2020-1-7 09:15
硬件問題,液晶需要查詢,如何液晶壞了,就退不出溫度程序,一直等待液晶的相應(yīng)。

如果說不用GPS,我弄三個溫度,每屏一個也是沒有不顯示問題的。
作者: wtmkimmy    時間: 2020-1-7 16:32
雖然你外面有循環(huán)15次,但是在第一次循環(huán)中就把Flag_GPS_OK清零了,而你每一次在循環(huán)中顯示后又沒有適當(dāng)?shù)难訒r,而后面的14循環(huán)中由于Flag_GPS_OK為0,同樣都不會顯示內(nèi)容。
作者: ynzsc001    時間: 2020-1-7 23:15
linzhiqi1 發(fā)表于 2020-1-7 09:15
硬件問題,液晶需要查詢,如何液晶壞了,就退不出溫度程序,一直等待液晶的相應(yīng)。

我現(xiàn)在換了2004的LCD 都沒有寫完,應(yīng)該不存在了。
作者: jizhongbiao    時間: 2020-1-8 11:28
你為什么解析15次GPS數(shù)據(jù)
作者: ynzsc001    時間: 2020-1-8 15:18
wtmkimmy 發(fā)表于 2020-1-7 16:32
雖然你外面有循環(huán)15次,但是在第一次循環(huán)中就把Flag_GPS_OK清零了,而你每一次在循環(huán)中顯示后又沒有適當(dāng)?shù)?...

感覺你說的很有道理。
但是“Flag_GPS_OK=0”  會在GPS中斷處理里面置1的。
現(xiàn)在在搬水泥呢,晚上回去搞搞看再回復(fù)你。
作者: ynzsc001    時間: 2020-1-8 15:26
wtmkimmy 發(fā)表于 2020-1-7 16:32
雖然你外面有循環(huán)15次,但是在第一次循環(huán)中就把Flag_GPS_OK清零了,而你每一次在循環(huán)中顯示后又沒有適當(dāng)?shù)?...

昨天晚上我的解決辦法是for了60000次后才顯示出GPS信息。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1