找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)流水燈程序左右移動卡頓問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:100982 發(fā)表于 2021-11-19 08:34 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
代碼很簡單,如上,現(xiàn)在現(xiàn)象是右移到頭后會卡頓一下再左移,左移到頭后也會卡頓一下再右移,懷疑是延時問題,沒找到解決方法,求教各位了。
單片機(jī)源程序如下:
  1. #include <reg51.h>
  2. void delay();
  3. int main()
  4. {
  5.         unsigned char cnt = 0;
  6.         bit flag = 0;

  7.         while(1)
  8.         {
  9.                 if(flag == 0)
  10.                 {
  11.                         P0 = 0x01 << cnt;
  12.                         if(P0 == 0x80)
  13.                         {
  14.                                 flag = 1;
  15.                         }
  16.                 }
  17.                 else
  18.                 {
  19.                         P0 = 0x80 >> cnt;
  20.                         if(P0 == 0x01)
  21.                         {
  22.                                 flag = 0;
  23.                         }
  24.                 }
  25.                 delay();
  26.                 cnt++;
  27.                 if(cnt >= 8)
  28.                 {
  29.                         cnt = 0;
  30.                 }
  31.         }
  32.         return 0;
  33. }

  34. void delay()
  35. {
  36.         int i = 0;
  37.         for(i = 0;i <30000;i++)
  38.         {
  39.         
  40.         }

  41. }
復(fù)制代碼


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

使用道具 舉報

沙發(fā)
ID:624769 發(fā)表于 2021-11-19 08:53 來自觸屏版 | 只看該作者
你這不是卡頓,是邏輯重復(fù)。
回復(fù)

使用道具 舉報

板凳
ID:624769 發(fā)表于 2021-11-19 08:55 來自觸屏版 | 只看該作者
你這不是卡頓,是邏輯重復(fù)。0x01會兩次,0x80也會兩次。
回復(fù)

使用道具 舉報

地板
ID:624769 發(fā)表于 2021-11-19 08:58 來自觸屏版 | 只看該作者
要么,cnt到7就歸0,要么cnt到8后歸1。這破手機(jī)發(fā)個回復(fù)那么累。
回復(fù)

使用道具 舉報

5#
ID:624769 發(fā)表于 2021-11-19 09:03 來自觸屏版 | 只看該作者
啊,我要抓狂了,cnt到8歸1,沒什么需要改,cnt到7歸0要改判斷邏輯,因?yàn),p0不會
回復(fù)

使用道具 舉報

6#
ID:824490 發(fā)表于 2021-11-19 09:04 | 只看該作者
int main()
while(1)
{
}
return 0;//這個是要返回到哪里去?有調(diào)用才可以返回,而且是被調(diào)用的才有資格返回!
}
回復(fù)

使用道具 舉報

7#
ID:624769 發(fā)表于 2021-11-19 09:07 來自觸屏版 | 只看該作者
我放棄了,你就到8歸1吧。
回復(fù)

使用道具 舉報

8#
ID:592807 發(fā)表于 2021-11-19 09:08 | 只看該作者
邏輯問題,0x01 和0x08出現(xiàn)兩次燈亮順序是1 2 3 4 5 6 7 8 8 7 6 5 4 3 2 1 1 2 3 4 5 6..................................
你把if(cnt >= 8)改成(cnt >= 7)
燈亮順序就是1 2 3 4 5 6 7 8 7 6 5 4 3 2 1 2 3 4 5 6 7..................................
回復(fù)

使用道具 舉報

9#
ID:887202 發(fā)表于 2021-11-19 09:10 | 只看該作者
異常發(fā)生在左移和右移兩種狀態(tài)切換的時候,那就去看兩種狀態(tài)切換的時候發(fā)生了什么就很容易發(fā)現(xiàn)問題了,切換前最后一次給P0賦值和切換后第一次給P0賦值都是同一個值,所以看起來頓了一下。
if(cnt>=8)
{
cnt = 0;//改成cnt=1;
}
這樣操作一下應(yīng)該就沒問題了。
回復(fù)

使用道具 舉報

10#
ID:592807 發(fā)表于 2021-11-19 09:18 | 只看該作者

剛學(xué)C語言是main里面是有return的,用來結(jié)束代碼運(yùn)行的。第一個c語言代碼就是int main {printf(“hellow
world!”);return 0;}
回復(fù)

使用道具 舉報

11#
ID:824490 發(fā)表于 2021-11-19 09:28 | 只看該作者
黃youhui 發(fā)表于 2021-11-19 09:18
剛學(xué)C語言是main里面是有return的,用來結(jié)束代碼運(yùn)行的。第一個c語言代碼就是int main {printf(“hellow ...

都已經(jīng)while1()大循環(huán)了。。。
回復(fù)

使用道具 舉報

12#
ID:908826 發(fā)表于 2021-11-19 09:29 | 只看該作者
黃youhui 發(fā)表于 2021-11-19 09:18
剛學(xué)C語言是main里面是有return的,用來結(jié)束代碼運(yùn)行的。第一個c語言代碼就是int main {printf(“hellow ...

沒事,main函數(shù)就算不是空返回類型,你不寫return也沒事
回復(fù)

使用道具 舉報

13#
ID:624769 發(fā)表于 2021-11-19 09:31 來自觸屏版 | 只看該作者
你們都有編譯器,都有現(xiàn)成的程序,加return,不加return,編譯一下,看看code大小,就明白了。
回復(fù)

使用道具 舉報

14#
ID:824490 發(fā)表于 2021-11-19 09:40 | 只看該作者
188610329 發(fā)表于 2021-11-19 09:31
你們都有編譯器,都有現(xiàn)成的程序,加return,不加return,編譯一下,看看code大小,就明白了。

test.c(30): warning C294: unreachable code

回復(fù)

使用道具 舉報

15#
ID:744809 發(fā)表于 2021-11-19 09:41 | 只看該作者

這種寫法是支持的,main也是被啟動文件調(diào)用的,而且電腦上的c程序這樣寫才是對的
回復(fù)

使用道具 舉報

16#
ID:824490 發(fā)表于 2021-11-19 09:42 | 只看該作者
我用的 uVision V4.72.9.0
警告了。
代碼沒變。
回復(fù)

使用道具 舉報

17#
ID:100982 發(fā)表于 2021-11-19 09:52 | 只看該作者
謝謝各位,菜鳥一個,太菜了,這樣改了下                if(cnt >= 8)
                {
                        cnt = 1;
                }解決問題了其實(shí)是邏輯上重復(fù)了
回復(fù)

使用道具 舉報

18#
ID:100982 發(fā)表于 2021-11-19 09:53 | 只看該作者
return 0 這個問題是因?yàn)榭磍inux里面gcc 代碼規(guī)范都得寫
回復(fù)

使用道具 舉報

19#
ID:824490 發(fā)表于 2021-11-19 09:55 | 只看該作者
是的,我百度了一下相關(guān),又漲姿勢了。。
/////
1、        C51中mian()并不是被調(diào)用的,而是跳轉(zhuǎn)進(jìn)去的;
2、        在main()中調(diào)用return語句,將會從棧中彈出SP大小的數(shù)據(jù)到SP中,進(jìn)而程序會運(yùn)行到彈出數(shù)據(jù)指向的地址,C51中可能就是SP指針返回0x0000。
/////


回復(fù)

使用道具 舉報

20#
ID:100982 發(fā)表于 2021-11-19 09:56 | 只看該作者
黃youhui 發(fā)表于 2021-11-19 09:08
邏輯問題,0x01 和0x08出現(xiàn)兩次燈亮順序是1 2 3 4 5 6 7 8 8 7 6 5 4 3 2 1 1 2 3 4 5 6.................. ...

這樣改是不行的,運(yùn)行后會變成  1  2  3  4  5  6   7      1  2  3  4  5  6  7  
回復(fù)

使用道具 舉報

21#
ID:100982 發(fā)表于 2021-11-19 09:58 | 只看該作者
黃youhui 發(fā)表于 2021-11-19 09:08
邏輯問題,0x01 和0x08出現(xiàn)兩次燈亮順序是1 2 3 4 5 6 7 8 8 7 6 5 4 3 2 1 1 2 3 4 5 6.................. ...

因?yàn)榈讲涣?0x80  flag永遠(yuǎn)為0
回復(fù)

使用道具 舉報

22#
ID:624769 發(fā)表于 2021-11-19 12:06 | 只看該作者
188610329 發(fā)表于 2021-11-19 09:03
啊,我要抓狂了,cnt到8歸1,沒什么需要改,cnt到7歸0要改判斷邏輯,因?yàn),p0不會

終于上電腦了。剛才手機(jī)發(fā)消息,差點(diǎn)被氣死, 總是打一半就發(fā), 終于能好好打字了。

cnt 到7歸0 要改判斷邏輯, 不能判斷 P0 來改Flag, 而是要把 Flag = !Flag 放到 cnt判斷里。

                if(flag)
                {
                        P0 = 0x01 << cnt;
                }
                else
                {
                        P0 = 0x80 >> cnt;
                }
                 delay();
                if(++cnt >= 7)
                {
                        cnt = 0;
                        flag = !flag;
                }

這是比較正統(tǒng)的寫法。
回復(fù)

使用道具 舉報

23#
ID:624769 發(fā)表于 2021-11-19 12:13 | 只看該作者
名字不是重點(diǎn) 發(fā)表于 2021-11-19 09:40
test.c(30): warning C294: unreachable code

剛才手機(jī)上的 黑51, return 后面的  0 沒有出來,所以,回復(fù)里我也說得加不加return 。

在Keil 環(huán)境里 return 是可以通過編譯的, return 0 是不能通過編譯的。
但是,邏輯上,return 0; 就是無返回的意思。在有些編譯器里是可以通過的。但是實(shí)際上是沒有意義的。所以,只要他能通過編譯,你就當(dāng)作是  注釋  就行了,不用去考慮邏輯關(guān)系問題。
回復(fù)

使用道具 舉報

24#
ID:100982 發(fā)表于 2021-11-19 15:07 | 只看該作者
188610329 發(fā)表于 2021-11-19 12:13
剛才手機(jī)上的 黑51, return 后面的  0 沒有出來,所以,回復(fù)里我也說得加不加return 。

在Keil 環(huán)境 ...

我在keil4里面用return0沒有問題啊
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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