標題: 單片機C語言程序奇怪的問題,我沒有考慮到什么? [打印本頁]

作者: wolfinn    時間: 2022-6-2 20:55
標題: 單片機C語言程序奇怪的問題,我沒有考慮到什么?
       原理:開機時讀入1302時間,記住分鐘初值,同時打開繼電器,接通wifi電源。在while(1)循環(huán)內(nèi)不斷的看1302的分鐘
值,如果大于5分鐘就關(guān)wifi,F(xiàn)在出現(xiàn)的問題是開機差不多不滿1分鐘就關(guān)機了。if內(nèi)的條件
((gds1302_time[1]/16*10+gds1302_time[1]%16-5)>(offpower)),如果把大于號改==就可以實現(xiàn)5分鐘關(guān)wifi。


       現(xiàn)在想請問一下高手為什么我在條件里用>號不可以呢?==就可以?

單片機源程序如下:

...............;
unsigned char gds1302_time[7];                               //1302時鐘數(shù)組
............;
unsigned char offpower;                                         //開機時分鐘值
sbit  wifi_power=P1^5;                                         //繼電器
..........;
main()
{
.........;
.........;
ds1302_read_time();                                                       //讀入1302時間值,放數(shù)組gds1302_time里,[1]里的是分鐘。
offpower=gds1302_time[1]/16*10+gds1302_time[1]%16; //分鐘轉(zhuǎn)為數(shù)值,此變量為開機分鐘初始值
if (offpower>49) offpower=0;                                         //將與下面的量比定時最大十分鐘

wifi_power=0;                                                                //打開繼電器,wifi通電。
...................;
...................;
while (1)
    {
      ..........;
      .........;
     ds1302_read_time();                                                                    //動態(tài)讀入時間值
     if ((gds1302_time[1]/16*10+gds1302_time[1]%16-5)>(offpower))  //轉(zhuǎn)化為現(xiàn)時分鐘后與開機時分鐘比較(現(xiàn)定時5                                                                                                      //分鐘)
                {                                                                                    //大于5分鐘后關(guān)wifi電源
                 wifi_power=1;
                 offpower=0xff;                                                              //同時比較初值設(shè)為255,因為1302時鐘原理,它永
                                                                                                    //遠不會大于59,以后只要不關(guān)機再開,永遠不合if
                                                                                                    //條件。
                }         
     ..................;
     .................;
     }

}




作者: wolfinn    時間: 2022-6-2 21:57
     想了一下,初值取模有點問題如果是定時10分鐘,應(yīng)當(dāng)是offpower>49時,offpwoer應(yīng)當(dāng)是offpwoer+10-60。當(dāng)然我在上面列出的程序是定時5分鐘,則為offpower>55時,offpwoer應(yīng)當(dāng)是offpwoer+5-60。
     現(xiàn)在不說模的問題,是在時間為20幾分鐘時開機它不按我的定時分鐘關(guān)電,而是差不多1分鐘就關(guān)電了,改>于號為==就可以。
作者: Hephaestus    時間: 2022-6-2 22:07
如果沒有仿真器,那么用串口把(gds1302_time[1]/16*10+gds1302_time[1]%16-5)和(offpower)兩個值打印出來看看。
作者: 啤酒瓶子老大    時間: 2022-6-2 22:24
如果只是5分鐘后關(guān)閉什么東西,不用1302也行。直接用定時器計時簡單一點。
作者: wolfinn    時間: 2022-6-2 22:25
Hephaestus 發(fā)表于 2022-6-2 22:07
如果沒有仿真器,那么用串口把(gds1302_time[1]/16*10+gds1302_time[1]%16-5)和(offpower)兩個值打印出來看 ...

好主意,在滿足條件語句里打印。但現(xiàn)在我想問的是為什么>不行,==就可以,是不是單片機把條件當(dāng)作賦值語句什么的了,比如我在這里改>號為單=號,大多數(shù)情況它的條件不為零,它會同樣是一執(zhí)行到就關(guān)電。
作者: wolfinn    時間: 2022-6-2 22:32
啤酒瓶子老大 發(fā)表于 2022-6-2 22:24
如果只是5分鐘后關(guān)閉什么東西,不用1302也行。直接用定時器計時簡單一點。

不想浪費定時器資源。我這個是1302時鐘程序,wifi每天對時,當(dāng)然對時完成wifi會關(guān)電,F(xiàn)在是在wifi連不上網(wǎng)的時候就不對時了,一定時間關(guān)wifi,節(jié)能。
作者: wolfinn    時間: 2022-6-2 22:36
Hephaestus 發(fā)表于 2022-6-2 22:07
如果沒有仿真器,那么用串口把(gds1302_time[1]/16*10+gds1302_time[1]%16-5)和(offpower)兩個值打印出來看 ...

其實打印出來也沒有用,開機到條件滿足就一兩分鐘,打印出來的數(shù)據(jù)對分析作用不太大。無非是我的初值加1兩分鐘。
作者: tongguan123    時間: 2022-6-2 22:45
本帖最后由 tongguan123 于 2022-6-2 23:14 編輯
Hephaestus 發(fā)表于 2022-6-2 22:07
如果沒有仿真器,那么用串口把(gds1302_time[1]/16*10+gds1302_time[1]%16-5)和(offpower)兩個值打印出來看 ...

首先說明一下,我也是一名初學(xué)者啊。
你所說的通過串口把這兩個值打印出來,是不是在編程序時候,分別將這兩個公式計算的值賦值給兩個變量,然后通過串口發(fā)送出來???

作者: lkc8210    時間: 2022-6-2 23:07
要不改成這樣試試
  1. while (1)
  2.     {
  3.       ..........;
  4.       .........;
  5.      ds1302_read_time();                                                                    //動態(tài)讀入時間值
  6.          CurrentTime = gds1302_time[1]/16*10+gds1302_time[1]%16;//<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  7.      if (CurrentTime - offpower >= 5)  //轉(zhuǎn)化為現(xiàn)時分鐘后與開機時分鐘比較(現(xiàn)定時5                                                                                                      //分鐘)
  8.                 {                                                                                    //大于5分鐘后關(guān)wifi電源
  9.                  wifi_power=1;
  10.                  offpower=0xff;                                                              //同時比較初值設(shè)為255,因為1302時鐘原理,它永
  11.                                                                                                     //遠不會大于59,以后只要不關(guān)機再開,永遠不合if
  12.                                                                                                     //條件。
  13.                 }         
  14.      ..................;
  15.      .................;
  16.      }
復(fù)制代碼





作者: wolfinn    時間: 2022-6-2 23:09
tongguan123 發(fā)表于 2022-6-2 22:45
首先說明一下,我也是一名初學(xué)者啊。
你所說的通過串口把這兩個值打印出來,是不是在編程序時候, ...

條件滿足時在進入里面的語句加才有效,要不循環(huán)內(nèi)我的時間值在不斷的讀不斷的變。
作者: tongguan123    時間: 2022-6-2 23:13
作為一名菜鳥,只能這樣分析了,看圖說話!





所以-------------------------------------


作者: tongguan123    時間: 2022-6-2 23:17
wolfinn 發(fā)表于 2022-6-2 21:57
想了一下,初值取模有點問題如果是定時10分鐘,應(yīng)當(dāng)是offpower>49時,offpwoer應(yīng)當(dāng)是offpwoer+10-60。 ...
所以你那個取模應(yīng)該是沒問題的。
作者: wolfinn    時間: 2022-6-2 23:18
lkc8210 發(fā)表于 2022-6-2 23:07
要不改成這樣試試

謝謝你,我估計你這想法也是可以的,因為我用==也是可以通過的。

其實寫這程序出來只是提供一個思路,怎樣運行一段時間關(guān)一個東西,我這里利用上了1302時鐘的分鐘功能,當(dāng)然用定時器0也是可以的。
程序用于GPS、Wifi雙模塊每天定時對1302對時,關(guān)電再也可以對時一次。

我想了解的是邏輯語句的>號和==為什么會有這效果,是不是==號有強制數(shù)據(jù)轉(zhuǎn)換功能。而>號就沒有。而表達式的左邊是不是為INT整形了,而右邊是字符形,不轉(zhuǎn)換類型的話是不是INT整形永遠大于任何一個字符形。
作者: tongguan123    時間: 2022-6-2 23:21
wolfinn 發(fā)表于 2022-6-2 23:09
條件滿足時在進入里面的語句加才有效,要不循環(huán)內(nèi)我的時間值在不斷的讀不斷的變。
ok,了解!Thanks, my brother!
作者: wolfinn    時間: 2022-6-2 23:22
tongguan123 發(fā)表于 2022-6-2 23:17
所以你那個取模應(yīng)該是沒問題的。

程序里沒有寫-60,當(dāng)然這里不是討論這個模的問題,最多是在變模處會有1~10分鐘的不規(guī)則定時。
作者: wolfinn    時間: 2022-6-2 23:27
tongguan123 發(fā)表于 2022-6-2 23:13
作為一名菜鳥,只能這樣分析了,看圖說話!

你錯了,如你所說,1302取出的數(shù)是0x24,而不是24,所以如果要數(shù)碼管顯示的話得2后直接查2的段碼顯示就行,余4也同樣查4的段碼。如在LED等顯示要加0x30或48,或‘ ’空格。2要加,4也要加。
作者: tongguan123    時間: 2022-6-2 23:31
wolfinn 發(fā)表于 2022-6-2 23:22
程序里沒有寫-60,當(dāng)然這里不是討論這個模的問題,最多是在變模處會有1~10分鐘的不規(guī)則定時。
因為你設(shè)置的時間剛好是五分鐘就要執(zhí)行關(guān)閉WIFI電源,所以按照你那個if里面取模公式,必須要等于==offpower,才滿足條件,即條件為真,才執(zhí)行里面的語句!
作者: tongguan123    時間: 2022-6-2 23:39
所以這條語句應(yīng)該不會執(zhí)行吧?   if (offpower>49) offpower=0;      //將與下面的量比定時最大十分鐘

作者: wolfinn    時間: 2022-6-2 23:48
tongguan123 發(fā)表于 2022-6-2 23:31
因為你設(shè)置的時間剛好是五分鐘就要執(zhí)行關(guān)閉WIFI電源,所以按照你那個if里面取模公式,必須要等于==offpowe ...

你沒有明白,我不是要求必須要==才關(guān)電,而是>于也可以,只要關(guān)了就行。
比如我取初值時為58,程序里認為大于49了,初值為0.然后過三分鐘,時間為01,大于00了,關(guān)電,達不到10分鐘的定時要求。加上模就不同了,58+10-60=08分鐘,到09才關(guān)電.

同樣5分鐘的定時模也一樣。我取初值時為58,程序里認為大于55了,初值為0.然后過三分鐘,時間為01,大于00了,關(guān)電,達不到5分鐘的定時要求。加上模就不同了,58+5-60=03分鐘,到04才關(guān)電.
作者: Hephaestus    時間: 2022-6-2 23:50
tongguan123 發(fā)表于 2022-6-2 23:39
所以這條語句應(yīng)該不會執(zhí)行吧?   if (offpower>49) offpower=0;      //將與下面的量比定時最大十分鐘

你明顯不對,如果是59分,那么是0x59/16*10
作者: wolfinn    時間: 2022-6-2 23:50
tongguan123 發(fā)表于 2022-6-2 23:39
所以這條語句應(yīng)該不會執(zhí)行吧?   if (offpower>49) offpower=0;      //將與下面的量比定時最大十分鐘

時間分鐘是59,但是1302讀出的是0x59,而不是值是59,值是5*16+9=89
作者: Hephaestus    時間: 2022-6-2 23:52
tongguan123 發(fā)表于 2022-6-2 22:45
本帖最后由 tongguan123 于 2022-6-2 23:14 編輯

首先說明一下,我也是一名初學(xué)者啊。

對啊!這樣才能知道這兩個值到底是什么,而不是樓主夢想中的值。
作者: tongguan123    時間: 2022-6-3 00:02
wolfinn 發(fā)表于 2022-6-2 23:50
時間分鐘是59,但是1302讀出的是0x59,而不是值是59,值是5*16+9=89

OK!
作者: wolfinn    時間: 2022-6-3 00:05
tongguan123 發(fā)表于 2022-6-2 23:39
所以這條語句應(yīng)該不會執(zhí)行吧?   if (offpower>49) offpower=0;      //將與下面的量比定時最大十分鐘

你別跟我糾結(jié)模的問題啦,在40以下不跟模運算有關(guān)的用 >都出現(xiàn)點問題,模我改了以后沒問題的了。還有你對1302取出的數(shù)不了解,它用的是BCD碼表示一位數(shù)值,是多少分鐘就是0x多少,小時、年、月、日、秒都一樣。BCD是用四位二進制表示一位數(shù)字,我們就理解直讀就行。比如0x59,就是0101 1001,為什么這么表示而不用89(10進制)。用BCD碼以后顯示運算方便啊。好象書上寫過最快的是移位和位運算吧,如果右移四,      
0000 0101 5這個數(shù)不是出來了?再位運算與0F,0000 1001不是出來了。當(dāng)然我在程序里用什么除16乘10再加16的余數(shù)也是一樣的。
作者: wolfinn    時間: 2022-6-3 00:07
只是討論,討論才讓人明白,并不是顯示我多懂,是想讓我懂的東西別人也懂了。
作者: tongguan123    時間: 2022-6-3 00:12
wolfinn 發(fā)表于 2022-6-3 00:05
你別跟我糾結(jié)模的問題啦,在40以下不跟模運算有關(guān)的用 >都出現(xiàn)點問題,模我改了以后沒問題的了。還有你對 ...

好吧!
作者: wolfinn    時間: 2022-6-3 00:13
tongguan123 發(fā)表于 2022-6-3 00:02
OK!

好吧,再說回轉(zhuǎn)問題,是不是拿89當(dāng)59運算呢。不是的,還是得算回59,就是89/16,再89%16,當(dāng)然可以寫0x59/16+0x59%16直觀點,砍一個位的數(shù)就行。
作者: wolfinn    時間: 2022-6-3 00:28
tongguan123 發(fā)表于 2022-6-3 00:12
好吧!

再說一個,比如我們要LED十六進制顯示出一個數(shù),我們知道它的值是0x6B(107十進制),先原樣字符0x,再經(jīng)過運算得6(0x36,即6+0x30),再輸出B(是不是0x3B?不是的,0~9要字符顯示是加0x30,余數(shù)大于10以上的A~F要加0x37才正常顯示。如要顯示0x6b,這樣B小寫,同樣余數(shù)大于10以上的a~f也不能加0x37了,要加什么,我還沒算,自己查ASCII表也可以算出來。
作者: 188610329    時間: 2022-6-3 00:34
我不知道為什么你要用這么復(fù)雜的算法……
不知道乘除法非常費資源的么? 而且跨60的時候,還要策略去補償,
只是要計算多少分鐘,這樣不是最穩(wěn)妥?

void main()
{
offpower = 100;

while(1)
{
........................
     if(offpower)       //非0才進入
     {
           if(temp != gds1302_time[1])
           {
                    temp = gds1302_time[1];
                    if(++offpower  > 105)
                    {
                              wifi_power=1;
                              offpower = 0;  
                     }
            }
}
}


作者: wolfinn    時間: 2022-6-3 00:37
wolfinn 發(fā)表于 2022-6-3 00:28
再說一個,比如我們要LED十六進制顯示出一個數(shù),我們知道它的值是0x6B(107十進制),先原樣字符0x,再經(jīng) ...

小寫表示a~f要加0x57。
作者: wolfinn    時間: 2022-6-3 00:50
188610329 發(fā)表于 2022-6-3 00:34
我不知道為什么你要用這么復(fù)雜的算法……
不知道乘除法非常費資源的么? 而且跨60的時候,還要策略去補償 ...

多謝指導(dǎo),你的才真的高。學(xué)習(xí)。
總會有問題的,你怎不查下為什么我會出這種小問題?是數(shù)據(jù)左右不同?
另外單片機用數(shù)組多了會有數(shù)據(jù)重疊現(xiàn)象,當(dāng)然對結(jié)果沒有大影響,就是會影響LED顯示,有什么解決方法?
作者: 188610329    時間: 2022-6-3 13:12
wolfinn 發(fā)表于 2022-6-3 00:50
多謝指導(dǎo),你的才真的高。學(xué)習(xí)。
總會有問題的,你怎不查下為什么我會出這種小問題?是數(shù)據(jù)左右不同?
...

查問題, 是需要標本的……, 樓上好多層都讓你回傳數(shù)據(jù),你覺得沒有意義。那么很多東西是沒有辦法分析的……

給你前面那個代碼,說實話,其實我是打算在你不愿意采集標本的前提下,通過我比較確認的代碼變相的采集標本。

非要拿你的代碼來說的話……,至少我看下來,除了:
if (offpower>49) offpower=0;                                         //將與下面的量比定時最大十分鐘
這個帶來很多問題之外,
理論上,如果你在 20分左右的時候,開機,應(yīng)該是可以5分鐘關(guān)機的。

非要我給你一個方案的話,我以為:

ds1302_read_time();                                                                    //動態(tài)讀入時間值
if((gds1302_time[1] < 0x60) && ((gds1302_time[1] & 0x0f)< 0x0A))     //這里增加一個判斷{
     if ((gds1302_time[1]/16*10+gds1302_time[1]%16-5)>(offpower))  //轉(zhuǎn)化為現(xiàn)時分鐘后與開機時分鐘比較(現(xiàn)定時5                                                                                                      //分鐘)
                {                                                                                    //大于5分鐘后關(guān)wifi電源
                 wifi_power=1;
                 offpower=0xff;                                                              //同時比較初值設(shè)為255,因為1302時鐘原理,它永
                                                                                                    //遠不會大于59,以后只要不關(guān)機再開,永遠不合if
                                                                                                    //條件。
                }

}

應(yīng)該可以解決你的問題。
至于原因,我相信,當(dāng)你這么寫確實解決問題了之后,你就明白為什么了。

作者: wolfinn    時間: 2022-6-3 20:26
188610329 發(fā)表于 2022-6-3 13:12
查問題, 是需要標本的……, 樓上好多層都讓你回傳數(shù)據(jù),你覺得沒有意義。那么很多東西是沒有辦法分析的 ...

唉,轉(zhuǎn)模處不討論,這東西經(jīng)過我進行轉(zhuǎn)模處理后是沒有問題的了。我是想讓高手你以你的經(jīng)驗看看條件中同樣是關(guān)系表達式,為什么用>號不行,==號反倒可以,同時我也試過了>=也同樣不行的哈。如果是純粹地為了讓程序運行得了,通得過。用==就是了,或者用你那高效率的奇妙寫法就行。可能還是數(shù)據(jù)轉(zhuǎn)換的問題,因為我是直接表達式,如果放一有類型變量后再比較可能會好。
作者: 188610329    時間: 2022-6-3 23:28
wolfinn 發(fā)表于 2022-6-3 20:26
唉,轉(zhuǎn)模處不討論,這東西經(jīng)過我進行轉(zhuǎn)模處理后是沒有問題的了。我是想讓高手你以你的經(jīng)驗看看條件中同樣 ...

所以,我就是問, 按我上面寫的加一個判斷, 大于是不是可以了? 這個也很難回答么?
作者: wolfinn    時間: 2022-6-4 11:30
188610329 發(fā)表于 2022-6-3 23:28
所以,我就是問, 按我上面寫的加一個判斷, 大于是不是可以了? 這個也很難回答么?

我歷來都是說不觸發(fā)模的情況下20多分鐘也不行,所以你說的有關(guān)加個檢查模的那條命令這沒有必要試。另外我不想用串口輸出兩個值是因為輸出要做格式化處理,我隱隱感覺這可能是左邊的公式?jīng)]有數(shù)據(jù)類型,可能是系統(tǒng)做轉(zhuǎn)化的問題,而我用輸出同樣是找不到答案的。用頭腦可以運行出時間沒有超過兩分鐘。另外我有點不好意思,好象我在逼著你回答一樣。我后來也把左邊自己加上(int)和 (unsigned char)自己強廹讓它數(shù)據(jù)轉(zhuǎn)化,也不行。
        以后我少點發(fā)這種請教的問題了,其實我目的也不在請教,只是想說明自己遇到過這種情況,如有高手點一下最好,如果同樣是菜鳥回復(fù)就算不解決不了問題,我在回應(yīng)中舒緩下神經(jīng),說不定一閃光自己能解決了。
作者: 188610329    時間: 2022-6-4 12:26
wolfinn 發(fā)表于 2022-6-4 11:30
我歷來都是說不觸發(fā)模的情況下20多分鐘也不行,所以你說的有關(guān)加個檢查模的那條命令這沒有必要試。另外我 ...

行吧,如無意外,最后一次對此問題展開討論。
在所有的判定當(dāng)中, == 是最為嚴格的, 當(dāng)測試 == 能正常動作時,不管你換成大于和小于理論上都是能正常動作的。所以,加任何強轉(zhuǎn)什么的都是毫無必要的。這是無用功!。∧阋詾槟阕隽撕芏,其實,等于什么都沒做。
那么,== 能夠正確的判定, 為什么換了 > 就出問題了呢? 問題肯定不在判定的公式上,而是天平兩邊的東西和你預(yù)料的不同,在極為嚴格的 == 下,被貍貓換太子的數(shù)據(jù),不會讓==準許進入if分支,但是,如果不嚴格 > 就會允許進入到 if 分支。
不知基于什么原因,但凡對你的數(shù)據(jù)源有一點懷疑,就好像刺痛你的神經(jīng)源一樣。但是,事實上,如果上面的描述你沒有刻意隱藏一些其他信息的話,基本可以確定,就是你數(shù)據(jù)源有亂入數(shù)據(jù)。不過,既然你也說了,你不打算知道問題的真相,那么,就當(dāng)我瞎起勁就是了。
反正,你解決問題也好,了解真相也好,對于我是沒有辦法好處的。
作者: wolfinn    時間: 2022-6-4 13:29
188610329 發(fā)表于 2022-6-4 12:26
行吧,如無意外,最后一次對此問題展開討論。
在所有的判定當(dāng)中, == 是最為嚴格的, 當(dāng)測試 == 能正常 ...

好吧,謝謝你,左邊是一個現(xiàn)算值,右邊一個算好的變量值,數(shù)據(jù)亂入?不想吵了,謝謝你,浪費了你的時間。
作者: 雪玉寐影    時間: 2022-6-4 14:27
比較前,把等號左邊的值送串口看一眼很難嗎?爭來爭去,沒有數(shù)據(jù)徒傷和氣,有什么意義?
作者: zhxiufan    時間: 2022-6-4 14:38
關(guān)鍵的問題是當(dāng),分值大于49時,被賦予了值為0,當(dāng)然就會出問題了。所以要分別處理大于49和小于49的情況。
作者: wolfinn    時間: 2022-6-4 15:31
沒必要送串口了,打印出來也分析不出什么引起的。單片機很忠實的。條件運算的結(jié)果肯定是為真(1),轉(zhuǎn)換后的數(shù)我認為就是數(shù)據(jù)自動轉(zhuǎn)換的問題了,經(jīng)換換后的數(shù)肯定是大于初值的,至于==的情況只有一個滿足,所以用==可以獲得我要的定時結(jié)果。我在網(wǎng)上搜了一下,左右數(shù)據(jù)類型不同的情況比較確實會自動轉(zhuǎn)換。按說法應(yīng)該是負數(shù)轉(zhuǎn)換才會出錯,也就是在后面讀的分鐘在00~定時值時,左邊是負值,轉(zhuǎn)換后永遠大于初值。至于不為負轉(zhuǎn)換后也這樣我就不明白了。
作者: wolfinn    時間: 2022-6-4 15:35
我之所以對我的數(shù)據(jù)源不懷疑,是用頭腦跟著運算到那條語句的當(dāng)下那一瞬間,是很確定的情況,第一,我雖開著串口中斷,但沒接線。別的中斷在那當(dāng)下也沒有發(fā)生,要不我會懷疑什么中斷堆棧之類的問題。
作者: 名字不是重點    時間: 2022-6-4 16:13
其實一開始就是邏輯的問題:
1、開機讀取1302的分鐘值,存為變量比如“”
2、過一段時間(這個時間影響定時的實時性,最多不要超1分鐘),如2秒一次,讀1302分鐘值,與“START”對比,相同則跳過,不同則計時變量如“MIN” +1,同時把1032分鐘值賦予“START”。
3、"MIN">=5,則繼電器動作切換。
要什么取模轉(zhuǎn)換?要什么串口打印?都不用管它。。只不過多加了個變量而已。
作者: wolfinn    時間: 2022-6-4 16:23
zhxiufan 發(fā)表于 2022-6-4 14:38
關(guān)鍵的問題是當(dāng),分值大于49時,被賦予了值為0,當(dāng)然就會出問題了。所以要分別處理大于49和小于49的情況。

不用分別處理,經(jīng)模轉(zhuǎn)換后可以排除影響。
作者: 名字不是重點    時間: 2022-6-4 20:06

...............;
unsigned char gds1302_time[7];                               //1302時鐘數(shù)組
............;

u8  newmin;
u8  min_count;

sbit  wifi_power=P1^5;                                         //繼電器
..........;
main()
{
.........;
.........;
ds1302_read_time();                                                       //讀入1302時間值,放數(shù)組gds1302_time里,[1]里的是分鐘。
newmin=gds1302_time[1]; //分鐘轉(zhuǎn)為數(shù)值,此變量為開機分鐘初始值
min_count=0;
wifi_power=0;                                                                //打開繼電器,wifi通電。
...................;
...................;
while (1) //如果這個大循環(huán)時間超長(大于1分鐘,則需另開一個定時器,用中斷法)
    {
      ..........;
      .........;
     if(wifi_power=0)  //wifi通電時,才讀入時間值,防止一直讀取分鐘數(shù)

       ds1302_read_time();

        if (gds1302_time[1]!=newmin) //比較分鐘值
                {                                                                              
                 min_count++;  //不同則表示已改變分鐘數(shù),計數(shù)+1

                 newmin=gds1302_time[1]; //同時改變已存的分鐘值

                 }

    if (min_count>=5) wifi_power=1;      //計數(shù)溢出(超5分鐘)則wifi斷電
                                                         
       }         
     ..................;
     .................;
     }

}
作者: Hephaestus    時間: 2022-6-4 23:16
傳說中三個臭皮匠賽過諸葛亮,但是這個帖子告訴我們一個臭皮匠能氣死三個諸葛亮。
作者: wolfinn    時間: 2022-6-5 00:33
名字不是重點 發(fā)表于 2022-6-4 16:13
其實一開始就是邏輯的問題:
1、開機讀取1302的分鐘值,存為變量比如“”
2、過一段時間(這個時間影響定 ...

是,你這方法同上一位高手的異曲同工,只是變了種寫法。今天傍晚前我差不多也想到了一致的內(nèi)容,剛看你的回復(fù)。用串口是另一朋友為了讓我排除故障提出來的一個方法。但我一直沒有進行。是因為我左邊值一開始就是一個無類型的值。串口輸出要怎么處理,要說它是64位的值我都可以轉(zhuǎn)換打印得出來。不同右邊初值是一個字任型的變量。而我是無法去打印出那倆個系統(tǒng)為了運行>比較而自動轉(zhuǎn)換的值的。你們的算法都很妙。其實現(xiàn)在我把左值在判斷前先把它賦給一個確定類型的變量可能就好了,F(xiàn)在看來在編程當(dāng)中不能有一個不確定的東西。我還沒有試。我是一切都懷疑,而不是那朋友所說的質(zhì)疑我的數(shù)據(jù)源,好象什么刺痛我的神經(jīng)。為的是看起來可以的東西為什么不行。防止下回再犯同樣的錯誤。雖然說算法有點笨和慢。但能用的話同樣能解決問題的。
作者: wolfinn    時間: 2022-6-5 00:40
以前我調(diào)試程序是點亮一盞燈來看看程序走到哪里,有沒有進條件語句。現(xiàn)在看來打印輸出更方便?梢愿鶕(jù)內(nèi)容設(shè)無數(shù)個點。
作者: lkc8210    時間: 2022-6-5 00:56
wolfinn 發(fā)表于 2022-6-4 13:29
好吧,謝謝你,左邊是一個現(xiàn)算值,右邊一個算好的變量值,數(shù)據(jù)亂入?不想吵了,謝謝你,浪費了你的時間。

如你所說左邊是現(xiàn)算值,右邊是算好的變量值
if(A>B)要成立必定是A的值大于B
既然B是固定值
必然是A在一分多鐘內(nèi)突然多于B(如255)
那么有沒有一個可能
就是ds1302_read_time();這函數(shù)在讀取分鐘值時受到中斷或其他因素干擾
令讀到的值產(chǎn)生錯誤(如255)
于是if(A>B)就成立了
188610329的if((gds1302_time[1] < 0x60) && ((gds1302_time[1] & 0x0f)< 0x0A))
就是為了過濾這種掉數(shù)據(jù)亂入
而串口輸出更可以得知A的值甚至A的源數(shù)據(jù)gds1302_time[1]的值
從你的回覆得知你還沒有試過打印出來
而是認定了過了一分多鐘gds1302_time[1]的值只會+1或+2

還有就是為什么不把所有代碼都貼上來?
而是只"節(jié)錄"你覺得有問題的代碼片段?
在你之前的三個發(fā)問貼中
第一個貼子沒有代碼,范范而談,結(jié)果是定時器0初始化語句放WHILE(1)大循環(huán)里
第二個貼子有代碼,但原來是用錯晶振
第三個貼子有"節(jié)錄"代碼,結(jié)果是函數(shù)宣告打少了*號
在第一個貼子中更說出"不放程序上來不是讓人來解決問題的。那樣我覺得學(xué)不到東西。對別人也是種折磨。"這名句
敢問你在第一個貼子里學(xué)到了什么?

作者: wolfinn    時間: 2022-6-5 00:58
名字不是重點 發(fā)表于 2022-6-4 16:13
其實一開始就是邏輯的問題:
1、開機讀取1302的分鐘值,存為變量比如“”
2、過一段時間(這個時間影響定 ...

又想了一下,你這方法雖說可以,但是沒有開關(guān)量,因為這只要開機運行一次,還得加一開關(guān)量。
作者: wolfinn    時間: 2022-6-5 06:34
lkc8210 發(fā)表于 2022-6-5 00:56
如你所說左邊是現(xiàn)算值,右邊是算好的變量值
if(A>B)要成立必定是A的值大于B
既然B是固定值

分析得有道理,別的代碼沒必要放出來。
我誤解了,仔細看你所的加條語句是解決亂入問題的。
你說的我的第一貼我說不貼代碼,本來我是把貼子放51單片機里的,沒把它放24小時里。是管理員把它挪來。只是想所我遇到過這奇怪的現(xiàn)象。第一貼可以說是學(xué)到了寫代碼在什么位置都會有影響。
第二貼是沒想到晶振對串口影響那么大,板載的是多少的沒標志,后來在別的地方找了個對上。
三貼可以說是為了解決問題臨時在程序里打的*,而在函數(shù)說明里沒打。至今不懂指針。那是用指針亂打最后把問題解決了?梢哉f我所有的貼子本來都只是個標題就行,只說自己遇到個現(xiàn)象。
還有這貼子也經(jīng)管理員改過了,本來我是先寫代碼進來,后才說明 現(xiàn)象的,是管理員把它換過來先說現(xiàn)象,后還補了句代碼如下的?梢哉f我是多么的不嚴謹。
代碼亂入,不是不會有,因為我這程序里 有個數(shù)組用得比較大,處理串口程序時12864第二行就會亂閃。處理完就不閃了。之所以沒考慮同樣是串口程序也同樣這問題,是因為串口沒線,Wifi模塊沒用,,僅接個接觸器。

作者: wolfinn    時間: 2022-6-5 06:52
lkc8210 發(fā)表于 2022-6-5 00:56
如你所說左邊是現(xiàn)算值,右邊是算好的變量值
if(A>B)要成立必定是A的值大于B
既然B是固定值

"
wolfinn 發(fā)表于 2022-6-4 13:29
好吧,謝謝你,左邊是一個現(xiàn)算值,右邊一個算好的變量值,數(shù)據(jù)亂入?不想吵了,謝謝你,浪費了你的時間。

如你所說左邊是現(xiàn)算值,右邊是算好的變量值
if(A>B)要成立必定是A的值大于B
既然B是固定值
必然是A在一分多鐘內(nèi)突然多于B(如255)
那么有沒有一個可能
就是ds1302_read_time();這函數(shù)在讀取分鐘值時受到中斷或其他因素干擾"

突然多于B,表現(xiàn)為不穩(wěn)定,如果是亂入,也是一個固定的亂入。
好吧,都見笑了,本來都是個標題貼,以后不發(fā)了。自己學(xué)習(xí)。
作者: lkc8210    時間: 2022-6-5 11:18
wolfinn 發(fā)表于 2022-6-5 06:34
分析得有道理,別的代碼沒必要放出來。
我誤解了,仔細看你所的加條語句是解決亂入問題的。
你說的我的 ...

對不起~誤會了你
想不到管X員還會刪代碼
作者: 188610329    時間: 2022-6-5 14:37
wolfinn 發(fā)表于 2022-6-4 13:29
好吧,謝謝你,左邊是一個現(xiàn)算值,右邊一個算好的變量值,數(shù)據(jù)亂入?不想吵了,謝謝你,浪費了你的時間。

本不打算再回復(fù)此帖,正好路過,也不打算再幫你分析了,就給你指條路,

DS1302  時常讀出   0xff      這幾個關(guān)鍵字,你可以百度一下。

多了也沒力氣說,想要進步就自己好好分析一下, 0xff 是不是一定大于你右邊任意值,要是還是故步自封,那也是你自己的事了。就像我回復(fù)另一個帖子說的,這個論壇提問的都是爺爺,您愛怎樣就怎樣吧。
作者: wolfinn    時間: 2022-6-5 15:33
188610329 發(fā)表于 2022-6-5 14:37
本不打算再回復(fù)此帖,正好路過,也不打算再幫你分析了,就給你指條路,

DS1302  時常讀出   0xff      ...

謝謝你,本來就是水貼,本來也沒想在什么24小時必答版放的,既然管理員把我第一個貼放那里了,也就多放了幾個。
       雖說從未想水過那貼,但如查寫,也是“單片機會打斗地主?總是給我顯示黑桃2、紅桃3........"
亂入不是沒有,但我同時也在顯示屏上看著的,也可能眼睛沒那么快。
作者: wolfinn    時間: 2022-6-5 15:38
188610329 發(fā)表于 2022-6-5 14:37
本不打算再回復(fù)此帖,正好路過,也不打算再幫你分析了,就給你指條路,

DS1302  時常讀出   0xff      ...

照這么說,最高明的那倆朋友的方法也不可靠了,不同就加1,也會定時不準。
作者: ephzq    時間: 2022-6-5 22:30
WIFI中有個叫看門狗的設(shè)置,你需要在程序中,時常去喂狗,就不會出現(xiàn)你說的情況了
作者: wolfinn    時間: 2022-6-6 15:44
lkc8210 發(fā)表于 2022-6-5 11:18
對不起~誤會了你
想不到管X員還會刪代碼

我說的是我先寫代碼,然后再寫現(xiàn)象,管理員發(fā)現(xiàn)我表述順序不好,然后把我寫的現(xiàn)象改到了前面,,然后替我寫了句代碼如下。我并沒有說管理員刪了我的代碼。我的貼一直都想說我遇到了什么現(xiàn)象,最后能夠解決的話寫上解決方法,無論是我引起的問題,好讓別人看到后“哦,原來這樣!本托。如不是為了表述方便我連代碼都不貼。沒有人這世界上會要24小時畢答我的。
作者: wolfinn    時間: 2022-6-6 15:46
ephzq 發(fā)表于 2022-6-5 22:30
WIFI中有個叫看門狗的設(shè)置,你需要在程序中,時常去喂狗,就不會出現(xiàn)你說的情況了

沒接Wifi, 僅僅是讀分鐘然后比較而引起的局部小問題。
作者: wolfinn    時間: 2022-6-7 03:57
一直沒做什么動作,剛才試了一下。
對各位的建議還是表示感謝,都會在心里過一下,雖然沒有去執(zhí)行一下,心里覺得有那可能,但不太象。
其實搞好了可以用DS1302長時間定時的,會舉一反三的人可能會知道,有時不太想說,明白的人也會明白。
用我認為最可能的,把左邊的在前面一句用相同的類型變量先算出來,再入條件比較,這樣避免類型不同引起的自動轉(zhuǎn)換問題(其實是我的不懂,是根本沒有數(shù)據(jù)類型)。這樣有了類型后倆個值也可以打印輸出了。
可以打印輸出后發(fā)現(xiàn)初值為零了。經(jīng)檢查發(fā)現(xiàn)好象是被Wifi的一個函數(shù)沖擊造成的。按說應(yīng)該不會的,函數(shù)主要是輸出一些AT指令到ESP8266,連網(wǎng),獲得時間數(shù)據(jù)串。因為沒接串口,僅僅空發(fā)AT指令,這些不在研究問題上,自己會看看。不再表述。
把獲取初值語句放wifi函數(shù)后面即可獲得正確初值,后面就是while(1)大循環(huán)了。
1.最佳的情況,獲取正確初值情況下,左值先運算值,基本正確。
2.在正確初值情況下,左值還是原來一樣用公式算,能定時,但好象不穩(wěn)。
3在初值不正確情況(為零),左值是公式還是先放變量里,在==比較右值時好象可以定時,但定時時間不確定。
因為試的各種可能試的內(nèi)容比較多,有點蒙圈
如果1情況屬實,將不再說明,會將貼子標題改【已解決】。
對wifi函數(shù)為什么會沖掉初值自己會看看(里面沒有用到那個變量名)。
作者: tongguan123    時間: 2022-6-7 23:35
Hephaestus 發(fā)表于 2022-6-4 23:16
傳說中三個臭皮匠賽過諸葛亮,但是這個帖子告訴我們一個臭皮匠能氣死三個諸葛亮。
原諒我不厚道的笑了!!
作者: 188610329    時間: 2022-6-9 18:21
wolfinn 發(fā)表于 2022-6-5 15:38
照這么說,最高明的那倆朋友的方法也不可靠了,不同就加1,也會定時不準。

給你那個 判斷方法,從來沒說可以解決你的問題, 只是告訴你,你根本不用計算就能判斷是不是過了5分鐘,并且,用那個方法之后,你不到5分鐘就跳出來,你就能意識到,原數(shù)據(jù)有錯誤,才會去著手解決數(shù)據(jù)亂入的問題。那么多人讓你串口把數(shù)據(jù)發(fā)出來,都是基本確定了:你的問題就是 原數(shù)據(jù) 有問題了,唯獨你不自知。
作者: wolfinn    時間: 2022-6-9 23:54
188610329 發(fā)表于 2022-6-9 18:21
給你那個 判斷方法,從來沒說可以解決你的問題, 只是告訴你,你根本不用計算就能判斷是不是過了5分鐘, ...

我想說的是,既然會有數(shù)據(jù)亂入,那么假如我1分鐘內(nèi)循環(huán)取了10次值,正常情況下這個數(shù)是不會變的,而有了數(shù)據(jù)亂入,那就更亂了,相隔兩個值亂入一次,只好象過了五分鐘一樣。而對于一個定時程序,1000次有一次亂入都是不允許的,就如同用在學(xué)校里打鈴一樣,剛上課一會又打下課鈴了,這怎么行。
    我這個問題除了我所解決的數(shù)據(jù)類型不定,還有沖掉初值問題外,還有一個就是一個綜合利用所引起的數(shù)據(jù)錯亂問題?赡苋缦拢1變量和數(shù)組利用過大,加上堆棧的管理,讓變量的地址重疊。2.LED沒有進行排忙命令處理引起的亂跳(當(dāng)然這問題貼子里我沒有描述)。3大量串口中斷引起的故障。(其實這個和1是差不多同一個意思,只是我接不接串口線表現(xiàn)不同而已。)
作者: wolfinn    時間: 2022-6-11 00:10
說點題外話。
我做的是一個可以顯示溫度的時鐘。做好后沒有用鍵盤調(diào)時的功能。
其實用串口輸入也是可以進行調(diào)時的。用2022/23/05 15:32:00、2022,23,05,15,32,00、2022|??|23|05#15(32;00#等等方式都可以,用幾個分隔符,用什么分隔符都不重要。只要知道時分秒等數(shù)據(jù)在第幾位就行。相關(guān)的串口處理程序能很好地解析出來送入DS1302更新就可以。
高手一點的話還可以用一個查詢語句AT?,單片機機收到是AT?后知道是查詢時間格式輸入方法。輸出一句應(yīng)相應(yīng)的格式語句就行。再高高手的話把AT?做一下大小處理,無論是輸入大寫的AT,還是小寫的at,還是大小寫的,都認為是查詢輸入時間格式命令。

作者: wolfinn    時間: 2022-6-11 00:31
我連串口輸入調(diào)時的程序都沒有做。
那么既然串口可以輸入,我知道有人用GPS和WIFI也做過對時的,,也有相關(guān)的文章之類的在各論壇發(fā)表過。GPS模塊輸出的也是有關(guān)定位數(shù)據(jù),時間數(shù)據(jù),速度,方向等等信息。只要把時間信息解析出來,更新到DS1302就行。也有現(xiàn)成的商品賣,兩面大紅字顯示的賣到上千元一個,也有便宜一點的。有一家只要幾十塊,Wifi、GPS、電波鐘都有。不是為他做廣告。只是說明個情況。學(xué)單片機就是玩,也不指望用它能掙到什么錢,如果要看時間,花個10來塊買個電子鐘,一年下來也很準時,就算差個一兩分鐘也沒有什么感覺。

作者: wolfinn    時間: 2022-6-11 00:38
網(wǎng)上賣的GPS模塊有多種,30塊錢左右有單模的,有GPS/北斗雙模的,還有三模的,有接小天線的,模塊上背個四方的陶瓷天線的,也有可以外接天線的。也有賣說是雙模,實際上賣出來的是僅有GPS信號。不過都可以有定位時間等文字輸出,只不過收星多少的問題。Wifi模塊更便宜了,就是四五塊的ESP8266。




作者: Hephaestus    時間: 2022-6-11 01:20
子曰:“朝聞道,夕死可矣!

沒有弄清楚到底是怎么回事,就輕易放棄,然后找了個“花個10來塊買個電子鐘”來證明追求真相是廉價的。那就是個不折不扣的懦夫。遇到挫折不是想要去克服,不是想要征服挫折,而是拿挫折的價格來說明自己懦弱是有道理的,這種人,一輩子都是懦夫。

在社會上混,一輩子都不行,反正競爭不過別人,都可以用別人買的產(chǎn)品才比你便宜一毛錢來解釋,一毛錢就能把壯漢變成懦弱無能的制杖。
作者: wolfinn    時間: 2022-6-11 01:42
先說下GPS實現(xiàn)方法。
拿到GPS模塊,用串口助手就可以調(diào)試了。不過用這前最好把它拿到天臺,用個充電寶,接上USB轉(zhuǎn)TTL接口先收一陣子衛(wèi)星,這樣回到屋子它就可以記住最好的星鏈表,接收起來快點。
基本上能見天就有信號,一顆星就能有UTC標準時間輸出。三到四顆星就可以定位。
通電未能定位在助手信息如下圖:


每秒鐘發(fā)送幾行信息:


一組信息內(nèi)有時間信息的行:


有具體一點年月月時間信息的行:


如果是調(diào)時間,解析有時間信息內(nèi)容的哪一行的都可以,但如果要整年月日等,最好是每組內(nèi)上圖這一行。


下圖是有具體定位信息的內(nèi)容,不過51單片機功能太小,定位信息也沒有地圖接口可用,倒是行進方向和速度如查解析出來倒是可以做個自行車碼表之類。

作者: wolfinn    時間: 2022-6-11 02:03
知道個什么原理,就好辦了。寫相關(guān)的串口程序。
$GNZDA,152547.000,10,06,2022,00,00*4D
先檢查收到的是不是"$"字符,是的話計數(shù)器清零,用計數(shù)器做下標存接收數(shù)組,再接收五個字符,看看數(shù)組內(nèi)是不是接收了$GNZDA,是的話繼續(xù)存入數(shù)組。不是就不管它,讓串口接收程序空轉(zhuǎn)。
等收到換行(0X0A),就可以關(guān)了串口中斷,進行數(shù)據(jù)解析,更新DS1302了。當(dāng)然,里面要做時區(qū)處理,每天的16:00:00~24:00:00(UTC),也就是北京時間0點到早上8點要做加一天處理,還有如果是月尾大小月30天31天,2月的閏年閏月2829,滿年要加年之類的日期處理。如果要更精確那更多的處理。因為數(shù)據(jù)出來是最好要加1秒是比較準的,要不會慢1秒。而加1秒又要做什么滿60秒分鐘加1等等判斷。

接口程序做好后就算沒有接GPS模塊,也可以用串口助手輸入相應(yīng)的一行字符調(diào)時,如下圖。
作者: wolfinn    時間: 2022-6-11 02:07
下面兩圖是我做的,請看第三行前面是個標志,如果正在對鐘就顯示一個向上箭頭,如果對時完成顯示一個星。


作者: wolfinn    時間: 2022-6-11 02:24
本帖最后由 wolfinn 于 2022-6-11 08:14 編輯

如果一顆星信號都沒有,數(shù)據(jù)幀頭是一樣的,但里面的時間日歷沒有,只有幾個分隔符逗號連著,不過可以通過收到換行符后計數(shù)器的大小判斷,比如大于39的為有效數(shù)據(jù)。
    解析語句搜網(wǎng)上資料有人用的是結(jié)構(gòu)體來進行,什么結(jié)構(gòu)體共同體,那東西我不懂,反正用笨笨的方法能搞出來就行。
作者: wolfinn    時間: 2022-6-11 02:33
程序設(shè)計有兩個內(nèi)容,一個是上電對時一次。一個是每天對時一次。
真正的是每天21:59:59對時,打開相關(guān)的標志,打開串口接收程序,接收數(shù)據(jù)正確后更新DS1302,關(guān)閉標志,設(shè)置成功標志,讓星星能顯出來。如果有可能,關(guān)GPS模塊的電。不過一般GPS室內(nèi)信號比較弱,常開電反倒能保持星鏈組。
上電對時主要是有利于調(diào)試和第一次使用的,不可能開機不能對時,等內(nèi)部時間走到22點再對時吧?
作者: wolfinn    時間: 2022-6-11 02:46
有一個注意事項是程序設(shè)計下載是GPS不能接著,要不程序下載不成功到單片機內(nèi)。
作者: wolfinn    時間: 2022-6-11 02:50
再說下Wifi模塊對時原理吧。
下面兩圖是我的時鐘用wifi對時未成功和成功的圖,就是標志換了下。


作者: wolfinn    時間: 2022-6-11 03:47
本帖最后由 wolfinn 于 2022-6-11 11:54 編輯

wifi對時我想了兩周才弄出來。
Wifi對時和GPS對時原理一樣,就是通過一串騷操作,得到一串串口有時間日期信息的字符去處理。但又有點不同,GPS是被動方式,它不用做什么,總能在串口得到數(shù)據(jù)。而Wifi模塊對時要連上家里的路由器,發(fā)出幾個AT命令,才得到有關(guān)數(shù)據(jù)。
有個網(wǎng)址在電腦上瀏覽器內(nèi)打上,得到的數(shù)據(jù)是最完美的,但是我一直在模塊上弄不出來。
后來我在相關(guān)內(nèi)容的貼子里看到有人說隨便連上個網(wǎng)站,然后隨便輸入,出錯信息里就有時間數(shù)據(jù)。開始我也沒做出來。因為有些網(wǎng)站他是不會有相關(guān)回應(yīng)的。
好了,拿到wifi模塊,我用的是ESP-01S,別的ESP 8266可能也一樣可以的吧。先用USB轉(zhuǎn)TTL接口調(diào)試。
接上家里的寬帶及密碼,重新上電確認它能自動連家里的Wifi,用AT查分配有IP及網(wǎng)關(guān)掩碼等內(nèi)容。
輸入以下AT命令:
AT+CIPSTART="TCP","www.網(wǎng)址.com",80
AT+CIPMODE=1
AT+CIPSEND
然后就會出現(xiàn)個>號,然后在后面隨便輸入點東西,就會有一大堆東西跳出來,里面就有UTC時間消息。

數(shù)據(jù)接收就是>后面的一堆東西,可以從換行符(隱藏的,顯示不出來的0X0A)收到換行符后計數(shù)器清零,接著收到的四個字符是Date的話就計數(shù)繼續(xù)存數(shù)據(jù)。直到換行符出現(xiàn),再根據(jù)換行符時的計數(shù)值判斷數(shù)據(jù)的有效性。要不是Date的話就只接收,空轉(zhuǎn)不存,直到遇到換行符再看后面四個字符是不是Date。
解析數(shù)據(jù)就同GPS對時的一樣了,就是數(shù)據(jù)幀頭不同,位置知道了數(shù)據(jù)也就能弄出來。
   也是每天22點對時一次,也是上電對時一次,以利于調(diào)試和第一次使用。
作者: wolfinn    時間: 2022-6-11 03:57
調(diào)試程序花了點時間,因為用助手時不用考慮延時的,而程序中每句AT命令要有1秒左右的延時。同時助手是自動加入回車換行,程序口也必須加上。
選用網(wǎng)址我用的是央視網(wǎng),連上網(wǎng)站后在>號后我打入的是123然后回車,所以如果有人上央視網(wǎng)如果有點卡頓,可能是我的時鐘正在上網(wǎng)對時。這也是句笑話,花不了什么時間的,網(wǎng)站服務(wù)器并發(fā)量大得很。

作者: wolfinn    時間: 2022-6-11 04:13
本帖最后由 wolfinn 于 2022-6-11 04:16 編輯

對于連上一個網(wǎng)站,它會多久脫網(wǎng)不知道。
另外ESP8266透傳方式退出有時會不是很好地退出。當(dāng)然可以用語句來判斷它是不是退出了透傳方式,但還是會有退不出的現(xiàn)象,那么下一次對時就不能進行了,時間可以走,向上箭頭總是顯示。
   為了解決這個問題,最好的方式是斷電,在正常情況下,對時完成,也可以關(guān)繼電器,這個做到是沒有問題的。就怕是某一天家里網(wǎng)絡(luò)出故障連不上網(wǎng),對時也就無從說起。
   所以就想到了一開機,或者是每天22點打開串口接收后,不管它收不收到正確的對時數(shù)據(jù),都在5分鐘后關(guān)Wifi模塊,說什么節(jié)能那是戲說。
  當(dāng)然羅,定時的方式多種多樣,我的LED第四行顯示的就是格言名言,兩句話的切換就是最簡單的計數(shù)定時,在大循環(huán)里計一個數(shù),等于一個值時就切換顯示第二句,再到另一個值時計數(shù)清零再切換顯示第一句。
作者: wolfinn    時間: 2022-6-11 04:23
本帖最后由 wolfinn 于 2022-6-11 05:03 編輯

串口一大堆信息內(nèi)容,真正有用的就是有時間那一句,收到那一句后的換行符后數(shù)據(jù)有效的話就關(guān)串口接收程序,后面的內(nèi)容不收了。
作者: wolfinn    時間: 2022-6-11 22:23
學(xué)習(xí)單片機,最大的是滿足感,學(xué)會了顯示圖片,就想到了做個片頭來套進自己的作品內(nèi)。甚至連轉(zhuǎn)場也放一個圖片,運行后發(fā)現(xiàn)卡死了,該有的東西它也不見了。查了查,發(fā)現(xiàn)程序編譯后的空間已經(jīng)大過8K。同時雖說用CODE可以把圖片內(nèi)容限定在ROM空間,節(jié)省寶貴的內(nèi)存資源,但運行起來刷新奇慢。只能取消這屁顛顛的興趣,真的要用,也用文字來顯示版權(quán)公司等信息。
作者: wolfinn    時間: 2022-6-11 22:30
上傳共享個C語言教程文件吧,某專業(yè)網(wǎng)站一點點扣下來的,里面可能會有該網(wǎng)站的信息,不知管理員會不會放行。現(xiàn)在這個論壇對這些太嚴了,有時放個網(wǎng)址來討論都被刪改。說淘東西只能某一個寶或馬云家。

C 語言教程_20220512133830.pdf

1.64 MB, 下載次數(shù): 5

C語言教程


作者: wolfinn    時間: 2022-6-13 12:00
今天看到51單片機有個PCON電源管理寄存器,里面的GF1、GF0是可以讓人自由使用的,這樣就可以把它們做為倆個Flage標志變量,程序設(shè)計中就可以少用倆個變量,節(jié)省資源了。還有單片機的低功耗和掉電模式也值得學(xué)習(xí),用好了可以實現(xiàn)節(jié)能和有趣味的功能。




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