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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4922|回復: 2
收起左側

骨牌時鐘制作

[復制鏈接]
ID:94097 發表于 2015-10-30 16:01 | 顯示全部樓層 |閱讀模式
視頻1——簡介:http://v.youku.com/v_show/id_XNDA5NTg4MjA4.html

視頻2——工作介紹:http://v.youku.com/v_show/id_XNDA5NTk1MTg0.html
視頻3——原理解說:http://v.youku.com/v_show/id_XNDA5NjI1MTIw.html
視頻里會發現燈珠有閃動,那是程序掃描頻率問題,用肉眼直接看是很完美的,不會閃動!
原理圖:
骨牌時鐘原理圖.JPG



程序等資料包: 骨牌時鐘.zip (75.47 KB, 下載次數: 14)
2
年前,無意中進了51hei網站里面的東西給我留下了深刻的印象,那時候才開始學習單片機,看到里面的立方體之后,震撼之余,也想自己什么時候可以發個作品在這個網站里?上ё约簩W藝不精,2年來只能是看網站里的作品,后來,終于覺得自己在專業課上有了點進步,做了個led金字塔。聯系到站長之后,站長很樂意上傳這些原創性的作品,也給我了很多鼓勵。
因為面臨畢業、參加各種比賽,這次上傳作品距離上次做金字塔間隔很久了,不過我沒有偷懶,一直在擠時間設計屬于自己的立方體(之前也做過,金字塔就是改版),但這個立方體我想做成終極版的,即便是不懂單片機編程的朋友,都可以編輯動畫,現在也已經有了很大的進展,估計在6月底,就可以和大家見面了!
這次的作品骨牌時鐘,靈感源于愛折騰網站,里面有個國外的骨牌時鐘,我那時候看了覺得很有意思,自己和工作室的朋友折騰了幾天,也搞了出來。下面,我就毫無保留的把制作過程、程序、原理圖拿出來供大家參考,希望讀者能指出不足之處,
在開始之前,我想說,希望各位讀者尊重原創,我所做的原創性、開源性的作品會上傳到愛折騰網,因為我覺得這個網站干凈,不帶廣告,非常適合做大家DIY交流的平臺。如果您覺得我的作品好,覺得這個網站好,請把連接發給您的朋友,讓更多的人欣賞里面妙趣橫生的作品,但請不要不道德的轉載,希望轉載的讀者,注明首發網站及作者。
作為單片機的初學者,最大的困難就是找資料,網絡上很多資料都是不完整的,特別是程序。我們工作室,立志做開源設計,毫無保留,我相信,我們工作室第一個做開源,會吸引更多的人一起來開源,大家會共同進步!希望在大家共同的努力下,愛折騰網站上會出現更多有趣、開源資料的作品!
骨牌時鐘圖片效果:



當前顯示的時間為  1229



顯示時間為   626








顯示時間為  333



顯示時間為  2;22
這個家伙可是我們工作室的人純手工制作的,這也是重慶市盛群杯單片機設計競賽的復賽作品,雖然在最終的評審后沒有取得獎項,但是得到了其他高校的贊賞和認可,算是有個安慰獎吧!
個人對DIY的理解:我覺得DIY就是一種折騰,折騰我們生活中一切可以折騰的東西。我呢,因為是學過單片機的,也喜歡動手制作,就把單片機技術和DIY結合起來,讓單片機學習不在變的枯燥、呆板,而是讓它改善我們的生活,就像愛折騰網站里說的那樣:“讓生活因折騰而與眾不同”,如果你愛生活,就請和我一起來折騰這個時鐘吧!
我這里粗略的說一下這個時鐘的顯示原理,和外殼設計方法,詳細請結合視頻。
大家在視頻里看到的骨牌,其實就是用ABS板圍成的,再蓋上玻璃板或者塑料板(透明就可以啦)。至于這個顏色,就是木紋紙了,建材市場很多賣的,十幾塊一大張,各種顏色、紋理都有的,大家根據自己的喜好自行選擇,現在圖片和視頻里白色的邊框那是ABS板的顏色,朋友們也可以把這部分貼上木紋紙,個人覺得,和骨牌面一樣的顏色比較好。
驅動部分:



原理圖中我是用的ls245,我建議大家用HC系列的,視頻演示的時候,我就全換成了HC系列的245,HC系列發熱小,功耗小,價格便宜,只不過一定要記得在輸入上加上拉電阻10K,這樣才能和TTL兼容,有朋友和我說hc系列的不穩定,我針對這個也是做了實驗的,結論就是加了上拉電阻后,效果和ls系列完全一樣!24519腳(使能端)就作為位碼的選通腳,所有輸入(段碼)都是并聯在一起的。原理圖我畫的比較詳細了,請用proteus7.5以上版本打開。
DS1302部分:
這個我想,接觸過一段時間單片機的朋友都會有所了解,DS1302是最常見的時鐘芯片之一,其工作原理圖我是畫好了的,這里要說一下,為了保證1302可以穩定的工作,5、67腳一定要加10K上拉電阻,最好把晶振的金屬殼部分接地。這樣才能保證DS1302工作的持久穩定。希望大家不要在這個環節偷懶。
三顯示原理:
骨牌時鐘顯示小時和分鐘,最左邊的顯示小時(12小時制),中間的顯示分鐘的十位(0——5,其中0時不顯示),右邊的顯示分鐘的各位(0——9,其中0時不顯示)。每個骨牌由上下兩部分組成,上下兩部分原理相同(參考原理圖),只是查表的標值不一樣,不管是左中右那個骨牌,都是先選中上面,再選中下面進行查表顯示,等于是一個6位數碼管,具體的看程序IO設置就可以了。大家看了原理圖就知道,其實也是個數碼管,只不過形狀和傳統的不一樣,這也意味著表值不一樣的,我已經做好了表值在程序里,大家自行參考。
發光器材選擇
現在我選用的是8MM的高亮發光二極管,因為做的比較大,F在都強調低碳嘛,我希望大家做小的,這樣就用一般的5MM二極管就可以了,根據實際情況縮放比例,我這有個做好的,就是試驗版本,用的就是5mm發光二極管,現在把圖拍下來,給大家做個參考:

這個我是沒做外殼的,只有顯示電路,主要是用來測試程序和硬件的。大家可以根據這個尺寸來設計自己的。細心的朋友可以發現,中間的顯示部分不需要焊接那么多的燈珠






,但是考慮到以后可能需要顯示日期、溫度等擴展功能,就在大的制作上把所有燈珠就焊接了,各位朋友可以根據自己的實際功能情況選擇燈珠的數量。
底板選擇
視頻和圖片里的呢,都是真材實料做的,底板用的是木板,尺寸為80cmX60cm。之所以看不到線,是因為我們在每個骨牌后面都是挖了線槽的(沒電鋸的朋友就苦惱了),線就像我們家里裝修一樣,走的都是內線,這個還是很費時間和精力的,如果有朋友想做這么大的,那就不要怕幸苦,如果做小型的,直接焊接萬能板就可以了,不費什么事情,就是跳線而已。個人覺得呢,我們應該不怕折騰,我鼓勵大家都做大型的,即便是做大了,也可以用5mm的二極管,選擇那種可以投射出光圈的就可以了,這樣只要設置好面板與二極管的距離,就可以改變紅點的大小,因為8mm不僅價格貴了,也不節能。不過,也不是說做小的就不行,覺得做個精簡版的,放在書桌上,也還是蠻不錯的。
邊框
我用的是2mmABS板,很好用,彎成轉角后,直角的木板或塑料。固定,其實呢,還是1mmABS板好用,我們當時是沒怎么注意,趕時間了,建議大家用1mm的,白色的比較便宜。每個骨牌的尺寸為36cmX18cm。詳細的制作方案大家請參考看視頻。
控制電路:
追求的完美的朋友可以不必用40p單片機,用28p的就夠了,STC公司的芯片程序都是兼容的,價格便宜,下載方式也都兼容,不二之選哦!不管做大做小,元件的布局都很重要,因為我們還有外殼的,所以說,布局不好,導致太多的跳線之類的,勢必影響外殼的安裝,希望大家在焊接直接多花心思布局電路,我的不一定是最佳方案,我也期待網友們做出更好的布局,給我參考!有條件的可以做PCB板子,我這次主要是為了給大家做視頻演示,用的是杜邦線直插(這樣也方便初期的程序調試),最后肯定是要用焊錫拖焊到一起的。
程序(請用keil  4版本)
這次的程序是c語言的,我對c語言不是很了解,這個程序是工作室別的朋友寫的,而且是用在其他地方的程序,我只是拿來改了改,肯定有不足之處,

主程序源程序:
  1. #include"MAIN.h"
  2. #include"DS1302.h"
  3. #include"DISPLED.h"
  4. //****制作顯示數據****//
  5. uint8 mek_buf[4];
  6. //制作顯示數據(正常)
  7. uint8 led_buf[4];
  8. //制作顯示數據(修改時鐘)
  9. uint8 timer_buf[4];
  10. //數據寫入DS1302緩存數組
  11. uint8 tempsbuf[5] = {0,0,0,0,0};
  12. //按鍵手動修改時鐘標志位
  13. bit faneg = 0;
  14. //按鍵手動修改時鐘位選
  15. uint8 mak = 0;
  16. //統一修改時間數組
  17. uint8 tempfen = 0,tempshi = 0;
  18. //********************************************************************
  19. //* 名稱  : void delay_key()
  20. //* 功能  : 按鍵消抖延時
  21. //* 輸入  :        無
  22. //* 返回值: 無
  23. //***********************************************************************
  24. void delay_key()
  25. {
  26.         uint8 c = 200;
  27.         while(--c);       
  28. }
  29. //********************************************************************
  30. //* 名稱  : mek_led
  31. //* 功能  : 制作正常顯示數據
  32. //* 輸入  :        無
  33. //* 返回值: 無
  34. //***********************************************************************
  35. void mek_led()
  36. {       
  37.         if(1 == faneg)    //主機
  38.         {
  39.                 timer_buf[0] = tempshi/10;
  40.                 timer_buf[1] = tempshi%10;
  41.                 timer_buf[2] = tempfen/10;
  42.                 timer_buf[3] = tempfen%10;                         
  43.         }
  44.         else if(0 == faneg)    //正常
  45.         {
  46.                 led_buf[0] = mek_buf[2]/10;
  47.                 led_buf[1] = mek_buf[2]%10;
  48.                 led_buf[2] = mek_buf[1]/10;
  49.                 led_buf[3] = mek_buf[1]%10;
  50.                 led_buf[4] = mek_buf[0]/10;
  51.                 led_buf[5] = mek_buf[0]%10;       
  52.         }
  53. }
  54. //********************************************************************
  55. //* 名稱  : void key_refresh()
  56. //* 功能  : 功能選擇(只包含所有分機同時修改)
  57. //* 輸入  :        無
  58. //* 返回值: 無
  59. //***********************************************************************
  60. void key_refresh()
  61. {
  62.         if(!keydin1)       
  63.         {
  64.                 delay_key();
  65.                 if(!keydin1)
  66.                 {
  67.                         write_ds1302(0X80,0X80);    //停止DS1302計時
  68.                         faneg = 1;                                    //標志位置1
  69.                         mak = 1;                                        //選中第一位
  70.                 }       
  71.         }
  72.         while((!keydin1));       
  73. }
  74. //********************************************************************
  75. //* 名稱  : void key_Modify()
  76. //* 功能  : 按鍵手動修改時間
  77. //* 輸入  :        無
  78. //* 返回值: 無
  79. //***********************************************************************
  80. void key_Modify()
  81. {       
  82.         tempshi = 0;
  83.         tempfen = 0;
  84.         while(1)
  85.         {
  86.                 mek_led();                                                 //制作顯示數據
  87.                 display_led(timer_buf);                     //顯示按鍵修改預存時間
  88.                 if(mak > 2){mak = 1;}
  89.                 if(!keydin1)
  90.                 {
  91.                         delay_key();
  92.                         if(!keydin1)
  93.                         {
  94.                                 mak++;
  95.                                 while(!keydin1);       
  96.                         }       
  97.                 }
  98.                
  99.                 if(1 == mak)
  100.                 {
  101.                         if(!keydin2)
  102.                         {
  103.                                 delay_key();
  104.                                 if(!keydin2)
  105.                                 {
  106.                                         if(tempshi > 23)
  107.                                         {
  108.                                                 tempshi = 0;
  109.                                         }
  110.                                         else
  111.                                         {
  112.                                                 tempshi++;               
  113.                                         }
  114.                                 }       
  115.                         }       
  116.                         if(!keydin3)
  117.                         {
  118.                                 delay_key();
  119.                                 if(!keydin3)
  120.                                 {
  121.                                         if(tempshi < 0)
  122.                                         {
  123.                                                 tempshi = 23;
  124.                                         }
  125.                                         else
  126.                                         {
  127.                                                 tempshi--;               
  128.                                         }
  129.                                 }       
  130.                         }       
  131.                         while((!keydin2) || (!keydin3));
  132.                 }
  133.                
  134.                 if(2 == mak)
  135.                 {
  136.                         if(!keydin2)
  137.                         {
  138.                                 delay_key();
  139.                                 if(!keydin2)
  140.                                 {
  141.                                         if(tempfen > 59)
  142.                                         {
  143.                                                 tempfen = 0;
  144.                                         }
  145.                                         else
  146.                                         {
  147.                                                 tempfen++;               
  148.                                         }
  149.                                 }       
  150.                         }       
  151.                         if(!keydin3)
  152.                         {
  153.                                 delay_key();
  154.                                 if(!keydin3)
  155.                                 {
  156.                                         if(tempfen < 0)
  157.                                         {
  158.                                                 tempfen = 59;
  159.                                         }
  160.                                         else
  161.                                         {
  162.                                                 tempfen--;               
  163.                                         }
  164.                                 }       
  165.                         }       
  166.                         while((!keydin2) || (!keydin3));
  167.                 }
  168.                
  169.                 if(!keydin4)
  170.                 {
  171.                         delay_key();
  172.                         if(!keydin4)
  173.                         {
  174.                                 tempsbuf[0] = tempshi;       
  175.                                 tempsbuf[1] = tempfen;       
  176.                                
  177.                                 write_ds1302(0X84,tempsbuf[0]/10*16+tempsbuf[0]%10);        //寫入修改好的時鐘
  178.                                 write_ds1302(0X82,tempsbuf[1]/10*16+tempsbuf[1]%10);   
  179.                                 write_ds1302(0X80,0X00);                                //啟動計時                                 
  180.                                 faneg = 0;
  181.                                 mak = 0;
  182.                                 return;                       
  183.                         }       
  184.                 }
  185.         }
  186. }
  187. //********************************************************************
  188. //* 名稱  : main()
  189. //* 功能  : 主程序
  190. //* 輸入  :        無
  191. //* 返回值: 無
  192. //***********************************************************************
  193. void main()
  194. {
  195.        
  196.         keydin1 = 1;keydin2 = 1;keydin3 = 1;keydin4 = 1;   //端口初始化
  197.         while(1)
  198.         {
  199.                 key_refresh();                   //功能選擇
  200.                 read_time(&mek_buf);             //讀出DS1302中的時間
  201.                 mek_led();                                             //制作顯示數據
  202.                 display_led(led_buf);                     //顯示正常時間               
  203.                 if(1 == faneg){key_Modify();}         //修改時間
  204.         //        shanshuo_led();                  //秒點閃爍
  205.         //        Automatic();           //單片機自動操作
  206.         }
  207. }

復制代碼



回復

使用道具 舉報

ID:113533 發表于 2016-4-18 21:56 | 顯示全部樓層
學習一下,if(1 == faneg)    //主機              避免了1=faneg的錯誤
回復

使用道具 舉報

ID:185829 發表于 2017-5-17 17:59 | 顯示全部樓層
時鐘數據羅馬數字編碼的方法,有意思
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩一区在线播放 | 欧美一区二区视频 | 午夜电影福利 | 欧美在线a | 中文字幕第一页在线 | 亚洲人成人一区二区在线观看 | av入口| 欧美精品成人一区二区三区四区 | 精品国产一区二区三区观看不卡 | 国产区高清 | 天天操天天摸天天干 | 中日字幕大片在线播放 | 视频羞羞| 亚洲精品日韩在线 | 91天堂网 | 国产高清一区二区三区 | 亚洲高清在线观看 | 中文字幕在线剧情 | 亚洲第一视频 | 亚洲人成免费 | 一区在线免费视频 | 中文字幕久久精品 | 国产精品久久久久久久久久久免费看 | 特一级毛片 | 亚洲第一视频 | av黄在线观看 | 有码一区 | www.精品一区| 亚洲欧美日本在线 | 日本不卡免费新一二三区 | 国产91精品久久久久久久网曝门 | 精品欧美色视频网站在线观看 | 99久久精品免费 | 国产探花 | 粉嫩一区二区三区性色av | 欧美精品在线一区二区三区 | www.一区二区| 免费在线播放黄色 | 欧美在线一区二区三区 | 欧美性受xxxx| 国产精品日韩欧美一区二区三区 |