找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 40295|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

基于單片機(jī)的自動(dòng)定時(shí)開關(guān)插座的設(shè)計(jì)文檔與源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:325162 發(fā)表于 2018-5-8 16:16 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
自動(dòng)定時(shí)開關(guān)插座的設(shè)計(jì)
主要內(nèi)容
以單片機(jī)為核心,設(shè)計(jì)智能定時(shí)開關(guān)插座,該系統(tǒng)可以實(shí)現(xiàn)自動(dòng)按時(shí)控制插座的打開、關(guān)閉,以達(dá)到控制用電設(shè)備工作,節(jié)省電能的效果。

基本要求
1、獨(dú)立完成系統(tǒng)軟、硬件設(shè)計(jì),并搭電路驗(yàn)證。
2、實(shí)現(xiàn)至少十六個(gè)時(shí)間點(diǎn)。
3、無線打開關(guān)閉插座。

摘要
隨著近年來各個(gè)家庭的家用電器的增多,以及各種公共用電設(shè)備的增加,各種智能化控制的功能被附加于產(chǎn)品之內(nèi),但不可忽視的是較為老舊的電器產(chǎn)品缺乏這些基本功能。因此這給生活和工作帶來很大的不便,同時(shí)長期的無用工作狀態(tài)也帶來了大量的電力資源的消耗。
本文介紹了一種基于51系列單片機(jī)的系統(tǒng)設(shè)計(jì),通過以實(shí)時(shí)時(shí)鐘芯片的時(shí)間信息為基準(zhǔn),配合單片機(jī)內(nèi)部擴(kuò)展RAM存儲(chǔ)的時(shí)間設(shè)定值,以及液晶顯示屏對(duì)各種信息的顯示,從而以達(dá)到定時(shí)控制開關(guān)插座電路的目的。此外,在該設(shè)計(jì)基礎(chǔ)之上,再添加紅外遙控打開/關(guān)閉插座的功能,以進(jìn)一步使得該設(shè)計(jì)更具智能化和實(shí)用性。該設(shè)計(jì)雖然結(jié)構(gòu)簡單,但能廣泛應(yīng)用于各個(gè)用電控制的工作環(huán)境中,具有較強(qiáng)的適用性。

目錄
摘要
Abstract
第1章 緒論
1.1 課題背景
1.2 當(dāng)前國內(nèi)外研究現(xiàn)狀
1.3 定時(shí)開關(guān)的應(yīng)用
1.4 設(shè)計(jì)的主要內(nèi)容和章節(jié)安排
第2章 系統(tǒng)總體設(shè)計(jì)
2.1 總體結(jié)構(gòu)
2.2 總體結(jié)構(gòu)的工作原理
2.3 本章小結(jié)
第3章 主控制器與外圍器件
3.1 STC12C5A60S2單片機(jī)
3.2 LCD1602液晶顯示模塊
3.3 DS1302實(shí)時(shí)時(shí)鐘模塊
3.4 紅外接收模塊
3.4.1 遙控發(fā)射器及其編碼
3.4.2 遙控信號(hào)的接收
3.5繼電器控制模塊
3.6 本章小結(jié)
第4章 硬件設(shè)計(jì)
4.1 單片機(jī)最小系統(tǒng)設(shè)計(jì)
4.1.1 單片機(jī)
4.1.2 電源電路
4.1.3 復(fù)位電路
4.1.4 晶振電路
4.1.5 RS232接口轉(zhuǎn)USB接口電路
4.2 顯示電路設(shè)計(jì)
4.3 時(shí)鐘電路設(shè)計(jì)
4.4 紅外接收電路設(shè)計(jì)
4.5 繼電器控制電路
4.6 按鍵電路
4.7本章小結(jié)
第5章 軟件設(shè)計(jì)
5.1 主程序設(shè)計(jì)
5.2 LCD1602顯示程序設(shè)計(jì)
5.3 DS1302實(shí)時(shí)時(shí)鐘程序設(shè)計(jì)
5.4 VS1838B中斷程序設(shè)計(jì)
5.5 系統(tǒng)測試
5.6 本章小結(jié)
結(jié)論
參考文獻(xiàn)
致謝
附錄1
附錄2
附錄3
附錄4
附錄5
附錄6


第1章 緒論
1.1 課題背景
自單片機(jī)誕生以來,其高可靠性,低功耗以及很強(qiáng)和工作運(yùn)行環(huán)境適應(yīng)能力,以廣泛應(yīng)用于各個(gè)生產(chǎn)生活的管理控制領(lǐng)域。而目前基于單片機(jī)的自動(dòng)控制開關(guān)的產(chǎn)品依然未進(jìn)入大規(guī)模應(yīng)用的階段,其不成熟的產(chǎn)品設(shè)計(jì)以及普通大眾對(duì)于該類產(chǎn)品的易用性與安全性仍存在一定的憂慮。因此,該課題將著眼于當(dāng)前市場實(shí)際需求和具體設(shè)計(jì)平臺(tái)性能,力求將該設(shè)計(jì)做到創(chuàng)新與實(shí)用的結(jié)合。
1.2 當(dāng)前國內(nèi)外研究現(xiàn)狀
              智能定時(shí)開關(guān)目前已經(jīng)大規(guī)模的應(yīng)用與汽車、工業(yè)生產(chǎn)和倉儲(chǔ)管理等無人監(jiān)控的領(lǐng)域;同時(shí),雖然目前已有部分的新推出的家用電器也已具備該功能了,但相對(duì)于目前數(shù)量更大的傳統(tǒng)舊款的家用電器和老式的公共照明設(shè)施來說,仍停留在機(jī)械式的開關(guān)和簡單的電子式定時(shí)開關(guān)。但無論以上兩者的性能如何,它們都存在易磨損,安全性較差,需要大量手動(dòng)操作,且在某些工作環(huán)境中還存在難以接觸操作的問題。
     因此,雖然市場上都有各式各樣的替代產(chǎn)品,但就目前來說,這些產(chǎn)品的功能都還存在很多不完善之處。在經(jīng)過對(duì)該課題背景下的充分的產(chǎn)品需求的調(diào)研和仔細(xì)的可行性分析,該課題存在很大的改進(jìn)和創(chuàng)新的空間。
1.3 定時(shí)開關(guān)的應(yīng)用
定時(shí)開關(guān)可用于各種需要按時(shí)自動(dòng)開啟和關(guān)閉的電器設(shè)備。廣泛適用于企事業(yè)單位和家庭,尤其是對(duì)人體傷害環(huán)境,如醫(yī)院,幼兒園,餐飲等單位的紫外線消毒間,化工場所,及含輻射區(qū)域,避免人員直接進(jìn)入內(nèi)部開啟和關(guān)閉開關(guān),頻繁遭受傷害。
同時(shí)定時(shí)開關(guān)還特別適合各種養(yǎng)殖場,孵化間,魚塘供養(yǎng),座位澆灌,魚缸等場所。一次操作,可每天自動(dòng)循環(huán)保證燈光照射及其投喂飼料的時(shí)間和次數(shù),減少了大量人力,且避免因人為失誤而導(dǎo)致的損失。
定時(shí)開關(guān)對(duì)于學(xué)校,軍營尤其需要。每天多個(gè)規(guī)定的時(shí)間,電鈴、軍號(hào)自動(dòng)響起,學(xué)生、軍人按要求上課、出操、熄燈,不需要管理者疲勞操作。
定時(shí)開關(guān)還適用于家庭,每天早上太陽升起,窗簾自動(dòng)緩緩打開,催醒睡夢(mèng)中的你; 夜幕降臨,窗簾又自動(dòng)拉合,一個(gè)智能溫馨而又奇妙的家全天侯擁抱著你。
定時(shí)開關(guān)為充電電池必備。尤其是電動(dòng)車電池在整輛車中價(jià)值比例非常高,長時(shí)間充電會(huì)大大減少電池壽命。配上本產(chǎn)品,則即保證了滿額充電,也不會(huì)在電池充滿電之后仍然處于通電狀態(tài),對(duì)電池的保護(hù)起到了極大地作用。
定時(shí)開關(guān)在人們的生活中扮演著重要的角色,給人們的生活帶來極大的便利。主要使用在提醒,計(jì)劃或者規(guī)律化生活、工作上。定時(shí)開關(guān)的歷史十分悠久,用途也很廣泛。
從古代的某些建筑、計(jì)時(shí)器(如滴水計(jì)時(shí),當(dāng)水滴到一定量時(shí)會(huì)引發(fā)機(jī)關(guān)進(jìn)行報(bào)時(shí)),到近代及今日的電腦定時(shí)開關(guān)機(jī)等,都采用了定時(shí)開關(guān)。
例子:學(xué)校的課鈴就是采用定時(shí)器進(jìn)行定時(shí),當(dāng)條件滿足(即達(dá)到時(shí)間設(shè)定的點(diǎn))時(shí),電源就會(huì)接通,使電鈴打開從而達(dá)到發(fā)出鈴聲的目的。
1.4 設(shè)計(jì)的主要內(nèi)容和章節(jié)安排
              綜合該領(lǐng)域的研究現(xiàn)狀與現(xiàn)目前單片機(jī)應(yīng)用的性能,該設(shè)計(jì)課題將主要圍繞以下內(nèi)容展開:
              一、首先,作為課題設(shè)計(jì)的第一步,應(yīng)首先完成對(duì)該課題的前期調(diào)研,確定其應(yīng)用需求以及對(duì)該課題可行性的分析,以求能更好的了解各個(gè)設(shè)計(jì)細(xì)節(jié),解決用戶所需求的問題;
              二、定時(shí)的開關(guān)控制是該設(shè)計(jì)的主要內(nèi)容,因此應(yīng)該在先設(shè)計(jì)出能作為時(shí)間基準(zhǔn)的時(shí)鐘模塊,然后在此基礎(chǔ)之上,完成對(duì)定時(shí)時(shí)間設(shè)定,時(shí)鐘校時(shí)以及模式切換等功能或模塊的設(shè)計(jì)。至此,已初步的完成定時(shí)時(shí)鐘的功能,為后續(xù)功能完善做好基礎(chǔ);
三、在前一步的基礎(chǔ)之上,再完成受控電路的設(shè)計(jì),根據(jù)定時(shí)時(shí)鐘的開關(guān)判斷結(jié)果,單片機(jī)在端口給出控制信號(hào)電平,對(duì)外圍的受控電路進(jìn)行控制。
此處,要注意的是,由于可能會(huì)存在單片機(jī)IO口的電平低于外圍的模擬器件的驅(qū)動(dòng)電平的問題,因此,對(duì)受控期間進(jìn)行電平上拉是一個(gè)必須注意的問題。
四、在以上基本的功能以后,應(yīng)該說該設(shè)計(jì)已初具雛形,可進(jìn)行對(duì)一些人性化需求的擴(kuò)展設(shè)計(jì),故此處規(guī)劃了對(duì)該開關(guān)進(jìn)行紅外遙控控制的擴(kuò)展。以期能達(dá)到該設(shè)計(jì)能應(yīng)用于以往的替代產(chǎn)品無法應(yīng)用的應(yīng)用環(huán)境中去,體現(xiàn)其產(chǎn)品的差異化。
五、最后,在完成了以上各個(gè)步驟以后,各個(gè)模塊也已大部分完成了最后的定型。但仍需要對(duì)程序在實(shí)際的硬件上運(yùn)行的效果進(jìn)行調(diào)試,對(duì)于顯示和按鍵反應(yīng)速度,蜂鳴器提示聲音等問題進(jìn)行最后的完善。
在本文在章節(jié)安排方面,將在第2章對(duì)整個(gè)系統(tǒng)的構(gòu)思和設(shè)想進(jìn)行闡述;在接著的第3章對(duì)方案中所使用的器件進(jìn)行必要的介紹說明;后續(xù)在第4章中將對(duì)各個(gè)器件模塊的硬件電路進(jìn)行詳細(xì)的設(shè)計(jì)說明;在完成硬件電路設(shè)計(jì)以后,將在第5章中完成對(duì)軟件的構(gòu)想流程進(jìn)行闡述;最后,在第6章中本文將對(duì)所設(shè)計(jì)的軟硬件進(jìn)行運(yùn)行測試,給出實(shí)驗(yàn)效果。在文章結(jié)束時(shí)得出結(jié)論。

                       
2章 系統(tǒng)總體設(shè)計(jì)
2.1 總體結(jié)構(gòu)
在綜合了各種設(shè)計(jì)方案的情況下,考慮了現(xiàn)有產(chǎn)品的缺陷之處的情況之后,最終確定了一STC12C5A60S2單片機(jī)為核心,DS1302實(shí)時(shí)時(shí)鐘芯片、LCD1602液晶顯示、TL1838紅外收發(fā)模塊、數(shù)字式繼電器等外圍器件構(gòu)成的模塊電路。這些功能器件不僅具有較好的抗干擾性能和高可靠能力,更由于其大都已經(jīng)大規(guī)模的應(yīng)用于各個(gè)應(yīng)用產(chǎn)品中,開發(fā)成本較低,如若進(jìn)入規(guī);a(chǎn),將進(jìn)一步的降低生產(chǎn)成本,提高市場的可接受度。
由于這些器件已有成熟的應(yīng)用,故以下圖(圖2-1)的總體設(shè)計(jì)結(jié)構(gòu)為藍(lán)本,進(jìn)行具體的系統(tǒng)集成和功能細(xì)化。

圖2-1 系統(tǒng)總體結(jié)構(gòu)圖
此外,在核心板的基礎(chǔ)之上只有紅外的接收模塊,而要完成紅外的收發(fā)控制,在此之外還需有紅外的發(fā)射裝置,在此未節(jié)省成本,選用了集成的紅外遙控器,采用電池供電,具有超低功耗,超出待機(jī)的特點(diǎn),十分符合設(shè)計(jì)要求。其整個(gè)紅外收發(fā)的大致原理結(jié)構(gòu)圖如下圖(圖2-2)所示。

圖2-2 紅外收發(fā)模塊工作原理圖
總體的系統(tǒng)模塊就如上述兩圖所示,整體結(jié)構(gòu)簡單明晰,各個(gè)模塊的功能和特性應(yīng)該更夠較為全面的滿足本課題的設(shè)計(jì)要求,故選用該方案。
2.2 總體結(jié)構(gòu)的工作原理
由于各個(gè)模塊的具體工作原理較為復(fù)雜,且對(duì)于該設(shè)計(jì)課題沒有實(shí)際的意義,故不在此贅述,F(xiàn)只將該方案的大體工作的流程以及結(jié)構(gòu)做以概述,以便更清新的闡述該課題。
首先,單片機(jī)為本次設(shè)計(jì)的核心設(shè)備,它將起著對(duì)各個(gè)指令的執(zhí)行和對(duì)外圍模塊的控制的作用,在邏輯功能上相當(dāng)于中央控制和調(diào)度的作用,本次將選擇STC12C5A60S2承擔(dān)該功能。
其次,作為定時(shí)開關(guān)插座的設(shè)計(jì),DS1302實(shí)時(shí)時(shí)鐘芯片將承擔(dān)對(duì)時(shí)間信息的記錄和輸出,同時(shí)作為時(shí)間基準(zhǔn)與設(shè)定的開關(guān)時(shí)間做比對(duì),以達(dá)到輔助控制的作用。
然后,作為一個(gè)交互式的單片機(jī)設(shè)計(jì)課題,在以單片機(jī)為核心的基礎(chǔ)之上,應(yīng)當(dāng)配合一定的輸入輸出控制設(shè)備。在此設(shè)計(jì)中,按鍵將作為對(duì)校時(shí),定時(shí),以及模式切換等功能的輸入設(shè)備,輔助DS1302時(shí)鐘芯片完成其對(duì)時(shí)間信息操控的功能。
再者,數(shù)字式時(shí)鐘必然要求時(shí)間信息的顯示效果。因此在比較了LED數(shù)碼管,普通液晶屏,帶漢字字符顯示的液晶屏幕,以及有觸摸功能的屏幕等等可用的顯示設(shè)備之后,鑒于LCD1602這款液晶屏較低的采購價(jià)格,較好的顯示效果和顯示字符數(shù)的規(guī)格均符合設(shè)計(jì)需求,故決定采用這款不帶漢字字符字庫和觸摸功能液晶顯示屏幕。其能很好的滿足時(shí)間信息,定時(shí)信息,和模式狀態(tài)的顯示。
最后,作為擴(kuò)展功能的紅外接收頭和紅外發(fā)射器,將主要以外部中斷的方式進(jìn)行對(duì)整個(gè)開關(guān)系統(tǒng)的閉合和關(guān)閉的控制,以期能達(dá)到方便應(yīng)用于大多數(shù)較難手動(dòng)按鍵控制的應(yīng)用環(huán)境中。
綜上所述,在整個(gè)系統(tǒng)中,將以整個(gè)單片機(jī)為核心,而DS1302時(shí)鐘芯片作為時(shí)鐘基準(zhǔn),配合按鍵輸入的時(shí)間控制信息和紅外遙控裝置的控制信息,以達(dá)到定時(shí)開關(guān)被控制電路的效果,是典型的以弱電的設(shè)備控制強(qiáng)電電路開關(guān)的應(yīng)用。
2.3 本章小結(jié)
              本章主要對(duì)整個(gè)系統(tǒng)的總體結(jié)構(gòu)進(jìn)行了大致的描述,給出了整個(gè)系統(tǒng)的框圖,并對(duì)于選擇該設(shè)計(jì)方案進(jìn)行了簡單的說明。在此基礎(chǔ)之上,對(duì)系統(tǒng)總體的結(jié)構(gòu)中的各個(gè)部分分別進(jìn)行了簡單的原理闡述,明確了各個(gè)部分在系統(tǒng)中的承擔(dān)的功能和作用。

                       
第3章 主控制器與外圍器件
3.1
STC12C5A60S2單片機(jī)
STC12C5A60S2單片機(jī)是中國大陸企業(yè)宏晶科技生產(chǎn)的單時(shí)鐘/機(jī)器周期(1T)的單片機(jī),是一種高速/低功耗/超強(qiáng)抗干擾的新一代增強(qiáng)型8051單片機(jī),它不但完全兼容傳統(tǒng)8051指令代碼和管腳功能,而且其片內(nèi)具有FLASH工藝的大容量程序存儲(chǔ)器,該款單片機(jī)內(nèi)部就自帶高代60K FLASH ROM,這種工藝的存儲(chǔ)器用戶可以用點(diǎn)的方式瞬間擦除、改寫。此外,片上也集成了180字節(jié)的RAM。而且STC系列單片機(jī)支持串口程序燒寫。顯而易見,這種單片機(jī)對(duì)開發(fā)設(shè)備的要求很低,開發(fā)時(shí)間也打打縮短。寫入單片機(jī)內(nèi)的程序還可以進(jìn)行加密,又很好的保護(hù)了開發(fā)者的勞動(dòng)成果。
其最大的特點(diǎn)是采用以單時(shí)鐘周期作為機(jī)器周期進(jìn)行指令的執(zhí)行,大大的提高了指令的執(zhí)行速度,其速度可快8-12倍。內(nèi)部也集成了MAX810專用復(fù)位電路,2路PWM,8路高速10位A/D轉(zhuǎn)換(250K/S),針對(duì)電機(jī)控制,強(qiáng)干擾場合。
此外,其I/O口在功能上與標(biāo)準(zhǔn)8051通用,復(fù)位后可設(shè)置成四種模式:準(zhǔn)雙向口/弱上拉,強(qiáng)推挽/強(qiáng)上拉,僅為輸入/高阻,開漏。每個(gè)I/O口驅(qū)動(dòng)能力可達(dá)20mA,但整個(gè)芯片不要超過120mA。整體來看,雖為弱電控制器件,但其外部驅(qū)動(dòng)能力較強(qiáng),對(duì)于大多外圍受控器件,無需再添加模擬放大電路進(jìn)行驅(qū)動(dòng),很大程度上降低了開發(fā)和制造成本。
在定時(shí)器方面,共有4個(gè)16位定時(shí)器,兩個(gè)與傳統(tǒng)的8051兼容的定時(shí)器/計(jì)數(shù)器,16位定時(shí)器T0和T1,沒有定時(shí)器2,但有獨(dú)立波特率發(fā)生器做串行通信的波特率發(fā)生器,再加上2路PCA模塊可再實(shí)現(xiàn)2個(gè)16位定時(shí)器。
在外部中斷方面,外部中斷I/O口7路,傳統(tǒng)的下降沿中斷或低電平觸發(fā)中斷,并新增支持上升沿中斷的PCA模塊,Power Down模式可由外部中斷喚醒.
其有多種的封裝方式,較常用且也為本次設(shè)計(jì)所用的芯片如下圖(圖3-1)所示,其采用PDIP(塑料雙列直插式封裝):


圖3-1 STC12C5A60S2單片機(jī)封裝引腳圖
3.2 LCD1602液晶顯示模塊
LCD1602液晶顯示器,是基于液晶顯示技術(shù)的點(diǎn)陣式顯示屏幕,通過電壓對(duì)其顯示區(qū)域進(jìn)行控制,具有厚度薄、適用于大規(guī)模集成電路直接驅(qū)動(dòng),且具有低功耗的特點(diǎn),也大大的降低了發(fā)熱量。而液晶的性能也很大部分是取決于其液晶對(duì)于各像素點(diǎn)輸入信號(hào)的響應(yīng)時(shí)間,顯然在單片機(jī)這樣的較低速的控制系統(tǒng)中,LCD1602作為較為簡單的液晶顯示屏幕,也足以能滿足其應(yīng)用需求,只要注意使用延時(shí)設(shè)置,基本不會(huì)有顯示模糊和閃爍的情況發(fā)生。
具體上來說,1602液晶是一種專用的字符型液晶,它專門用來顯示字母、數(shù)字、符號(hào)等的點(diǎn)陣型液晶模塊。它由若干個(gè)5*7或者5*11等點(diǎn)陣字符位組成,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符。由于其內(nèi)帶字符發(fā)生器,通常使用RAM來存儲(chǔ)相應(yīng)字符的各個(gè)像素點(diǎn)的信息,因此,字符發(fā)生器的控制器在顯示時(shí)只需要控制顯示的行列號(hào)及找到需要顯示字符的RAM對(duì)應(yīng)的地址,設(shè)立光標(biāo),在此送上該字符對(duì)應(yīng)的代碼即可。
字符型液晶顯示器目前常用16*1,16*2,20*2和40*2等規(guī)格的模塊,綜合本設(shè)計(jì)的實(shí)際需求和成本限制,故在此選擇了16*2規(guī)格(即可以顯示兩行,每行16個(gè)字符)的LC1602模塊。
市面上字符型液晶大多數(shù)是基于HD44780液晶芯片的,控制原理也是完全相同的,因此基于HD44780寫的控制程序可以很方便地應(yīng)用與市面上大部分的字符型液晶。
引腳功能說明
LCD1602采用標(biāo)準(zhǔn)的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表3-1所示:
表3-1 引腳接口說明表
編號(hào)
符號(hào)
引腳說明
編號(hào)
符號(hào)
引腳說明
1
VSS
電源地
9
D2
數(shù)據(jù)
2
VDD
電源正極
10
D3
數(shù)據(jù)
3
VL
液晶顯示偏壓
11
D4
數(shù)據(jù)
4
RS
數(shù)據(jù)/命令選擇
12
D5
數(shù)據(jù)
5
R/W
讀/寫選擇
13
D6
數(shù)據(jù)
6
E
使能信號(hào)
14
D7
數(shù)據(jù)

D0
數(shù)據(jù)
15
BLA
背光源正極
8
D1
數(shù)據(jù)
16
BLK
背光源負(fù)極
第1腳:VSS為地電源。
第2腳:VDD接5V正電源。
第3腳:VL為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地時(shí)對(duì)比度最高,對(duì)比度過高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對(duì)比度。
第4腳:RS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器。
第5腳:R/W為讀寫信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫操作。當(dāng)RS和R/W共同為低電平時(shí)可以寫入指令或者顯示地址,當(dāng)RS為低電平R/W為高電平時(shí)可以讀忙信號(hào),當(dāng)RS為高電平R/W為低電平時(shí)可以寫入數(shù)據(jù)。
第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。
第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。
第15腳:背光源正極。
第16腳:背光源負(fù)極。
該設(shè)計(jì)所使用的液晶模塊具體如下實(shí)物圖(圖3-2)所示:
圖3-2 LCD1602液晶顯示模塊實(shí)物圖
3.3 DS1302實(shí)時(shí)時(shí)鐘模塊
實(shí)時(shí)時(shí)鐘模塊采用以DS1302實(shí)時(shí)時(shí)鐘芯片為核心的集成化模塊,DS1302是美國DALLAS公司推出的一款高性能、低功耗的實(shí)時(shí)時(shí)鐘芯片,并附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)和RAM數(shù)據(jù)。
低功耗時(shí)鐘芯片DS1302可以對(duì)年、月、日、時(shí)、分、秒進(jìn)行計(jì)時(shí),且具有閏年補(bǔ)償?shù)榷喾N功能。DS1302用于數(shù)據(jù)記錄,特別是對(duì)某些具有特殊意義的數(shù)據(jù)點(diǎn)的記錄上,能實(shí)現(xiàn)數(shù)據(jù)與出現(xiàn)該數(shù)據(jù)的時(shí)間同時(shí)記錄。這種記錄對(duì)長時(shí)間的連續(xù)測控系統(tǒng)結(jié)果的分析以及對(duì)異常數(shù)據(jù)出現(xiàn)的原因的查找有重要意義。
采用DS1302作為記錄測控系統(tǒng)中的數(shù)據(jù)記錄,其軟硬件設(shè)計(jì)簡單,時(shí)間記錄準(zhǔn)確,既避免了連續(xù)記錄的大工作量,又避免了定時(shí)記錄的盲目性,給連續(xù)長時(shí)間的測量、控制系統(tǒng)的正常運(yùn)行及檢查都來了很大的方便,可廣泛應(yīng)用于長時(shí)間連續(xù)的測控系統(tǒng)中。在測量控制系統(tǒng)中,特別是長時(shí)間無人職守的測控系統(tǒng)中,經(jīng)常需要記錄某些具有特殊意義的數(shù)據(jù)及其出現(xiàn)的時(shí)間。記錄及分析這些特殊意義的數(shù)據(jù),對(duì)測控系統(tǒng)的性能分析及正常運(yùn)行具有重要的意義。傳統(tǒng)的數(shù)據(jù)記錄方式是隔時(shí)采樣或定時(shí)采樣,沒有具體的時(shí)間記錄,因此只能記錄數(shù)據(jù)而無法準(zhǔn)確記錄其出現(xiàn)的時(shí)間;若采用單片機(jī)計(jì)時(shí),一方面需要采用計(jì)數(shù)器,占用硬件資源,另一方面需要設(shè)置中斷、查詢等,同樣耗費(fèi)單片機(jī)的資源,而且某些測控系統(tǒng)可能不允許。而在系統(tǒng)中采用DS1302則能很好地解決這個(gè)問題。
DS1302時(shí)鐘芯片包括實(shí)時(shí)時(shí)鐘/日歷和31字節(jié)的靜態(tài)RAM。它經(jīng)過一個(gè)簡單的串行接口與微處理器通信。實(shí)時(shí)時(shí)鐘/日歷提供秒、分、時(shí)、日、周、月和年等信息。對(duì)于小于31天的月和月末的日期自動(dòng)進(jìn)行調(diào)整,還包括閏年校正的功能。時(shí)鐘的運(yùn)行可以采用24h或帶AM(上午)/PM(下午)的12h格式。采用三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)據(jù)。DS1302有主電源/后備電源雙電源引腳:VCC1 在單電源與電池供電的系統(tǒng)中提供低電源,并提供低功率的電池備份;VCC2在雙電源系統(tǒng)中提供主電源,在這種運(yùn)用方式中,VCC1 連接到備份電源,以便在沒有主電源的情況下能保存時(shí)間信息以及數(shù)據(jù)。DS1302由VCC1或VCC2中較大者供電。當(dāng)VCC2大于VCC1+0.2V時(shí),VCC2給DS1302供電;當(dāng)VCC2小于VCC1時(shí),DS1302由VCC1供電。
DS1302數(shù)據(jù)操作原理
DS1302在任何數(shù)據(jù)傳送時(shí)必須先初始化,把RST腳置為高電平,然后把8位地址和命令字裝入移位寄存器,數(shù)據(jù)在SCLK的上升沿被輸入。無論是讀周期還是寫周期,開始8位指定40個(gè)寄存器中哪個(gè)被訪問到。在開始8個(gè)時(shí)鐘周期,把命令字節(jié)裝入移位寄存器之后,另外的時(shí)鐘周期在讀操作時(shí)輸出數(shù)據(jù),在寫操作時(shí)寫入數(shù)據(jù)。時(shí)鐘脈沖的個(gè)數(shù)在單字節(jié)方式下為8加8,在多字節(jié)方式下為8加字節(jié)數(shù),最大可達(dá)248字節(jié)數(shù)。

圖3-3 DS1302管腳圖

如果在傳送過程中置RST為低電平,則會(huì)終止本次數(shù)據(jù)傳送,并且I/O引腳變?yōu)楦咦钁B(tài)。上電運(yùn)行時(shí),在VCC >=2.5V之前,RST腳必須保持低電平。只有在SCLK為低電平時(shí),才能將RST置為高電平。DS1302的管腳圖如圖3-3所示,表3-2為各引腳的功能。

表3-2 DS1302引腳功能表

引腳號(hào)

引腳名稱

功能

1

VCC2

主電源

2,3

X1,X2

振蕩源,外接32768HZ晶振

4

GND

地線

5

RST

復(fù)位/片選線

6

I/O

串行數(shù)據(jù)輸入/輸出端(雙向)

7

SCLK

串行時(shí)鐘輸入端

8

VCC1

后備電源


DS1302的控制字如圖3-4所示?刂谱止(jié)的最高有效位(位7)必須是邏輯1;如果它為邏輯0,則不能把數(shù)據(jù)寫入到DS1302中。位6如果為0,則表示存取日歷時(shí)鐘數(shù)據(jù);為1表示存取RAM數(shù)據(jù)。位5~1(A4~A0)指示操作單元的地址。最低有效位(位0)如為0,表示要進(jìn)行寫操作;為1表示進(jìn)行讀操作?刂谱止(jié)總是從最低位開始輸入/輸出。


圖3-4 控制字節(jié)的含義

為了提高對(duì)32個(gè)地址的尋址能力(地址/命令位1~5=邏輯1),可以把時(shí)鐘/日歷或RAM寄存器規(guī)定為多字節(jié)(burst)方式。位6規(guī)定時(shí)鐘或RAM,而位0規(guī)定讀或?qū)。在時(shí)鐘/日歷寄存器中的地址9~31或RAM寄存器中的地址31不能存儲(chǔ)數(shù)據(jù)。在多字節(jié)方式中,讀或?qū)憦牡刂?的位0開始。必須按數(shù)據(jù)傳送的次序?qū)懽钕鹊?個(gè)寄存器。但是,當(dāng)以多字節(jié)方式寫RAM 時(shí),為了傳送數(shù)據(jù)不必寫所有31字節(jié)。不管是否寫了全部31字節(jié),所寫的每一字節(jié)都將傳送至RAM。數(shù)據(jù)讀寫時(shí)序如圖3-5所示。






       圖3-5 數(shù)據(jù)讀寫時(shí)序圖

DS1302共有12個(gè)寄存器,其中有7個(gè)寄存器與日歷、時(shí)鐘相關(guān),存放的數(shù)據(jù)位為BCD碼形式,其日歷、時(shí)間寄存器及其控制字見表3-3,其中奇數(shù)為讀操作,偶數(shù)為寫操作。

表3-3 片內(nèi)時(shí)鐘數(shù)據(jù)寄存器

寄存器

命令碼

數(shù)據(jù)范圍

寄存器中各位的內(nèi)容

名稱

地址

7

6

5

4

3

2

1

0

00H

80H

81H

00~59

CH

秒數(shù)據(jù)

01H

82H

83H

00~59

0

分?jǐn)?shù)據(jù)

時(shí)

02H

84H

85H

01~12

或00~23

12/

24

0

10/

AP

時(shí)數(shù)據(jù)

03H

86H

87H

01~28,29

30,31

0

0

日數(shù)據(jù)

04H

88H

89H

01~12

0

0

0

月數(shù)據(jù)

星期

05H

9AH

8BH

01~07

0

0

0

0

0

星期數(shù)據(jù)

06H

8CH

8DH

00~99

年數(shù)據(jù)

多字節(jié)讀寫

BEH

BFH


3.4 紅外接收模塊


圖3-6 紅外收發(fā)工作流程圖
紅外遙控系統(tǒng)是集光、電于一體的系統(tǒng),。其工作原理是用戶按鍵信號(hào)單片機(jī)編碼處理后轉(zhuǎn)化為脈沖信號(hào),經(jīng)由紅外發(fā)射頭發(fā)射出去;接收端由紅外一體化接收頭實(shí)現(xiàn)對(duì)信號(hào)的放大解調(diào)并還原數(shù)據(jù)流,經(jīng)由單片機(jī)解碼后對(duì)相關(guān)I/O口進(jìn)行操作,從而完成整個(gè)遙控操作。整個(gè)工作流程圖如圖3-6所示。
紅外控制模塊主要分為兩個(gè)部分:紅外發(fā)射端和紅外接收端。而二者之間進(jìn)行通信的基礎(chǔ)是其共用的編碼方式。
3.4.1 遙控發(fā)射器及其編碼
紅外遙控早已進(jìn)入商用和開發(fā)領(lǐng)域多年,故遙控發(fā)射器的專用芯片很多。根據(jù)編碼的格式可以分為兩大類:NEC碼和RC碼,本設(shè)計(jì)以運(yùn)用比較廣泛,解碼比較容易的日本NEC編碼方式為開發(fā)的基礎(chǔ),F(xiàn)以日本NEC公司的Upd6121G組成的發(fā)射電路為例說明編碼原理。當(dāng)發(fā)射器按鍵按下后,即有遙控碼發(fā)出,所安的鍵不同遙控編碼也不同。這種遙控碼具有以下特征:采用脈寬調(diào)制的串行碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進(jìn)制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進(jìn)制的“1”,其波形如圖3-7所示。


圖3-7 Upd6121G的遙控碼
圖3-8遙控信號(hào)編碼波形圖
圖3-7所示遙控碼的“0”和“1”(注:所有波形為接收端的與發(fā)射相反),這些“0”和“1”組成的32位二進(jìn)制碼經(jīng)38kHz的載頻進(jìn)行二次調(diào)制以提高發(fā)射效率,達(dá)到降低電源功耗的目的。然后再通過紅外發(fā)射二極管產(chǎn)生紅外線像空間發(fā)射,如圖3-8所示。


圖3-9 紅外遙控發(fā)射波形圖
UPD6121G產(chǎn)生的遙控編碼是連續(xù)的32位二進(jìn)制碼組,其中前16位為用戶識(shí)別碼,能區(qū)別不同的電路設(shè)備,以防止不同機(jī)種遙控碼互相干擾。該芯片的用戶識(shí)別碼固定為十六進(jìn)制01H;后16位為8位操作碼(功能碼)及其反碼。UPD6121G最多128種不同組合的編碼。遙控器在按鍵按下后,周期性地發(fā)出同一種32位二進(jìn)制編碼,周期約為108ms。一組碼本身的持續(xù)時(shí)間隨它包含的二進(jìn)制“0”和“1”的個(gè)數(shù)不同而不同,大約在45 ~63ms之間,圖3-9為發(fā)射波形圖。
當(dāng)一個(gè)按鍵按下超過36ms,振蕩器使芯片激活,將發(fā)射一組108ms的編碼脈沖,這108ms發(fā)射代碼由一個(gè)引導(dǎo)碼(9ms)、一個(gè)結(jié)果碼(4.5ms)、低八位地址碼(9~18ms)、高八位地址碼(9~18ms)、8為數(shù)據(jù)碼(9~18ms)和這8位數(shù)據(jù)的反碼(9~18ms)組成。如果按鍵按下超過108ms仍未松開,接下來發(fā)射的代碼(連發(fā)碼)將僅由起始碼(9ms)和結(jié)束碼(2.25ms)組成。引導(dǎo)碼和連發(fā)碼的格式分別如圖3-10所示和圖3-11所示。



圖3-10 引導(dǎo)碼                                圖3-11 連發(fā)碼
3.4.2 遙控信號(hào)的接收
接收電路可以使用一種集紅外線接收和放大于一體的一體化紅外線接收器,不需要任何的外接元件,就能完成從紅外線接收到輸出與TTL電平信號(hào)兼容的所有工作,而體積和普通的塑封三極管大小一樣,它適合于各種紅外線遙控和紅外線數(shù)據(jù)傳輸。接收器對(duì)外只有3個(gè)引腳:OUT、GND、Vcc與單片機(jī)接口非常方便;其中,脈沖信號(hào)輸出直接接單片機(jī)的IO口、GND接系統(tǒng)的底線(0V)、Vcc接系統(tǒng)的電源正極(+5V);
3.5繼電器控制模塊
繼電器是一種電子控制器件,它具有控制系統(tǒng)(又稱輸入回路)和被控制系統(tǒng)(又稱輸出回路),通常應(yīng)用于自動(dòng)控制電路中,它實(shí)際上是用較小的電流去控制較大電流的一種“自動(dòng)開關(guān)”。故在電路中起著自動(dòng)調(diào)節(jié)、安全保護(hù)、轉(zhuǎn)換電路等作用,是一種典型的弱電器件控制強(qiáng)電電路的應(yīng)用。
電磁式繼電器的工作原理和特性較為簡單,一般由鐵芯、線圈、銜鐵、觸點(diǎn)簧片等組成的。只要在線圈兩端加上一定的電壓,線圈中就會(huì)流過一定的電流,從而產(chǎn)生電磁效應(yīng),銜鐵就會(huì)在電磁力吸引的作用下克服返回彈簧的拉力吸向鐵芯,從而帶動(dòng)銜鐵的動(dòng)觸點(diǎn)與靜觸點(diǎn)(常開觸點(diǎn))吸合。當(dāng)線圈斷電后,電磁的吸力也隨之消失,銜鐵就會(huì)在彈簧的反作用力返回原來的位置,使動(dòng)觸點(diǎn)與原來的靜觸點(diǎn)(常閉觸點(diǎn))吸合。這樣吸合、釋放,從而達(dá)到了在電路中的導(dǎo)通、切斷的目的。對(duì)于繼電器的“常開、常閉”觸點(diǎn),可以這樣來區(qū)分:繼電器線圈未通電時(shí)處于斷開狀態(tài)的靜觸點(diǎn),稱為“常開觸點(diǎn)”;處于接通狀態(tài)的靜觸點(diǎn)稱為“常閉觸點(diǎn)”。
本次設(shè)計(jì)中采用的繼電器為SRD-05VDC-SL-C,繼電器電氣圖如圖3-12所示。
由于繼電器的開啟和關(guān)閉需要一定的機(jī)械運(yùn)動(dòng),因此一般的繼電器仍需要較高的驅(qū)動(dòng)電壓。首先,應(yīng)該查閱繼電器的技術(shù)說明,查明其額定的驅(qū)動(dòng)電壓值,看單片機(jī)的端口能否直接將其驅(qū)動(dòng),如若不能直接驅(qū)動(dòng)或者要串聯(lián)其他期間,應(yīng)當(dāng)考慮在外圍構(gòu)建放大電路,此繼電器由于其額定的驅(qū)動(dòng)電壓值為5V,而該款STC單片機(jī)的端口電壓值在5V左右,在沒有特殊要求的情況下亦可不必外接放大電路;其次,在設(shè)計(jì)過程中應(yīng)當(dāng)充分的考慮到被控制電路的電壓范圍和最大電流,避免因超過額定值而造成安全隱患。
圖3-12 繼電器電氣圖
3.6 本章小結(jié)
   本章十分詳細(xì)的介紹了實(shí)際方案中所用到的STC12C5A60S2單片機(jī)、LCD1602液晶顯示模塊、DS1302實(shí)時(shí)時(shí)鐘模塊、繼電器控制模塊等外圍模塊,對(duì)它們各自的功能和性能參數(shù)都有了一個(gè)詳盡的了解,保證了后面方案中的硬件設(shè)計(jì)和軟件設(shè)計(jì)的順利進(jìn)行。
                                                      


第3章 主控制器與外圍器件                        

                                                      


第4章 硬件設(shè)計(jì)                          
第4章 硬件設(shè)計(jì)4.1 單片機(jī)最小系統(tǒng)設(shè)計(jì)
基于單片機(jī)的硬件設(shè)計(jì),首先應(yīng)當(dāng)考慮的是如何構(gòu)建起支撐單片機(jī)順利運(yùn)行的單片機(jī)最小系統(tǒng)。單片機(jī)最小系統(tǒng),或者稱為最小應(yīng)用系統(tǒng),是指用最少的元件組成的單片機(jī)可以工作的系統(tǒng)。對(duì)于各式各樣的單片機(jī)在外圍電路方面有一定的差異,而針對(duì)本設(shè)計(jì)所用的STC12C5A60S2單片機(jī)屬于51系列單片機(jī),其最小系統(tǒng)一般都應(yīng)該包括:單片機(jī)、電源電路、復(fù)位電路、晶振電路;此外,針對(duì)燒錄程序時(shí)所有的接口,本設(shè)計(jì)中還添加了RS232轉(zhuǎn)USB接口的電路設(shè)計(jì)。
4.1.1 單片機(jī)
本次設(shè)計(jì)采用的這款單片機(jī)為STC12C5A60S2,屬于增強(qiáng)型的51系列單片機(jī)。其功能屬性及指標(biāo)都已在第二章中有過介紹了,故在此不作詳細(xì)介紹了。以下將主要從其余三個(gè)電路部分進(jìn)行闡述。
4.1.2 電源電路
首先,對(duì)于一個(gè)完整的電子設(shè)計(jì)來講,首要問題就是為整個(gè)系統(tǒng)提供電源供電模塊,電源模塊的穩(wěn)定可靠是系統(tǒng)平穩(wěn)運(yùn)行的前提和基礎(chǔ)。51單片機(jī)雖然使用時(shí)間最早、應(yīng)用范圍最廣,但是在實(shí)際使用過程中,一個(gè)和典型的問題就是相比其他系列的單片機(jī),51單片機(jī)更容易受到干擾而出現(xiàn)程序跑飛的現(xiàn)象,克服這種現(xiàn)象出現(xiàn)的一個(gè)重要手段就是為單片機(jī)系統(tǒng)配置一個(gè)穩(wěn)定可靠的電源供電模塊。
此最小系統(tǒng)中電源模塊的此最小系統(tǒng)中的電源供電模塊的電源可以通過計(jì)算機(jī)的USB口供給,也可使用外部穩(wěn)定的5V電源供電模塊供給。具體電路原理圖如圖4-1所示。雖然通用的外部變壓器和USB的穩(wěn)壓性能一般均能滿足單片機(jī)的運(yùn)行需要,但仍考慮到可能運(yùn)用到的極端環(huán)境中去,可能存在電磁干擾以及電源本身的擾動(dòng),故在此并聯(lián)了一個(gè)47uF和一個(gè)0.1uF的濾波電容。經(jīng)實(shí)際調(diào)試試驗(yàn),其中電容值較大的電容可以很好的過濾掉低頻的雜波,而電容值較小電容可以較好的過濾掉高頻的雜波。經(jīng)此電源退耦電路,Vcc端可以有一個(gè)較為平穩(wěn)的供電電源。符合大多數(shù)應(yīng)用環(huán)境,符合本設(shè)計(jì)的要求。


圖4-1 電源供電電路
4.1.3 復(fù)位電路
單片機(jī)的置位和復(fù)位,都是為了把電路初始化到一個(gè)確定的狀態(tài),一般來說,單片機(jī)復(fù)位電路作用是把一個(gè)例如狀態(tài)機(jī)初始化到空狀態(tài),而在單片機(jī)內(nèi)部,復(fù)位的時(shí)候單片機(jī)是把一些寄存器以及存儲(chǔ)設(shè)備裝入廠商預(yù)設(shè)的一個(gè)值。
單片機(jī)復(fù)位電路原理是在單片機(jī)的復(fù)位引腳RST上外接電阻和電容,實(shí)現(xiàn)上電復(fù)位。當(dāng)復(fù)位電平持續(xù)兩個(gè)機(jī)器周期以上時(shí)復(fù)位有效。復(fù)位電平的持續(xù)時(shí)間必須大于單片機(jī)的兩個(gè)機(jī)器周期。具體數(shù)值可以由RC電路計(jì)算出時(shí)間常數(shù)。
復(fù)位電路由按鍵復(fù)位和上電復(fù)位兩部分組成。如圖 4-2所示。
上電復(fù)位:STC89系列單片及為高電平復(fù)位,通常在復(fù)位引腳RST上連接一個(gè)電容到VCC,再連接一個(gè)電阻到GND,由此形成一個(gè)RC充放電回路保證單片機(jī)在上電時(shí)RST腳上有足夠時(shí)間的高電平進(jìn)行復(fù)位,隨后回歸到低電平進(jìn)入正常工作狀態(tài),這個(gè)電阻和電容的典型值為10K和10uF。
按鍵復(fù)位:按鍵復(fù)位就是在復(fù)位電容上并聯(lián)一個(gè)開關(guān),當(dāng)開關(guān)按下時(shí)電容被放電、RST也被拉到高電平,而且由于電容的充電,會(huì)保持一段時(shí)間的高電平來使單片機(jī)復(fù)位。


圖4-2 復(fù)位電路原理圖
              此外,STC89C51系列單片機(jī)自帶有“看門狗”電路。由于單片機(jī)的工作有可能會(huì)受到來自外界電磁場的干擾,造成程序的跑飛,從而陷入死循環(huán),程序的正常運(yùn)行被打斷,由單片機(jī)控制的系統(tǒng)便無法繼續(xù)工作,這樣會(huì)造成整個(gè)系統(tǒng)陷入停滯狀態(tài),發(fā)生不可預(yù)料的后果,所以出于對(duì)單片機(jī)運(yùn)行狀態(tài)進(jìn)行實(shí)時(shí)監(jiān)測的考慮,便產(chǎn)生了“看門狗”電路。其工作過程如下:看門狗芯片和單片機(jī)的一個(gè)I/O引腳相連,該I/O引腳通過單片機(jī)的程序控制,使它定時(shí)地往看門狗芯片的這個(gè)引腳上送入高電平(或低電平),這一程序語句是分散地放在單片機(jī)其他控制語句中間的,一旦單片機(jī)由于干擾造成程序跑飛后而陷入某一程序段進(jìn)入死循環(huán)狀態(tài)時(shí),給看門狗引腳送電平的程序便不能被執(zhí)行到,這時(shí),看門狗電路就會(huì)由于得不到單片機(jī)送來的信號(hào),便將它和單片機(jī)復(fù)位引腳相連的引腳上送出一個(gè)復(fù)位信號(hào),使單片機(jī)發(fā)生復(fù)位,從而單片機(jī)將從程序存儲(chǔ)器的起始位置重新開始執(zhí)行程序,這樣便實(shí)現(xiàn)了單片機(jī)的自動(dòng)復(fù)位。從而,“看門狗”電路很好的彌補(bǔ)了上述復(fù)位電路的缺陷,大大的增強(qiáng)了整個(gè)系統(tǒng)的可靠性與穩(wěn)定性。
4.1.4 晶振電路
單片機(jī)系統(tǒng)里都有晶振,在單片機(jī)系統(tǒng)里晶振作用非常大,全稱叫晶體振蕩器,他結(jié)合單片機(jī)內(nèi)部電路產(chǎn)生單片機(jī)所需的時(shí)鐘頻率,單片機(jī)晶振提供的時(shí)鐘頻率越高,那么單片機(jī)運(yùn)行速度就越快,單片接的一切指令的執(zhí)行都是建立在單片機(jī)晶振提供的時(shí)鐘頻率。
  在通常工作條件下,普通的晶振頻率絕對(duì)精度可達(dá)百萬分之五十。高級(jí)的精度更高。有些晶振還可以由外加電壓在一定范圍內(nèi)調(diào)整頻率,稱為壓控振蕩器(VCO)。晶振用一種能把電能和機(jī)械能相互轉(zhuǎn)化的晶體在共振的狀態(tài)下工作,以提供穩(wěn)定,精確的單頻振蕩。
單片機(jī)晶振的作用是為系統(tǒng)提供基本的時(shí)鐘信號(hào)。通常一個(gè)系統(tǒng)共用一個(gè)晶振,便于各部分保持同步。有些通訊系統(tǒng)的基頻和射頻使用不同的晶振,而通過電子調(diào)整頻率的方法保持同步。
晶振通常與鎖相環(huán)電路配合使用,以提供系統(tǒng)所需的時(shí)鐘頻率。如果不同子系統(tǒng)需要不同頻率的時(shí)鐘信號(hào),可以用與同一個(gè)晶振相連的不同鎖相環(huán)來提供。
圖4-3 晶振電路原理圖
STC89C51使用外部的晶體振蕩器作為振蕩源,考慮到本次設(shè)計(jì)中對(duì)時(shí)間的精確性和指令執(zhí)行速度的要求,該設(shè)計(jì)選用了22.1184MHz的振蕩晶體。由于單片機(jī)內(nèi)部有振蕩電路,所以外部只要連接一個(gè)晶振和兩個(gè)電容。具體電路如圖4-3所示。電容容量一般在15pF至50pF之間,根據(jù)實(shí)際使用效果該處選用了30pF的電容,有較高的振蕩穩(wěn)定性。
4.1.5 RS232接口轉(zhuǎn)USB接口電路
由于單片機(jī)誕生年代較早,而在當(dāng)時(shí)的工業(yè)控制領(lǐng)域大多采用了RS232串行口通信協(xié)議,但其存在著傳輸速率低,傳輸距離有限和信號(hào)電平值較高等問題。現(xiàn)在大多的PC設(shè)備基本改用了USB標(biāo)準(zhǔn)協(xié)議的通信串口,故為了方便的燒錄程序,在常規(guī)單片機(jī)最小系統(tǒng)的基礎(chǔ)之上,應(yīng)該設(shè)計(jì)必要的接口轉(zhuǎn)換電路。具體電路原理如圖4-4所示。
圖4-4 RS232轉(zhuǎn)USB接口電路
該硬件系統(tǒng)由4部分組成:USB接口、CH341T、MAX232和RS232接口。其中,USB接口用于連接USB主機(jī),在此選用USB總線接口的A型連接頭;CH341T用于完成USB接口轉(zhuǎn)RS232接口的所有硬件功能;MAX232用于完成RS232與TLL/CMOS的電平轉(zhuǎn)換;RS232接口用于連接RS232設(shè)備。根據(jù)實(shí)際需要,選擇目前廣泛應(yīng)用的DB9連接器。
USB總線包括一對(duì)5V電源線和一對(duì)數(shù)據(jù)信號(hào)線。通常,+5V電源線為紅色;接地線為黑色;D+信號(hào)線為綠色;D-信號(hào)線為白色。USB總線提供的電源電流最大可以達(dá)到500 mA,CH341T芯片可以直接使用USB總線提供的5V電源。C3和C4是高頻瓷片電容,C3容量一般為4700pF~0.02μF,用于CH341T內(nèi)部電源節(jié)點(diǎn)的退耦;C4容量為0.1μF,用于外部電源的退耦。晶振X1、電容C1和C2用于時(shí)鐘振蕩電路。X1的頻率是12 MHz,C1和C2是容量為15~30 pF的高頻瓷片電容。MAX232提供電平轉(zhuǎn)換。
4.2 顯示電路設(shè)計(jì)
              液晶顯示電路選用了LCD1602模塊。從成本和適用性的方面考慮,選用了該集成模塊。具體的引腳功能與所采用的芯片資料都已經(jīng)在3.2節(jié)中做了詳細(xì)介紹,在此只做以下電路說明。
              由于單片機(jī)的IO口資源極為有限,而對(duì)于這樣有較多引腳的外圍模塊,應(yīng)當(dāng)考慮未來是否有擴(kuò)展的需要,能否直接采用串口連接。對(duì)于有擴(kuò)展必要的設(shè)計(jì),可采用相關(guān)的芯片進(jìn)行IO口擴(kuò)展。而此處作為設(shè)計(jì)簡潔性與成本方面的考慮,其剩余單片機(jī)的端口在未來使用過程中,仍然有較大的空間。因此,該部分的設(shè)計(jì)就直接采用了較少使用的串口連接方式。其7—14號(hào)8個(gè)數(shù)據(jù)端口直接與單片機(jī)的P0口相連,P0口可以外擴(kuò)存儲(chǔ)器作為地址總線,也可以外存儲(chǔ)器擴(kuò)作為數(shù)據(jù)總線,也可以不外擴(kuò)直接作為普通IO口,但內(nèi)部無上拉電阻,作為輸入或輸出時(shí)應(yīng)在外部接上拉電阻,因此,在與單片機(jī)相連是應(yīng)該再添加上拉電路。具體連接如圖4-5所示。
圖4-5 LCD1602連接PO口的上拉電路圖
此外,該液晶模塊的第3腳為液晶對(duì)比度調(diào)整端,當(dāng)接電源時(shí)對(duì)比度最低,接地時(shí)對(duì)比度最高,但對(duì)比度過高會(huì)產(chǎn)生“鬼影”,使用該端口的功能是一般是通過串聯(lián)一個(gè)10K的滑動(dòng)變阻器進(jìn)行調(diào)節(jié)。但在此處,考慮到顯示畢竟只是一個(gè)輔助顯示時(shí)間設(shè)置信息的工具,而大部分運(yùn)行的時(shí)間,是沒有不斷調(diào)節(jié)顯示效果的需求的,因此,只在此說明,并不做相應(yīng)設(shè)計(jì)。
綜上所述,該模塊功能雖然比較完備和強(qiáng)大,引腳相比于其他模塊也較多,但各個(gè)引腳的功能分配比較合理,連接時(shí)能夠比較清晰的認(rèn)識(shí)該模塊的基本結(jié)構(gòu)和工作原理,符合預(yù)期設(shè)計(jì)目標(biāo)所要求的原則。
4.3 時(shí)鐘電路設(shè)計(jì)
              實(shí)時(shí)時(shí)鐘功能是本次設(shè)計(jì)的一個(gè)核心部分,它作為整個(gè)設(shè)計(jì)部分的時(shí)間信息的基準(zhǔn),其設(shè)計(jì)的穩(wěn)定性與精確性就基本決定了該設(shè)計(jì)的精度與能應(yīng)用的環(huán)境,故其設(shè)計(jì)的重要性不言而喻。
              本設(shè)計(jì)中選用了較為常用的DS1302實(shí)時(shí)時(shí)鐘模塊,其性能屬性基本滿足了所需設(shè)計(jì)的要求。其共有Vcc1、Vcc2兩個(gè)電源引腳,GND接地端,X1、X2兩個(gè)振蕩源連接端,I/O端在三線接口時(shí)為雙向串行數(shù)據(jù)線,SCLK為串行時(shí)鐘端,此外,也自帶了RST復(fù)位端。具體的電路連接如下圖4-6所示。其連接的說明如下。
              首先DS1302的連個(gè)電源引腳中Vcc1為后備電源,VCC2為主電源。在主電源關(guān)閉的情況下,也能保持時(shí)鐘的連續(xù)運(yùn)行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當(dāng)Vcc2大于Vcc1+0.2V時(shí),Vcc2給DS1302供電。當(dāng)Vcc2小于Vcc1時(shí),DS1302由Vcc1供電。因此,在如圖所示的電源端連接中,Vcc2直接連接了主板上的5V供電端,而Vcc1和紐扣型電磁相連,作為后備電源,保證了即使在主板斷電的情況下仍然能夠準(zhǔn)確的走時(shí),避免了斷電后再次啟動(dòng)需再次設(shè)置時(shí)間起點(diǎn),體現(xiàn)了其人性化的設(shè)計(jì)。
              X1、X2為振蕩源連接端口,根據(jù)技術(shù)手冊(cè)的說明,此處應(yīng)當(dāng)外接32.768kHz的晶振。但時(shí)鐘芯片要能正常較為精確的計(jì)時(shí),則對(duì)于晶振的穩(wěn)定性要求極高,故在此處一般是外接兩個(gè)6pF的接地電容,能大大的提高其走時(shí)準(zhǔn)確性。但在此處選用了0.1uF的電容,在實(shí)際的測試中發(fā)現(xiàn)有一定的偏移。經(jīng)過查找原因,發(fā)現(xiàn)DS1302 是依靠外部晶振與其內(nèi)部的電容配合來產(chǎn)生時(shí)鐘脈沖的。 由于DS1302在芯片本身已經(jīng)集成了6pF 的電容,所以, 為了獲得穩(wěn)定可靠的時(shí)鐘,必須選用具有 6pF 負(fù)載電容的晶振。然而,在選用晶振時(shí)僅僅注意了晶振的額定頻率值,而忽視了晶振的負(fù)載電容大小,甚至連許多經(jīng)銷商也不能提供所售晶振的負(fù)載電容。所以即使在 使用中選用了符合 32768Hz 的晶振,但如果該晶振的負(fù)載電容與 DS1302 提供的 6pF 不一致時(shí),就會(huì)影響晶振的起振或?qū)е抡袷庮l率的偏移,出現(xiàn)上述在應(yīng)用中的問題。
              I/O、SCLK、RST三個(gè)端口構(gòu)成簡單的SPI總線接口,是一般低速外圍器件與CPU進(jìn)行數(shù)據(jù)傳輸?shù)牡湫徒涌凇T谥髌骷囊莆幻}沖下,數(shù)據(jù)按位傳輸,高位在前,低位在后,為全雙工通信。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)RST為高電平時(shí),所有的數(shù)據(jù)傳送被初始
圖4-6 DS1302電路圖
化,允許對(duì)DS1302進(jìn)行操作。如果在傳送過程中RST置為低電平,則會(huì)終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。在此設(shè)計(jì)中,三個(gè)端口分別于與單片機(jī)P1.4、P1.5、P1.6三個(gè)端口相連,十分方便。
4.4 紅外接收電路設(shè)計(jì)
              本次設(shè)計(jì)的中的“無線打開關(guān)閉插座”的功能,采用紅外遙控的方式實(shí)現(xiàn),其有效距離和有效接收角度均符合一般的應(yīng)用場景。
在發(fā)送端使用了較為常用的采用日本NEC編碼的一體化紅外遙控按鍵,其超低的發(fā)射功耗和豐富的按鍵資源,已經(jīng)足夠完成該設(shè)計(jì)目標(biāo)。其基本工作原理為利用不同的脈沖時(shí)間來編碼信號(hào)。
紅外接收電路使用的是紅外一體化接收管VS1838B,它有3個(gè)管腳,一個(gè)腳接地,還有一個(gè)腳接電源,另外一個(gè)腳接到單片機(jī)的I/O口,本次設(shè)計(jì)用的是P3.3口,如圖4-7所示。通常,紅外遙控器將遙控信號(hào)(二進(jìn)制脈沖碼)調(diào)制在40KHZ的載波上,經(jīng)緩沖放大后送至紅外發(fā)光二極管,產(chǎn)生紅外信號(hào)發(fā)射出去。經(jīng)過空間的傳送被紅外接收管接收到,在接收過程中,脈沖通過光學(xué)濾波器和紅外接收管轉(zhuǎn)換為40KHZ的電信號(hào),此信號(hào)經(jīng)過放大,檢波,整形,解調(diào),送到解碼與接口電路,從而完成相應(yīng)的遙控功能


圖4-7紅外接收電路連接圖
              需要說明的是,在本設(shè)計(jì)中,為了實(shí)物產(chǎn)品的緊湊,節(jié)省空間資源。所以DS1302模塊和VS1838B紅外接收模塊是印制在同一塊PCB板上的。電路原理圖如圖4-8所示。實(shí)物圖如圖4-9所示。


圖4-8 DS1302和VS1838B整合電路原理圖
圖4-9 DS1302和VS1838B整合電路實(shí)物圖
4.5 繼電器控制電路
該部分電路是本電路的輸出部分,所選用的繼電器型號(hào)為SRD-05VDC-SL-C,按照技術(shù)手冊(cè)的說明,其額定的驅(qū)動(dòng)電壓為5V,而經(jīng)過測試單片機(jī)端口的實(shí)際電壓在5V±0.2V的范圍內(nèi),因此理論上是可以進(jìn)行直接驅(qū)動(dòng)的。但考慮上電路上如果再串聯(lián)一個(gè)用于開關(guān)狀態(tài)指示的發(fā)光二極管,會(huì)有一定的壓降存在,同時(shí)也考慮到要保證被控電路的穩(wěn)定性,保證被控電路上的電器安全,所以在此不適用直接驅(qū)動(dòng)的連接方式,而是采用了一個(gè)三極管的放大電路進(jìn)行驅(qū)動(dòng),以下作詳細(xì)說明。
如圖4-10所示,由三極管組成共射極放大電路,二極管D2形成繼電器回路保護(hù),其中,繼電器觸發(fā)信號(hào)有單片機(jī)P1.3口直接產(chǎn)生,并串聯(lián)有LED-RED發(fā)光二極管作為工作狀態(tài)指示燈。當(dāng)P1.3口輸出高電平時(shí),指示燈亮,繼電器吸合,被控電路導(dǎo)通;當(dāng)P1.3口輸出低電平時(shí),繼電器斷開,指示燈熄滅,被控電路斷開。此處,輸出功率由繼電器上所標(biāo)示的接點(diǎn)容量決定的。

圖4-10 繼電器控制電路
4.6 按鍵電路
                由于本設(shè)計(jì)中設(shè)計(jì)到時(shí)間設(shè)置,模式調(diào)整等眾多的信息輸入,故必然
需要較多的按鍵完成該功能。其按鍵本身為機(jī)械結(jié)構(gòu),結(jié)構(gòu)十分簡單。且由于該設(shè)計(jì)中單片機(jī)的I/O口剩余較多,因此,按鍵直接與單片機(jī)的I/O口相連。但機(jī)械式按鍵最大的問題是按鍵時(shí)存在嚴(yán)重的信號(hào)抖動(dòng)的問題。對(duì)于這個(gè)問題,可以直接利用數(shù)字電路器件進(jìn)行消除抖動(dòng),也可用波形整形器件進(jìn)
圖4-11 按鍵電路
行信號(hào)整形。以上二者均可以較好的消除問題,但器件的增加無疑會(huì)帶來制造成本的增加和功耗的增加,因此,通常的辦法是采用利用軟件編程進(jìn)行延時(shí)消抖,經(jīng)過實(shí)際測試,效果什么良好。連接圖如圖4-11所示。
4.7本章小結(jié)
              本章詳細(xì)的闡述了硬件電路部分的設(shè)計(jì)過程,從電源電路、晶振電路、復(fù)位電路、RS232轉(zhuǎn)USB接口電路開始搭建了單片機(jī)最小系統(tǒng),接著完成了對(duì)顯示電路部分、實(shí)時(shí)時(shí)鐘電路部分、紅外接收電路部分、繼電器控制電路部分以及按鍵電路部分的詳細(xì)設(shè)計(jì),并根據(jù)設(shè)計(jì)原理圖詳盡的說明了各個(gè)部分的設(shè)計(jì)的合理性以及各個(gè)部分所需完成的功能。經(jīng)過該章的說明,本設(shè)計(jì)在硬件部分已經(jīng)完備,接下來只剩下驅(qū)動(dòng)其正常工作的軟件設(shè)計(jì)部分。
                      第5章 軟件設(shè)計(jì)
5.1 主程序設(shè)計(jì)
系統(tǒng)軟件設(shè)計(jì)采用模塊化設(shè)計(jì),分為LCD1602顯示模塊、DS1302讀寫
圖5-1 主程序流程圖
模塊、紅外遙控模塊、按鍵處理模塊。通過程序?qū)崿F(xiàn)的可行性分析和軟件架構(gòu)的整體規(guī)劃,其主程序的流程圖大體如下圖5-1所示。
              其中,初始化模塊主要是對(duì)DS1302時(shí)鐘芯片、LCD1602液晶顯示模塊進(jìn)行任務(wù)初始化設(shè)置,并打開INT0中斷進(jìn)行紅外按鍵檢測和設(shè)置T0中斷允許狀態(tài),以上流程均在主程序最前端,但并不在循環(huán)體內(nèi),只作為開機(jī)啟動(dòng)時(shí)初始化的部分。            
接著,進(jìn)入while( )循環(huán)體內(nèi)以后,因?yàn)檎麄(gè)軟件結(jié)構(gòu)中,設(shè)置模式作為了第一級(jí)設(shè)置菜單,所以首先應(yīng)進(jìn)行當(dāng)前設(shè)置模式的判斷,如果有設(shè)置模式切換的輸入(K5按鍵),要進(jìn)行相應(yīng)的設(shè)置模式的切換,然后再進(jìn)行對(duì)當(dāng)前的設(shè)置模式進(jìn)行顯示。            
在顯示當(dāng)前所處的設(shè)置模式以后,程序繼續(xù)向下判斷應(yīng)該進(jìn)入哪個(gè)對(duì)應(yīng)的設(shè)置模式。根據(jù)不同的判定結(jié)果,可進(jìn)入校時(shí)子程序、復(fù)位子程序、定時(shí)子程序、運(yùn)行子程序、運(yùn)行模式切換子程序這些這些子程序中的一個(gè),執(zhí)行對(duì)應(yīng)的子程序,進(jìn)行相應(yīng)的操作。若要進(jìn)行各個(gè)子程序間的切換,可利用設(shè)置模式切換的程序進(jìn)行切換。
在正常工作狀態(tài)時(shí),系統(tǒng)會(huì)一直在運(yùn)行子程序中進(jìn)行循環(huán),根據(jù)當(dāng)前運(yùn)行模式的設(shè)定,分別可進(jìn)入長開模式、長關(guān)模式和自動(dòng)逐組查詢的模式,在各個(gè)運(yùn)行模式中分別對(duì)受控繼電器進(jìn)行常閉、常開和定時(shí)開關(guān)的操作。至此,整個(gè)主程序的循環(huán)體結(jié)束,運(yùn)行流程圖指向返回循環(huán)體起始點(diǎn)。
5.2 LCD1602顯示程序設(shè)計(jì)
              LCD1602液晶顯示程序,在本次設(shè)計(jì)中并無特別復(fù)雜的設(shè)計(jì)要求,只需要寫出最基本的顯示驅(qū)動(dòng)程序即可。根據(jù)液晶屏的技術(shù)手冊(cè)給出的驅(qū)動(dòng)顯示的時(shí)序圖,即可順利的寫出所需顯示驅(qū)動(dòng)。在此,值得注意的問題是,由于液晶的驅(qū)動(dòng)有一定的轉(zhuǎn)換時(shí)間延遲,所以在調(diào)用該顯示驅(qū)動(dòng)時(shí)要注意恰到好處的使用延時(shí)函數(shù),避免顯示亂碼。除此之外,對(duì)于未用到的字符塊,為避免不必要的亂碼顯示,可在對(duì)應(yīng)空白處寫入空格,可有效避免該問題的出現(xiàn)。
              根據(jù)顯示需要,該模塊的程序主要由以下三個(gè)函數(shù)組成,分別為:
void LCD_init( ); //屏幕初始化
void LCD_writecom(unsigned char com);  //寫屏幕的指令
void LCD_writedata(unsigned char dat);  //寫屏幕的數(shù)據(jù)
每一個(gè)字符塊的顯示,均采用先利用LCD_writecom()指令寫入函數(shù)進(jìn)行顯示位置的設(shè)置,再利用LCD_writedata()顯示數(shù)據(jù)函數(shù)寫入需要顯示的字符數(shù)據(jù)。對(duì)于需要在連續(xù)位置顯示字符的情況,可在一次寫入顯示地址以后,連續(xù)寫入顯示字符的數(shù)據(jù);對(duì)于需要在非連續(xù)位置顯示的字符,則必須在每次寫入字符數(shù)據(jù)之前,寫入對(duì)應(yīng)的顯示地址。整個(gè)顯示驅(qū)動(dòng)來說,結(jié)構(gòu)什么簡單,調(diào)用時(shí)也十分方便。
5.3 DS1302實(shí)時(shí)時(shí)鐘程序設(shè)計(jì)
              DS1302是本次設(shè)計(jì)的核心部分,同樣,該部分的軟件部分也承擔(dān)了大部分實(shí)現(xiàn)功能的任務(wù)。從這部分軟件模塊的任務(wù)規(guī)劃來說,主要負(fù)責(zé)了時(shí)間信息的輸出顯示,和校時(shí)、定時(shí)、復(fù)位、模式四種鍵處理。而其中最為核心的部分為校時(shí)部分的程序,定時(shí)、復(fù)位、時(shí)間顯示也都均基于校時(shí)程序而做部分的操作而構(gòu)建的。所以,下面將主要展示校時(shí)子程序的程序流程圖,如下圖5-2所示。
              當(dāng)進(jìn)入定時(shí)子程序以后,DS1302寫入暫停標(biāo)志為1,使時(shí)鐘進(jìn)入暫停運(yùn)行狀態(tài),然后進(jìn)入按位調(diào)整時(shí)間信息的程序,并且默認(rèn)首先進(jìn)入“年”調(diào)整位,接著再判斷是否有“調(diào)整位”切換的輸入,如果有,則進(jìn)入切換程序進(jìn)行位切換,最后進(jìn)入判斷當(dāng)前所處的“調(diào)整位”。進(jìn)行“調(diào)整位”判定以后,再分別進(jìn)入“年份調(diào)整”、“月份調(diào)整”、“日期調(diào)整”、“小時(shí)調(diào)整”、“分鐘調(diào)整”各個(gè)具體的調(diào)整子程序,在各個(gè)子程序中應(yīng)當(dāng)注意的是每一個(gè)位的溢出判斷要考慮周全,特別是在月份溢出判斷中,要進(jìn)行比較復(fù)雜的判定過程。最后,在進(jìn)行了各個(gè)位的調(diào)整以后,再將調(diào)整后的數(shù)據(jù)分別寫入DS1302各位對(duì)應(yīng)的存儲(chǔ)單元,并且在LCD1602上顯示出來。DS1302寫入走時(shí)標(biāo)志,至此,整個(gè)校時(shí)的子程序處理結(jié)束。
              在前面,說過定時(shí)、復(fù)位也大都基于校時(shí)程序而衍變的。其中,定時(shí)子程序與校時(shí)子程序不同之處在于,在完成各個(gè)位調(diào)整以后,并不把其設(shè)置的時(shí)間信息寫入DS1302的存儲(chǔ)單元,而是寫入單片機(jī)的內(nèi)部擴(kuò)展的RAM單元,以作開/關(guān)時(shí)間信息。同時(shí),在進(jìn)行設(shè)置的過程中也不需要暫停走時(shí)。這兩個(gè)子程序的主要區(qū)別僅為以上兩點(diǎn),其他部分基本無差異。具體流程圖如圖5-3所示。
圖5-2 校時(shí)子程序流程圖
圖5-3 定時(shí)子程序流程圖
5.4 VS1838B中斷程序設(shè)計(jì)
              VS18038B紅外接收端主要實(shí)現(xiàn)的功能是無線打開關(guān)閉開關(guān),由于是模塊化的器件,功能實(shí)現(xiàn)也比較簡單。在此處主要說明的是如何采用單片機(jī)的中斷原理實(shí)現(xiàn)紅外的接收功能。
              由于發(fā)射的紅外波是以高低電平時(shí)長作為編碼信息的,所以在VS1838B接收時(shí),要采用定時(shí)/計(jì)數(shù)器進(jìn)行對(duì)每個(gè)碼元的高低電平持續(xù)時(shí)間進(jìn)行測量。而紅外接收端的信號(hào)觸發(fā)采用了外部響應(yīng)中斷方式,一旦有接收到紅外信號(hào),就立即進(jìn)入中斷程序。其流程圖如圖5-4所示。
            


圖5-4 VS1838B中斷接收程序流程圖
由中斷的基本原理可知,在進(jìn)入中斷以后,首先進(jìn)入現(xiàn)場保護(hù)。然后在檢測到紅外信號(hào)觸發(fā)以后,進(jìn)入外部中斷程序,在中斷程序中啟動(dòng)定時(shí)/計(jì)數(shù)器T0,開始對(duì)每個(gè)碼元的高低電平進(jìn)行計(jì)時(shí),接著完成解碼,根據(jù)解碼的信息對(duì)單片機(jī)進(jìn)行相應(yīng)控制,此處通過對(duì)長開\長關(guān)運(yùn)行模式的切換,以實(shí)現(xiàn)無線打開/關(guān)閉開關(guān)的功能。
5.5 系統(tǒng)測試
經(jīng)過前面系統(tǒng)的總體設(shè)計(jì)、控制器和外圍模塊的介紹、軟硬件設(shè)計(jì),系統(tǒng)所需實(shí)現(xiàn)的功能已基本完成。在此章節(jié)中將主要以實(shí)驗(yàn)結(jié)果為介紹主體,對(duì)于測試過程中遇到的問題或漏洞進(jìn)行總結(jié)分析。
首先,進(jìn)入的是系統(tǒng)第三項(xiàng)設(shè)置模式,即定時(shí)設(shè)置模式,如圖5-4所示。
圖5-5 定時(shí)設(shè)置模式下的實(shí)物圖
同時(shí)此刻的運(yùn)行模式為自動(dòng)逐組查詢模式,如圖所示X3。此模式下,可根據(jù)需要,自行設(shè)定開關(guān)在某時(shí)刻進(jìn)行開或者關(guān)的操作。例如圖種所示為2014年1月1日0點(diǎn)10分打開插座。運(yùn)行結(jié)果如下圖5-6和圖5-7所示。可以看到,在運(yùn)行模式為自動(dòng)逐組查詢的模式下,設(shè)置時(shí)間之前指示繼電器開關(guān)的LED燈為熄滅狀態(tài);而當(dāng)時(shí)間到達(dá)設(shè)定值以后,指示燈亮,繼電器吸合。說明其已基本達(dá)到了設(shè)計(jì)              之初的目標(biāo)。此外,本設(shè)計(jì)是可以至少對(duì)16組時(shí)間點(diǎn)進(jìn)行定時(shí)的,經(jīng)過測試,完全符合預(yù)期目標(biāo)。
除此之外,可以看到圖中的紅外線接收頭和紅外遙控器,設(shè)計(jì)目標(biāo)中要求能無線打開關(guān)閉插座。此處,在演示的過程中已經(jīng)體現(xiàn),完全達(dá)到了設(shè)計(jì)目標(biāo)。
            


圖5-6  自動(dòng)逐組查詢運(yùn)行模式下到達(dá)定時(shí)之前的運(yùn)行圖

圖5-7 自動(dòng)逐組查詢運(yùn)行模式下到達(dá)定時(shí)之后的運(yùn)行圖
5.6 本章小結(jié)
              本章介紹了自動(dòng)定時(shí)開關(guān)插座的軟件設(shè)計(jì)。首先介紹了整個(gè)主程序的工作流程,其主要結(jié)構(gòu)為一個(gè)大的循環(huán)體,在其循環(huán)體內(nèi)根據(jù)當(dāng)前所處的模式分別進(jìn)入定時(shí)子程序、校時(shí)子程序、復(fù)位子程序、運(yùn)行子程序、運(yùn)行模式切換子程序等子程序,各個(gè)子程序之間的切換運(yùn)行,可通過按鍵進(jìn)行切換,也可通過紅外遙控按鍵進(jìn)行切換。其次,對(duì)于各個(gè)子程序部分,本章主要詳細(xì)說明了定時(shí)子程序、校時(shí)子程序和紅外接收中斷子程序,其中定時(shí)和校時(shí)子程序核心部分較為相似,而紅外接收中斷子程序較為詳細(xì)的介紹了整個(gè)中斷過程,體現(xiàn)了中斷原理的實(shí)際應(yīng)用。
              最后在完成了對(duì)源代碼的編譯后,對(duì)所搭建的硬件實(shí)物進(jìn)行了運(yùn)行測試,所得的測試結(jié)果已基本符合了設(shè)計(jì)目標(biāo)。對(duì)于測試中遇到的問題,也在調(diào)試的過程中進(jìn)行了修改和完善。
                   結(jié)論
本文對(duì)當(dāng)前自動(dòng)定時(shí)開關(guān)的相關(guān)的背景做了簡要介紹,并設(shè)計(jì)了一種簡單實(shí)用的自動(dòng)定時(shí)開關(guān)插座,完成了自動(dòng)定時(shí)開關(guān)整體的硬件設(shè)計(jì)和軟件設(shè)計(jì),并經(jīng)過調(diào)試、整合,做出來一套完整的最終產(chǎn)品,達(dá)到了預(yù)期要求。本系統(tǒng)具有功能完備、使用便捷、應(yīng)用前景廣泛等優(yōu)點(diǎn),相比于現(xiàn)有的一些機(jī)械式定時(shí)開關(guān)的產(chǎn)品具有較為完善的功能和實(shí)用性,主要成果如下:
(1)本設(shè)計(jì)采用了51系列單片機(jī)來設(shè)計(jì)了自動(dòng)定時(shí)開關(guān)插座,能夠較為精確的按照設(shè)定的時(shí)間值對(duì)插座進(jìn)行開關(guān)控制,最多可設(shè)置16個(gè)時(shí)間點(diǎn)的開關(guān)控制。
(2)該設(shè)計(jì)中考慮到了自動(dòng)定時(shí)開關(guān)插座運(yùn)用環(huán)境的多樣性,故在該設(shè)計(jì)中添加了紅外遙控功能,能無線的打開關(guān)閉插座;
(3)完成該設(shè)計(jì)過程中利用了Keil C51進(jìn)行了軟件編程設(shè)計(jì),利用Protues完成了對(duì)硬件電路的設(shè)計(jì)。獨(dú)立完成了該設(shè)計(jì)軟硬件的設(shè)計(jì),并搭電路進(jìn)行了驗(yàn)證測試。
由于時(shí)間以及個(gè)人能力有限,本文僅對(duì)該領(lǐng)域的產(chǎn)品進(jìn)行了初步的完善和改進(jìn),實(shí)現(xiàn)了目前最為需求的功能,以后可做如下改進(jìn):
(1)本系統(tǒng)在定時(shí)方面,運(yùn)行的模式只加入了長開、長關(guān)和自動(dòng)查詢控制模式,而在這方面可以通過軟件的進(jìn)一步優(yōu)化,添加更多的運(yùn)行模式,例如,按星期控制開關(guān)的模式、例外情況的工作模式等等。
(2)本系統(tǒng)只設(shè)計(jì)了對(duì)一個(gè)繼電器開關(guān)進(jìn)行的控制,而從節(jié)能和功能完善性方面考慮,也可以同時(shí)對(duì)多組繼電器開關(guān)進(jìn)行控制,進(jìn)一步的調(diào)高了整機(jī)的工作效率,提升產(chǎn)品功能。


                                                      
                                                致謝
歷時(shí)將近兩個(gè)月的時(shí)間終于將這篇文檔寫完,在文檔的寫作過程中遇到了無數(shù)的困難和障礙,都在同學(xué)和老師的幫助下度過了。尤其要強(qiáng)烈感謝我的文檔指導(dǎo)老師---xx老師,他對(duì)我進(jìn)行了無私的指導(dǎo)和幫助,不厭其煩的幫助我對(duì)設(shè)計(jì)項(xiàng)目指導(dǎo)和改進(jìn)。另外,在校圖書館查找資料的時(shí)候,圖書館的老師也給我提供了很多方面的支持與幫助。在此向幫助和指導(dǎo)過我的各位老師表示最衷心的感謝!
感謝這篇文檔所涉及到的各位學(xué)者。本文引用了數(shù)位學(xué)者的研究文獻(xiàn),如果沒有各位學(xué)者的研究成果的幫助和啟發(fā),我將很難完成本篇文檔的寫作。
感謝我的同學(xué)和朋友,在我寫文檔的過程中給予我了很多相關(guān)素材,還在文檔的撰寫和排版過程中提供熱情的幫助。
由于我的學(xué)術(shù)水平有限,所寫文檔難免有不足之處,懇請(qǐng)各位老師和學(xué)友批評(píng)和指正!


附錄4
文獻(xiàn)翻譯
單片機(jī)嵌入式閃存技術(shù)的演變
摘要------隨著單片機(jī)(微型控制單元)的產(chǎn)品大量應(yīng)用,受各種各樣性能需求的驅(qū)動(dòng),嵌入式閃存技術(shù)經(jīng)歷了長足的進(jìn)步。應(yīng)用于自動(dòng)控制時(shí)要求高溫運(yùn)行下的高可靠性,應(yīng)用于智能卡時(shí)要求非常低功耗的嵌入式EEPROM,應(yīng)用于醫(yī)療時(shí)要求超低電壓驅(qū)動(dòng),這些都是嵌入式閃存發(fā)展的驅(qū)動(dòng)因素。與存儲(chǔ)單元技術(shù)一起發(fā)展的是,通過開發(fā)專用的設(shè)計(jì)平臺(tái),從而使用優(yōu)化的嵌入式閃存技術(shù),存儲(chǔ)器接口和總線設(shè)計(jì),以及整個(gè)芯片設(shè)計(jì)方法,解決了性能/功耗均衡的問題。采用分裂式柵極MONOS(金屬氧化氮氧化硅)閃存技術(shù),已經(jīng)實(shí)現(xiàn)了高級(jí)單片機(jī)產(chǎn)品系列,其廣泛應(yīng)用的產(chǎn)品包括了自動(dòng)控制和安全領(lǐng)域。
該文檔發(fā)表在:IC設(shè)計(jì)與技術(shù)(ICICDT),2011年IEEE國際會(huì)議,發(fā)行日期:2011年5月2日至4日,作者:Hidaka,H.
第一部分
介紹
由于2000年代的前十年間實(shí)時(shí)控制應(yīng)用的快速增長,閃存型單片機(jī)和采用嵌入式閃存的微控制器,在市場接受度方面有了跨越式的進(jìn)步?删幋a的嵌入式存儲(chǔ)器取代片上的掩模只讀存儲(chǔ)器引發(fā)了自適應(yīng)控制應(yīng)用和數(shù)據(jù)流應(yīng)用的快速增長。隨著生產(chǎn)和庫存的各個(gè)方面成本的降低,相比于不可更改的只讀存儲(chǔ)器或者使用獨(dú)立的閃存的單片機(jī),這種進(jìn)步已經(jīng)體現(xiàn)了它的創(chuàng)新,具有顯著地成本/價(jià)值的優(yōu)勢(shì)。
采用各種各樣的嵌入式閃存技術(shù)的閃存型單片機(jī)產(chǎn)品挑戰(zhàn)著新的市場的驅(qū)動(dòng)者,例如自動(dòng)控制,智能IC卡,醫(yī)療應(yīng)用,以及那些擴(kuò)展單片機(jī)市場的領(lǐng)域,而交互地嵌入式閃存已經(jīng)成為在嵌入式存儲(chǔ)技術(shù)領(lǐng)域中最成功和最大的商業(yè)應(yīng)用,它僅次于帶有COMS的嵌入式SRAM。在1990年代,閃存型單片機(jī)主要用于調(diào)試系統(tǒng)的原型。隨著閃存型單片機(jī)創(chuàng)新的進(jìn)步,幾乎所有的單片機(jī)市場都集中到閃存型單片機(jī)解決方案,嵌入式閃存技術(shù)演進(jìn)是最重要的代表。

圖1.  以存儲(chǔ)器的角度劃分的單片機(jī)產(chǎn)品的演變過程圖
本文回顧了過去和現(xiàn)在的發(fā)展?fàn)顩r,并從這些過程中的觀點(diǎn),電路和應(yīng)用方面,來探索單片機(jī)的嵌入式閃存技術(shù)在未來的發(fā)展方向。創(chuàng)新的因素不同于單獨(dú)的閃存和一個(gè)在以存儲(chǔ)器的角度劃分的演變圖中的未來的單片機(jī)概念。
第2部分
嵌入式閃存技術(shù)的演變
在圖2的存儲(chǔ)技術(shù)樹狀圖中,這些嵌入式應(yīng)用對(duì)存儲(chǔ)技術(shù)的選擇相當(dāng)
圖2. 閃存和嵌入式閃存技術(shù)的演變
的挑剔,因?yàn)楦鱾(gè)嵌入式應(yīng)用有其各自的具體的需求。因?yàn)閱渭兊氖褂酶呙芏乳W存技術(shù)的數(shù)據(jù)存儲(chǔ)器并不能滿足嵌入式應(yīng)用在可靠性和性能方面的要求,并且嵌入式閃存技術(shù)也在不斷的自我發(fā)展中。
圖3. 嵌入式閃存技術(shù).高密度的1Tr-NOR存儲(chǔ)單元正被高性能的在1.5Tr/2Tr存儲(chǔ)單元所取代。電荷儲(chǔ)存單元(Charge-trapping cells)正出現(xiàn)在一些要求可靠性的應(yīng)用里
這兩種技術(shù)的轉(zhuǎn)換特性對(duì)嵌入式閃存技術(shù)來說是至關(guān)重要的(圖3):
1.1T單元到1.5T(分裂柵結(jié)構(gòu))和2T單元擁有高性能/低功耗的優(yōu)點(diǎn),而
2.離散的電荷儲(chǔ)存單元技術(shù)(MONOS和Nano-dot)擁有更高的可靠性的優(yōu)點(diǎn)。
這些趨勢(shì)已經(jīng)表明正從標(biāo)準(zhǔn)化的單一的閃存產(chǎn)品(例如NAND-flash存儲(chǔ)器)開始衍變。雖然傳統(tǒng)的浮柵型的NOR結(jié)構(gòu)仍將在一些高密度的嵌入式應(yīng)用中繼續(xù)使用,但是由于單片機(jī)市場細(xì)分的多元化需求,預(yù)計(jì)不久將普遍性的使用分裂柵結(jié)構(gòu)和電荷儲(chǔ)存結(jié)構(gòu)。
考慮到分裂柵結(jié)構(gòu)和的相關(guān)先進(jìn)的COMS邏輯晶體管的兼容性,首先是接入門是更好的選擇(最后是控制柵),因?yàn)樗俏ㄒ坏挠梢粋(gè)薄膜電荷捕獲存儲(chǔ)層實(shí)現(xiàn),而不是通過層疊浮動(dòng)?xùn)艠O結(jié)構(gòu)。這可能表明其未來技術(shù)的融合點(diǎn)在于分裂柵單元和電荷儲(chǔ)存單元結(jié)構(gòu)中。這種選擇的優(yōu)點(diǎn)已經(jīng)在90nm的CMOS邏輯平臺(tái)上的實(shí)驗(yàn)被證明。
第3部分
最先進(jìn)的單片機(jī)設(shè)計(jì)
除了利用閃存型單片機(jī)的可編程性的特點(diǎn),通過設(shè)計(jì),生產(chǎn)和庫存控制來全面的降低成本,同時(shí)也因?yàn)椤扒度胧健钡母咝阅芎透邤?shù)據(jù)安全性,嵌入式正被優(yōu)先選擇使用。嵌入式閃存的優(yōu)勢(shì)和可能的缺點(diǎn)都列在了表1中。產(chǎn)品的設(shè)計(jì)應(yīng)該考慮利用嵌入式閃存的特性所帶來的整體成本和價(jià)值優(yōu)勢(shì),克服更高的晶片制造成本的缺點(diǎn)。通常,只有在統(tǒng)一的設(shè)計(jì)平臺(tái)上利用優(yōu)化的嵌入式閃存的宏命令,更多元化的單片機(jī)產(chǎn)品系列才能更有效的被支持。
通過減小設(shè)備的尺寸和電路技術(shù)的發(fā)展,穩(wěn)步的發(fā)展趨勢(shì)已經(jīng)在自動(dòng)控制領(lǐng)域的單片機(jī)應(yīng)用中得以體現(xiàn),十年間CPU性能增長了20倍,ROM容量增長了8倍。由于受限于其較小的系統(tǒng)芯片和一些需要在較高溫度下運(yùn)行的特定的技術(shù)要求,單片機(jī)的技術(shù)的發(fā)展力度并沒有最前沿的SOC系統(tǒng)那樣大。
                嵌入式閃存的優(yōu)點(diǎn):
      -通過內(nèi)部訪問路徑
                 (1)快速,低功耗
      (2)高數(shù)據(jù)安全性
      (3)高可靠性,低電磁干擾,低系統(tǒng)開銷
      (4)更高的設(shè)計(jì)自由度
存儲(chǔ)容量,接口,設(shè)計(jì)的功能和運(yùn)行電壓
           -通較低的激活率,相當(dāng)于加裝發(fā)熱冷卻器
                     -有助于優(yōu)化大規(guī)模集成電路功能和成本
    可能的嵌入式閃存的缺點(diǎn):
     (1)大、小容量的存儲(chǔ)器的成本較高
         (由于其低密度,較高的生產(chǎn)成本)
    (2)由于非標(biāo)準(zhǔn)化帶來的成本開支
(3)單一的資源
    (4)多種類型的存儲(chǔ)器整合困難
表1.和單獨(dú)的閃存相比嵌入式閃存的優(yōu)點(diǎn)和可能的缺點(diǎn)
當(dāng)前最先進(jìn)的單片機(jī)設(shè)計(jì)的要求實(shí)例如表2.所示。因?yàn)閱纹瑱C(jī)中的嵌入式閃存需要很高的訪問速度以滿足CPU的執(zhí)行速度,在許多應(yīng)用中都以性能需求為設(shè)計(jì)方向進(jìn)行設(shè)計(jì),這點(diǎn)與單獨(dú)的閃存產(chǎn)品是大為不同的。同時(shí),數(shù)據(jù)可靠性與耐高溫特性和低漏電特性一樣,它們都是大多數(shù)單片機(jī)應(yīng)用產(chǎn)品的重要指標(biāo)。
下面描述了當(dāng)前細(xì)分的單片機(jī)市場和嵌入式閃存規(guī)格的要求
1.自動(dòng)控制的應(yīng)用產(chǎn)品,如傳動(dòng)系統(tǒng)需要有高密度,耐高溫,有高可靠性的嵌入式閃存設(shè)計(jì)。利用當(dāng)前最先進(jìn)的分層傳感設(shè)計(jì),優(yōu)化存儲(chǔ)分塊和高可靠性的存儲(chǔ)單元技術(shù),在嵌入式閃存中隨機(jī)存取速度能高達(dá)10ns達(dá)到160?(max),以適用于這種應(yīng)用環(huán)境。
2.防止破解攻擊的安全功能設(shè)計(jì)在單片機(jī)智能IC卡產(chǎn)品設(shè)計(jì)中是占比很大的一個(gè)部分。用于數(shù)據(jù)操作的嵌入式EEPRROM,在編程和擦除時(shí)要具有相當(dāng)快的速度和較低驅(qū)動(dòng)電壓,這在非接觸式智能卡中是必不可少的要求,因此,這使得在這個(gè)領(lǐng)域中對(duì)嵌入式閃存技術(shù)的選擇是非常挑剔的。
圖4.高端自動(dòng)控制產(chǎn)品市場中CPU和嵌入式閃存性能需求趨勢(shì)
3新型的醫(yī)療/保健應(yīng)用產(chǎn)品需要具有能超低電壓驅(qū)動(dòng)或超低功耗的單片機(jī)產(chǎn)品。未來,嵌入式閃存的編程/擦除對(duì)于高級(jí)醫(yī)療產(chǎn)品中數(shù)據(jù)流的收集和存儲(chǔ)操作是很有必要的。

圖5.高端自動(dòng)控制產(chǎn)品市場中嵌入式閃存性能需求趨勢(shì)

表2.單片機(jī)產(chǎn)品中對(duì)嵌入式閃存的要求
這些需求的例子表明了多元化的單片機(jī)產(chǎn)品系列,意味著對(duì)嵌入式閃存的性能和功能有著的很廣的期望,在技術(shù)/電路/系統(tǒng)方面還有很多東西需要探索和開發(fā)利用。
圖6.描述了在嵌入式閃存設(shè)計(jì)中的關(guān)鍵的結(jié)構(gòu)和電路技術(shù)。在代碼存儲(chǔ)應(yīng)用程序中頻繁讀取的代碼,非升壓字線利用分裂柵單元結(jié)構(gòu)有望提高隨機(jī)讀取訪問速度和低功耗。在充電泵電路的編程/擦除操作會(huì)顯著影響嵌入式閃存的低功耗設(shè)計(jì)。因?yàn)殚W存技術(shù)在降低編程/擦除電壓方面存在固有的缺點(diǎn),因此,高能效的編程/擦除算法和優(yōu)化產(chǎn)生的高壓波形來緩解過度功耗的問題對(duì)于節(jié)能設(shè)計(jì)是非常重要的。
圖7.展示了目前使用分裂柵MONOS嵌入式閃存技術(shù)的單片機(jī)產(chǎn)品系列,在芯片上500k的EEPROM的編程/擦除容量以高達(dá)100MHz的讀取訪問都低于Tj=160(max)。電池驅(qū)動(dòng)的運(yùn)行電壓范圍低至1.62V。
圖6.嵌入式設(shè)計(jì)中主要的考慮方向
圖七. 90nm閃存型單片機(jī)產(chǎn)品
第四部分
節(jié)能型非易失性存儲(chǔ)器的影響
節(jié)能系統(tǒng)需要能以低耗能的方式頻繁的重寫非揮發(fā)性存儲(chǔ)器。當(dāng)待機(jī)丟失的問題在高級(jí)的大規(guī)模集成電路系統(tǒng)中成為一個(gè)關(guān)鍵的問題時(shí),通過間歇性的電源開關(guān)方案(圖.8),即將頻繁的開關(guān)空轉(zhuǎn)狀態(tài)轉(zhuǎn)換為關(guān)機(jī)狀態(tài),因此,嵌入式非易失性存儲(chǔ)器在降低系統(tǒng)功耗方面將發(fā)揮重要作用。頻繁的電源開/關(guān)需要頻繁的非易失性存儲(chǔ)和電路狀態(tài)與數(shù)據(jù)的檢索。在這里,非易失性存儲(chǔ)器需要高速且又節(jié)能的重寫性能。
圖.8間歇性系統(tǒng)運(yùn)行方案和常規(guī)關(guān)閉方案
圖.9描述了與電磁型RAM相比,各種嵌入式閃存技術(shù)的重寫速度和能耗。因?yàn)樵诠目刂品桨干细鱾(gè)系統(tǒng)的要求多種多樣,但所有當(dāng)前的嵌入式閃存和下一代的非易失性存儲(chǔ)器都適合用于間歇性的電源控制應(yīng)用。但是,高效省電的方案將要求能立即存儲(chǔ)和檢索電路的狀態(tài),且在芯片上要支持分布式的高速非易失性存儲(chǔ)。新興的非易失性存儲(chǔ)器具有一個(gè)意義非凡的特性,即利用其高速和低電壓的重寫能力(圖.10),它的每比特重寫的能耗比現(xiàn)有的嵌入式閃存低了好幾個(gè)數(shù)量級(jí),這一點(diǎn)可以有效的被開發(fā)利用。

圖.10 非易失性存儲(chǔ)器的重寫性能.重寫頻率范圍覆蓋系統(tǒng)中的電源開/關(guān)方案
參考文獻(xiàn):
[1] S. Kianian et al., Symp. VLSl Tech. Dig. Tech. Papers, pp.71-72 (1994).
[2] B. Eitan et al., Proc. Int. Conf. Solid State Devices and Materials,
     pp. 522-524 (1999).
[3] J. A. Yater et al., NVSMW, pp. 77-78 (2007).
[4] H. M. Lee et al., Dig. NVSMW, pp. 15-16 (2006).
[5] K. Baker, Proc. ICICDT, pp.185-189 (2009).
[6] J. A. Yater et al, International Memory Workshop (2009).
[7] W. Stenzl and J. Hupper, in EE-Times Europe, March 17 (2008).
                                                      


附錄4                           
[8] M. Hatanaka and H. Hidaka, Proc. Tech. Papers, ASSCC, pp.38-41 (2007).
[9] H.Hidaka, in chap. 7, ed. K. Zhang, “Embedded memories for nano scale VLSI”, Springer (2009).
[10] M. Zwerg et al., Dig. Tech. Papers, ISSCC, pp. 334-335 (2011).


Evolution of embedded flash memory technology for MCU
Embedded flash memory technology has undergone tremendous growth of demands with various performance requirements driven by expanded applications of MCU (Micro Controller Unit) products. High temperature operations with highest reliability for auto-motive applications, very low power embedded EEPROM functions for smart-cards, and ultra low-voltage operations for medical applications are driving factors in developing embedded flash technologies. Together with evolving memory cell technology, resolving performance/power trade-offs by developing dedicated design platforms with optimized eFlash technology, memory interface & bus designs, and the whole chip design methodologies, has realized advanced MCU products line-ups by split-gate MONOS flash technology with a wide range of applied products including auto-motive and security applications.
This paper appears in: IC Design & Technology (ICICDT), 2011 IEEE International Conference on, Issue Date: 2-4 May 2011, Written by: Hidaka, H.
SECTION I
INTRODUCTION
Flash-MCU, Micro-Controller Unit with embedded flash memory storage (eFlash), has made a leaping progress in the market acceptance according to the expansion of real-time control applications in 2000's. The programmable code storage by eFlash in place of on-chip mask-ROM has triggered rapid expansion of adaptive control and data stream applications. Together with over-all production and inventory cost reduction, this development has realized an innovation with remarkable cost/value advantage over MCU with fixed ROM or MCU with stand-alone flash memory.
Diversified eFlash technologies for flash-MCU products have challenged new market drivers such as auto-motive, smart-IC card, and medical applications and
have expanded the MCU market, while alternately eFlash has become the most successful, largest business in embedded memory technology only second to CMOS-inclusive embedded SRAM. In 1990's Flash-MCU was mainly used in proto-types for debugging systems. With the advancement of Flash-MCU innovation, almost all the MCU market has been focused onto flash-MCU solutions (Fig. 1), where eFlash technology evolution represents the most important factor.


Fig. 1. Evolution of MCU products in a memory-centric view.
This paper reviews the past and current status and explore the future directions of eFlash technology for MCU, from the viewpoints of process, circuit, and applications. Innovative factors different from stand-alone flash memory and a future MCU concept in the memory-centric view are also presented.
SECTION II
EVOLUTION OF EMBEDDED FLASHTECHNOLOGY
In the flash memory technology tree in Fig. 2, those suitable for embedded uses have been quite selective because of requirements specific to embedded uses. Because high-density flash technologies for stand-alone data memory don't meet the requirements for embedded uses in reliability and performance, eFlash technologies have evolved on its own.
Fig. 2. Evolution of Flash and eFlash memory technologies.
Fig. 3. Embedded flash memory technologies. 1Tr-NOR cells for high density are giving way to 1.5Tr/2Tr cell for performance. Charge-trapping cells are emerging in some applications for reliability.
Two technology transitions specific to eFlash technologies have been remarkable (Fig. 3):
1T cell to 1.5T (split-gate structure) and 2T cells for high-performance/low power, and Discrete charge-trapping cell technology (MONOS and Nano-dot[5]) for higher reliability.
These trends prove a deviation from the standardized standalone flash memory products such as NAND-flash memories. Although the conventional floating-gate NOR structure will survive in some of the high-density embedded uses, pervasive use of split-gate and charge-trapping storage structures are expected according to the requirements by diversified MCU market segments.
Considering the structural compatibility of the split-gate with advanced underlying CMOS logic transistor, Access-Gate first (Control-Gate last), which is only realized by a thin-film charge-trapping storage layer, not by stacked floating gate structure, is preferred. This may indicate that the technological convergence point lies in the split-gate, charge-trapping cell structure in the future. The advantage of this choice has been proved by the implementation in the CMOS logic platforms at 90nm[6],[7].
SECTION III
STATE-OF-THE-ART MCU DESIGN
In addition to the over-all cost reduction through design, production and inventory control by programmability in Flash-MCU, the “embedded-ness” is favorably utilized for high performance and data security properties. The advantages and possible drawbacks of embedded flash memory are listed in Table. 1. Product design should consider utilizing embedded flash properties with the overall cost and value advantages over-coming drawbacks of higher wafer process cost to incorporate flash memory. In general much diversified MCU product line-ups are efficiently supported only by a unified design platform to employ optimized eFlash macros.
By scaling the device and by circuit developments, a steady scaling trend has been realized in the auto-motive applications of MCUs (Figs. 4 and 5), with x20 CPU performance growth by 10 years and x8 ROM capacity growth by 10 years. The technology node development for MCU is not so aggressive as most-advanced SOCs because of the smaller system on the chip and somewhat tailored technology for required higher temperature operations.
TABLE1. ADVANTAGESAND POSSIBLE DRAWBACKSOF EMBEDDED FLASH MEMORY,ASCOMPARED WITH STAND-ALONE FLASH MEMORY.
Example requirements to current state-of-the-art MCU designs are shown in Table.2. Because eFlash in MCU is inherently required a high-speed access to meet the CPU execution speed, performance-oriented design is required in many applications, which is quite different from stand-alone flash memory products. Also data reliability as well as high-temperature and low-leakage product strategy are important factors in most of MCU applications.
Requirements here describe the natures of current MCU market segments as well as eFlash specifications.
  •          Auto-motive applications such as power-train require high-density, high-temperature and highly reliable eFlash designs. A random access as fast as 10ns at 160 ?(max) in eFlash is achieved by the current state-of-the-art design with hierarchical sensing, optimized memory mat division, and highly reliable memory cell technology to fit this application.
  •          Security functions against attacks account for a large portion of the MCU design for smart-IC card applications. Embedded EEPROM for data manipulation functions with quite fast and low-power program/erase operation is essential in non-contact smart-cards, which makes this field of application very selective in the choice of eFlash technologies.
  •          Very low-voltage/low-power MCU products are required for emerging medical/health-care applications with battery operations. eFlash program/erase is necessary in the future data collection and storage for data streaming operations in the advanced health-care environments.


Fig. 4. Performance trend in CPU and eFlash for high-end auto-motive market.


Fig. 5. Trend in eFlash capacity for high-end auto-motive market.


TABLE.2. REQUIREMENTS FOR EMBEDDEDFLASH MEMORY IN MCU APPLICATIONS.
These sample requirements indicate much diversified MCU product line-ups, suggesting very wide expectations to eFlash performance and functions, much to be explored and exploited in technology/circuit/system developments.
Fig. 6 depicts key architecture and circuit technologies in eFlash designs. In frequent read operations in the code storage applications, non-boosted word-line utilizing a split-gate cell structure is promising to enhance the random read access speed and for low-power consumptions. Lowe-power design in eFlash is strongly affected by the charge-pumping circuitry in program/erase operations. Because flash memory technologies have inherent difficulty in scaling down the program/erase voltage, energy-efficient program/erase algorithms and optimally generated high-voltage waveforms to mitigate excessive power consumption are important in power-aware designs.
Fig. 7 shows a current MCU product line-up employing a split-gate MONOS eFlash technology, with up to 100MHz read access at code storage with 500K program/erase capability in EEPROM on the chip, all under. The operating voltage ranges down to 1.62V for battery operations.
Fig. 6. Key considerations in eFlash design[8], [9].
Fig. 7. 90nm flash-MCU products.
SECTION IV
IMPACT OF ENERGY-EFFICIENT NV-MEMORY
Energy-efficient system approaches require low-energy frequent re-write performance of non-volatile memories. As the stand-by leakage problem has emerged as a critical factor in the advanced LSI systems, embedded non-volatile memory will play more important roles in reducing the system power by intermittent power switching schemes (Fig. 8), to frequently switch idling states into power-off states. Frequent power On/Off necessitates frequent non-volatile store and retrieval of circuits states and data. Fast and energy-efficient re-write is required for non-volatile memories in this context.
Fig. 8. Intermittent system operations with normally off schemes.
Fig. 9 describes re-write speed and energy in various eFlash technologies compared with Magnetic-RAM. Because system requirements are diverse in power control schemes, all the current eFlash and next-generation NV-memories are good for uses in intermittent power control applications. However, efficient power-down schemes will store and retrieve circuit states instantly, favoring distributed fast non-volatile storage on the chip. One remarkable feature realized by emerging NV memory is orders-of-magnitude lower energy per bit re-write than existing eFlash by fast and low-voltage re-write capabilities (Fig. 10), which can be exploited effectively[10].
Programmability provided on the chip has been an important factor in the design and cost structure of LSI (Table 3). Beginning with the ROM-based logic operated by stored instructions in the CPU, alterable/reconfigurable logic organizations have emerged in the 2nd stage, where the main players are Flash-MCU and re-configurable logic products. The 3-rd stage realized by NV-RAM will see a much broader possibility of innovation by energy-efficient NV memories.
SECTION V
CONCLUUSIONS
Flash-MCU has achieved a rapid market penetration attributed to the leap in value/cost for innovation by virtue of evolving eFlash technologies. eFlash cell and circuit technologies will see some convergence points quite different from stand-alone flash memory, according to diversified market requirements. Designs of energy-efficient MCU and of MCU for energy-efficient systems will be the next focus of technology, circuit, and system co-development in emerging applications, where non-volatile memory technologies will play important roles in the scaled LSI environments.
Fig. 9. Re-write performance by energy/bit in various eFlash and MRAM. Re-write energy and time by memory cell and periphery circuitry.
Fig. 10. Re-write performance by non-volatile memories. Re-write frequency requirement ranges over power On/Off schemes in the system.
TABLE 3. EVOLUTION OF ON-Chip Programmability[9].
ACKNOWLEDGEMENT
The author would like to express sincere thanks to all the members of Embedded Memory Core Development Division, Renesas Electronics Corp. for their supports.
REFERENCES
1. S. Kianian et al., Symp. VLSl Tech. Dig. Tech. Papers, pp.71-72 (1994).
2. B. Eitan et al., Proc. Int. Conf. Solid State Devices and Materials, pp. 522-524 (1999).
3. J. A. Yater et al., NVSMW, pp. 77-78 (2007).
4. H. M. Lee et al., Dig. NVSMW, pp. 15-16 (2006).
5. K. Baker, Proc. ICICDT, pp.185-189 (2009).
6. J. A. Yater et al, International Memory Workshop (2009).
7. W. Stenzl and J. Hupper, in EE-Times Europe, March 17 (2008).
8. M. Hatanaka and H. Hidaka, Proc. Tech. Papers, ASSCC, pp.38-41 (2007).
9. H.Hidaka, in chap. 7, ed. K. Zhang, "Embedded memories for nano scale VLSI", Springer (2009).
10. M. Zwerg et al., Dig. Tech. Papers, ISSCC, pp. 334-335 (2011).

附錄5
硬件電路原理圖
附錄6
程序源代碼
主程序



  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "delay1ms.h"
  4. #include "ds1302.h"
  5. #include "display.h"
  6. #define uchar unsigned char;
  7. unsigned char code digit1[11]={"0123456789-"};     //定義字符數(shù)組顯示數(shù)字,主要用于LCD 的顯示
  8. unsigned char code digit2[2]={"GK"};                //digit[0]斷開,digit[1]閉合
  9. unsigned char code digit3[16]={"0123456789ABCDEF"};
  10. unsigned char keyflag=4; //判斷鍵盤是否有輸入              ?
  11. unsigned char QH_FLAG1=1;
  12. extern unsigned char model_flag;//長開,長關(guān),自動(dòng),模式標(biāo)志
  13. unsigned char xdata dings[16][7]={{0,0,0,1,1,0,14},{0,0,0,1,1,0,14}, {0,0,0,1,1,0,14},{0,0,0,1,1,0,14}, {0,0,0,1,1,0,14},{0,0,0,1,1,0,14},{0,0,0,1,1,0,14},{0,0,0,1,1,0,14},{0,0,0,1,1,0,14},{0,0,0,1,1,0,14},{0,0,0,1,1,0,14},{0,0,0,1,1,0,14},{0,0,0,1,1,0,14},{0,0,0,1,1,0,14},{0,0,0,1,1,0,14}, {0,0,0,1,1,0,14}};                                          //0年,0周,0月,0日,0時(shí),0分,0秒
  14. char xdata dings_kaig[16]={0,0,0,0,
  15.                                                                                              0,0,0,0,
  16.                                                                                                        0,0,0,0,
  17.                                                                                                        0,0,0,0};                //0斷開,1閉合
  18. char time_buf1[7] ={0,0,0,0,0,0,0};
  19. unsigned char time_buf2[7] ={0,0,0,0,0,0,0};
  20. unsigned char second1,minute1,hour1,day1,month1,year1;      //分別儲(chǔ)存苗、分、小時(shí),日,月,年
  21. unsigned char open_close_pd=1;
  22. sfr AUXR=0x8e;
  23. bit K1_FLAG1=0;                                                        //定義按鍵標(biāo)志位,當(dāng)按下K1鍵時(shí),該位置1,K1鍵未按下時(shí),該位為0。
  24. unsigned char ReadValue1;
  25. unsigned char ReadValue2;
  26. unsigned char i=0;//i 用于for循環(huán)
  27. unsigned char j;//j 用于for循環(huán)
  28. unsigned char k=0;//k用于調(diào)整數(shù)組數(shù)目
  29. void KeyProcess1();
  30. void main()
  31. {
  32.    RELAY=0;//默認(rèn)繼電器斷開
  33.    model_flag=3;
  34. /************************************************************
  35. 函數(shù)功能:紅外初始化
  36. ************************************************************/
  37.                     EA=1;        //開啟總中斷
  38.        EX1=1;       //開外中斷1
  39.        ET0=1;       //定時(shí)器T0中斷允許
  40.        IT1=1;       //外中斷的下降沿觸發(fā)
  41.        TMOD=0x01;   //使用定時(shí)器T0的模式1            
  42.                  TR0=0;       //定時(shí)器T0關(guān)閉
  43. /**********************************************************/
  44.    int_ds1302();
  45.    LCD_init();
  46.    delay1ms(1);
  47.    while(1)
  48.   {
  49.                 LCD_writecom(0x41+0x80);  // 設(shè)置顯示x位置為第一行的第1個(gè)字
  50.      delay1ms(10);
  51.      LCD_writedata(digit1[model_flag]);
  52.               LCD_writecom(0x4f+0x80);  // 設(shè)置顯示x位置為第一行的第1個(gè)字
  53.      delay1ms(10);
  54.      LCD_writedata(digit1[keyflag]);
  55.               if(K5==0)
  56.               {
  57.                             delay1ms(10);
  58.                             while(!K5);
  59.                             Ds1302_beep();
  60.                             keyflag++;
  61.                             if(keyflag>4)
  62.                             keyflag=1;
  63.               }
  64.               if(keyflag==1)                               //校時(shí)
  65.               {
  66.                  time_get_show();
  67.                  Ds1302_QLShow();
  68.               }
  69.               if (keyflag==2)                                          //復(fù)位和模式切換
  70.               {
  71.                             if(K4==0)                                             //k4 復(fù)位
  72.                               {
  73.                                             delay1ms(10);
  74.                                             while(!K4);
  75.                                           Ds1302_beep();
  76.                                           write_ds1302(0x8E,0x00);                 //根據(jù)寫狀態(tài)寄存器命令字,寫入不保護(hù)指令
  77.                                              write_ds1302(0x80,((00/10)<<4|(00%10)));   //根據(jù)寫秒寄存器命令字,寫入秒的初始值
  78.                                           write_ds1302(0x82,((00/10)<<4|(00%10)));   //根據(jù)寫分寄存器命令字,寫入分的初始值
  79.                                           write_ds1302(0x84,((00/10)<<4|(00%10))); //根據(jù)寫小時(shí)寄存器命令字,寫入小時(shí)的初始值
  80.                                           write_ds1302(0x86,((1/10)<<4|(1%10))); //根據(jù)寫日寄存器命令字,寫入日的初始值
  81.                                           write_ds1302(0x88,((1/10)<<4|(1%10))); //根據(jù)寫月寄存器命令字,寫入月的初始值
  82.                                           write_ds1302(0x8c,((14/10)<<4|(14%10)));  //根據(jù)寫年寄存器命令字,寫入年的初始值
  83.                                           write_ds1302(0x90,0xa5);                //打開充電功能 選擇2K電阻充電方式
  84.                                           write_ds1302(0x8E,0x80);                                             //根據(jù)寫狀態(tài)寄存器命令字,寫入保護(hù)指令
  85.             for(i=0;i<16;i++)
  86.                                           {dings_kaig[i]=0;}
  87.                                           for (i=0;i<16;i++)
  88.                                                         for(j=0;j<7;j++)
  89.                                                         {dings[i][j]=0;}
  90.                                               model_flag=1;
  91.                                           }
  92.                             if(K3==0)                                             //K3模式切換
  93.                               {               
  94.                                delay1ms(10);
  95.                                while(!K3);
  96.                                Ds1302_beep();
  97.                                model_flag++;
  98.                                if( model_flag>3)
  99.                                { model_flag=1;}
  100.                                }                           
  101.                             time_show();
  102.                             Ds1302_QLShow();
  103.               }
  104.                 if(keyflag==3)
  105.               {
  106.                
  107.                  if(K1==0)
  108.                  {
  109.                   delay1ms(10);
  110.                             if(K1==0)
  111.                             {
  112.                               while(!K1);
  113.                               Ds1302_beep();
  114.                               k++;
  115.                     if(k>15)
  116.                       {k=0;}
  117.                               QH_FLAG1=1;
  118.                                }               
  119.        }
  120.                  LCD_writecom(0x4e+0x80);  // 設(shè)置顯示x位置為第一行的第1個(gè)字
  121.        delay1ms(10);
  122.        LCD_writedata(digit3[k]);              //顯示第幾組的時(shí)間設(shè)定值
  123.                  for(j=0;j<7;j++)
  124.                             { time_buf1[j]=dings[k][j];              }
  125.                  KeyProcess1();
  126.                  LCD_writecom(0x42+0x80);    //顯示三個(gè)空格防止亂碼
  127.                  delay1ms(1);
  128.                  LCD_writedata(' ');   
  129.                  delay1ms(1);                                                  //延時(shí)1ms給硬件一點(diǎn)反應(yīng)時(shí)間
  130.                   second1=dings[k][0];
  131.                               Ds1302_DisplaySecond(0);          //顯示秒
  132.                               minute1=dings[k][1];
  133.                             Ds1302_DisplayMinute(minute1);                     //顯示分
  134.                    hour1=dings[k][2];
  135.                               Ds1302_DisplayHour(hour1);                           //顯示小時(shí)
  136.                    day1= dings[k][3];
  137.                               Ds1302_DisplayDay(day1);                //顯示日
  138.                               month1=dings[k][4];
  139.                               Ds1302_DisplayMonth(month1);            //顯示月
  140.                               year1=dings[k][6];
  141.                               Ds1302_DisplayYear(year1);              //顯示年
  142.                             LCD_writecom(0x4c+0x80);    //寫顯示地址,將在第2行第7列開始顯示
  143.                   delay1ms(1);
  144.                   LCD_writedata(digit2[dings_kaig[k]]);    //將百位數(shù)字的字符常量寫入LCD
  145.                             Ds1302_QLShow();//在對(duì)應(yīng)位置顯示date ——
  146.                                }            
  147.                  if(keyflag==4)                                                          //無輸入模式
  148.                  {
  149.                                time_show();
  150.                             Ds1302_QLShow();
  151.                             switch(model_flag)
  152.                                           {
  153.                                           case 1:                                          //長開模式              ,一直閉合
  154.                                           RELAY=1;
  155.                                           LCD_writecom(0x4c+0x80);
  156.                                           delay1ms(5);
  157.                                           LCD_writedata(digit2[1]);
  158.                                           break;
  159.                                           case 2:                                          //長關(guān)模式 ,一直斷開
  160.                                           RELAY=0;
  161.                                           LCD_writecom(0x4c+0x80);
  162.                                           delay1ms(5);
  163.                                           LCD_writedata(digit2[0]);
  164.                                           break;                              
  165.                                           case 3:                                          //自動(dòng)模式
  166.                                                         ReadValue2=read_ds1302(0x8d);                            //年
  167.                                                         time_buf2[6]=((ReadValue2&0xf0)>>4)*10 + (ReadValue2&0x0F);//將讀出數(shù)據(jù)轉(zhuǎn)化
  168.                                                         ReadValue2=read_ds1302(0x89);                            //月
  169.                                                         time_buf2[4]=((ReadValue2&0x70)>>4)*10 + (ReadValue2&0x0F);//將讀出數(shù)據(jù)轉(zhuǎn)化
  170.                                     ReadValue2=read_ds1302(0x87);                            //日
  171.                                                         time_buf2[3]=((ReadValue2&0x70)>>4)*10 + (ReadValue2&0x0F);//將讀出數(shù)據(jù)轉(zhuǎn)化
  172.                                                         ReadValue2=read_ds1302(0x85);                            //              時(shí)
  173.                                                         time_buf2[2]=((ReadValue2&0x70)>>4)*10 + (ReadValue2&0x0F);//將讀出數(shù)據(jù)轉(zhuǎn)化
  174.                                     ReadValue2=read_ds1302(0x83);                              //分
  175.                                                         time_buf2[1]=((ReadValue2&0x70)>>4)*10 + (ReadValue2&0x0F);//將讀出數(shù)據(jù)轉(zhuǎn)化                                          //自動(dòng)模式
  176.                                           for(i=0;i<16;i++)
  177.                                                         {
  178.               if((time_buf2[6]==dings[k][6])&&(time_buf2[4]==dings[k][4])&&(time_buf2[3]==dings[k][3])&&(time_buf2[2]==dings[k][2])&&(time_buf2[1]==dings[k][1]))
  179.                                                                                       {if(dings_kaig[k]==1)
  180.                                                                                        open_close_pd=1;
  181.                                                                                        else
  182.                                                                                        open_close_pd=0;
  183.                                                                                     }                           
  184.                                                         }
  185.                                                         RELAY=open_close_pd;
  186.                                                         LCD_writecom(0x4c+0x80);
  187.                                                         delay1ms(5);
  188.                                                         LCD_writedata(digit2[open_close_pd]);
  189.                                           }
  190.                  }
  191. }
  192. }  
  193.   /********以下是定時(shí)按鍵處理函數(shù)********/
  194. void KeyProcess1()
  195. {
  196.     write_ds1302(0x8e,0x00);                                            //ds13202寄存器允許寫

  197.    if(K2==0)                               //K2鍵調(diào)整所要的位,向右企切換年月日
  198.   {
  199.                 delay1ms(10);                                                        //延時(shí)去抖
  200.                 if(K2==0)
  201.                 {
  202.                                           while(!K2);                                                                                    //等待K2鍵釋放
  203.                                           QH_FLAG1++;
  204.                                           if(QH_FLAG1>6)
  205.                                           { QH_FLAG1=1;
  206.                                           }            
  207.               }
  208.   }                             
  209.                  switch(QH_FLAG1)
  210.                             {case 1:
  211.                                     LCD_writecom(0x4d+0x80);  // 設(shè)置顯示位置為第一行的第1個(gè)字
  212.                 delay1ms(1);
  213.                                                         LCD_writedata('Y');
  214.                                                         delay1ms(1); break;
  215.                             case 2:
  216.                                     LCD_writecom(0x4d+0x80);  // 設(shè)置顯示位置為第一行的第1個(gè)字
  217.                 delay1ms(1);
  218.                                                         LCD_writedata('M');
  219.                                                         delay1ms(1);  break;
  220.                    case 3:
  221.                                     LCD_writecom(0x4d+0x80);  // 設(shè)置顯示位置為第一行的第1個(gè)字
  222.                 delay1ms(1);
  223.                                                         LCD_writedata('D');
  224.                                                         delay1ms(1);  break;
  225.                               case 4:
  226.                                     LCD_writecom(0x4d+0x80);  // 設(shè)置顯示位置為第一行的第1個(gè)字
  227.                 delay1ms(1);
  228.                                                         LCD_writedata('H');
  229.                                                         delay1ms(1);  break;
  230.                               case 5:
  231.                                     LCD_writecom(0x4d+0x80);  // 設(shè)置顯示位置為第一行的第1個(gè)字
  232.                 delay1ms(1);
  233.                                                         LCD_writedata('F');
  234.                                                         delay1ms(1);  break;
  235.                               case 6:
  236.                                                           LCD_writecom(0x4d+0x80);  // 設(shè)置顯示位置為第一行的第1個(gè)字
  237.                 delay1ms(1);
  238.                                                         LCD_writedata('S');
  239.                                                         delay1ms(1);  break;
  240.                             }                                                  
  241.     if(K3==0)                              // K3鍵用來進(jìn)行加1調(diào)整
  242.               {
  243.                             delay1ms(10);                      //延時(shí)去抖
  244.                     if(K3==0)                              
  245.                             {
  246.                                           while(!K3);                                                                                    //等待K3鍵釋放
  247.                                           switch(QH_FLAG1)
  248.                             {              case 1:      
  249.                                           time_buf1[6]=time_buf1[6]+1;                                   //年加1
  250.                                    if(time_buf1[6]>99) time_buf1[6]=0;                             //當(dāng)年加到60時(shí)初始化為0
  251.                         dings[k][6]=time_buf1[6];
  252.                                 break;
  253.                                           case 2:      
  254.                                           time_buf1[4]=time_buf1[4]+1;                                   //月加1
  255.                                    if(time_buf1[4]>12) time_buf1[4]=1;                             //當(dāng)分鐘加到60時(shí)初始化為0
  256.                         dings[k][4]=time_buf1[4];
  257.             break;
  258.                                           case 3:      
  259.                                           time_buf1[3]=time_buf1[3]+1;         //日加1               
  260. if((time_buf1[4]==1)||(time_buf1[4]==3)||(time_buf1[4]==5)||(time_buf1[4]==7)||(time_buf1[4]==8)||(time_buf1[4]==10)||(time_buf1[4]==12))
  261.                                              {if(time_buf1[3]>31)
  262.                                                             time_buf1[3]=1;
  263.                                                         }
  264.                             if((time_buf1[4]==4)||(time_buf1[4]==6)||(time_buf1[4]==9)||(time_buf1[4]==11))
  265.                                              {if(time_buf1[3]>30)
  266.                                                             time_buf1[3]=1;
  267.                                                         }
  268.                                           if(time_buf1[4]==2)
  269.                                           {              if((time_buf1[6]%4)&&(time_buf1[3]>28)) time_buf1[3]=1;
  270.                                               if(!(time_buf1[6]%4)&&(time_buf1[3]>29)) time_buf1[3]=1;
  271.                                           }
  272.                                           dings[k][3]=time_buf1[3];
  273.                                  break;
  274.                                           case 4:      
  275.                                           time_buf1[2]=time_buf1[2]+1;                                   //小時(shí)加1
  276.                                    if(time_buf1[2]>23) time_buf1[2]=0;                             //當(dāng)分鐘加到60時(shí)初始化為0
  277.                         dings[k][2]=time_buf1[2];
  278.                                           break;
  279. case 5:      
  280.                                           time_buf1[1]=time_buf1[1]+1;                                   //小時(shí)加1
  281.                                    if(time_buf1[1]>59) time_buf1[1]=0;                             //當(dāng)分鐘加到60時(shí)初始化為0
  282.                         dings[k][1]=time_buf1[1];
  283.                                           break;
  284.                                           case 6:
  285.                                             dings_kaig[k]=dings_kaig[k]+1;
  286.                                             if(dings_kaig[k]>1)
  287.                                             dings_kaig[k]=0;
  288.                                             LCD_writecom(0x4c+0x80);    //寫顯示地址,將在第2行第7列開始顯示
  289.                         delay1ms(1);
  290.                         LCD_writedata(digit2[dings_kaig[k]]);    //將百位數(shù)字的字符常量寫入LCD
  291.                                           }
  292.                                           delay1ms(500);                              //以下為連發(fā)功能  約0.5s觸發(fā)連發(fā)功能
  293.                                           while(K3==0)                                            
  294.                                           {
  295.                                                         delay1ms(150);                //150ms加一次
  296.                                           switch(QH_FLAG1)
  297.                             {              case 1:      
  298.                                           time_buf1[6]=time_buf1[6]+1;                                   //年加1
  299.                                    if(time_buf1[6]>99) time_buf1[6]=0;                             //當(dāng)分鐘加到60時(shí)初始化為0
  300.                        
  301.                                           dings[k][6]=time_buf1[6];
  302.                                           LCD_writecom(0x07+0x80);    //寫顯示地址,將在第2行第7列開始顯示
  303.                       delay1ms(1);               
  304.                       LCD_writedata(digit1[time_buf1[6]/10]);    //將百位數(shù)字的字符常量寫入LCD,不能直接寫入,必須轉(zhuǎn)化
  305.                       delay1ms(1);
  306.                       LCD_writedata(digit1[time_buf1[6]%10]);    //將十位數(shù)字的字符常量寫入LCD
  307.                       delay1ms(1);
  308.                                           break;
  309.                                           case 2:      
  310.                                           time_buf1[4]=time_buf1[4]+1;                                   //月加1
  311.                                    if(time_buf1[4]>12) time_buf1[4]=1;                             //當(dāng)分鐘加到60時(shí)初始化為0
  312.                         dings[k][4]=time_buf1[4];
  313.                          break;
  314.                                           case 3:      
  315.                                           time_buf1[3]=time_buf1[3]+1;         //日加1               
  316.                                           if((time_buf1[4]==1)||(time_buf1[4]==3)||(time_buf1[4]==5)||(time_buf1[4]==7)||(time_buf1[4]==8)||(time_buf1[4]==10)||(time_buf1[4]==12))
  317.                                              {if(time_buf1[3]>31)
  318.                                                             time_buf1[3]=1;
  319.                                                         }
  320.                             if((time_buf1[4]==4)||(time_buf1[4]==6)||(time_buf1[4]==9)||(time_buf1[4]==11))
  321.                                              {if(time_buf1[3]>30)
  322.                                                             time_buf1[3]=1;
  323.                                                         }
  324.                                           if(time_buf1[4]==2)
  325.                                           {              if((time_buf1[6]%4)&&(time_buf1[3]>28)) time_buf1[3]=1;
  326.                                               if(!(time_buf1[6]%4)&&(time_buf1[3]>29)) time_buf1[3]=1;
  327.                                           }
  328.                                           dings[k][3]=time_buf1[3];
  329.                                              break;
  330. case 4:      
  331.                                           time_buf1[2]=time_buf1[2]+1;                                   //小時(shí)加1
  332.                                    if(time_buf1[2]>23) time_buf1[2]=0;                             //當(dāng)分鐘加到60時(shí)初始化為0
  333.                         dings[k][2]=time_buf1[2];
  334.                                           break;
  335. case 5:      
  336.                                           time_buf1[1]=time_buf1[1]+1;                                   //小時(shí)加1
  337.                                    if(time_buf1[1]>59) time_buf1[1]=0;                             //當(dāng)分鐘加到60時(shí)初始化為0
  338.                         dings[k][1]=time_buf1[1];
  339.                                 break;
  340.                                           }
  341.                                           }
  342.                    }
  343.               }
  344.               if(K4==0)                              // 減
  345.               {            
  346.                   delay1ms(10);                      //延時(shí)去抖
  347.                     if(K4==0)                              
  348.                             {
  349.                                           while(!K4);                                                                                    //等待K4鍵釋放
  350.                                           switch(QH_FLAG1)
  351.                                {            
  352.                                 case 1:      
  353.                                           time_buf1[6]=time_buf1[6]-1;                                   //年減1
  354.                                    if(time_buf1[6]<0) {time_buf1[6]=99;}                             //當(dāng)年到60時(shí)初始化為0
  355.                         dings[k][6]=time_buf1[6];
  356.                                           break;
  357.                                           case 2:      
  358.                                           time_buf1[4]=time_buf1[4]-1;                                   //年減1
  359.                                    if(time_buf1[4]<1) time_buf1[4]=12;                             //當(dāng)分鐘加到60時(shí)初始化為0
  360.                         dings[k][4]=time_buf1[4];
  361.                                           break;
  362.                                           case 3:      
  363.                                           time_buf1[3]=time_buf1[3]-1;                                   //年減1
  364. if((time_buf1[4]==1)||(time_buf1[4]==3)||(time_buf1[4]==5)||(time_buf1[4]==7)||(time_buf1[4]==8)||(time_buf1[4]==10)||(time_buf1[4]==12))
  365.                                              {if(time_buf1[3]<1)
  366.                                                             time_buf1[3]=31;
  367.                                                         }
  368.                             if((time_buf1[4]==4)||(time_buf1[4]==6)||(time_buf1[4]==9)||(time_buf1[4]==11))
  369.                                              {if(time_buf1[3]<1)
  370.                                                             time_buf1[3]=30;
  371.                                                         }
  372.                                           if(time_buf1[4]==2)
  373.                                           {              if((time_buf1[6]%4)&&(time_buf1[3]<1)) time_buf1[3]=28;
  374.                                               if(!(time_buf1[6]%4)&&(time_buf1[3]<1)) time_buf1[3]=29;
  375.                                           }
  376.                                    dings[k][3]=time_buf1[3];
  377.                                           break;
  378.                                           case 4:      
  379.                                           time_buf1[2]=time_buf1[2]-1;                                   //年減1
  380.                                    if(time_buf1[2]<0) time_buf1[2]=23;                             //當(dāng)分鐘加到60時(shí)初始化為0
  381.                         dings[k][2]=time_buf1[2];
  382.                                           break;
  383.                                           case 5:      
  384.                                           time_buf1[1]=time_buf1[1]-1;                                   //年減1
  385.                                    if(time_buf1[1]<0) time_buf1[1]=59;                             //當(dāng)分鐘加到60時(shí)初始化為0
  386.                         dings[k][1]=time_buf1[1];
  387.                                           break;
  388.                             case 6:
  389.                                             dings_kaig[k]=dings_kaig[k]-1;
  390.                                             if(dings_kaig[k]<0)
  391.                                             {dings_kaig[k]=1;}
  392.                                             LCD_writecom(0x4c+0x80);    //寫顯示地址,將在第2行第7列開始顯示
  393.                         delay1ms(1);
  394.                         LCD_writedata(digit2[dings_kaig[k]]);    //將百位數(shù)字的字符常量寫入LCD
  395.                                             break;            
  396.                                             }
  397. ……………………

  398. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

完整的Word格式文檔51黑下載地址:
基于單片機(jī)的自動(dòng)定時(shí)開關(guān)插座的設(shè)計(jì).doc (11.87 MB, 下載次數(shù): 168)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:514540 發(fā)表于 2019-4-17 14:07 | 只看該作者
請(qǐng)問樓主這是控制模塊嗎,演示的圖片好像沒有看到插座啊
回復(fù)

使用道具 舉報(bào)

板凳
ID:532047 發(fā)表于 2019-5-9 22:29 | 只看該作者
樓主,有原件清單嗎
回復(fù)

使用道具 舉報(bào)

地板
ID:532047 發(fā)表于 2019-5-9 22:43 | 只看該作者
樓主,有原件清單嗎
回復(fù)

使用道具 舉報(bào)

5#
ID:700403 發(fā)表于 2020-2-29 22:45 | 只看該作者
多謝樓主提供思路
回復(fù)

使用道具 舉報(bào)

6#
ID:686739 發(fā)表于 2020-3-1 07:48 來自手機(jī) | 只看該作者
學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

7#
ID:711816 發(fā)表于 2020-3-19 19:44 | 只看該作者
小白參觀一下
回復(fù)

使用道具 舉報(bào)

8#
ID:200118 發(fā)表于 2023-8-31 11:06 | 只看該作者
收藏。。。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表