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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3075|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91色啪 | 亚洲第一天堂 | 国产农村妇女毛片精品久久麻豆 | 日韩在线免费观看视频 | 国产激情一区二区三区 | 欧美日韩一区二区三区在线观看 | 天天干人人 | 久久精品亚洲一区二区三区浴池 | 久久9999久久 | 午夜a v电影| 男女黄网站 | 一本色道精品久久一区二区三区 | 欧美一区 | 国产免费a视频 | 久久综合狠狠综合久久综合88 | 久久精品国产一区二区电影 | 日韩毛片中文字幕 | 狠狠爱综合 | 成人亚洲 | 久久www免费人成看片高清 | 欧美xxxx网站 | 精品无码久久久久久国产 | 天天色综 | 毛片一级片| 欧美一区二区在线观看 | 精品亚洲一区二区三区 | 一区二区三区在线 | 欧 | 亚洲国产精品一区二区第一页 | 欧美白人做受xxxx视频 | 97人人超碰 | 美女黄网站视频免费 | 精品久久一区二区三区 | 日本三级全黄三级三级三级口周 | 日韩一区精品 | 精品国产乱码久久久久久久久 | 欧美日韩国产在线观看 | 能看的av| 日韩一级二级片 | 欧美日韩精品一区二区三区四区 | 在线国产视频 | 久久久久国产精品午夜一区 |