裴德鳳
(合肥通用機械研究院,安徽 合肥 230031)
一般家用電器產品在使用過程中遇到忽然停電斷電的情況后,恢復供電,只會進入通電待機狀態不會重新啟動,而這種突發情況往往會給用戶帶來不必要的麻煩,當單片機在意外掉電,再恢復供電時,掉電前的一些存儲在RAM區的數據隨即丟失,為了避免這種情況發生,系統增加了掉電記憶功能,即單片機在正常工作時,用戶設定的一些參數,以及系統采集的數據在斷電前寫入到E2PROM存儲器中,再來電時,系統自動從存儲器中讀出信息,按照設定的方式運行.本文以空調系統為例,介紹如何實現掉電記憶功能.
24C02芯片內部含有256*8位低功耗CMOS的E2PROM,該芯片采用I2C總線形式傳送數據,具有體積小、接口簡單、可靠性高、功耗低,價格便宜的特點,其引腳圖如圖1所示:

圖1 24C02引腳圖
圖中SDA為串行數據輸入/輸出,SCL為串行時鐘輸入線,A0、A1、A2為地址線,當接不同的電平時,芯片的地址也不同,可實現一個系統中擴展多片24C02,數據通過SDA雙向串行傳送.WP引腳為寫保護控制端,接“1”禁止寫入,接“0”允許寫入,Vcc和Vss分別是接正、負電源.
I2C總線的通信協議簡述如下:
(1)I2C總線開始信號:SCL保持高電平,且數據線SDA由高到低變化,I2C被啟動.
(2)I2C總線停止信號:SCL保持高電平,且數據線SDA由低到高變化時,I2C總線數據停止傳送.
(3)數據改變:SCL為低電平時,SDA才能改變傳輸的數據,數據傳輸時,SCL必須為高電平,SDA必須為固定狀態,不允許跳變.
(4)數據傳輸:SCL為高電平時,SDA若保持穩定,那么SDA上正在傳輸數據.即當SCL為高電平時,SDA上的任何變化都被當作啟動或停止信號.發送到SDA上的每個字節必須為8位,每次傳送的字節數量不受限制,每個字節后面必須跟一個響應位ACK.
(5)在I2C總線開始信號后,發送一個從機地址,地址碼共7位,第8位為讀寫數據選擇位R/W,“0”表示寫數據,“1”表示讀數據,系統發出開始信號后,系統中各個器件將CPU發送到總線上的地址和自己的地址進行比較,如果兩者相一致,則該器件即被CPU選中,其接收數據還是發送數據則由R/W的狀態確定.[1]
數據傳送格式如下:

空調在工作過程中需要隨時記憶開關機狀態、運行模式,設定溫度,設定風速的狀態,當這些狀態一有變化時,即單片機只要判斷到有按鍵按下,或遙控接收信號,立即將上述信息重新寫入相應的存儲芯片,具體存儲方式如下表1所示.另外,為了識別讀出字節的準確性,在寫入時外加一個校驗字節.

表1 存儲信息分配表
由上表可知一般空調系統共需要4*8位存儲空間來進行信息的存儲.為此,在設計中,選用24C02芯片完全能滿足空調產品對存儲容量的要求,I2C總線結構只需要單片機的兩個端口即可進行數據的讀寫,這對于I/O端口并不富足的M37544單片機控制的空調控制系統來說,非常合適.
當系統首次上電時,單片機將存儲芯片中的內容讀出,存放到相應的存儲單元,系統將會按照掉電前狀態運行.判斷首次上電的方法:可以在幾個固定的存儲單元中存入固定的數據,如果單片機掉電,此數據會丟失.所以單片機復位后,首先比較這幾個單元的數據是否與存放的數據一致,如果不一致,則說明此次復位為上電復位,即需要讀取24C02數據.

圖2 24C02與單片機的接口電路
24C02與單片機的接口電路如圖2所示,因為本控制系統只用到一片24C02,所以可將A0、A1、A2三條地址線接地,表示24C02的地址為000,用單片機的P1.0端口接串行時鐘輸入端SCL,P1.1端口接串行數據輸入輸出端SDA.
當24C02被啟動后,單片機首先發送寫控制命令,因為24C02器件識別碼為1010,本控制系統硬件電路中三根地址線A2、A1、A0全部接地,所以器件的地址為000,因為是向24C02中寫數據,所以R/W位應送0.

圖3 寫24C02流程圖

圖4 寫24C02子程序片段
當執行寫操作時,單片機發出啟動信號后,接著發送寫控制字節,即1010 0000,當單片機接收到24C02的應答信號ACK后,將發送待寫入的字節首地址,單片機再次接收到24C02的應答信號ACK后,將發送待寫入的數據至指定地址單元中,當主器件再次收到應答信號ACK后,產生停止位結束一個字節的寫入.緊跟著寫入下一個字節,也可多個字節數據連續傳送之后,再送停止位[1].
圖3為寫24C02程序流程圖.
其中基于M37544單片機[2]的發送數據子程序代碼如圖4所示,該程序中累加器A中存放待發送的數據,RR7單元中存放發送的位數.
讀24C02字節數據之前,先發送起始位,再通過寫操作發送要讀的24C02的首地址,當收到應答信號之后再發送讀控制命令,24C02器件識別碼為1010,器件的地址為000,要讀24C02中的數據,R/W位應置1.所以讀控制命令為10100001,該命令發送之后,24C02發出應答信號之后會發出8位數據.當所有數據接收完畢,單片機發出一個停止位,結束當前的讀操作.
讀24C02芯片的流程圖如圖5所示:

圖5 讀24C02流程圖
其中基于M37544單片機的讀字節數據子程序片段如下圖6所示,該程序實現讀一個字節數據的功能,首先根據數據口p1.1的高低電平狀態,將進位標志位CY置1或清0,再移位送入累加器的最高位,最終讀取的數據存放在累加器A中,RR7中存放讀取數據的位數,初始存入8,當RR7中的數據減到等于0時,一個字節接收完畢.

圖6 讀24C02數據的子程序片段
隨著家電產品的智能化發展,在電飯鍋、洗衣機、空調等家電產品中,增加了掉電記憶功能,實踐證明,在單片機控制系統中,采用24C02存儲芯片,可以達到良好記憶效果,從而滿足一些特定場合的需求.該種控制方式具有簡單靈活、體積小、功耗低、價格便宜等優良性能.