欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3450|回復: 23
收起左側

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

[復制鏈接]
ID:100982 發表于 2021-11-19 08:34 | 顯示全部樓層 |閱讀模式
代碼很簡單,如上,現在現象是右移到頭后會卡頓一下再左移,左移到頭后也會卡頓一下再右移,懷疑是延時問題,沒找到解決方法,求教各位了。
單片機源程序如下:
  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. }
復制代碼


回復

使用道具 舉報

ID:624769 發表于 2021-11-19 08:53 來自觸屏版 | 顯示全部樓層
你這不是卡頓,是邏輯重復。
回復

使用道具 舉報

ID:624769 發表于 2021-11-19 08:55 來自觸屏版 | 顯示全部樓層
你這不是卡頓,是邏輯重復。0x01會兩次,0x80也會兩次。
回復

使用道具 舉報

ID:624769 發表于 2021-11-19 08:58 來自觸屏版 | 顯示全部樓層
要么,cnt到7就歸0,要么cnt到8后歸1。這破手機發個回復那么累。
回復

使用道具 舉報

ID:624769 發表于 2021-11-19 09:03 來自觸屏版 | 顯示全部樓層
啊,我要抓狂了,cnt到8歸1,沒什么需要改,cnt到7歸0要改判斷邏輯,因為,p0不會
回復

使用道具 舉報

ID:824490 發表于 2021-11-19 09:04 | 顯示全部樓層
int main()
while(1)
{
}
return 0;//這個是要返回到哪里去?有調用才可以返回,而且是被調用的才有資格返回!
}
回復

使用道具 舉報

ID:624769 發表于 2021-11-19 09:07 來自觸屏版 | 顯示全部樓層
我放棄了,你就到8歸1吧。
回復

使用道具 舉報

ID:592807 發表于 2021-11-19 09:08 | 顯示全部樓層
邏輯問題,0x01 和0x08出現兩次燈亮順序是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..................................
回復

使用道具 舉報

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

使用道具 舉報

ID:592807 發表于 2021-11-19 09:18 | 顯示全部樓層

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

使用道具 舉報

ID:824490 發表于 2021-11-19 09:28 | 顯示全部樓層
黃youhui 發表于 2021-11-19 09:18
剛學C語言是main里面是有return的,用來結束代碼運行的。第一個c語言代碼就是int main {printf(“hellow ...

都已經while1()大循環了。。。
回復

使用道具 舉報

ID:908826 發表于 2021-11-19 09:29 | 顯示全部樓層
黃youhui 發表于 2021-11-19 09:18
剛學C語言是main里面是有return的,用來結束代碼運行的。第一個c語言代碼就是int main {printf(“hellow ...

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

使用道具 舉報

ID:624769 發表于 2021-11-19 09:31 來自觸屏版 | 顯示全部樓層
你們都有編譯器,都有現成的程序,加return,不加return,編譯一下,看看code大小,就明白了。
回復

使用道具 舉報

ID:824490 發表于 2021-11-19 09:40 | 顯示全部樓層
188610329 發表于 2021-11-19 09:31
你們都有編譯器,都有現成的程序,加return,不加return,編譯一下,看看code大小,就明白了。

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

回復

使用道具 舉報

ID:744809 發表于 2021-11-19 09:41 | 顯示全部樓層

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

使用道具 舉報

ID:824490 發表于 2021-11-19 09:42 | 顯示全部樓層
我用的 uVision V4.72.9.0
警告了。
代碼沒變。
回復

使用道具 舉報

ID:100982 發表于 2021-11-19 09:52 | 顯示全部樓層
謝謝各位,菜鳥一個,太菜了,這樣改了下                if(cnt >= 8)
                {
                        cnt = 1;
                }解決問題了其實是邏輯上重復了
回復

使用道具 舉報

ID:100982 發表于 2021-11-19 09:53 | 顯示全部樓層
return 0 這個問題是因為看linux里面gcc 代碼規范都得寫
回復

使用道具 舉報

ID:824490 發表于 2021-11-19 09:55 | 顯示全部樓層
是的,我百度了一下相關,又漲姿勢了。。
/////
1、        C51中mian()并不是被調用的,而是跳轉進去的;
2、        在main()中調用return語句,將會從棧中彈出SP大小的數據到SP中,進而程序會運行到彈出數據指向的地址,C51中可能就是SP指針返回0x0000。
/////


回復

使用道具 舉報

ID:100982 發表于 2021-11-19 09:56 | 顯示全部樓層
黃youhui 發表于 2021-11-19 09:08
邏輯問題,0x01 和0x08出現兩次燈亮順序是1 2 3 4 5 6 7 8 8 7 6 5 4 3 2 1 1 2 3 4 5 6.................. ...

這樣改是不行的,運行后會變成  1  2  3  4  5  6   7      1  2  3  4  5  6  7  
回復

使用道具 舉報

ID:100982 發表于 2021-11-19 09:58 | 顯示全部樓層
黃youhui 發表于 2021-11-19 09:08
邏輯問題,0x01 和0x08出現兩次燈亮順序是1 2 3 4 5 6 7 8 8 7 6 5 4 3 2 1 1 2 3 4 5 6.................. ...

因為到不了 0x80  flag永遠為0
回復

使用道具 舉報

ID:624769 發表于 2021-11-19 12:06 | 顯示全部樓層
188610329 發表于 2021-11-19 09:03
啊,我要抓狂了,cnt到8歸1,沒什么需要改,cnt到7歸0要改判斷邏輯,因為,p0不會

終于上電腦了。剛才手機發消息,差點被氣死, 總是打一半就發, 終于能好好打字了。

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;
                }

這是比較正統的寫法。
回復

使用道具 舉報

ID:624769 發表于 2021-11-19 12:13 | 顯示全部樓層
名字不是重點 發表于 2021-11-19 09:40
test.c(30): warning C294: unreachable code

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

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

使用道具 舉報

ID:100982 發表于 2021-11-19 15:07 | 顯示全部樓層
188610329 發表于 2021-11-19 12:13
剛才手機上的 黑51, return 后面的  0 沒有出來,所以,回復里我也說得加不加return 。

在Keil 環境 ...

我在keil4里面用return0沒有問題啊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表