久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4979|回復: 4
打印 上一主題 下一主題
收起左側

小白菜的學習之路系列之四—歡天喜地搖搖棒

[復制鏈接]
跳轉到指定樓層
樓主
背景
話說年就要過去了,某人的生日也快到了。送個什么東西好呢?小白菜開始思考了,上次送是一條小白菜自己設計定做的項鏈(銀的,不貴的,同學們可以試一下哦,保證讓小女生感動的不得了……咳咳,有點跑題了。),這次嘛,送個什么好,想啊想,要不就送個閃字搖搖棒吧。搖搖棒又好玩,而且能親手做(表達心意嘛),還能鍛煉一下動手能力,最主要的是自己親手做的東西是天下獨一份的哦。恩,說做就做!
小白菜會把這次DIY過程的全部資料無私奉獻!鼓掌!!!可是,這是為什么呢?因為現在地里的白菜8分錢一斤沒人要啊,還不如白送吶!!!哈哈。開玩笑!不過種白菜的今年吃苦頭了,希望他們早日過上好日子……
應用需求     做一個搖搖棒!
過程分析
手不停的左右搖晃,利用人眼的視覺暫留來顯示一幅畫面,其原理和數碼管、點陣的動態掃描相同。因此需要LED和單片機,還需要一個啟動顯示的裝置,并且在搖到一定的位置時來觸發這個裝置,這個裝置就是慣性開關。別的沒了……
硬件分析
單片機及外圍電路必不可少。單片機就先STC90C52RC,為什么?因為我手上暫時就只有這一片能用的了。16個LED可以顯示漢字,通過電阻連接到VCC,另一端接IO口。
難點來了,慣性開關!小白菜手上沒有水銀開關,就用加了點焊錫的銅線來充當吧。見圖4.1.1。
電池?當然要有!省電???需要稍微考慮一下。附錄1是較為詳細的制作過程。
4.1.1   DIY“水銀開關”示意圖
軟件分析
    通過過程分析,小白菜了解了一個重要的地方,觸發顯示。但小白菜喜歡把功能拆分開,于是就需要兩個函數來處理,觸發函數和顯示函數。
1 司令部——觸發函數
通過檢測慣性開關來決定是否起動顯示,這是發命允顯示命令的函數,因此是司令部!既然是允許顯示,那就起名App_YYB_Disp_Enable()吧(App是什么?小白菜的應用層函數的前綴)。
2 作戰部隊——顯示函數
顯示函數只負責顯示。當司令部觸發函數發布顯示允許命令后,該函數把一幅圖片顯示出來(就算是漢字,其實也是一幅點陣圖片)。這就像作戰部隊接到命令后進行執行一樣。軟件起名App_ YYB_Disp()。
    3作戰內容——顯示內容
    找個取模軟件把要顯示的東西取個模,然后把數據放到code區。盡量放在code區哦。

代碼編寫
成果展示
    “誰知盤中餐,粒粒皆辛苦。”成果出來的那一刻,小白菜心里巨激動!畢竟是個人的勞動成果嘛。話不多說,直接上圖。
    圖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的電阻。

圖8.3.1雙向觸發慣性開關


   
圖8.4.1 普通LED接線方式

   

8.4.2 無實用價值的改進型LED接線方式
附件
內有硬件原理圖,源代碼,以及本文的PDF版本。
聯系小白菜
QQ = 1062509507

3htech
我是一顆小白菜~

======================================================================
附錄1:搖搖棒硬件制作過程,一定要先畫原理圖。


原理圖
1 焊接LED,數目自己定。之后焊接電阻,最好用直插元件,小白菜這里都是貼片的……小白菜又測量了下電阻值(1k,5%精度)。
   
圖F1.1.1 焊接LED

圖F1.1.2焊接限流電阻

圖F1.1.3 檢查電阻焊接質量
2 焊接DIP40座和單片機的復位電路,晶振電路。還是貼片的……
   
                          圖F1.2.1焊接DIP40座                             圖F1.2.2焊接復位電路和時鐘電路

3 焊接慣性開關。由于怕慣性開關自身質量太小,所以加了個焊錫球。為了不讓它上下活動,我加了一個小罩子,這樣就能保證只在一定的范圍內活動。
圖F1.3.1慣性開關
4 用排線連接LED和單片機以及開關。如圖F1.4.1。
5 焊接電池座和電源地線。整機焊接完成。如圖F1.5.1。這里我強壓了一個DIP40座,方便我取下單片機下程序。兩個電池串聯的,電壓6V。正好。效果圖如圖F1.5.2和圖F1.5.3。

        
                        圖F1.4.1背面連線圖                            圖F1.5.1  整機正面圖



                                  圖F1.5.2 效果圖1                            圖F1.5.3 效果圖2


歡天喜地搖搖棒.rar (3.34 MB, 下載次數: 2870)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:70650 發表于 2014-12-20 18:24 | 只看該作者
主程序預覽:
  1. #include "Config.H"


  2. //========================================================================//
  3. //                              慣性開關                                  //
  4. //========================================================================//
  5. sbit InertiaSwitch = P2^7;  // 為0時表示開關閉合了。
  6. //========================================================================//
  7. //                      顯示允許函數 (對外提供服務)
  8. //函數名稱:App_YYB_Disp_Enable ()
  9. //函數功能:檢查當前是否允許顯示
  10. //入口參數:無。
  11. //出口參數:TRUE = 運動到最左邊,口線電平被拉低,允許啟動顯示。FALSE = 其他位置,不允許顯示。
  12. //重要說明:
  13. //編寫日期:2012-11-29
  14. //測試結果:
  15. //========================================================================//
  16. // 函數返回值:
  17. extern uint8 App_YYB_Disp_Enable(void)
  18. {
  19.     // 閉合后口線電平為低
  20.     if(0 == InertiaSwitch)
  21.     {
  22.         Delay_MS(30);   // 在剛觸發時,搖搖棒剛行進到最左邊,此時速度很低,因而若立即啟動顯示,則必然會使字顯示的很少,所以延時一段時間。
  23.                         // 在搖搖棒速度上來之后再啟動顯示。

  24.         return TRUE;
  25.     }
  26.     else
  27.     {
  28.         return FALSE;
  29.     }
  30. }

  31. //========================================================================//
  32. //                              顯示部分                                  //
  33. //========================================================================//


  34. //========================================================================//
  35. //變量名稱:u8Picture
  36. //變量功能:保存需要顯示的數據
  37. //作用域  :全局變量、僅限本文件
  38. //重要說明:,僅適用于本程序。
  39. //========================================================================//

  40. static uint8 code u8Picture[4][32] =
  41. {

  42.     0xFF,0xFF,0xFF,0xEF,0xFF,0xEF,0xFE,0xEF,0x00,0x6F,0x80,0xEF,0xEE,0xEF,0xEE,0xEF,    // 與
  43.     0xEE,0xEF,0xEE,0xEF,0xEE,0xCF,0xEE,0xED,0xEE,0xFC,0xCE,0x01,0xFC,0x03,0xFE,0xFF,

  44.     0xFF,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xBE,0xFF,0xBE,0xFF,0xBE,0xFD,0xBE,0xFD,    // 子
  45.     0xB8,0x00,0xB0,0x01,0xA6,0xFF,0x8E,0xFF,0x1E,0xFF,0xBE,0xFF,0xFC,0xFF,0xFE,0xFF,

  46.     0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x80,0x01,0xB7,0xFF,0xB4,0x07,0xB6,0x0F,0xB6,0xEF,    // 同
  47.     0xB6,0xEF,0xB6,0x07,0xA4,0x0D,0xB6,0xFD,0x80,0x00,0x00,0x01,0xBF,0xFF,0xFF,0xFF,

  48.     0xFF,0xFF,0xFB,0xDF,0xF7,0xBF,0xCE,0x00,0x18,0x01,0xBD,0xFF,0xFF,0xFF,0xFB,0xFF,    // 行
  49.     0xBB,0xFF,0xBB,0xFD,0xBB,0xFD,0xB8,0x00,0xB8,0x01,0x3B,0xFF,0xB3,0xFF,0xFB,0xFF,

  50. };

  51. //========================================================================//
  52. //                      顯示一列數據函數 (對外提供服務)
  53. //函數名稱:App_YYB_Disp_Colum ()
  54. //函數功能:顯示一列數據。
  55. //入口參數:u8UpByte為16位的上半部分數據,u8DownByte為下半部分數據
  56. //出口參數:無。
  57. //重要說明:
  58. //編寫日期:2012-11-29
  59. //測試結果:
  60. //========================================================================//
  61. static void App_YYB_Disp_Colum(uint8 u8UpByte, uint8 u8DownByte)
  62. {
  63.     P1 = u8UpByte;
  64.     P0 = u8DownByte;

  65.     Delay_50us(10);  // 延時500us,可自行調節

  66.     P1 = 0xFF;      // 關閉顯示
  67.     P0 = 0xFF;
  68. }
  69. //========================================================================//
  70. //                      顯示圖像函數 (對外提供服務)
  71. //函數名稱:App_YYB_Disp()
  72. //函數功能:顯示一幅圖片。漢字點陣實際上也是一幅圖片
  73. //入口參數:u8disp_Enable:是否起動顯示。TRUE = 允許起動顯示,FALSE = 不允許顯示。
  74. //出口參數:無。
  75. //重要說明:
  76. //編寫日期:2012-11-29
  77. //測試結果:
  78. //========================================================================//
  79. extern void App_YYB_Disp(uint8 u8disp_Enable)
  80. {
  81.     uint8 i, k;

  82.     if(FALSE == u8disp_Enable)
  83.     {
  84.         return; // 一個函數最好只有一個出口,顯然,這里不符合要求。
  85.     }


  86.     for(i = 0; i < 4; i++)  // 要顯示的4個漢字
  87.     {
  88.         for(k = 0; k < 16; k++) // 這里,一個漢字有16列
  89.         {
  90.             App_YYB_Disp_Colum(u8Picture[i][2*k], u8Picture[i][2*k + 1]);
  91.         }

  92.         Delay_MS(1);
  93.     }

  94.     Delay_MS(20);
  95. }
  96. //========================================================================//
  97. //                               主函數                                   //
  98. //========================================================================//
  99. void main(void)
  100. {
  101.     uint8 u8State;

  102.     while(1)
  103.     {
  104.         u8State = App_YYB_Disp_Enable();

  105.         App_YYB_Disp(u8State);
  106.     }
  107. }




復制代碼
回復

使用道具 舉報

板凳
ID:70650 發表于 2014-12-20 18:26 | 只看該作者
TypeRedefine.H文件:
  1. /*
  2. ********************************************************************************
  3. *                                     WIT
  4. *                             淄博威特電氣有限公司
  5. *
  6. *     地址:山東省淄博市張店區淄博市高新技術開發區政通路135號高創中心E座2層
  7. *                  (c) Copyright 2012,   All Rights Reserved
  8. *                                www.weitedq.com
  9. * 開發環境  : Keil4
  10. * 文件名    : TypeRedefine.H
  11. * 程序員    : 3htech
  12. * 開發時間  : 2012-06-04
  13. * 描述      : 類型重新定義。
  14. * 生存條件  : 自由存在。
  15. *-------------------------------------------------------------------------------
  16. * 修 改    :
  17. * 日 期    :
  18. * 描  述    :
  19. *-------------------------------------------------------------------------------
  20. ********************************************************************************
  21. */


  22. //------------------------------    文件開關    ------------------------------//
  23. // 防止文件包含時多次編本文件,與本文件結尾處的endif對應。
  24. #ifndef     _TYPEREDEFINE_H_
  25.     #define _TYPEREDEFINE_H_
  26. //----------------------------------------------------------------------------//




  27. //------------------------------ 系統頭文件包含 ------------------------------//
  28. #include<stdio.H>       // 為了使用NULL的定義。

  29. //----------------------------- 自定義頭文件包含 -----------------------------//
  30. //無
  31. //--------------------------------  類型聲明  --------------------------------//
  32. //----------------------------------------------------------------------------//
  33. //類型名稱:
  34. //類型功能:
  35. //成員詳解:
  36. //重要說明:
  37. //----------------------------------------------------------------------------//


  38. //------------------------------  全局變量定義  ------------------------------//
  39. //無


  40. //--------------------------------------------------------------//
  41. //                     類型重新定義
  42. //名稱:類型重新定義
  43. //功能:
  44. //      51系列單片機應用下的類型重新定義。
  45. //      使用的是8位單片機,因此char是8位,int為16位,long為32位
  46. //--------------------------------------------------------------//

  47. typedef  bit  bdata   uint1;    //  無符號1 位整型變量需要加前綴u1

  48. typedef unsigned char uint8;    // 無符號8 位整型,前綴u8
  49. typedef   signed char  int8;    // 有符號8 位整型,前綴i8

  50. typedef unsigned int  uint16;   // 無符號16位整型,前綴u16
  51. typedef   signed int   int16;   // 有符號16位整型,前綴i16

  52. typedef unsigned long uint32;   // 無符號32位整型,前綴u32
  53. typedef   signed long  int32;   // 有符號32位整型,前綴i32

  54. typedef  float         flt32;   // 單精度浮點數(32位長度),前綴f32



  55. //-------------------------------   宏定義   ---------------------------------//
  56. //----------------------------------------------------------------------------//
  57. //宏名    :TURE, FALSE
  58. //功能    :錯誤標志或操作完成標志。
  59. //重要說明:無
  60. //----------------------------------------------------------------------------//
  61. #ifndef TRUE
  62.     #define TRUE  0
  63. #endif

  64. #ifndef FALSE
  65.     #define FALSE 1
  66. #endif
  67. //------------------------------    文件開關    ------------------------------//
  68. // 防止文件包含時多次編本文件,與本文件開頭處的 #ifndef 對應。
  69. #endif
  70. //----------------------------------------------------------------------------//


  71. //------------------------------    文件結束    ------------------------------//
復制代碼
回復

使用道具 舉報

地板
ID:70650 發表于 2014-12-20 18:27 | 只看該作者
Delay.c文件:
  1. /*
  2. ================================================================================
  3. * 開發環境  : Keil4
  4. * 文件名    : Delay.C
  5. * 程序員    : 3htech
  6. * 開發時間  : 2012-06-08
  7. * 描述      : 軟件延時函數驅動。不同內核的單片機、晶振、分頻數、指令所用的周期數不同
  8. *           :都會導致延時時間的不同。所以本驅動需要進行移植修改。
  9. * 生存條件  :
  10. ===============================================================================
  11. //修 改  :
  12. //日 期  :
  13. //描  述  :
  14. ================================================================================
  15. ================================================================================
  16. */

  17. //------------------------------    程序開關    ------------------------------//
  18. //----------------------------------------------------------------------------//
  19. // 名稱 :
  20. // 功能 :
  21. //----------------------------------------------------------------------------//


  22. //------------------------------ 系統頭文件包含 ------------------------------//

  23. //----------------------------- 自定義頭文件包含 -----------------------------//
  24. #include"Delay.h"



  25. ////////////////////////////////////////////////////////////////////////////////
  26. //                            本文件專用函數定義                              //
  27. ////////////////////////////////////////////////////////////////////////////////
  28. //----------------------------------------------------------------------------//
  29. //                      xxxx函數 (僅限本文件使用)
  30. //函數名稱:
  31. //函數功能:
  32. //入口參數:無
  33. //出口參數:無
  34. //重要說明:無
  35. //----------------------------------------------------------------------------//
  36. //修改日期:
  37. //修改人員:
  38. //修改內容:
  39. //----------------------------------------------------------------------------//

  40. ////////////////////////////////////////////////////////////////////////////////
  41. //                          本文件專用函數定義結束                            //
  42. ////////////////////////////////////////////////////////////////////////////////







  43. ////////////////////////////////////////////////////////////////////////////////
  44. //                             對外服務函數定義                               //
  45. ////////////////////////////////////////////////////////////////////////////////

  46. //----------------------------------------------------------------------------//
  47. //                      軟件延時n個毫秒函數 (對外提供服務)
  48. //函數名稱:Delay_MS
  49. //函數功能:STC90C52,Fcpu = 12MHz,12T條件下,精確的軟件延時n個毫秒。
  50. //入口參數:n,8位無符號數,延時的毫秒數。n的最大值為255,即255毫秒。小心您的看門狗。
  51. //出口參數:無。
  52. //重要說明:
  53. //編寫日期:2012-11-29
  54. //----------------------------------------------------------------------------//
  55. extern void Delay_MS(uint8 n)
  56. {
  57.     uint8 i;
  58.     for( ; n > 0; n--)
  59.     {
  60.         for(i = 200; i > 0; i--)
  61.         {
  62.             // 空。
  63.         }
  64.         for(i = 200; i > 0; i--)
  65.         {
  66.             // 空。
  67.         }
  68.         for(i = 94; i > 0; i--)
  69.         {
  70.             // 空。
  71.         }
  72.     }
  73. }

  74. //----------------------------------------------------------------------------//
  75. //                      軟件延時n個毫秒函數 (對外提供服務)
  76. //函數名稱:Delay_us
  77. //函數功能:STC90C52,Fcpu = 12MHz,12T條件下,精確的軟件延時n x 50個毫秒。
  78. //入口參數:n,8位無符號數,延時50微秒的倍數。n的最大值為255,即255 x 50微秒秒。
  79. //出口參數:無。
  80. //重要說明:
  81. //編寫日期:2012-11-29
  82. //測試結果:
  83. //  期望值-->實際值:
  84. //   50us -->  63us
  85. //  100us --> 112us
  86. //  150us --> 161us
  87. //  200us --> 210us
  88. //  250us --> 259us
  89. //  300us --> 308us
  90. //  400us --> 406us
  91. //  500us --> 504us
  92. //----------------------------------------------------------------------------//
  93. extern void Delay_50us(uint8 n)
  94. {
  95.     uint8 i;

  96.     if(0 == n)
  97.     {
  98.         return;
  99.     }

  100.     for( ; n > 0; n--)
  101.     {
  102.         for(i = 20; i > 0; i--)
  103.         {
  104.             // 空。
  105.         }
  106.     }
  107. }
  108. ////////////////////////////////////////////////////////////////////////////////
  109. //                           對外服務函數定義結束                             //
  110. ////////////////////////////////////////////////////////////////////////////////



  111. //------------------------------    文件結束    ------------------------------//
復制代碼
回復

使用道具 舉報

5#
ID:71861 發表于 2015-1-8 17:06 | 只看該作者
不錯不錯
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久久久久久久 | 欧美激情久久久 | 91欧美精品 | 亚洲风情在线观看 | 日韩在线免费 | 91亚洲精选| 亚洲 日本 欧美 中文幕 | 国产精品久久久久久久久免费相片 | 成人免费在线观看视频 | 国产熟熟| 91免费看片| 成人国产一区二区三区精品麻豆 | 欧美一区二区三区视频 | 91成人在线视频 | 欧美九九| 日韩精品在线网站 | 黄色免费网站在线看 | 欧美综合国产精品久久丁香 | 久久久91精品国产一区二区三区 | 中文字幕欧美一区 | 亚洲专区在线 | 日韩欧美亚洲 | 亚洲第一区国产精品 | 日本三级电影在线观看视频 | 中文字幕av网站 | 伊人网综合在线 | 欧美乱做爰xxxⅹ久久久 | 日韩成人免费视频 | 亚洲精久久久 | 日韩中文字幕在线视频 | 97av视频在线观看 | 91免费在线看 | 亚洲久久| 亚洲欧美日本在线 | 亚洲欧美日韩国产综合 | 国产精品久久久久久久久久久久久 | 久久精选 | 中文字幕一区二区三区在线观看 | 欧美 日韩 亚洲91麻豆精品 | 精品在线一区二区 | 国产在线视频三区 |