流水燈
1.基本思路
- 先讓P1口全為高電平(燈不亮)
- 通過為左移/位右移動來實作依次點亮LED燈一個具有注腳的文本,1
- 用for回圈陳述句嵌套
- 寫程式
#include <REGX52.H>//用到的頭檔案
void main()
{
int i;
P1=0xff;//給每個位高電平11111111
for(i=8;i>0;i--)//8個燈,位左移8次
{
P1=P1<<1;//位左移的
}
}
-
結果:燈全部亮了,因為程式運行的很快

-
找學姐討論

-
其他問題
Keil5無法寫中文注釋
解決方法見鏈接:如何寫中文注釋
2.延時程式的加入
#include <REGX52.H>
void main()
{
int i,a;
P1=0xff;//位操作,給每個位高電平11111111,燈不亮
while(1)//讓燈不斷地亮和滅
{
for(i=8;i>0;i--)//8個燈,位左移8次
{
P1=P1<<1;//位左移
for(a=60000;a>0;a--)//延時程式
{
;//結構體為空,但是要記得加分號
}
}
P1=0xff;//給每個位高電平11111111,讓全亮的燈滅掉
for(a=60000;a>0;a--)//重滅到開再延時,要不然
{;}
}
}
結果:還是全亮,真的不知道為什么,現在也沒有搞明白(詢問????????????)
更改后,可以運行,不會再全部燈亮
#include <REGX52.H>
void main()
{
int i,a;
P1=0xff;//位操作,給每個位高電平11111111,燈不亮
while(1)//讓燈不斷地亮和滅
{
for(i=8;i>0;i--)//8個燈,位左移8次
{
P1=P1<<1;//位左移
for(a=30000;a>0;a--)//延時程式把a的值改小了,之前有符號int的范圍和無符號的搞混了
{
;//結構體為空,但是要記得加分號
}
}
P1=0xff;//給每個位高電平11111111,讓全亮的燈滅掉
for(a=30000;a>0;a--)//重滅到開再延時,要不然
{;}
}
}
| 原因:資料型別int的范圍搞錯,超了 |

3.上網搜
結果:找到了很多的方法,但基本都需要呼叫函式,我看不懂
4.去B站找
結果:發現把自己的延時程式變成用while陳述句實作的就可以了
//從左到右點亮
#include <REGX52.H>
void main()
{
int i,a;
P1=0xff;//位操作,給每個位高電平11111111,燈不亮
while(1)//讓燈不斷地亮和滅
{
for(i=8;i>0;i--)//8個燈,位左移8次
{
P1=P1>>1;
a=65535;
while(a--);//延時程式
}
P1=0xff;//給每個位高電平11111111,讓全亮的燈滅掉
a=65535;
while(a--);//重滅到開再延時,要不然程式運行太快有是一直亮著
}
}
//右到左
#include <REGX52.H>
void main()
{
int i,a;
P1=0xff;//給每個位高電平11111111
while(1)
{
for(i=8;i>0;i--)
{
P1=P1<<1;//就這里不一樣
a=65535;
while(a--);
}
P1=0xff;//給每個位高電平11111111
a=65535;
while(a--);
}
}
當時最開始只是亮了一個燈
#include <REGX52.H>//宣告頭檔案
void main()
{
int i,a;
P1=0xff;//給每個位高電平11111111
while(1)
{
for(i=8;i>0;i--)
{
P1=P1<<1;
a=65535;
while(a);
}
P1=0xff;//給每個位高電平11111111
a=65535;
while(a);//a出問題了
}
}
原因:while里面的a沒有“減減”
5.其他問題
- 字母P一定要大寫,它頭檔案里面是這樣子定義的
- 花括號成雙成對,出現了程式寫太長結果花括號漏掉或者重復的情況
- 把注釋符號“//”寫在了分號“;”前面,結果編譯一堆錯誤
- 板子燒錄程式與視頻講解的略有不同,就“冷啟動”那里,但都是先點下載再開開關
- Keil頭檔案名字要大寫,視頻里由于版本的原因是小寫,可右鍵直接添加頭檔案

- 放大直接ctrl+滾輪
- 再一個個亮后加了延時程式,結果滅后面沒有加延時程式,導致第一個燈就沒有滅過
- 資料型別沒搞對,賦值太大,超過范圍
當時想了兩種流水燈情況,但是第一種要用到回圈左移/回圈右移,我寫不出來,所以想了第二種的
??
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/279661.html
標籤:其他
