找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

我這個(gè)單片機(jī)流水燈左移再右移為什么只有一次,不是有while循環(huán)嗎?

  [復(fù)制鏈接]
ID:1038507 發(fā)表于 2022-7-6 07:18 | 顯示全部樓層 |閱讀模式
51hei圖片20220706071728.png
回復(fù)

使用道具 舉報(bào)

ID:190577 發(fā)表于 2022-7-6 09:08 | 顯示全部樓層
unsigned char cnt=0,應(yīng)該在放在while(1) 循環(huán)上面
回復(fù)

使用道具 舉報(bào)

ID:824490 發(fā)表于 2022-7-6 09:12 | 顯示全部樓層
因?yàn)槟阋瞥鋈サ臄?shù)據(jù),再也回不來(lái)了。你用環(huán)移指令試試?
回復(fù)

使用道具 舉報(bào)

ID:275826 發(fā)表于 2022-7-6 09:14 | 顯示全部樓層
把unsigned char cnt=0;改成char cnt=0;
回復(fù)

使用道具 舉報(bào)

ID:1006814 發(fā)表于 2022-7-6 09:48 | 顯示全部樓層
cnt是unsigned char,永遠(yuǎn)大于-1,所以一直在for語(yǔ)句循環(huán)了。
回復(fù)

使用道具 舉報(bào)

ID:1038531 發(fā)表于 2022-7-6 10:28 | 顯示全部樓層
你的aa每次左移一位,左移完8次之后沒(méi)有歸 1,所以只能循環(huán)一次
回復(fù)

使用道具 舉報(bào)

ID:94031 發(fā)表于 2022-7-6 11:28 | 顯示全部樓層
for(cnt=7;cnt>-1;cnt--)改為for(cnt=7;cnt>0;cnt--),unsigned char cnc 不可能是負(fù)數(shù)。
回復(fù)

使用道具 舉報(bào)

ID:8222 發(fā)表于 2022-7-6 13:58 | 顯示全部樓層
xuyaqi 發(fā)表于 2022-7-6 11:28
for(cnt=7;cnt>-1;cnt--)改為for(cnt=7;cnt>0;cnt--),unsigned char cnc 不可能是負(fù)數(shù)。

正解!
回復(fù)

使用道具 舉報(bào)

ID:8222 發(fā)表于 2022-7-6 13:59 | 顯示全部樓層
hb_lhw 發(fā)表于 2022-7-6 09:48
cnt是unsigned char,永遠(yuǎn)大于-1,所以一直在for語(yǔ)句循環(huán)了。

我,很贊同。
回復(fù)

使用道具 舉報(bào)

ID:509408 發(fā)表于 2022-7-6 15:23 | 顯示全部樓層
for循環(huán)中 -1溢出unsigned char 的范圍 當(dāng)cnt=0 時(shí)滿(mǎn)足>-1 的條件 此時(shí)再減一次就變成255,emmm  后面的自然會(huì)出錯(cuò)。
回復(fù)

使用道具 舉報(bào)

ID:1033105 發(fā)表于 2022-7-6 16:02 | 顯示全部樓層
問(wèn)問(wèn)樓主,這個(gè)程序修改后能循環(huán)了嗎?我也是剛學(xué),有好多的東西都一知半解的,不是很明白。
回復(fù)

使用道具 舉報(bào)

ID:195496 發(fā)表于 2022-7-6 16:28 | 顯示全部樓層
你的第二個(gè)for循環(huán)變量類(lèi)型不對(duì),定義unsigned char是無(wú)符號(hào)數(shù),不能設(shè)定比較負(fù)數(shù)
回復(fù)

使用道具 舉報(bào)

ID:195496 發(fā)表于 2022-7-6 16:28 | 顯示全部樓層
for(cnt=8;cnt>0;cnt--)
回復(fù)

使用道具 舉報(bào)

ID:195496 發(fā)表于 2022-7-6 16:35 | 顯示全部樓層
你的第二個(gè)循環(huán)cnt永遠(yuǎn)減不到-1,一直減,還是0,無(wú)法正常結(jié)束循環(huán)
回復(fù)

使用道具 舉報(bào)

ID:509408 發(fā)表于 2022-7-7 15:21 | 顯示全部樓層
tzs233 發(fā)表于 2022-7-6 15:23
for循環(huán)中 -1溢出unsigned char 的范圍 當(dāng)cnt=0 時(shí)滿(mǎn)足>-1 的條件 此時(shí)再減一次就變成255,emmm  后面的自 ...

1  再補(bǔ)充一點(diǎn)補(bǔ)碼的知識(shí),負(fù)數(shù)在計(jì)算機(jī)中會(huì)用補(bǔ)碼來(lái)表示  負(fù)整數(shù)的補(bǔ)碼計(jì)算是將其原碼除符號(hào)位外的所有位
    取反后加1,比如-1的補(bǔ)碼為其絕對(duì)值1(0000 0001)->所有位取反(1111 11110) -> 加1(1111 1111)即255
2、接上一點(diǎn),此時(shí)cnt=255 又滿(mǎn)足了for循環(huán)中cnt>-1判定條件,因此它就會(huì)一一直循環(huán)下去無(wú)法退出。
3、然后循環(huán)體內(nèi)(7-cnt) 也會(huì)產(chǎn)生負(fù)數(shù),這樣和你想要的結(jié)果會(huì)完全不同。如在cnt=255時(shí) 7-  cnt=-248  補(bǔ)碼
     為0x08,即實(shí)際向右循環(huán)移動(dòng)了8位之后變成0x80,外面又取反了一次變成 0x7f。   即P2 = 0x7f
4. 最后出現(xiàn)問(wèn)題不要慌哈 可以借助編譯器仿真調(diào)試設(shè)置斷點(diǎn)、變量調(diào)試查看。都是這么過(guò)來(lái)的。
回復(fù)

使用道具 舉報(bào)

ID:264021 發(fā)表于 2022-7-8 18:23 | 顯示全部樓層
把unsigned int i=0;放到while(1)里面就可以循環(huán)左右移動(dòng)了
回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2022-7-9 01:28 | 顯示全部樓層
沒(méi)人注意到第8行是語(yǔ)法錯(cuò)誤嗎?

在C89標(biāo)準(zhǔn)里面,任何變量的定義必須放在可執(zhí)行語(yǔ)句之前,也就是第8行應(yīng)該放在第6行前面。

只有C99標(biāo)準(zhǔn)才會(huì)支持第8行的寫(xiě)法,但是編譯器都是默認(rèn)不支持C99,要打開(kāi)相關(guān)的編譯開(kāi)關(guān)。

第一行說(shuō)明樓主用的是C51而不是支持C99標(biāo)準(zhǔn)的MDK,C51至今依然不支持C99標(biāo)準(zhǔn),所以樓主的代碼根本不可能通過(guò)編譯。
回復(fù)

使用道具 舉報(bào)

ID:385830 發(fā)表于 2022-7-9 04:05 | 顯示全部樓層
這是一個(gè)【數(shù)據(jù)類(lèi)型】的問(wèn)題!參見(jiàn)下面7樓的解答吧。
回復(fù)

使用道具 舉報(bào)

ID:1038923 發(fā)表于 2022-7-9 11:22 | 顯示全部樓層
定義的數(shù)據(jù)類(lèi)型就不對(duì),Unsigned int, 不可能出現(xiàn)-1. 程序的循環(huán)設(shè)計(jì)需要重新修改一下
回復(fù)

使用道具 舉報(bào)

ID:1033105 發(fā)表于 2022-7-9 11:37 | 顯示全部樓層
Hephaestus 發(fā)表于 2022-7-9 01:28
沒(méi)人注意到第8行是語(yǔ)法錯(cuò)誤嗎?

在C89標(biāo)準(zhǔn)里面,任何變量的定義必須放在可執(zhí)行語(yǔ)句之前,也就是第8行應(yīng) ...

第8行放在第6行之前我試過(guò)了,就是將unsigned int i=0;放在while(1)之前,編譯不通過(guò),我用的是stc8g1ko8a,P3口有4個(gè)I/O,我的(抄樓主的)程序如下
#include <STC8G.H>
//#define char
//#define unsigned int
void main()
{
         P3M0=0x00;
   P3M1=0x00;
         P5M0=0X00;
   P5M1=0X00;
         
         while(1)
         {
       unsigned int i=0;
                   char led4=0;
                                for(led4=0;led4<4;led4++)
                                {
                                        P3=~(0x01<<led4);
                                        for(i=0;i<40000;i++);
                                }
                    for(led4=4;led4>0;led4--)
                                {
                                        P3=~(0x08>>(4-led4));
                                        for(i=0;i<40000;i++);
                                }
                }
}
回復(fù)

使用道具 舉報(bào)

ID:1038929 發(fā)表于 2022-7-9 11:59 | 顯示全部樓層
cnt是無(wú)符號(hào)整形,第二個(gè)for循環(huán)cnt>-1的判斷不對(duì),當(dāng)cnt為0后,再次執(zhí)行--,cnt變?yōu)?55
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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