久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1099|回復(fù): 33
收起左側(cè)

while(1)循環(huán)是不是很慢

  [復(fù)制鏈接]
ID:1144680 發(fā)表于 2025-5-31 21:06 | 顯示全部樓層 |閱讀模式
DS1302時鐘,在while(1)里有兩個"if"檢測按鍵,沒有按鍵時用switch/case顯示時鐘,結(jié)果發(fā)現(xiàn)時鐘不同步,秒進位時,有時候“小時”或“分鐘”會延遲1秒左右,這是while循環(huán)有延遲嗎?
回復(fù)

使用道具 舉報

ID:712493 發(fā)表于 2025-5-31 21:46 | 顯示全部樓層
肯定不是,while(1)只是大循環(huán)而已!
回復(fù)

使用道具 舉報

ID:584814 發(fā)表于 2025-5-31 22:33 | 顯示全部樓層
可能是防抖功能的設(shè)計問題
回復(fù)

使用道具 舉報

ID:619259 發(fā)表于 2025-5-31 23:38 | 顯示全部樓層
時間有延時與while(1)無關(guān),秒溢出,分+1延時,應(yīng)該是你的1302讀寫函數(shù)有延時了。
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2025-5-31 23:54 | 顯示全部樓層
是你讀DS1302代碼的問題
回復(fù)

使用道具 舉報

ID:1128898 發(fā)表于 2025-6-1 06:15 | 顯示全部樓層
延遲對的,信號并不是時時的,關(guān)鍵看處理什么控制什么,又不是f16
回復(fù)

使用道具 舉報

ID:1109793 發(fā)表于 2025-6-1 07:51 | 顯示全部樓層
是一個循環(huán),慢不慢,看你代碼啊
回復(fù)

使用道具 舉報

ID:1144680 發(fā)表于 2025-6-1 13:45 | 顯示全部樓層
xiaobendan001 發(fā)表于 2025-6-1 07:51
是一個循環(huán),慢不慢,看你代碼啊

幫忙看看,謝謝!

  1.         while (1)      
  2. {       
  3.       if (TM1639_KEY_B1==1)
  4. {
  5.     _nop_();
  6.     while(TM1639_KEY_B1==1);//按住不放
  7.     _nop_();
  8.         SetSelect++;//松手后
  9.        
  10.                                 if(SetSelect>=7){SetSelect=0;DS1302_GengxinTime();}        //更新時間                       
  11.                                
  12. //                                        LED_OF[TimeWei-1]=0xff;        //離開該位顯示,防止正好熄滅       
  13.                                 LED_OF[0]=0xff;
  14.                                 LED_OF[1]=0xff;                                
  15.                                 LED_OF[3]=0xff;        
  16.                                 LED_OF[4]=0xff;
  17.                                 LED_OF[6]=0xff;                                
  18.                                 LED_OF[7]=0xff;                                        
  19. }
  20.                         switch(SetSelect)
  21.                         {
  22.                                 case 0:        TimeShow(); break;        //讀取并顯示時間
  23.                                 case 1:        TimeWei=0;        break;        //10時               
  24.                                 case 2:        TimeWei=1;        break;        // 時               
  25.                                 case 3:        TimeWei=3;        break;                //10分       
  26.                                 case 4: TimeWei=4;        break;                //分       
  27.                                 case 5:        TimeWei=6;        break;        //10秒                       
  28.                                 case 6: TimeWei=7;        break;        //秒       
  29.                         }
  30.                
  31. if (TM1639_KEY_B2==1)
  32.         {
  33.     _nop_();
  34.     while(TM1639_KEY_B2==1);//按住不放
  35.     _nop_();
  36.                
  37.     Shezhi();        //設(shè)置時間
  38.         }       
  39.                
  40. }
復(fù)制代碼



回復(fù)

使用道具 舉報

ID:1144680 發(fā)表于 2025-6-1 13:47 | 顯示全部樓層
  1. void TimeShow()
  2. {
  3.      DS1302_ReadTime();//讀取時間
  4.           LED_BCD[0] =DS1302_Time[0];                  //最高位,10時               
  5.           LED_BCD[1] =DS1302_Time[1];         

  6.           LED_BCD[3] =DS1302_Time[3];                        
  7.           LED_BCD[4] =DS1302_Time[4];                       

復(fù)制代碼


顯示時間代碼
回復(fù)

使用道具 舉報

ID:1144680 發(fā)表于 2025-6-1 13:49 | 顯示全部樓層
man1234567 發(fā)表于 2025-5-31 22:33
可能是防抖功能的設(shè)計問題

是有兩個延遲,不過是按鍵按下后才起作用。
回復(fù)

使用道具 舉報

ID:1144680 發(fā)表于 2025-6-1 13:50 | 顯示全部樓層
cy009 發(fā)表于 2025-5-31 23:38
時間有延時與while(1)無關(guān),秒溢出,分+1延時,應(yīng)該是你的1302讀寫函數(shù)有延時了。

有點頭暈,下面有代碼,能不能幫忙看看。。。
回復(fù)

使用道具 舉報

ID:1144680 發(fā)表于 2025-6-1 13:51 | 顯示全部樓層
188610329 發(fā)表于 2025-5-31 23:54
是你讀DS1302代碼的問題

一開始沒問題,后來加了按鍵檢測后出現(xiàn)的,不知道哪個環(huán)節(jié)出的。
回復(fù)

使用道具 舉報

ID:1152291 發(fā)表于 2025-6-1 16:53 | 顯示全部樓層
dcc60 發(fā)表于 2025-6-1 13:51
一開始沒問題,后來加了按鍵檢測后出現(xiàn)的,不知道哪個環(huán)節(jié)出的。

其實加了按鍵檢測是不太靈敏的,首先按鍵檢測是是基于一個模塊的,但是你如果添加了多個模塊的話,按鍵檢測到底是應(yīng)用于誰了,所以基于按鍵檢測模塊的書寫,一般是只能需求一個模塊的,多個模塊添加進來,是會使軟件整混的,應(yīng)用于仿真和實物都是不太靈敏的。
回復(fù)

使用道具 舉報

ID:1133081 發(fā)表于 2025-6-1 17:31 | 顯示全部樓層
dcc60 發(fā)表于 2025-6-1 13:51
一開始沒問題,后來加了按鍵檢測后出現(xiàn)的,不知道哪個環(huán)節(jié)出的。

TM1639讀到的鍵值是1個字節(jié),并不是位信號0/1。沒有看到相關(guān)代碼,無法判斷與你所說的延遲1秒是否有關(guān)。
回復(fù)

使用道具 舉報

ID:1152365 發(fā)表于 2025-6-1 17:40 | 顯示全部樓層
肯定不是,while(1)只是大循環(huán)而已
回復(fù)

使用道具 舉報

ID:1144680 發(fā)表于 2025-6-1 18:15 | 顯示全部樓層
WL0123 發(fā)表于 2025-6-1 17:31
TM1639讀到的鍵值是1個字節(jié),并不是位信號0/1。沒有看到相關(guān)代碼,無法判斷與你所說的延遲1秒是否有關(guān)。

估計是我搞錯了。
下次把按鍵改為單片機引腳。
回復(fù)

使用道具 舉報

ID:1144680 發(fā)表于 2025-6-1 18:17 | 顯示全部樓層
單片機重購 發(fā)表于 2025-6-1 16:53
其實加了按鍵檢測是不太靈敏的,首先按鍵檢測是是基于一個模塊的,但是你如果添加了多個模塊的話,按鍵檢 ...

太復(fù)雜了。
謝謝支持,再研究研究。
回復(fù)

使用道具 舉報

ID:883242 發(fā)表于 2025-6-2 18:48 | 顯示全部樓層
就是while按鍵那兩句卡住的。
回復(fù)

使用道具 舉報

ID:1144680 發(fā)表于 2025-6-3 10:27 | 顯示全部樓層
Hephaestus 發(fā)表于 2025-6-2 18:48
就是while按鍵那兩句卡住的。

下次刪了試試。
回復(fù)

使用道具 舉報

ID:1152291 發(fā)表于 2025-6-3 17:10 | 顯示全部樓層
有時候不用while(1)進行循環(huán),用其它語言指令對單片機進行書寫也是可以使得單片機的程序可以運行起來
回復(fù)

使用道具 舉報

ID:1152595 發(fā)表于 2025-6-3 18:41 | 顯示全部樓層
這個函數(shù)本身沒有快慢的說法,主要看內(nèi)部函數(shù)
回復(fù)

使用道具 舉報

ID:1152630 發(fā)表于 2025-6-3 22:48 來自觸屏版 | 顯示全部樓層
試一下移除按鍵檢測中的延時消抖,改為狀態(tài)機方式。
回復(fù)

使用道具 舉報

ID:65956 發(fā)表于 2025-6-4 08:32 | 顯示全部樓層
你可以不用while試試,因為用這個就是在死等,等超時了才重新來
回復(fù)

使用道具 舉報

ID:1144680 發(fā)表于 2025-6-4 10:58 | 顯示全部樓層
aking991 發(fā)表于 2025-6-4 08:32
你可以不用while試試,因為用這個就是在死等,等超時了才重新來

在計時器里試過,沒有延遲。
問題是以前也沒有延遲,按說,即便延遲,應(yīng)該時分秒一起延遲才對。
回復(fù)

使用道具 舉報

ID:1144680 發(fā)表于 2025-6-4 11:51 | 顯示全部樓層
Hephaestus 發(fā)表于 2025-6-2 18:48
就是while按鍵那兩句卡住的。

試過了,不是按鍵問題。
回復(fù)

使用道具 舉報

ID:1144680 發(fā)表于 2025-6-4 11:53 | 顯示全部樓層
單片機重購 發(fā)表于 2025-6-3 17:10
有時候不用while(1)進行循環(huán),用其它語言指令對單片機進行書寫也是可以使得單片機的程序可以運行起來

是的,放在定時器里就沒延遲。
回復(fù)

使用道具 舉報

ID:1144680 發(fā)表于 2025-6-4 11:55 | 顯示全部樓層
2631449463 發(fā)表于 2025-6-3 22:48
試一下移除按鍵檢測中的延時消抖,改為狀態(tài)機方式。

試了,可能還是其它問題。
回復(fù)

使用道具 舉報

ID:1152676 發(fā)表于 2025-6-4 12:06 | 顯示全部樓層
在DS1302時鐘程序中,當(dāng)`while(1)`循環(huán)內(nèi)用兩個`if`檢測按鍵,且無按鍵時通過`switch/case`顯示時鐘,出現(xiàn)時間不同步(如秒進位時小時或分鐘延遲1秒左右),**主要原因是按鍵檢測邏輯導(dǎo)致主循環(huán)阻塞,影響了時鐘數(shù)據(jù)的及時讀取和刷新**。以下是具體分析和解決思路:   ### **一、問題根源:主循環(huán)阻塞導(dǎo)致時鐘更新延遲** 1. **按鍵檢測的潛在阻塞**      如果`if`語句中直接使用**延時消抖**(如`delay(20ms)`)或復(fù)雜邏輯,會導(dǎo)致整個`while(1)`循環(huán)卡頓。例如:      ```c    while(1) {        if(按鍵按下) {            delay(20ms); // 阻塞20ms,期間無法讀取時鐘            // 處理按鍵        }        // 讀取DS1302時鐘并顯示    }    ```      此時,若按鍵按下,程序會在`delay`處停留20ms,導(dǎo)致**DS1302的秒更新可能被錯過**,進而出現(xiàn)顯示延遲。  2. **循環(huán)頻率與時鐘更新不匹配**      DS1302的秒數(shù)據(jù)每秒更新一次,若主循環(huán)執(zhí)行周期較長(如因按鍵檢測耗時),可能導(dǎo)致:      - 秒進位時,程序尚未讀取到最新數(shù)據(jù),仍在顯示舊值;      - 下一次循環(huán)讀取時,秒已進位,但分鐘/小時的計算依賴舊秒值,導(dǎo)致延遲。   ### **二、解決方案:非阻塞式按鍵檢測與定時刷新時鐘** #### **1. 核心思路**   - **用定時器中斷掃描按鍵**,避免主循環(huán)阻塞;   - **定時讀取DS1302時鐘**(如每100ms一次),確保數(shù)據(jù)更新頻率穩(wěn)定。  #### **2. 具體實現(xiàn)步驟**   ##### **(1)改用定時器中斷檢測按鍵(非阻塞式)**   - **原理**:通過定時器(如1ms中斷)周期性掃描按鍵狀態(tài),用狀態(tài)機記錄按鍵按下、消抖、釋放的過程,避免主循環(huán)中直接延時。   - **示例邏輯**:     ```c   unsigned char key_state = 0; // 0=未按下,1=按下消抖中,2=確認(rèn)按下,3=釋放等待   unsigned char key_flag = 0;  // 按鍵觸發(fā)標(biāo)志    // 定時器1ms中斷函數(shù)   void Timer0_ISR() interrupt 1 {       if(按鍵按下) {           switch(key_state) {               case 0: key_state = 1; break; // 首次檢測到按下,進入消抖               case 1: key_state = 2; key_flag = 1; break; // 消抖完成,標(biāo)記按鍵觸發(fā)           }       } else {           key_state = 0; // 按鍵釋放,重置狀態(tài)       }   }   ```  ##### **(2)定時讀取DS1302時鐘數(shù)據(jù)**   - **原理**:在主循環(huán)中用計數(shù)器控制讀取頻率(如每100ms讀取一次),避免頻繁讀取占用資源。   - **示例邏輯**:     ```c   unsigned int tick = 0; // 計數(shù)器   unsigned char time_buf[7]; // 存儲時分秒等數(shù)據(jù)    while(1) {       if(tick >= 100) { // 每100ms讀取一次(100ms=0.1秒,可根據(jù)需求調(diào)整)           tick = 0;           DS1302_ReadTime(time_buf); // 讀取時鐘數(shù)據(jù)       }              // 顯示時鐘(switch/case邏輯)       switch(mode) {           case 0: 顯示正常時間; break;           case 1: 顯示調(diào)時界面; break;           // ...其他模式       }              tick++; // 每循環(huán)一次自增,控制讀取頻率       // 其他非阻塞操作(如少量延時或任務(wù))   }   ```  ##### **(3)優(yōu)化顯示邏輯**   - 確保`switch/case`中的顯示函數(shù)(如數(shù)碼管驅(qū)動)執(zhí)行速度快,避免包含耗時操作(如長延時)。   - 若顯示需要動態(tài)效果(如閃爍),可通過定時器中斷控制,而非在主循環(huán)中阻塞。   ### **三、其他可能原因及排查方向** 1. **DS1302通信時序問題**      - 檢查讀寫函數(shù)是否嚴(yán)格遵循DS1302的時序要求(如時鐘沿、復(fù)位信號順序),避免因通信錯誤導(dǎo)致數(shù)據(jù)讀取失敗。   2. **變量緩存與臨界資源**      - 若在中斷中修改時間數(shù)據(jù),需用`volatile`關(guān)鍵字聲明變量,并在主循環(huán)讀取時關(guān)閉中斷,避免數(shù)據(jù)不一致。   3. **晶振穩(wěn)定性**      - DS1302的走時精度依賴外部晶振(如32.768kHz),若晶振質(zhì)量差或電容匹配不當(dāng),可能導(dǎo)致實際秒長偏移,需硬件排查。   ### **四、總結(jié)**   - **核心問題**:按鍵檢測的阻塞式邏輯導(dǎo)致主循環(huán)無法及時讀取和刷新時鐘數(shù)據(jù)。   - **解決關(guān)鍵**:用定時器中斷實現(xiàn)非阻塞按鍵掃描,主循環(huán)專注于定時讀取時鐘和快速顯示,確保每秒至少讀取一次時鐘數(shù)據(jù)(如每100ms讀取一次,每秒可讀取10次),避免秒進位被遺漏。   - **擴展建議**:若系統(tǒng)支持多任務(wù)(如RTOS),可將按鍵處理、時鐘讀取、顯示分別分配到獨立任務(wù),通過消息隊列或信號量同步,進一步提升實時性。
回復(fù)

使用道具 舉報

ID:1144680 發(fā)表于 2025-6-4 13:38 | 顯示全部樓層
jzh1 發(fā)表于 2025-6-4 12:06
在DS1302時鐘程序中,當(dāng)`while(1)`循環(huán)內(nèi)用兩個`if`檢測按鍵,且無按鍵時通過`switch/case`顯示時鐘,出現(xiàn) ...

謝謝支持。說的很詳細(xì)。
經(jīng)過反復(fù)試驗,發(fā)現(xiàn)循環(huán)之前的主函數(shù)運行時間太長(1-2秒左右),可能是造成不同步的主要原因。時分秒是直接讀取DS1302時間,不是按秒進位,理應(yīng)“快、慢”同步才對,不知道為什么分鐘或小時會慢1秒。
回復(fù)

使用道具 舉報

ID:1146186 發(fā)表于 2025-6-9 09:11 | 顯示全部樓層
while(1) 本身不慢,但你在循環(huán)里做了按鍵檢測( if ) + 時鐘顯示( switch/case ),這倆操作會占用CPU時間。秒進位時,若CPU正忙按鍵檢測或顯示邏輯,沒及時讀取DS1302的最新時間,就會“延遲1秒”,本質(zhì)是主循環(huán)被耗時任務(wù)阻塞,沒做到“實時響應(yīng)時鐘更新”。
回復(fù)

使用道具 舉報

ID:1146186 發(fā)表于 2025-6-9 10:52 | 顯示全部樓層
while(1) 本身不慢,但你在循環(huán)里做了按鍵檢測( if ) + 時鐘顯示( switch/case ),這倆操作會占用CPU時間。秒進位時,若CPU正忙按鍵檢測或顯示邏輯,沒及時讀取DS1302的最新時間,就會“延遲1秒”,本質(zhì)是主循環(huán)被耗時任務(wù)阻塞,沒做到“實時響應(yīng)時鐘更新”
回復(fù)

使用道具 舉報

ID:1153440 發(fā)表于 2025-6-10 15:15 | 顯示全部樓層
與while(1)無關(guān)吧,更多與內(nèi)部函數(shù)相關(guān)
回復(fù)

使用道具 舉報

ID:1144680 發(fā)表于 2025-6-10 21:26 | 顯示全部樓層
1763333333 發(fā)表于 2025-6-9 10:52
while(1) 本身不慢,但你在循環(huán)里做了按鍵檢測( if ) + 時鐘顯示( switch/case ),這倆操作會占用CPU時 ...

在while里只留timeshow也還是不同步,估計與主函數(shù)有關(guān)。
回復(fù)

使用道具 舉報

ID:1144680 發(fā)表于 2025-6-10 21:26 | 顯示全部樓層
gmlxh 發(fā)表于 2025-6-10 15:15
與while(1)無關(guān)吧,更多與內(nèi)部函數(shù)相關(guān)

應(yīng)該是的,現(xiàn)在放在定時器里就正常。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人婷婷 | 国产欧美在线播放 | 久久精品伊人 | 亚洲理论片 | 成人不卡视频 | 91免费网 | 免费看黄色大片 | 日本天天操 | 又色又爽又黄18网站 | 一区二区三区四区在线播放 | 国产精品视频免费 | 国产色站 | 日韩一区在线播放 | 成人av一区二区三区在线观看 | 日韩 欧美 亚洲 | 欧美日韩毛片 | 中文字幕亚洲欧美 | 亚洲精品福利 | 99久久久国产精品 | 黄色片久久 | 国产伦精品一区二区三区视频网站 | 午夜在线免费视频 | 成人a毛片| 欧美亚洲国产日韩 | 日韩三级一区 | 久久av片 | 欧美日韩在线视频观看 | 久久久久久亚洲 | 黄色三级在线 | 亚洲精品乱码久久久久久蜜桃91 | 91一级片| 自拍偷拍欧美日韩 | 亚洲福利专区 | 久久精选视频 | 91av视频在线观看 | 黄色片观看 | 日韩av一区二区三区四区 | 九九在线免费视频 | 一区二区三区蜜桃 | 国产伦精品一区二区三区在线 | 国产欧美一区二区三区视频在线观看 |