“搖搖棒”是基于人眼視覺暫留原理而產生的, 當進行搖動時,由于人的視覺暫留會在發光二極管搖動區域產生一個視覺平面,從而達到在該視覺平面上傳達信息的作用。本文介紹了以STC89C52單片機控制為主控芯片、配合高亮度LED二極管以及水銀開關構成簡易搖搖棒的設計過程,通過分時刷新20個發光二極管來顯示輸出文字或圖案等信息。并在此基礎上,利用DS1302時鐘芯片顯示當前時間,可通過按鍵對時間進行設置
第一章 基本原理
1.1視覺暫留現象
(Visual staying phenomenon,duration of vision)
人眼在觀察景物時,光信號傳入大腦神經,需經過一段短暫的時間,光的作用結束后,視覺形象并不立即消失,這種殘留的視覺稱“后像”,視覺的這一現象則被稱為“視覺暫留”。
是光對視網膜所產生的視覺在光停止作用后,仍保留一段時間的現象,其具體應用是電影的拍攝和放映。原因是由視神經的反應速度造成的.其時值是二十四分之一秒。是動畫、電影等視覺媒體形成和傳播的根據。
視覺實際上是靠眼睛的晶狀體成像,感光細胞感光,并且將光信號轉換為神經電流,傳回大腦引起人體視覺。感光細胞的感光是靠一些感光色素,感光色素的形成是需要一定時間的,這就形成了視覺暫停的機理。
物體在快速運動時, 當人眼所看到的影像消失后,人眼仍能繼續保留其影像0.1-0.4秒左右的圖像,這種現象被稱為視覺暫留現象。是人眼具有的一種性質。人眼觀看物體時,成像于視網膜上,并由視神經輸入人腦,感覺到物體的像。但當物體移去時,視神經對物體的印象不會立即消失,而要延續0.1 -0.4秒的時間,人眼的這種性質被稱為“眼睛的視覺暫留”。
1.2 STC單片機簡介
STC單片機是一款增強型51單片機,完全兼容MCS-51,還增加了新的功能,比如新增兩級中斷優先級,多一個外中斷,內置EEPROM,硬件看門狗,具有掉電模式,512B內存等。還支持ISP下載,不用編程器,只要一個MAX232和一些廉價的元件就能寫程可擦寫10萬次。
單片機最小系統:2
圖(1) 單片機最小系統電路圖
1.3 水銀開關
搖搖棒在搖動時,只能在朝某一方向搖動時顯示,否則會出現鏡像字或鏡像畫面。所以通過接一個水銀開關來控制,使搖搖棒從左向右搖動時將內容正確顯示出來。
圖(2) 水銀開關結構圖
1510414z8s4inzj2znginu.png (151.91 KB, 下載次數: 170)
下載附件
2017-3-7 03:24 上傳
圖(3)水銀開關實物圖1
水銀開關里的水銀柱很活躍,導致在接通時容易產生抖動。所以將水銀開關斜向上放置(尖端朝斜上方45°角),靠水銀自身重力的作用減少抖動。
因為重力的關系,水銀水珠會隨容器中較低的地方流去,如果同時接觸到兩個電極的話,開關便會將電路閉合,開啟開關。
主要作用:
1. 觸發EXT1中斷,在中斷程序中顯示畫面。
2. 水銀開關斷開時,進入設置狀態。(
1.4 時鐘芯片
DS1302是美國DALLAS公司推出的一種高性能、低功耗的實時時鐘芯片,附加31字節靜態RAM,采用SPI三線接口與CPU進行通信,并可采用突發方式一次傳送多個字節的時鐘信號和RAM數據。實時時鐘可提供秒、分、時、日、星期、月和年,一個月小與31天時可以自動調整,且具有閏年補償功能。工作電壓寬達2.5~5.5V。采用雙電源供電(主電源和備用電源),可設置備用電源充電方式,提供了對后備電源進行涓細電流充電的能力。
圖(4) DS1302引腳分配圖)
各引腳的功能為:
8、Vcc1:備用電池端;
1、Vcc2:5V電源。當Vcc2>Vcc1+0.2V時,由Vcc2向DS1302供電,當Vcc2< Vcc1時,由Vcc1向DS1302供電。
7、SCLK:串行時鐘,輸入;
6、I/O:數據輸入輸出口;
5、CE/RST:復位腳
2、3、X1、X2 是外接晶振腳 (32.768KHZ的晶振)
4、地(GND)
基本電路:
151041uk056o6r0vviboa6.jpg (27.56 KB, 下載次數: 158)
下載附件
2017-3-7 03:24 上傳
:
圖(5) DS1302電路圖
1.5 按鍵
圖(6)按鍵外觀/
主要作用:切換畫面以及時間設置。
1.6 LED
LED是發光二極管(Light Emitting Diode,LED)的簡稱,也稱作發光二極管。這種半導體組件可以作為指示燈、顯示板,它不但能夠高效率地直接講點能轉化為光能,而且擁有最長達數萬小時的使用壽命,同時具備不如傳統燈泡易碎,節能省電等優點。
在設計中的作用:作為此設計的顯示模塊,進行字符的顯示。
圖(7) LED結構圖
第二章 原理圖;
圖(8)總原理圖
第三章 實物說明圖
0.png (257.78 KB, 下載次數: 145)
下載附件
2017-3-7 03:27 上傳
圖(9)總體實物圖
1. 水銀開關:傳感器
2. 20位LED:顯示器
3. DS1302: 時鐘芯片
4. STC89C52單片機:主控芯片
5. 電源開關:供電
6. 功能按鍵(四個):○1切換畫面。○2設置時間。 ○3時間加。 ○4時間減。
7. 時鐘芯片備用電池:當電源關閉時為時鐘芯片供電,保證時間的實時性。
151043l62om2ztlcn2lv2h.png (155.15 KB, 下載次數: 158)
下載附件
2017-3-7 03:24 上傳
圖(10) IC座里隱藏元件
IC座里隱藏元件,這樣做既美觀又能節省空間,還可以保護元件。
第四章 使用說明
步驟一:將電源連接好。
151044lr7ni99czn68u6l5.png (180.07 KB, 下載次數: 175)
下載附件
2017-3-7 03:24 上傳
圖(11)電源開關及按鍵
步驟二:將電源開關打開。
此時20位LED開始閃爍,搖動搖搖棒將會看到如下效果:
151046vyuvqmvbbd1m3b6a.png.thumb.jpg (318.22 KB, 下載次數: 139)
下載附件
2017-3-7 03:24 上傳
圖(12)初始效果圖
步驟三:進入按鍵功能狀態。
方法如下:
將搖搖棒LED一側向下放置,即使水銀開關兩個引腳不導通(如圖13)。(此狀態是實現所有按鍵功能的通用狀態。若不在此狀態,按鍵將都不可用。時間設置同樣是在此狀態下進行的)。
圖(13)按鍵功能狀態
此時按下【換字】鍵,再搖動搖搖棒,畫面會切換,將會看到如下效果(如圖14):
151048r8h4k7lrrl38pwpr.png.thumb.jpg (303.58 KB, 下載次數: 142)
下載附件
2017-3-7 03:24 上傳
圖(14)切換畫面
本搖搖棒系統共存儲5個畫面,通過【換字】按鍵進行循環切換。其中第五個換面顯示的是實時時間,時間信息由時鐘芯片提供。
步驟四:設置時間
首先進入按鍵功能狀態。【將搖搖棒LED一側向下放置,即使水銀開關兩個引腳不導通(如圖13)】。
設置狀態下LED顯示說明:
如下圖所示,從右至左四個LED分別表示:調秒標志位、調分標志位、調時標志位、設置狀態標志位。時間信息的個位和十位分別由四個LED以二進制碼的形式顯示。
1510527tity6m66u6623qt.png.thumb.jpg (224.18 KB, 下載次數: 147)
下載附件
2017-3-7 03:24 上傳
圖(15)設置狀態下LED顯示說明圖
按下【設置】按鍵,設置狀態標志位點亮,調時標志位點亮,對小時設置。按【加】按鍵或【減】按鍵可以對小時進行設置,時間信息以二進制形式顯示。
再按下【設置】按鍵,設置狀態標志位點亮,調分標志位點亮,對分鐘設置。設置方法同上。
再按下【設置】按鍵,設置狀態標志位點亮,調秒標志位點亮,對秒設置。設置方法同上。
15105536k0cxw6x2cacy7m.png.thumb.jpg (236.64 KB, 下載次數: 133)
下載附件
2017-3-7 03:24 上傳
圖(16)設置小時
151059apf58fnqizko7fxq.png.thumb.jpg (217.75 KB, 下載次數: 138)
下載附件
2017-3-7 03:24 上傳
圖(17)設置分鐘
1511027m71k87t56ts17w6.png.thumb.jpg (242.73 KB, 下載次數: 149)
下載附件
2017-3-7 03:24 上傳
圖(18)設置秒
步驟五:退出設置
設置完成后再按一下【設置】按鍵,退出設置狀態,此時20個LED全滅。否則搖搖棒顯示將不正確。(
第五章 軟件設計3
5.1 設計思路-
由于搖搖棒在搖動時,只能在朝某一方向搖動時顯示,否則會出現鏡像字或鏡像畫面,所以通過接一個水銀開關來控制。
在搖搖棒左向右搖動時,水銀開關導通,觸發單片機的外部中斷,運行中斷程顯示預設畫面。
在搖搖棒右向左搖動時,水銀開關斷開,運行主程檢測按鍵,實現畫面切換及時間設置。
5.2 系統工作流程
1.顯示預設圖形,并按鍵切換。
2.按鍵設置時間。
3.顯示時間。,
5.3主程序流程圖(
151104kuybl4gaklgudv71.png.thumb.jpg (58.22 KB, 下載次數: 148)
下載附件
2017-3-7 03:24 上傳
圖(19)主程序流程圖"
第六章 部分效果圖
151106n5o7u1c2nm001rzo.png.thumb.jpg (302.11 KB, 下載次數: 134)
下載附件
2017-3-7 03:24 上傳
圖(20)效果圖 電信0802班
151109r466hm4m4an0am6p.png.thumb.jpg (305.99 KB, 下載次數: 155)
下載附件
2017-3-7 03:24 上傳
- /*************************************************************
- 旋轉LED字體程序
- 單片機 STC89C52
- 字模軟件用的PC2002
- 逐列取模方式
- ***************************************************************/
- #include "SYSTEM.H"
- #include <reg52.h>
- #include <DIG.h>
- #define uchar unsigned char
- #define uint unsigned int //宏定義
- uint i=0 ;
- uint j=0 ;
- sbit key=P3^7;
- sbit she=P2^7;
- sbit shi=P2^6;
- sbit fen=P2^5;
- sbit mia=P2^4;
- uchar h1;
- uchar h2;
- uchar m1;
- uchar m2;
- uchar s1;
- uchar s2;
- uchar K1J,K2J,K3J; //鍵值
- //char Set_Mode = 0;
- extern uchar k;
- extern uchar Set; //調整值
- unsigned char code Disp_Tab[] = {0xff,0x7f,0xbf,0x3f,0xdf,0x5f,0x9f,0x1f,0xef,0x6f}; //段碼控制
- /*****n(us)延時子程序*****/
- void DelayUs(uint N)
- {
- uint x ;
- for(x=0;x<=N;x++);
- }
- /*--------------------------------------------------------------*/
- //鍵盤掃描
- void Keysan(void)
- {
- if(!key) //換字
- { DelayUs(7000);
- if(!key)
- {
- j++;
- }
- if(j==5) { j=0; }
- }
-
- if(~P2_3&K1J) { k++; }
- K1J=~(~P2_3);
- if(~P2_2&K2J) { Set=1; }
- K2J=~(~P2_2);
- if(~P2_1&K3J) { Set=-1; }
- K3J=~(~P2_1);
-
- if(k == 4) {k = 0; }
-
- switch(k)
- { //case 4: break;
- case 3: she=0;shi=1;fen=1;mia=0; DS1302_AddTime(DS1302_SECOND, Set);P1=Disp_Tab[s1];P0=Disp_Tab[s2];Set=0; break; //設置秒
- case 2: she=0;shi=1;fen=0;mia=1; DS1302_AddTime(DS1302_MINUTE, Set);P1=Disp_Tab[m1];P0=Disp_Tab[m2];Set=0; break; //設置分
- case 1: she=0;shi=0;fen=1;mia=1; DS1302_AddTime(DS1302_HOUR , Set);P1=Disp_Tab[h1];P0=Disp_Tab[h2];Set=0; break; //設置時
- case 0: P0=0xff;P1=0xff;P2=0xff;Set=0; break;
- default: break;
- }
- }
- /*****主函數*****/
- void main(void)
- { k=0;
- DS1302_Initial();//DS1302初始化
- while(1)
- {
- EA=1;//開總中斷
- EX0=1;//開外部中斷0
- //全滅
- P0=0xff;
- P1=0xff;
- P2=0xff;
- //讀出時間
- h1=(Read1302(DS1302_HOUR)&0x70)>>4;
- h2=(Read1302(DS1302_HOUR)&0x0f);
- m1=(Read1302(DS1302_MINUTE)&0x70)>>4;
- m2=(Read1302(DS1302_MINUTE)&0x0f);
- s1=(Read1302(DS1302_SECOND)&0x70)>>4;
- s2=(Read1302(DS1302_SECOND)&0x0f);
- Keysan();
- }
- }
- /*************外部中斷函數(顯示)*******************/
- void exter0() interrupt 0
- {
- for(i=0;i<160;i++)
- {
- switch(j)
- {case 0: P0=love0[i*3];P1=love0[i*3+1];P2=love0[i*3+2];DelayUs(30);break;
- case 1: P0=love1[i*3];P1=love1[i*3+1];P2=love1[i*3+2];DelayUs(30);break;
- case 2: P0=love2[i*3];P1=love2[i*3+1];P2=love2[i*3+2];DelayUs(20);break;
- case 3: P0=love3[i*3];P1=love3[i*3+1];P2=love3[i*3+2];DelayUs(30);break;
- case 4: if(i<50){P0=0xFF;P1=0xFF;P2=0xFF;DelayUs(20);}
- if((i>49)&&(i<60)){P0=dig[h1][(i-50)*3];P1=dig[h1][(i-50)*3+1];P2=dig[h1][(i-50)*3+2];DelayUs(20);}
- if((i>59)&&(i<70)){P0=dig[h2][(i-60)*3];P1=dig[h2][(i-60)*3+1];P2=dig[h2][(i-60)*3+2];DelayUs(20);}
- if((i>69)&&(i<80)){P0=dig[10][(i-70)*3];P1=dig[10][(i-70)*3+1];P2=dig[10][(i-70)*3+2];DelayUs(20);}
- if((i>79)&&(i<90)){P0=dig[m1][(i-80)*3];P1=dig[m1][(i-80)*3+1];P2=dig[m1][(i-80)*3+2];DelayUs(20);}
- if((i>89)&&(i<100)){P0=dig[m2][(i-90)*3];P1=dig[m2][(i-90)*3+1];P2=dig[m2][(i-90)*3+2];DelayUs(20);}
- if((i>99)&&(i<110)){P0=dig[10][(i-100)*3];P1=dig[10][(i-100)*3+1];P2=dig[10][(i-100)*3+2];DelayUs(20);}
- if((i>109)&&(i<120)){P0=dig[s1][(i-110)*3];P1=dig[s1][(i-110)*3+1];P2=dig[s1][(i-110)*3+2];DelayUs(20);}
- if((i>119)&&(i<130)){P0=dig[s2][(i-120)*3];P1=dig[s2][(i-120)*3+1];P2=dig[s2][(i-120)*3+2];DelayUs(20);}
- if(i>129){P0=0xFF;P1=0xFF;P2=0xFF;DelayUs(20);}
- break;
- }
- }
- }
復制代碼
0.png (69.66 KB, 下載次數: 165)
下載附件
2017-3-7 03:25 上傳
代碼下載(Keil2工程文件):
搖搖棒2.3軟件版本3.1 時鐘顯示.7z
(16.53 KB, 下載次數: 305)
2021-7-24 01:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|