標題: 小白菜的學習之路系列之四—歡天喜地搖搖棒 [打印本頁]
作者: jiujiu 時間: 2014-12-20 18:22
標題: 小白菜的學習之路系列之四—歡天喜地搖搖棒
一 背景
話說年就要過去了,某人的生日也快到了。送個什么東西好呢?小白菜開始思考了,上次送是一條小白菜自己設計定做的項鏈(銀的,不貴的,同學們可以試一下哦,保證讓小女生感動的不得了……咳咳,有點跑題了。),這次嘛,送個什么好,想啊想,要不就送個閃字搖搖棒吧。搖搖棒又好玩,而且能親手做(表達心意嘛),還能鍛煉一下動手能力,最主要的是自己親手做的東西是天下獨一份的哦。恩,說做就做!
小白菜會把這次DIY過程的全部資料無私奉獻!鼓掌!!!可是,這是為什么呢?因為現在地里的白菜8分錢一斤沒人要啊,還不如白送吶!!!哈哈。開玩笑!不過種白菜的今年吃苦頭了,希望他們早日過上好日子……
二 應用需求 做一個搖搖棒!
三 過程分析
手不停的左右搖晃,利用人眼的視覺暫留來顯示一幅畫面,其原理和數碼管、點陣的動態掃描相同。因此需要LED和單片機,還需要一個啟動顯示的裝置,并且在搖到一定的位置時來觸發這個裝置,這個裝置就是慣性開關。別的沒了……
四 硬件分析
單片機及外圍電路必不可少。單片機就先STC90C52RC,為什么?因為我手上暫時就只有這一片能用的了。16個LED可以顯示漢字,通過電阻連接到VCC,另一端接IO口。
難點來了,慣性開關!小白菜手上沒有水銀開關,就用加了點焊錫的銅線來充當吧。見圖4.1.1。
電池?當然要有!省電???需要稍微考慮一下。附錄1是較為詳細的制作過程。
202254u1515cggizi5pewt.jpg.thumb.jpg (10.59 KB, 下載次數: 202)
下載附件
2014-12-20 18:56 上傳
圖4.1.1 DIY“水銀開關”示意圖
五 軟件分析
通過過程分析,小白菜了解了一個重要的地方,觸發顯示。但小白菜喜歡把功能拆分開,于是就需要兩個函數來處理,觸發函數和顯示函數。
1 司令部——觸發函數
通過檢測慣性開關來決定是否起動顯示,這是發命允顯示命令的函數,因此是司令部!既然是允許顯示,那就起名App_YYB_Disp_Enable()吧(App是什么?小白菜的應用層函數的前綴)。
2 作戰部隊——顯示函數
顯示函數只負責顯示。當司令部觸發函數發布顯示允許命令后,該函數把一幅圖片顯示出來(就算是漢字,其實也是一幅點陣圖片)。這就像作戰部隊接到命令后進行執行一樣。軟件起名App_ YYB_Disp()。
3作戰內容——顯示內容
找個取模軟件把要顯示的東西取個模,然后把數據放到code區。盡量放在code區哦。
六 代碼編寫 略
七 成果展示
“誰知盤中餐,粒粒皆辛苦。”成果出來的那一刻,小白菜心里巨激動!畢竟是個人的勞動成果嘛。話不多說,直接上圖。
2028022wl8g50t08l3g0g3.bmp (438.8 KB, 下載次數: 168)
下載附件
2014-12-20 18:56 上傳
202748thiynnu1iiu4bk1l.bmp (231.3 KB, 下載次數: 163)
下載附件
2014-12-20 18:56 上傳
圖7.1.1 效果圖
八 總結
1 一開始測試時,不要急于顯示漢字,因為漢字是相對復雜的圖案。可以先點亮一行或一列。循序漸進!延時要自己進行測試。一開始小白菜在顯示列時用的是毫秒級延時,后來發現時間太長,于是改用了微秒級延時。
2 由于手在來回擺動的時候不是勻速的,在最邊上時速度最慢,所以在觸發后要先延時一段時間,待行進到較為勻速區之后再開始顯示。當然,你也可以動態的進行延時來處理這個問題。
3慣性開關可以做成雙向觸發的(類似于單刀雙擲開關)。由兩個IO口來確定兩個邊的位置。如圖8.3.1所示。軟件也要做相應的更改。如左邊觸發時,正序顯示,右邊觸發時,逆序顯示。(兩個都觸發時?可以忽略或者取一邊有效。)要注意顯示時把握好延時。
4顯示方式可改變。我們一般都是一次送出8位LED數據到Pn口,這是因為我們的硬件支持我們這們做,如圖8.4.1所示,各個LED間互不影響。
是否有其他顯示方式?其實我們可以每次只送出一個LED的數據,然后把Pn口的8位數據依次送出,之后顯示下一字節。既然一次只點亮一個數據,那個我們可以只用一個限流電阻,如圖8.4.2所示。此時一定要保證一次只點亮一個LED,否則亮度下降,注意不要燒毀0.25W的電阻。
203006yux6tdmcy3dmegtt.bmp (857.71 KB, 下載次數: 186)
下載附件
2014-12-20 18:56 上傳
圖8.3.1雙向觸發慣性開關
203034l25rc0vzozms9j05.bmp (949.92 KB, 下載次數: 188)
下載附件
2014-12-20 18:56 上傳
圖8.4.1 普通LED接線方式
202954t8nyry009090jtb9.bmp (696.15 KB, 下載次數: 152)
下載附件
2014-12-20 18:56 上傳
圖8.4.2 無實用價值的改進型LED接線方式
九 附件
內有硬件原理圖,源代碼,以及本文的PDF版本。
十 聯系小白菜
QQ = 1062509507
3htech
我是一顆小白菜~
======================================================================
附錄1:搖搖棒硬件制作過程,一定要先畫原理圖。
2033079avyavoxrva9hcom.bmp (1.65 MB, 下載次數: 171)
下載附件
2014-12-20 18:56 上傳
原理圖
1 焊接LED,數目自己定。之后焊接電阻,最好用直插元件,小白菜這里都是貼片的……小白菜又測量了下電阻值(1k,5%精度)。
203545hhvzsjrr4djjcp7j.bmp (535.37 KB, 下載次數: 177)
下載附件
2014-12-20 18:56 上傳
圖F1.1.1 焊接LED
20234529x3g1z3dz44f984.bmp (808.47 KB, 下載次數: 162)
下載附件
2014-12-20 18:56 上傳
圖F1.1.2焊接限流電阻
202341wcswl93vnuv77klu.jpg.thumb.jpg (31.68 KB, 下載次數: 182)
下載附件
2014-12-20 18:56 上傳
圖F1.1.3 檢查電阻焊接質量
2 焊接DIP40座和單片機的復位電路,晶振電路。還是貼片的……
203728lrypyxbxegex0gew.jpg (52.64 KB, 下載次數: 190)
下載附件
2014-12-20 18:56 上傳
203742ju3ooboxnnnq2703.jpg.thumb.jpg (46.87 KB, 下載次數: 178)
下載附件
2014-12-20 18:56 上傳
圖F1.2.1焊接DIP40座 圖F1.2.2焊接復位電路和時鐘電路
3 焊接慣性開關。由于怕慣性開關自身質量太小,所以加了個焊錫球。為了不讓它上下活動,我加了一個小罩子,這樣就能保證只在一定的范圍內活動。
2023478gdedo849xw8zgge.jpg (60.82 KB, 下載次數: 167)
下載附件
2014-12-20 18:56 上傳
圖F1.3.1慣性開關
4 用排線連接LED和單片機以及開關。如圖F1.4.1。
5 焊接電池座和電源地線。整機焊接完成。如圖F1.5.1。這里我強壓了一個DIP40座,方便我取下單片機下程序。兩個電池串聯的,電壓6V。正好。效果圖如圖F1.5.2和圖F1.5.3。
20410281jc9l9uzxulvxv5.jpg.thumb.jpg (21.26 KB, 下載次數: 166)
下載附件
2014-12-20 18:56 上傳
204155t4mttqqmzq8sistn.jpg.thumb.jpg (13.92 KB, 下載次數: 167)
下載附件
2014-12-20 18:56 上傳
圖F1.4.1背面連線圖 圖F1.5.1 整機正面圖
圖F1.5.2 效果圖1 圖F1.5.3 效果圖2
歡天喜地搖搖棒.rar
(3.34 MB, 下載次數: 2870)
2014-12-20 18:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: jiujiu 時間: 2014-12-20 18:24
主程序預覽:
- #include "Config.H"
- //========================================================================//
- // 慣性開關 //
- //========================================================================//
- sbit InertiaSwitch = P2^7; // 為0時表示開關閉合了。
- //========================================================================//
- // 顯示允許函數 (對外提供服務)
- //函數名稱:App_YYB_Disp_Enable ()
- //函數功能:檢查當前是否允許顯示
- //入口參數:無。
- //出口參數:TRUE = 運動到最左邊,口線電平被拉低,允許啟動顯示。FALSE = 其他位置,不允許顯示。
- //重要說明:
- //編寫日期:2012-11-29
- //測試結果:
- //========================================================================//
- // 函數返回值:
- extern uint8 App_YYB_Disp_Enable(void)
- {
- // 閉合后口線電平為低
- if(0 == InertiaSwitch)
- {
- Delay_MS(30); // 在剛觸發時,搖搖棒剛行進到最左邊,此時速度很低,因而若立即啟動顯示,則必然會使字顯示的很少,所以延時一段時間。
- // 在搖搖棒速度上來之后再啟動顯示。
- return TRUE;
- }
- else
- {
- return FALSE;
- }
- }
- //========================================================================//
- // 顯示部分 //
- //========================================================================//
- //========================================================================//
- //變量名稱:u8Picture
- //變量功能:保存需要顯示的數據
- //作用域 :全局變量、僅限本文件
- //重要說明:,僅適用于本程序。
- //========================================================================//
- static uint8 code u8Picture[4][32] =
- {
- 0xFF,0xFF,0xFF,0xEF,0xFF,0xEF,0xFE,0xEF,0x00,0x6F,0x80,0xEF,0xEE,0xEF,0xEE,0xEF, // 與
- 0xEE,0xEF,0xEE,0xEF,0xEE,0xCF,0xEE,0xED,0xEE,0xFC,0xCE,0x01,0xFC,0x03,0xFE,0xFF,
- 0xFF,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xBE,0xFF,0xBE,0xFF,0xBE,0xFD,0xBE,0xFD, // 子
- 0xB8,0x00,0xB0,0x01,0xA6,0xFF,0x8E,0xFF,0x1E,0xFF,0xBE,0xFF,0xFC,0xFF,0xFE,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x80,0x01,0xB7,0xFF,0xB4,0x07,0xB6,0x0F,0xB6,0xEF, // 同
- 0xB6,0xEF,0xB6,0x07,0xA4,0x0D,0xB6,0xFD,0x80,0x00,0x00,0x01,0xBF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFB,0xDF,0xF7,0xBF,0xCE,0x00,0x18,0x01,0xBD,0xFF,0xFF,0xFF,0xFB,0xFF, // 行
- 0xBB,0xFF,0xBB,0xFD,0xBB,0xFD,0xB8,0x00,0xB8,0x01,0x3B,0xFF,0xB3,0xFF,0xFB,0xFF,
- };
- //========================================================================//
- // 顯示一列數據函數 (對外提供服務)
- //函數名稱:App_YYB_Disp_Colum ()
- //函數功能:顯示一列數據。
- //入口參數:u8UpByte為16位的上半部分數據,u8DownByte為下半部分數據
- //出口參數:無。
- //重要說明:
- //編寫日期:2012-11-29
- //測試結果:
- //========================================================================//
- static void App_YYB_Disp_Colum(uint8 u8UpByte, uint8 u8DownByte)
- {
- P1 = u8UpByte;
- P0 = u8DownByte;
- Delay_50us(10); // 延時500us,可自行調節
- P1 = 0xFF; // 關閉顯示
- P0 = 0xFF;
- }
- //========================================================================//
- // 顯示圖像函數 (對外提供服務)
- //函數名稱:App_YYB_Disp()
- //函數功能:顯示一幅圖片。漢字點陣實際上也是一幅圖片
- //入口參數:u8disp_Enable:是否起動顯示。TRUE = 允許起動顯示,FALSE = 不允許顯示。
- //出口參數:無。
- //重要說明:
- //編寫日期:2012-11-29
- //測試結果:
- //========================================================================//
- extern void App_YYB_Disp(uint8 u8disp_Enable)
- {
- uint8 i, k;
- if(FALSE == u8disp_Enable)
- {
- return; // 一個函數最好只有一個出口,顯然,這里不符合要求。
- }
- for(i = 0; i < 4; i++) // 要顯示的4個漢字
- {
- for(k = 0; k < 16; k++) // 這里,一個漢字有16列
- {
- App_YYB_Disp_Colum(u8Picture[i][2*k], u8Picture[i][2*k + 1]);
- }
- Delay_MS(1);
- }
- Delay_MS(20);
- }
- //========================================================================//
- // 主函數 //
- //========================================================================//
- void main(void)
- {
- uint8 u8State;
- while(1)
- {
- u8State = App_YYB_Disp_Enable();
- App_YYB_Disp(u8State);
- }
- }
復制代碼
作者: jiujiu 時間: 2014-12-20 18:26
TypeRedefine.H文件:
- /*
- ********************************************************************************
- * WIT
- * 淄博威特電氣有限公司
- *
- * 地址:山東省淄博市張店區淄博市高新技術開發區政通路135號高創中心E座2層
- * (c) Copyright 2012, All Rights Reserved
- * www.weitedq.com
- * 開發環境 : Keil4
- * 文件名 : TypeRedefine.H
- * 程序員 : 3htech
- * 開發時間 : 2012-06-04
- * 描述 : 類型重新定義。
- * 生存條件 : 自由存在。
- *-------------------------------------------------------------------------------
- * 修 改 :
- * 日 期 :
- * 描 述 :
- *-------------------------------------------------------------------------------
- ********************************************************************************
- */
- //------------------------------ 文件開關 ------------------------------//
- // 防止文件包含時多次編本文件,與本文件結尾處的endif對應。
- #ifndef _TYPEREDEFINE_H_
- #define _TYPEREDEFINE_H_
- //----------------------------------------------------------------------------//
- //------------------------------ 系統頭文件包含 ------------------------------//
- #include<stdio.H> // 為了使用NULL的定義。
- //----------------------------- 自定義頭文件包含 -----------------------------//
- //無
- //-------------------------------- 類型聲明 --------------------------------//
- //----------------------------------------------------------------------------//
- //類型名稱:
- //類型功能:
- //成員詳解:
- //重要說明:
- //----------------------------------------------------------------------------//
- //------------------------------ 全局變量定義 ------------------------------//
- //無
- //--------------------------------------------------------------//
- // 類型重新定義
- //名稱:類型重新定義
- //功能:
- // 51系列單片機應用下的類型重新定義。
- // 使用的是8位單片機,因此char是8位,int為16位,long為32位
- //--------------------------------------------------------------//
- typedef bit bdata uint1; // 無符號1 位整型變量需要加前綴u1
- typedef unsigned char uint8; // 無符號8 位整型,前綴u8
- typedef signed char int8; // 有符號8 位整型,前綴i8
- typedef unsigned int uint16; // 無符號16位整型,前綴u16
- typedef signed int int16; // 有符號16位整型,前綴i16
- typedef unsigned long uint32; // 無符號32位整型,前綴u32
- typedef signed long int32; // 有符號32位整型,前綴i32
- typedef float flt32; // 單精度浮點數(32位長度),前綴f32
- //------------------------------- 宏定義 ---------------------------------//
- //----------------------------------------------------------------------------//
- //宏名 :TURE, FALSE
- //功能 :錯誤標志或操作完成標志。
- //重要說明:無
- //----------------------------------------------------------------------------//
- #ifndef TRUE
- #define TRUE 0
- #endif
- #ifndef FALSE
- #define FALSE 1
- #endif
- //------------------------------ 文件開關 ------------------------------//
- // 防止文件包含時多次編本文件,與本文件開頭處的 #ifndef 對應。
- #endif
- //----------------------------------------------------------------------------//
- //------------------------------ 文件結束 ------------------------------//
復制代碼
作者: jiujiu 時間: 2014-12-20 18:27
Delay.c文件:
作者: 曼濤1314 時間: 2015-1-8 17:06
不錯不錯
歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |