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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4877|回復: 2
打印 上一主題 下一主題
收起左側(cè)

骨牌時鐘制作

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:94097 發(fā)表于 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
視頻里會發(fā)現(xiàn)燈珠有閃動,那是程序掃描頻率問題,用肉眼直接看是很完美的,不會閃動!
原理圖:




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



當前顯示的時間為  1229



顯示時間為   626








顯示時間為  333



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



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

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






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

主程序源程序:
  1. #include"MAIN.h"
  2. #include"DS1302.h"
  3. #include"DISPLED.h"
  4. //****制作顯示數(shù)據(jù)****//
  5. uint8 mek_buf[4];
  6. //制作顯示數(shù)據(jù)(正常)
  7. uint8 led_buf[4];
  8. //制作顯示數(shù)據(jù)(修改時鐘)
  9. uint8 timer_buf[4];
  10. //數(shù)據(jù)寫入DS1302緩存數(shù)組
  11. uint8 tempsbuf[5] = {0,0,0,0,0};
  12. //按鍵手動修改時鐘標志位
  13. bit faneg = 0;
  14. //按鍵手動修改時鐘位選
  15. uint8 mak = 0;
  16. //統(tǒng)一修改時間數(shù)組
  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. //* 功能  : 制作正常顯示數(shù)據(jù)
  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();                                                 //制作顯示數(shù)據(jù)
  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();                                             //制作顯示數(shù)據(jù)
  202.                 display_led(led_buf);                     //顯示正常時間               
  203.                 if(1 == faneg){key_Modify();}         //修改時間
  204.         //        shanshuo_led();                  //秒點閃爍
  205.         //        Automatic();           //單片機自動操作
  206.         }
  207. }

復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:113533 發(fā)表于 2016-4-18 21:56 | 只看該作者
學習一下,if(1 == faneg)    //主機              避免了1=faneg的錯誤
回復

使用道具 舉報

板凳
ID:185829 發(fā)表于 2017-5-17 17:59 | 只看該作者
時鐘數(shù)據(jù)羅馬數(shù)字編碼的方法,有意思
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人免费在线观看 | 国产96色在线 | 亚洲欧洲在线观看视频 | julia中文字幕久久一区二区 | 国产精品96久久久久久 | 最新av在线网址 | 国产精品我不卡 | 久久精品一区 | 自拍 亚洲 欧美 老师 丝袜 | 中文字幕免费在线观看 | 免费在线成人 | 欧美成人自拍视频 | 好姑娘影视在线观看高清 | 国产精品亚洲成在人线 | 国产精品视频一区二区三区 | 99久久精品免费看国产小宝寻花 | 日韩有码一区二区三区 | 久久中文字幕在线 | 久草视频观看 | 国产一区 | 福利片在线 | 亚洲综合日韩精品欧美综合区 | 国产成人福利 | 男女羞羞视频在线免费观看 | 成人深夜小视频 | 成人在线a| 国产激情视频在线免费观看 | 欧美一级毛片久久99精品蜜桃 | 一区中文 | 欧美日韩一区二区三区四区五区 | 久久精品综合 | 国产一区二区在线看 | 精品国产欧美一区二区 | 91精品国产乱码久久久久久 | 中文字幕成人av | 中文字幕第十五页 | 成人午夜激情 | 91免费福利在线 | 男人的天堂久久 | 久久久久久久久久毛片 | 欧美区日韩区 |