找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4484|回復(fù): 25
打印 上一主題 下一主題
收起左側(cè)

兩個(gè)C語言for循環(huán)(1、GPS解析;2、溫度)只會(huì)執(zhí)行其中一個(gè),為何?

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:408809 發(fā)表于 2020-1-5 23:08 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
這是我寫的 一塊 1602LCD 分兩屏顯示  GPS信息和溫度信息。但是只會(huì)執(zhí)行溫度的循環(huán),GPS 解析的不會(huì)顯示。如果只有GPS解析的循環(huán)則可以正常顯示GPS 的信息。請(qǐng)教前輩這是咋回事?改怎么解決?  
單片機(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秒延時(shí),主要用來做歡迎詞延時(shí)
{
        
        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);        //  清屏




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


                        
        }
   }   



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:408809 發(fā)表于 2020-1-6 08:38 | 只看該作者
這兩個(gè)循環(huán)和在一起就只能運(yùn)行溫度循環(huán),不管放在前后。但是每一個(gè)都能單獨(dú)運(yùn)行。
回復(fù)

使用道具 舉報(bào)

板凳
ID:681887 發(fā)表于 2020-1-6 09:02 | 只看該作者
沒有跳出循環(huán)
回復(fù)

使用道具 舉報(bào)

地板
ID:381937 發(fā)表于 2020-1-6 09:17 | 只看該作者
ynzsc001 發(fā)表于 2020-1-6 08:38
這兩個(gè)循環(huán)和在一起就只能運(yùn)行溫度循環(huán),不管放在前后。但是每一個(gè)都能單獨(dú)運(yùn)行。

for循環(huán)中間是條件表達(dá)式
回復(fù)

使用道具 舉報(bào)

5#
ID:168857 發(fā)表于 2020-1-6 09:43 | 只看該作者
把 GPS_JieXi();放在dataprosS(Ds18b20ReadTempS()); 后面
回復(fù)

使用道具 舉報(bào)

6#
ID:282850 發(fā)表于 2020-1-6 10:12 | 只看該作者
請(qǐng)關(guān)注外圍設(shè)備的速度!必要時(shí)加延時(shí)。當(dāng)然你的延時(shí)太強(qiáng),一來就是1S。
回復(fù)

使用道具 舉報(bào)

7#
ID:652296 發(fā)表于 2020-1-6 10:15 來自觸屏版 | 只看該作者
循環(huán)問題
回復(fù)

使用道具 舉報(bào)

8#
ID:213173 發(fā)表于 2020-1-6 10:22 | 只看該作者
ynzsc001 發(fā)表于 2020-1-6 08:38
這兩個(gè)循環(huán)和在一起就只能運(yùn)行溫度循環(huán),不管放在前后。但是每一個(gè)都能單獨(dú)運(yùn)行。

主循環(huán)中運(yùn)行兩個(gè)for循環(huán)本身不會(huì)有問題,問題在于for循環(huán)中的子程序有毛病,導(dǎo)致退不出來。
回復(fù)

使用道具 舉報(bào)

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

可是我是將GPS解析放在前面的,正常運(yùn)行的話應(yīng)該是從前往后,在怎么說也要顯示一次GPS解析才對(duì)啊。
回復(fù)

使用道具 舉報(bào)

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

如果是for循環(huán)的話在前后都不行。不用的話我又是分屏顯示,每一屏顯示幾秒后轉(zhuǎn)下一屏幕。
回復(fù)

使用道具 舉報(bào)

11#
ID:408809 發(fā)表于 2020-1-6 11:29 | 只看該作者
f556 發(fā)表于 2020-1-6 10:12
請(qǐng)關(guān)注外圍設(shè)備的速度!必要時(shí)加延時(shí)。當(dāng)然你的延時(shí)太強(qiáng),一來就是1S。

我的1秒是顯示開機(jī)詞所使用。
在下功力尚淺,懇請(qǐng)前輩再更詳細(xì)指點(diǎn)。。
回復(fù)

使用道具 舉報(bào)

12#
ID:408809 發(fā)表于 2020-1-6 11:32 | 只看該作者
wulin 發(fā)表于 2020-1-6 10:22
主循環(huán)中運(yùn)行兩個(gè)for循環(huán)本身不會(huì)有問題,問題在于for循環(huán)中的子程序有毛病,導(dǎo)致退不出來。

在下功力尚淺,懇請(qǐng)前輩再詳細(xì)指點(diǎn)。!
回復(fù)

使用道具 舉報(bào)

13#
ID:451629 發(fā)表于 2020-1-6 12:29 | 只看該作者
問題出現(xiàn)在GPS和溫度的處理函數(shù)里,應(yīng)該是沒有從函數(shù)中退出來
回復(fù)

使用道具 舉報(bào)

14#
ID:160500 發(fā)表于 2020-1-6 12:37 | 只看該作者
兩個(gè)for之間沒有足夠的延時(shí),造成只會(huì)顯示一個(gè)
回復(fù)

使用道具 舉報(bào)

15#
ID:408809 發(fā)表于 2020-1-6 16:21 | 只看該作者
liuzx66 發(fā)表于 2020-1-6 12:37
兩個(gè)for之間沒有足夠的延時(shí),造成只會(huì)顯示一個(gè)

我在中間加3秒的延時(shí)也不行。不管GPS循環(huán)在前還是在后都不執(zhí)行。
回復(fù)

使用道具 舉報(bào)

16#
ID:142699 發(fā)表于 2020-1-6 16:50 | 只看該作者
你讀取完gps就清屏了,你顯示放那兒顯示呢
回復(fù)

使用道具 舉報(bào)

17#
ID:408809 發(fā)表于 2020-1-6 21:15 | 只看該作者
jianfeii 發(fā)表于 2020-1-6 16:50
你讀取完gps就清屏了,你顯示放那兒顯示呢

GPS_JieXi(); //解析GPS信息(海拔、速度、使用衛(wèi)星數(shù)量)
這個(gè)子程序里面我已經(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;                                                                                    //累計(jì)量歸零

  8.                 if (First_Share_OK==0)                                  //讓變量j在0~10000之間來回增減,增加到10000時(shí)顯示". ",減到0時(shí)顯示" .",實(shí)現(xiàn)兩點(diǎn)來回閃動(dòng)
  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,因?yàn)橐_保Display_GPGGA_Buffer[67]為'\0',便于串口發(fā)送
  46.                         {
  47.                                 Display_GPGGA_Buffer[i] = RX_Buffer[i];                  //儲(chǔ)存到數(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++)                                                  //由于海拔有時(shí)是1位數(shù)有時(shí)是2位數(shù)有時(shí)是3位數(shù),不定
  63.                         {                                                                                  //而確定的是其數(shù)值在第9與第10個(gè)逗號(hào)之間,所以用此算法輸出海拔
  64.                                 if ( Display_GPGGA_Buffer[i]==',' )          //逐個(gè)檢索
  65.                                         k++;                                                          //k計(jì)算逗號(hào)數(shù)量
  66.                                 if (k==9&&qian_OK==0)
  67.                                         qian_a=i,qian_OK=1;                                  //找到第9個(gè),則記錄其序號(hào),同時(shí)標(biāo)志變量置為1
  68.                                 if (k==10)                                                          //海拔數(shù)據(jù)位于第9~10個(gè)逗號(hào)之間
  69.                                 {
  70.                                         hou_a=i;                                                  //記錄第10個(gè)的序號(hào)
  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)                                                        //計(jì)算海拔數(shù)據(jù)的長度
  78.                         {
  79.                                 case 3:LCD_write_word("   ");break;                //根據(jù)海拔數(shù)據(jù)長度輸出對(duì)應(yīng)所需的空格數(shù),使其顯示方式為右對(duì)齊
  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ù)量 個(gè)位
  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個(gè)逗號(hào)之間
  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)還浮動(dòng),故只讓它顯示一位小數(shù)
  144.                         {
  145.                                 case 3:LCD_write_word("");break;                    //使右對(duì)齊
  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剛好取個(gè)整數(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ù)制代碼

回復(fù)

使用道具 舉報(bào)

18#
ID:682507 發(fā)表于 2020-1-6 21:58 | 只看該作者
延時(shí)太短了吧
回復(fù)

使用道具 舉報(bào)

19#
ID:532541 發(fā)表于 2020-1-7 09:15 | 只看該作者
硬件問題,液晶需要查詢,如何液晶壞了,就退不出溫度程序,一直等待液晶的相應(yīng)。
回復(fù)

使用道具 舉報(bào)

20#
ID:261288 發(fā)表于 2020-1-7 10:33 | 只看該作者
for循環(huán)省略中間條件表達(dá)式,不作處理便進(jìn)入死循環(huán)。
回復(fù)

使用道具 舉報(bào)

21#
ID:408809 發(fā)表于 2020-1-7 11:26 | 只看該作者
linzhiqi1 發(fā)表于 2020-1-7 09:15
硬件問題,液晶需要查詢,如何液晶壞了,就退不出溫度程序,一直等待液晶的相應(yīng)。

如果說不用GPS,我弄三個(gè)溫度,每屏一個(gè)也是沒有不顯示問題的。
回復(fù)

使用道具 舉報(bào)

22#
ID:497656 發(fā)表于 2020-1-7 16:32 | 只看該作者
雖然你外面有循環(huán)15次,但是在第一次循環(huán)中就把Flag_GPS_OK清零了,而你每一次在循環(huán)中顯示后又沒有適當(dāng)?shù)难訒r(shí),而后面的14循環(huán)中由于Flag_GPS_OK為0,同樣都不會(huì)顯示內(nèi)容。
回復(fù)

使用道具 舉報(bào)

23#
ID:408809 發(fā)表于 2020-1-7 23:15 | 只看該作者
linzhiqi1 發(fā)表于 2020-1-7 09:15
硬件問題,液晶需要查詢,如何液晶壞了,就退不出溫度程序,一直等待液晶的相應(yīng)。

我現(xiàn)在換了2004的LCD 都沒有寫完,應(yīng)該不存在了。
回復(fù)

使用道具 舉報(bào)

24#
ID:130230 發(fā)表于 2020-1-8 11:28 | 只看該作者
你為什么解析15次GPS數(shù)據(jù)
回復(fù)

使用道具 舉報(bào)

25#
ID:408809 發(fā)表于 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”  會(huì)在GPS中斷處理里面置1的。
現(xiàn)在在搬水泥呢,晚上回去搞搞看再回復(fù)你。
回復(fù)

使用道具 舉報(bào)

26#
ID:408809 發(fā)表于 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信息。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表