|
發布時間: 2025-10-24 16:31
正文摘要:各位論壇的大佬,又碰到問題了。電路圖如下,就是想實現從左邊開始的流水燈。代碼也附上了,可是運行的時候就是只有最左邊的LED閃爍,運行環境是proteus8.17sp4,麻煩大家看看原因出在哪里? #include <reg51 ... |
suiwinder 發表于 2025-10-29 22:12 想要很快的解決問題,把你高傲的proteus 8.17 sp5工程文件和程序文件打包發上來吧。 |
lkc8210 發表于 2025-10-27 10:26 謝謝你的熱心回復。 生成了hex文檔的,proteus引用也是正確的。就是沒有按預想的仿真結果出現。 |
wannenggong 發表于 2025-10-27 21:37 謝謝你的回復。 加入for循環是必要的。但是你這個代碼和樓下的是一樣的。 |
|
謝謝網友的回復。 這個代碼在proteus 8.17 sp5上運行的時候,一個燈都不亮。 |
|
1.樓主的程序問題不大,跑馬燈可以跑起來,只是高位燈不亮,只循環點亮7個燈,原因是程序行for( i = 7; i > 0; i -- )有問題,應改為for( i = 8; i > 0; i -- )。 2.程序可以化簡,既然用了_crol_()函數,可以不用for循環,也不用定義循環邊界,因為_crol_()函數已經內含循環機制,它跟左移運算符<<的運行結果是有區別的。主程序可簡化為: void main(void) { P2=0xfe; while( 1 ) { P2=_crol_(P2,1); delay1s(1); } } |
|
用實驗板測試驗證以下代碼可以實現流水顯示,代碼如下: **** void main(void) { P6=0xfe; while(1) { delay_ms(250); P6 = _crol_(P6, 1); } } 加入for循環效果不變,如果只是驗證單向流水加for循環顯然是沒必要的,實現雙向流水時各自加for循環就必要了。 |
| 定義一個變量,這個變量進行移位,然后再把變量賦值給P2口 |
suiwinder 發表于 2025-10-27 13:31 先給端口直接賦值,看看那些指示燈能不能有對應的變化 |
WL0123 發表于 2025-10-27 08:28 你有好的辦法嗎? |
WL0123 發表于 2025-10-27 08:28 為啥不是反復循環? 樓主的意思是為啥輸出的口沒有按照代碼改變吧,只有P2.7有變化,其他的腳沒有。 |
|
請檢查有沒有生成Hex檔 Proteus引用的Hex檔是不是正確的 |
suiwinder 發表于 2025-10-26 23:05 如果用的是沙發代碼在樓主截圖電路仿真,結果不是由左至右反復循環。只能是樓主太自信且不仔細。 |
man1234567 發表于 2025-10-26 11:42 問題照樣沒解決。 |
WL0123 發表于 2025-10-24 19:53 這個運行結果一樣。 |
undyme 發表于 2025-10-25 11:25 不用for循環,就只會左移一次。 |
undyme 發表于 2025-10-25 11:25 運行后顯示的結果有什么不同么 |
| 你在while(1)里面的P2 = _crol_( P2, 1 );已經做成了循環左移了,不用再在外面套一個for循環 |
|
#include <reg51.h> #include <intrins.h> #define u8 unsigned char void delay1s( u8 x ) { u8 i, j, k; i = x; j = 120; k = 169; while( i ) { while( j ) { while( k ) { ; k --; } k = 169; j --; } j = 120; i --; } } void main( void ) { // u8 i; P2 = 0xfe; while( 1 ) { // for( i = 7; i > 0; i -- ) // { delay1s( 1 ); // P2 = _crol_( P2, 1 ); P2 = _cror_( P2, 1 ); // } } } |