今天終于決定要為這次電賽寫點小結了。
遺憾.....
2010/05/14
歷經了三個晚上的通宵,白天也逃課了。究竟還是沒把電路板做出來...遺憾....QG那邊那臺刻板機,刻我電路板中的其中一面就需要5、6個小時,而且還刻不成功,最后是因為擔心已經軸心磨損的刻板機再這樣持續工作下去會壞掉而放棄刻板。那時我的心情很是沉重,因為電路板這一環節的失敗就意味著之前的所有努力與成果都是枉然,沒有電路板作載體,再好的系統工作方案、再好的程序也得不到體現...眼看這二十多天的努力頻臨死亡心里真不是滋味。(end)
2010/05/15
已經放棄了采用刻板機來制作電路板,而今天卻意外的發現工一某間室可以幫我激光打印熱轉印紙。之前我跑遍了半個大學城都找不到可以幫我激光打印熱轉印紙的地方(手工制作電路板的方法其中一種叫熱轉印法,需要激光打印機把高密度抗腐蝕碳粉打到熱轉印紙上面去,再熱轉印到覆銅板上去)。我抱著努力到最后的心態去打印了幾張熱轉印紙;蛟S是熱轉印紙的質量問題,每次打印都會受熱過度而卷縮(南亭的小賽格真不賣好東西,銅板又貴又不平整、甚至還雙面導電。灾戮路不完整,沒辦法了,總比沒有好,線路不完整就用油性筆補唄...
到最后,試驗品(小銅板)腐蝕的效果很好,線路很完整。大銅板(20cmX17CM)估計因我只用砂紙打磨了一下,沒有用酸性液體預處理過,熱轉印效果不怎么樣,最后斷線的地方不少,這樣一直補線,(同時,曉光在把另一塊從QG那邊刻板機做出來的失敗品的線路進行抗腐蝕的劃線和斷線的處理)直到下午五點多,已經超過了作品上交時間...這也意味著我們這次比賽以遺憾告終了....(end)
雖然這次比賽是不成功了,但作品還可以繼續做下去,這樣可以當做我們的一次項目經驗。我是這么認為的:拿不了獎也沒關系,以后拿獎的機會還多。最重要的是在比賽中使自己得到鍛煉,能力得到提升。不過這下子要得找個更好的手工制作電路板的方法。這熱轉印法太依賴于特定的機器(激光打印機)了 ,萬一以后他不幫我們打了那我們就麻煩了。 (感嘆:如果我能早點發現這里可以幫我進行激光打印,那我的電路板或許早就做出來了!不過,人能有多少個“如果”?)
另外,我覺得我自己對這次比賽的時間安排得不太好:大概是4月15號公布題目,直至4月底我才把系統詳細的最優工作方案寫了下來 (可惜這段時間只有我一個人在做,宇曦老是說沒頭緒,天天在打PSP和看小說,而曉光也剛學單片機沒多久。不然,大家能好好合作的話相信速度會更快。。大概是4月28號左右吧,我把LED屏驅動板的原理圖畫好后(即系統工作方案已經定下了、元器件也選好了) ,宇曦也幫忙布線。
這樣直到5月1號,宇曦回家了(5月7/8號回來),曉光也回家了(貌似是5月5號回來的吧,忘記了),那慘了,留下我一個寂寞的孩子在孤軍作戰.....于是我不甘寂寞,5月1號跟女朋友出去玩了......接下來幾天,我的主要工作是寫程序。在宇曦回來之前,貌似我剩下幾個函數還沒寫:最頭大的一個“對象拖移”函數還有其他幾個小函數。宇曦回來后,我把對象拖移交給他寫了(你是數據結構上的“刷題哥”啊,所以,這種算法難度高的事就拜托你了!沒時間了,我弄其他的驅動去)。(感嘆:如果早期宇曦能積極點就好。
接下來在最后的那幾天,大家都積極了,我們一起把主控板、光筆的PCB圖都設計好。我忘記了自己什么時候把程序調得通過編譯了....同時,我在另一塊開發板上測試通過了一些諸如延時函數(該單片機是1T單片機,用同樣的晶振,速度卻是普通51單片機的8~12倍,好東西。、AD掃描(STC12C5A60S2單片機P1.0~P1.7內置8路10位高精度AD模塊)等等的函數。那時候眼看形勢發展得還可以,真沒想到在最后我們會敗在電路板的制作上面....
最后,我說說我們這個作品的設計方案,有興趣的童鞋們可以看看:
首先,是題目要求:
LED點陣書寫顯示屏
一、任務
設計并制作一個基于32×32點陣LED模塊的書寫顯示屏,其系統結構如圖1所示。在控制器的管理下,LED點陣模塊顯示屏工作在人眼不易覺察的掃描微亮和人眼可見的顯示點亮模式下;當光筆觸及LED點陣模塊表面時,先由光筆檢測觸及位置處LED點的掃描微亮以獲取其行列坐標,再依據功能需求決定該坐標處的LED是否點亮至人眼可見的顯示狀態(如圖1中光筆接觸處的深色LED點已被點亮),從而在屏上實現“點亮、劃亮、反顯、整屏擦除、筆畫擦除、連寫多字、對象拖移”等書寫顯示功能。
控制器
32×32
LED
點陣模塊
光筆
圖1 LED點陣書寫顯示屏系統結構示意圖
二、要求
1.基本要求
(1)在“點亮”功能下,當光筆接觸屏上某點LED時,能即時點亮該點LED,并在控制器上同步顯示該點LED的行列坐標值(左上角定為行列坐標原點)。
(2)在“劃亮”功能下,當光筆在屏上快速劃過時,能同步點亮劃過的各點LED,其速度要求2s內能劃過并點亮40點LED。
(3)在“反顯”功能下,能對屏上顯示的信息實現反相顯示(即:字體筆畫處不亮,無筆畫處高亮)。
(4)在“整屏擦除”功能下,能實現對屏上所顯示信息的整屏擦除。
2.發揮部分
(1)在“筆畫擦除”功能下,能用光筆擦除屏上所顯漢字的筆畫。
(2)在“連寫多字”功能下,能結合自選的擦除方式,在30s內在屏上以“劃亮”方式逐個寫出四個漢字(總筆畫數不大于30)且存入機內,寫完后再將所存四字在屏上逐個輪流顯示。
(3)在“對象拖移”功能下,能用光筆將選定顯示內容在屏上進行拖移。先用光筆以“劃亮”方式在屏上圈定欲拖移顯示對象,再用光筆將該對象拖移到屏上另一位置。
(4)當環境光強改變時,能自動連續調節屏上顯示亮度。
(5)當光筆連續未接觸屏面的時間超過1~5min時(此時間可由控制器設定),能自動關閉屏上顯示,并使整個系統進入休眠狀態,此時系統工作電流應不大于5mA。
(6)其他。
三、說明
1.設計制作時所用LED點陣模塊的發光顏色不限。
2.各種功能的切換方式自定,但應力求操作簡便。
3.在各種功能的實際操作過程中,必要時可用按鍵或其他控制方式進行輔助。例如,“連寫多字”時,寫完一字后用自定義控制方式存入該字并清屏,然后再寫下一字。
4.系統應采用5V單電源供電。
5.設計制作時應在電路板上留有系統耗電參數的測試點。
6.設計報告正文中應包括系統總體框圖、核心電路原理圖、主要流程圖、主要的測試結果。完整的電路原理圖、重要的源程序和完整的測試結果用附件給出。
分析:這個系統最核心的兩個部分是:光筆掃描、LED屏幕顯示。
題目所說的“微亮掃描”中的微亮意為:高速、短時間地點亮、熄滅每一個LED燈,利用人眼的“視覺停留效應”(貌似是這么個叫法),讓人眼察覺不出LED燈的閃爍,人眼只會覺得它是在微亮。而題目中要求每秒光筆能至少劃過并點亮20個點,那也意味著掃描一次光筆所在位置并讓屏幕更新顯示并延時的操作必須<=50ms,而且光筆位置的掃描所占的時間比必須遠遠<LED顯示所占的時間比。這樣,由于掃描過程中,光筆所在點的的LED燈亮的時間是非常短暫的,所以對光敏器件有兩個要求:響應速度快、靈敏。于是我選用了3DU33光電三極管。tr、tf(電平的上升、下降變化所需最小時間)均小于5微秒,而且3DU33是對波長為880nm的近紅外光反應最靈敏(LED屏上的LED燈也是紅光燈),再加上3DU33在基極產生的光電流經過自身的放大能達到3ma左右,這電流足以讓外接的8050(NPN三極管)進入深飽和,這樣一來,光筆對光的反應時很穩定了。(結果我們做出來的電路板只有光筆,這光筆的外形挺像一架潛艇的,哈哈,我那笨拙的手工總是被宇曦笑,不過這光筆對光的反應還真的想預期那樣非常穩定,而且對自然光沒反應(抗自然光干擾))
另外,在光筆上,我安裝了一個小按鍵(為了人性化而設計的),因為假如我把光筆對著LED屏卻不想寫字、或者寫字過程中輕輕拖過LED屏的表面,在普通情況下都默認為寫字。這樣就不好了,我把按鍵裝在人手大拇指最常按到的地方,這樣,我真要寫字時便自然而然的按下去了。這按鍵接到外部中斷口(平時關掉外部中斷用來作普通IO口用),這樣,程序里面可以判斷按鍵是否被按下而決定是否進行光筆掃描和數據更新了。另外,這按鍵還有一個好處,就是可以在空閑模式(待機)時按下喚醒整個系統,即我想寫字時,隨手用拇指按一下便可以寫了,很人性化吧?呵呵~(至于這個按鍵的按鍵抖動,我接了個旁路電容去抖,再說,因為按鍵抖動時間比掃描一次并更新顯示的50ms要小得多,所以可以忽略其帶來的負面影響,負面影響幾乎為0)。
關于這個光筆,最后我說說這個掃描方案,這幾乎是這個系統的核心(以后的所有操作都有依賴于它):我最初的笨方案是一個一個點的掃描,沒掃描一次就是1024個點,算法/操作時間復雜度為O(1024)。這是最笨最沒效率的方法。后來改進了,把光筆接到普通IO口上去,每次選通一行LED,給該行中32列LED同步輸出(用74HC573的輸出使能控制可以做到)這32列的地址編碼(0~31可以用5位二進制數表示,所以32列LED的地址編碼都是5位數據),每次截取32列編碼中的一位送出去,再讀回光筆端口數據,共5位。這樣馬上就可以判斷光筆所在列。可是,這樣當光筆在第31列就分辨不出來了,因為掃描不在光筆當前所在行的話,數據與掃描在光筆所在行,而光筆在31列的效果一樣,同樣是11111(b)。而且這種方案的算法/操作時間復雜度為O(32*5)=O(160)。為了解決這個問題,我再加以改進了一下,把光筆接到定時器/計數器端口,并讓計數器賦初值:65535-N,(N>=1)并把該定時器/計數器工作方式選為16位計數器。在每次的行掃描時同步給32列以N次高低脈沖(電平持續時間>=5微秒)。這樣當行掃描切換到光筆當前所在行時,光筆電平從高到低跳變N次就可以觸發計數器中斷。N取指為2就可以有效地抗干擾了。 進入計數器中斷服務程序后,保持當前行選通并保存行數據,同步給32列以5次編碼脈沖(電平的高低變化)。這樣讀回的5位數據就是光筆當前所在列坐標,保存,OK!這種改進的方案不僅解決了上述問題,而且提高了抗干擾性,還有一個更重要的是它的算法/操作時間復雜度僅為:O'(32*N+5),如果N取指為2,則時間復雜度為:O'(69),而且比起第二個方案,O(1)'<O(1)。因為采用計數器中斷,所以比起第二個方案節省了很多CPU時間。
最后,我說說整個系統的構架。我是首先按照題目要求把實現的功能劃分為兩種性質:功能、和對功能的操作。
功能:必須時刻運行(不時刻運行也要間斷運行,即在 次數--時間 坐標系上的表現是線性的)。
操作:不能預知什么時候運行,由使用者決定,即在 次數--時間 坐標系上的表現是離散的。
功能有如下:1、點亮與畫亮 (即寫字功能、開機默認)
2、多字連寫
3、自動調光功能
4、超時待機功能
對功能的操作有如下:
1、反顯(可對于功能1和功能2模塊操作)
2、整屏擦除(可對于功能1和功能2模塊操作)
3、光筆擦除(可對于功能1和功能2模塊操作)
4、對象拖移(可對于功能1和功能2模塊操作)
5、寫字存儲(可對于功能1和功能2模塊操作)PS:由于時間問題,
而且這個功能題目沒要求,暫先擱置
6、自動調光參數設置,即調整使用者喜好的屏幕亮度級別,
而同時,系統會在這個級別內對LED屏根據環境光強的變化而自動調光
7、超時待機時間設定
然后接下來就是程序了.........程序很長呢,不知道各位童鞋們看不看得下(因為我們一起干的宇曦、曉光說看不下,估計宇曦這家伙是懶得不愿意看),由于篇幅有限完整的程序和電路圖請點這里:http://www.zg4o1577.cn/mcu/839.html,完全測試通過,如有問題可與我聯系.