|
本帖最后由 chinayanhui 于 2020-2-23 00:07 編輯
學習單片機的小學生第一次發帖,不足之處還請高人指正。
這期間,實再無聊,在網上看一些電子制作的視頻。看了一個群主自己做了一個心形流水燈,效果實再不錯,但是看到他寫的代碼,就是覺得太亂。不成系統,一大堆的數組組織起來的代碼,沒有注釋,看的讓人著實不爽。
頻中的代碼片段:
1.png (436.99 KB, 下載次數: 45)
下載附件
2020-2-22 22:32 上傳
2.png (210.73 KB, 下載次數: 46)
下載附件
2020-2-22 22:32 上傳
3.png (192.21 KB, 下載次數: 46)
下載附件
2020-2-22 22:32 上傳
是不是看得有點暈?
正好家里還有幾塊洞洞板和LED燈,用了兩天時間,加上代碼總算是搞定了。旨當給孩子的玩具了,孩子也比較喜歡。
先看一個效果視頻:
視頻.7z
(5.26 MB, 下載次數: 5)
2020-2-22 23:26 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
相關圖片:
51hei圖片_202002222328201.jpg (149.12 KB, 下載次數: 46)
下載附件
2020-2-22 23:29 上傳
51hei圖片_202002222328203.jpg (113.98 KB, 下載次數: 40)
下載附件
2020-2-22 23:29 上傳
51hei圖片_202002222328202.jpg (113.86 KB, 下載次數: 41)
下載附件
2020-2-22 23:29 上傳
51hei圖片_20200222232820.jpg (198.69 KB, 下載次數: 45)
下載附件
2020-2-22 23:28 上傳
由于手頭只有7*9的板子,用了26個LED,光拼這個心形就用了近一個半小時的時間。看似簡單,拼起來要考慮線的走向等等問題。
手頭還有幾只STC98C52RC,占用了P1, P2, P3和ALE(4.5)以及4.6管腳。為啥不用P0腳?因為想起了要接上拉電阻,手頭又沒有,所以干脆沒有用。雖然我的LED是共陽接法。。。其實是為了以后擴展用的
因為是用3節1.5V的電池帶動,為了能亮一些,所以限流電阻接了100歐的。
流水燈嘛就是一堆IO口的輸出,沒啥復雜的,是51單片機初學者的Hello World,復雜之處在于設計led流水燈的算法。筆者因為是從軟件轉過來的,雖然在PC端有一大堆的內存可以使用,但是學習單片機,面對只有幾百之字的內存和幾K的存儲空間。但是從算法上節約程序空間是筆者的習慣。另外程序看得也明白。主要是不想用一大堆數組,一堆看的頭疼的循環加套循環,只想設計幾個函數,解決問題。最終編譯出來,程序代碼686字節,占用內存23.0,我自己還能接受。
還有一些效果有些思路,但是真是沒有時間寫了,有興趣的壇友可以在我的思路上完善。因為LED較多,代碼中沒有使用循環左右移的代碼。覺得用unsign long左右移動就足夠了。當然程序中也注釋了一段筆者參考網上的uint32的循環左右移的代碼,供有興趣的壇友參考。
另外由于不需要精確定時也為了寫程序方便,沒有使用定時器,僅用了一個軟件延時。有興趣的壇友可以使用定時器試一下哈。
單片機代碼如下:- #include "STC89C5xRC.H"
- #define int8 char
- #define uint8 unsigned char
- #define uint16 unsigned short
- #define uint32 unsigned long
-
- #define FUNJMP 79 // 函數跳轉延時
- #define TIME 100 // 語句間延時
- /**********************************
- 函數功能:軟件延時
- 入口參數:
- count uint16 軟件延時的毫秒數
- 返 回:無
- 備 注:無
- **********************************/
- void Delay(uint16 count)
- {
- uint16 i;
- uint8 j;
- for(i = count; i > 0; i--)
- for(j = 110; j > 0; j--);
- }
- /**********************************
- 函數功能:全亮閃爍
- 入口參數:
- count uint8 閃爍次數
- ms uint16 閃爍時停留的毫秒數
- 返 回:無
- 備 注:無
- **********************************/
- void Flash(uint8 count, uint16 ms)
- {
- uint8 i;
-
- for(i = 0; i < count * 2; i++)
- {
- P1 = ~P1;
- P2 = ~P2;
- P3 = ~P3;
- P4 = ~P4;
-
- Delay(ms);
- }
- }
- /**********************************
- 函數功能:
- 循環移動無符號數
- 入口參數:
- uint32 val 待移動的數
- uint8 count 移動的位數
- 返 回:移動的結果
- 備 注:
- count < 0,左移
- count > 0, 右移
- **********************************/
- //uint32 CycleShift(uint32 val, int8 count)
- //{
- // uint32 temp = 0;
- //
- // if(count == 0)
- // return val;
- //
- // temp |= val;
- //
- // if(count < 0)
- // {
- // val <<= -count;
- // temp >>= (32 + count);
- // }
- // else
- // {
- // val >>= count;
- // temp <<= (32 - count);
- // }
- //
- // return val | temp;
- //}
- /**********************************
- 函數功能:根據參數設定LED的亮燈
- 入口參數:
- value uint32 設定led亮燈的數據
-
- 返 回:無
- 備 注:無
- **********************************/
- void LED(uint32 value)
- {
- P1 = value & 0xFF;
- P3 = (value & 0xFF00) >> 8;
- P2 = (value & 0xFF0000) >> 16;
- P44 = (value & 0x1000000) >> 24;
- P45 = (value & 0x2000000) >> 25;
- }
- /**********************************
- 函數功能:流水燈
- 入口參數:
- value uint8 流水燈初值(0.逆時針 1.順時針)
- isOff uint8 是否關閉流過的燈(1.關閉 0.不關閉)
-
- 返 回:無
- 備 注:無
- **********************************/
- void Assembly(uint32 value, uint8 style)
- {
- uint8 i;
- for(i = 0; i < 26; i++)
- {
- LED(value);
-
- // 第7位為1,則為順時針,否則為逆時針
- if((style & 0x80) == 0x80)
- value <<= 1;
- else
- value >>= 1;
-
- // 第0位為1則為單個流水燈(為0則是亮過的不再熄滅)
- if((style & 1) == 1)
- value++;
-
- // 第1位為1則為順時針逐個滅燈
- if((style & 2) == 2)
- value |= 1;
-
- // 第5位為1則為逆時針單個燈
- if((style & 0x10) == 0x10)
- value |= 0x2000000;
-
- Delay(TIME);
- }
- }
- /**********************************
- 函數功能:雙向流水燈
- 入口參數:
- dir uint8 0.雙向點亮(從上到下) 1.雙向熄滅(從上到下)
- 返 回:無
- 備 注:無
- **********************************/
- void Assembly2(uint8 dir)
- {
- uint8 i;
- uint16 clockwise;
- uint16 anticlockwise;
-
- Delay(TIME);
-
- clockwise = 0x1FFE;
- anticlockwise = 0x1FFF;
- for(i = 0; i < 14; i++)
- {
- uint32 temp = anticlockwise;
- temp = temp << 13;
- temp = temp | (clockwise & 0x1FFE);
-
- if(dir)
- temp = ~temp;
-
- LED(temp);
-
- clockwise = clockwise << 1;
- anticlockwise = anticlockwise >> 1;
- Delay(TIME);
- }
- }
- void main()
- {
- while(1)
- {
-
- //Delay(FUNJMP);
-
-
-
- // 全滅的狀態下順時針逐個流水亮燈
- Assembly(0xFFFFFFFE, 0x81);
-
- // 全滅的狀態下順時針堆積亮燈
- Delay(FUNJMP);
- Assembly(0xFFFFFFFE, 0x80);
-
- // 全亮狀態下順時針逐個堆積滅燈
- //P1 = 0xFF;
- Delay(FUNJMP);
- Assembly(1, 0x82);
-
- // 全滅狀態下逆時針逐個流水亮燈
- Delay(FUNJMP);
- Assembly(0x1FFFFFF, 0x10);
-
- // 逆時針逐個堆積亮燈
- Delay(FUNJMP);
- Assembly(0x1FFFFFF, 0x00);
-
- // 全亮的狀態下逆時針堆積滅燈
- Delay(FUNJMP);
- Assembly(0x2000000, 0x10);
-
- // 兩邊點亮
- Delay(FUNJMP);
- Assembly2(0);
-
- // 兩邊收縮
- Delay(FUNJMP);
- Assembly2(1);
-
- // 閃爍
- Delay(FUNJMP);
- Flash(3, FUNJMP - 10);
-
- Delay(3000);
- }
- }
復制代碼
洞洞板的設計比較簡單,為了美觀,用了兩塊洞洞板,一個板子上是共陽的26根LED,另一塊板子放單片機,晶振,然后是一堆插針。
洞洞板的設計:
111111.jpg (199.38 KB, 下載次數: 40)
下載附件
2020-2-23 00:07 上傳
222222.jpg (205.12 KB, 下載次數: 50)
下載附件
2020-2-23 00:07 上傳
|
-
51hei.png
(300.03 KB, 下載次數: 53)
下載附件
2020-2-22 23:27 上傳
-
3.png
(192.21 KB, 下載次數: 39)
下載附件
2020-2-22 23:27 上傳
-
2.png
(210.73 KB, 下載次數: 48)
下載附件
2020-2-22 23:27 上傳
-
1.png
(436.99 KB, 下載次數: 32)
下載附件
2020-2-22 23:27 上傳
評分
-
查看全部評分
|