diy 白光T12 用
天山OLED烙鐵使用手冊
0 特別聲明
0.1 版權(quán)聲明程序中所有代碼均由本人(即全體著作權(quán)所有人,下同)開發(fā)完成,程序開源后授權(quán)任何人可免費使用本程序(既可直接使用固件,亦可在程序基礎(chǔ)上修改出任何衍生版本),但上述程序及本文檔著作權(quán)屬本人所有。 硬件設(shè)計中參考了廣大網(wǎng)友的建議,不再聲明版權(quán),但請各位使用者尊重本人和其他網(wǎng)友的勞動成果。 0.2 開源協(xié)議除本人以外的任何人對本程序(包括但不限于此版本,下同)進(jìn)行修改后的任何衍生版本,以及以本程序思路或部分代碼為基礎(chǔ)設(shè)計的其它程序,必需開源所有代碼。未經(jīng)第一著作權(quán)所有人(@BEAT)之書面授權(quán),任何單位和個人不得將上述程序(包括本程序及所有衍生版本和參考本程序設(shè)計的其它程序)及本文檔以任何形式用于商業(yè)用途。 本程序受著作權(quán)法保護(hù),本人保留對侵權(quán)者及違反開源協(xié)議者追究法律責(zé)任的權(quán)利。請遵守此開源協(xié)議,尊重原作者、及所有衍生版本作者的勞動成果,遵守著作權(quán)人所在地法律法規(guī)! 0.3 免責(zé)聲明 本人只進(jìn)行程序的設(shè)計,并無償分享給網(wǎng)友。本人只保證該程序在我的手中可以正常工作,不保證其他人以任何形式得到的電路板、元器件及源程序均可正常工作,不承擔(dān)其他任何人使用本人所設(shè)計的所有軟硬件造成的一切后果。如您不同意此聲明,請您立即刪除本文檔及其相關(guān)程序。 0.4 致謝 本程序中部分內(nèi)容參考了@BEAT的相關(guān)算法;@ xzhyahoo1在V2.0和V2.1版本設(shè)計時提供了建議;V2.8版本修復(fù)的BUG是由@理解源于真誠發(fā)現(xiàn)的。V3.0中的UI是由@BEAT設(shè)計的。以上朋友的幫助,對程序的開發(fā)和更新起到了良好的作用,在此一并致謝。
1 硬件準(zhǔn)備1.1 硬件介紹1.1.1 本人設(shè)計的PCB介紹①存在已知問題是編碼器和OLED屏距離太近,如果選用1.3寸OLED,編碼器裝上旋鈕后會擋住部分OLED屏。因此需要各位試用的朋友自己飛線,或給屏裝上排線,或EC11采用飛線,總之將屏和編碼器分開。 ②焊接蜂鳴器和編碼器時,應(yīng)先焊蜂鳴器再焊編碼器,并用膠帶或熱熔膠將蜂鳴器的兩個焊盤妥善絕緣,否則編碼器背部的金屬會將蜂鳴器短路,并且需要將編碼器兩個固定腳剪掉。 ③選用5V供電的OLED屏?xí)r,R4/R5應(yīng)選用1k,采用3.3V供電時,R4/R5選用470R,具體選用5V還是3.3V,由JP1跳線決定。 ④請在5V加470uF以上電容,運放VCC加104電容。 ⑤電容C5設(shè)計有誤,實際不需要。 1.1.2 智萌版硬件介紹 ①正面三個電容不需要焊接,否則無法下載程序; ②建議MOS更換為AO4413. 1.1.3 海綿寶寶版硬件介紹 ①單片機(jī)應(yīng)改為STC15W2K60S2; 1.2 燒錄固件1.2.1 燒錄步驟 固件在Prj文件夾下Objects子文件夾內(nèi),文件名為HAKKO.hex。 ①將CH340模塊連接焊臺,先只接TX、RX、GND三根線,VCC不接; ②按圖1-1步驟勾選相關(guān)選項; 圖1-1 STC-ISP軟件操作步驟 ③將下載器VCC與焊臺連接。 1.2.2 燒錄失敗排查①編碼器位置不合適,旋轉(zhuǎn)編碼器再試(請確保編碼器轉(zhuǎn)到位,不要卡在中間); ②TX、RX接反,V1.0beta版本硬件應(yīng)是T-R、R-T; ③下載器供電不穩(wěn),檢查下載器帶載后的電源電壓; ④降低下載時的最高波特率,并取消勾選“使用快速下載模式”。 2 功能介紹2.1 界面介紹烙鐵工作時,分為兩種工作模式,即普通工作模式和通道工作模式,兩種模式可短按編碼器切換,以下將分別介紹。 2.1.1 普通工作模式普通工作模式下,允許用戶以自定義的步進(jìn)(在菜單中可調(diào)),調(diào)整設(shè)定溫度值。步進(jìn)取值范圍為1-50。普通工作模式界面如圖2-1。 圖2-1普通工作模式界面 2.1.2 通道工作模式 通道工作模式下,用戶可以在0~5共計6個溫度通道中選擇設(shè)定溫度,其中通道0為0℃,通道5為“最高溫度”值,其余四個通道的值可在工廠模式中設(shè)定。通道工作模式界面如圖2-2。 2.2 主菜單介紹長按編碼器進(jìn)入一級菜單,旋轉(zhuǎn)編碼器選擇想要進(jìn)入的二級菜單,短按進(jìn)入該二級菜單。再次旋轉(zhuǎn)編碼器,將光標(biāo)移動至需要修改的具體參數(shù)上,短按編碼器選中該內(nèi)容(選中后該選項值顯示在文字后方)。再次旋轉(zhuǎn)編碼器修改該值,修改完成后短按編碼器取消選中(取消選中后該選項值消失),再次旋轉(zhuǎn)編碼器可以移動光標(biāo)至其他參數(shù)上。退出一級菜單和二級菜單均需要長按編碼器,長按時間為1s。菜單結(jié)構(gòu)如圖2-3所示。 圖2-3 菜單結(jié)構(gòu)圖 2.2.1 溫度設(shè)置溫度步進(jìn):用戶在正常模式下旋轉(zhuǎn)編碼器的溫度步進(jìn)值,以及在其他菜單中設(shè)定與溫度相關(guān)的參數(shù)時的溫度步進(jìn)值; 休眠溫度:烙鐵進(jìn)入“休眠模式”下的工作溫度,該選項值如小于50,則休眠時不加熱,且該選項值不能超過“最高溫度”的設(shè)定值(已在固件中進(jìn)行了限制,下同); 默認(rèn)溫度:烙鐵開機(jī)后默認(rèn)的設(shè)定溫度,該選項值不能超過“最高溫度”的設(shè)定值,如希望焊臺保存上次關(guān)機(jī)時的設(shè)定溫度值,則可以將該選項置為“0”; 最高溫度:烙鐵可以設(shè)置的最高溫度,該選項值不能超過500(在溫度超過450℃后精度沒有保證,請謹(jǐn)慎使用); 2.2.2 時間設(shè)置休眠時間:當(dāng)烙鐵手柄停止振動且編碼器沒有動作后開始計時,到時進(jìn)入休眠模式,以“休眠溫度”進(jìn)行工作,直至進(jìn)入“待機(jī)模式”,在此時間內(nèi)通過振動手柄或編碼器動作可喚醒烙鐵,重新以原先的設(shè)定溫度進(jìn)行加熱。如不需要休眠,該位置0。該位置0后,不會進(jìn)入休眠和待機(jī)模式,也不會切斷220V電源。 待機(jī)時間:在進(jìn)入休眠模式后開始計時,到時進(jìn)入待機(jī)模式,烙鐵停止加熱。該位置0表示到休眠時間后直接進(jìn)入待機(jī)模式。待機(jī)模式下,只能由編碼器動作喚醒烙鐵。 關(guān)機(jī)時間:在進(jìn)入待機(jī)模式后開始計時,到時由單片機(jī)IO口(可自定義,參見第三章第五節(jié))給出低電平信號,由硬件配合切斷220V電源,該位置0表示不切斷220V電源,沒有硬件配合的該位無效,可置任何值不影響程序運行。由于單片機(jī)掉電喚醒定時器時鐘不準(zhǔn),該時間存在較大誤差(20%)。 2.2.3 通道設(shè)置 默認(rèn)通道:烙鐵開機(jī)后默認(rèn)的設(shè)定通道,該選項取值范圍為1-5,如希望焊臺保存上次關(guān)機(jī)時的設(shè)定通道,則可以將該選項置為“0”; 通道1-4:允許用戶設(shè)定通道1-通道4的通道值,在通道模式中調(diào)用,該選項取值不得大于“最高溫度”值。 2.2.4 其它設(shè)置 焊咀選擇:允許用戶在工廠模式中事先儲存4支烙鐵頭的參數(shù); 振動閾值:烙鐵頭振動喚醒烙鐵時的靈敏度設(shè)定,取值0~10,0為最靈敏; 按鍵音量:編碼器轉(zhuǎn)動或按下時的音量設(shè)定,取值為0~10,0為關(guān)閉蜂鳴器; 保護(hù)電壓:烙鐵停止加熱的電壓值,當(dāng)電源(或電池)電壓低于該設(shè)定值時,烙鐵停止加熱,但不影響菜單操作; 溫度波動:烙鐵顯示溫度波動較大時,可提高該值使顯示穩(wěn)定,取值范圍1-5,1為顯示實時值。 恢復(fù)出廠設(shè)置:如需恢復(fù)出廠設(shè)置,則將該位置1,退出菜單后所有參數(shù)均恢復(fù)出廠設(shè)置。 2.2.5 焊咀校準(zhǔn) 焊咀選校: 如需矯正并存儲烙鐵頭參數(shù),需將該選項調(diào)整為想要校準(zhǔn)的烙鐵頭編號,之后在其余子菜單中進(jìn)行校準(zhǔn)。 0~600℃: 單擊選中100℃至500℃選項后,將按照“焊咀選校”中設(shè)置的烙鐵頭編號對應(yīng)的溫度表對烙鐵加熱,取消選中后自動停止加熱。在校準(zhǔn)過程中,如實際溫度低于設(shè)定的溫度,則調(diào)大AD值;如實際溫度高于設(shè)定的溫度,則調(diào)小AD值。0℃及600℃一般為默認(rèn)值無需調(diào)整。溫度有過沖比較嚴(yán)重的現(xiàn)象時,反復(fù)多次校準(zhǔn)溫度一般可以解決. 在烙鐵頭校準(zhǔn)時,切記該組數(shù)據(jù)必須嚴(yán)格從小到大遞增,否則溫度無效。例如,如果校準(zhǔn)前:100℃,AD=110;200℃,AD =270;300℃,AD = 380,當(dāng)校準(zhǔn)200℃時,溫度不足200℃,需要將AD值從270調(diào)大,但其大小不能超過300°時的AD值380,如果從270調(diào)到380溫度還不能達(dá)到200℃,那就說明300℃時的380這個值也偏小了,需先將300℃的380也增大。 2.2.6 其他校準(zhǔn)按鍵校準(zhǔn):不同廠家的編碼器AB通道不一定相同,如編碼器方向與習(xí)慣不符,可將該選項調(diào)整為1,默認(rèn)為0。 電壓校準(zhǔn):如需矯正電源電壓,需旋轉(zhuǎn)編碼器將當(dāng)前電源電壓的測量值乘10取整保存在菜單中,如當(dāng)前電源電壓為24.4V,那么將該值調(diào)整為244即可;(注意此值對應(yīng)的編碼器步進(jìn)不為1,需多次旋轉(zhuǎn)才會進(jìn)1) 室溫校準(zhǔn):如需矯正室溫,需旋轉(zhuǎn)編碼器將當(dāng)前室溫的測量值取證保存在菜單中,如當(dāng)前室溫為18℃,那么將該值調(diào)整為18即可;(注意此值對應(yīng)的編碼器步進(jìn)不為1,需多次旋轉(zhuǎn)才會進(jìn)1)
3 程序修改為方便各位朋友在本程序的基礎(chǔ)上繼續(xù)添加或修改自己需要的功能,在此介紹一些常見的問題。 3.1 準(zhǔn)備工作首先需安裝Keil軟件(見群文件),并下載解壓STC-ISP軟件(見群文件)。添加型號和頭文件到Keil中,如圖3-1。然后打開prj文件夾下的HAKKO.uvproj文件即可開始修改。 圖3-1 添加型號和頭文件 3.2 可快捷修改的幾個設(shè)置 (1)打開程序文件的config.h文件,找到圖3-2(a)所示位置。 (a) config.h文件部分代碼 (b)編譯按鈕 圖3-2 可快捷操作的幾個設(shè)置 (2)根據(jù)需要注釋相關(guān)定義; (3)設(shè)置完畢后按編譯按鈕,編譯按鈕在Keil界面左上角如圖3-2(b)所示的紅圈內(nèi)。 3.3 修改開機(jī)LOGO①準(zhǔn)備一張128*64的logo圖片,單色BMP格式; ②打開PCtoLCD2002軟件; ③點菜單上的模式,改成圖片模式。
④點菜單上文件、打開(打開準(zhǔn)備好的bmp格式的logo圖片)如圖3-3; 圖3-3 ⑤點上面的齒輪,設(shè)字模選項,陰碼,列行式,逆向,C51,自定義格式(刪去行前綴和行后綴的大括號),如圖3-4所示; 圖3-4 字模選項 ⑥設(shè)定好后,點確定,然后點生成字模,如圖3-6; ⑦復(fù)制生成的代碼,替換源程序中LQ12864.C中的LOGO[1024]數(shù)組,如圖3-5所示; 圖3-5 替換LOGO數(shù)組 ⑧點擊圖3-2(b)所示的編譯按鈕,編譯后即可下載。 3.4 提高烙鐵最大輸出功率烙鐵最大輸出功率(24V側(cè))實測已經(jīng)達(dá)75w以上,如果認(rèn)為不滿意可以手動修改程序。但提高效果并不明顯且會造成進(jìn)口頭溫度檢測的波動。為滿足更多人需要,特給出修改方法: (1)打開程序文件的Sys_Sample.c文件,找到圖3-6所示位置。 圖3-6 Sys_Sample.c文件部分代碼 (2)根據(jù)需要將Get_ADC10bitResult也注釋; (3)修改完畢后按編譯按鈕,編譯按鈕在Keil界面左上角如圖3-2(b)所示的紅圈內(nèi)。 3.5 修改控制器IO口為方便使用其他控制板的朋友修改IO,特取消PCA功能并改用定時器生成PWM波,如圖3-7所示. (1)打開程序的config.h文件,找到圖3-7所示位置。 圖3-7 config.h文件部分代碼 (2)修改適當(dāng)?shù)腎O,其中KEY_A為切換烙鐵頭按鍵,KEY_B為休眠或關(guān)機(jī)按鍵; (3)修改完畢后按編譯按鈕,編譯按鈕在Keil界面左上角如圖3-2(b)所示的紅圈內(nèi)。
4 結(jié)語本程序為天山T12焊臺最終版程序,程序中不再新增任何功能,不再修復(fù)任何不影響使用的BUG。軟硬件均已經(jīng)開源,希望各位朋友在研究、使用的同時切實遵守開源協(xié)議,尊重各版本作者勞動成果,共同營造一個自由、平等、排除商業(yè)模式干擾的交流平臺。再次感謝開發(fā)本焊臺過程中向我提供過幫助的所有人,衷心感謝!
修訂歷史 | | | | | | | | | | 增加中文菜單,優(yōu)化溫度控制,修復(fù)若干BUG | | | | 修復(fù)工廠模式中的若干BUG,優(yōu)化溫度控制 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 修復(fù)重要BUG,改進(jìn)程序修改方法 | | | | 增加進(jìn)口頭的兼容性,調(diào)整程序結(jié)構(gòu),修復(fù)BUG | | | | 優(yōu)化程序結(jié)構(gòu),優(yōu)化對進(jìn)口頭的兼容性 | | | | | | | | 優(yōu)化按鍵功能,優(yōu)化菜單顯示,修復(fù)BUG | | | | | | | | 修改程序結(jié)構(gòu),為移植UI做最后準(zhǔn)備 | | | | 更換菜單界面,取消工廠模式,修改焊咀校準(zhǔn) | | | | | | | | | | | | | | V3.0.0 版更新詳細(xì)說明:①更換新的菜單界面; ②將工廠模式功能移植到主菜單中; ③修改校準(zhǔn)烙鐵頭的方法; V3.0.1 版更新詳細(xì)說明:①修復(fù)1.3吋OLED顯示不全的BUG; ②修復(fù)菜單中默認(rèn)通道不能置0的BUG; ③修復(fù)菜單中時間設(shè)置最大只能為10的BUG; V3.0.2 版更新詳細(xì)說明:①修復(fù)部分硬件蜂鳴器不響的BUG; ②修復(fù)休眠時屏幕顯示的BUG; ③修復(fù)菜單中版本號顯示的BUG; ④嘗試修復(fù)待機(jī)喚醒的花屏BUG. V3.1.0 版更新詳細(xì)說明:①在保留原先UI界面的同時,添加仿JBC界面可供選擇; ②修復(fù)最高溫度限制可能無效的BUG; ③修復(fù)部分獨立按鍵無提示音的BUG。
單片機(jī)源程序如下:
- /*********************************************************************************
- * COPYRIGHT NOTICE
- * Copyright (c) 2017, XinJiang University
- * All rights reserved.
- *
- * 文件名 : Sys_Basic.c
- * 描述 : 系統(tǒng)基礎(chǔ)函數(shù),包括中斷和MCU底層,延時函數(shù)等
- *
- * 版本 : V3.0.2
- * 作者 : 王志浩
- * 日期 : 2017-10-22
- *
- * 以下全部程序之著作權(quán)歸屬新疆大學(xué)所有,受《中華人民共和國著作權(quán)法》保護(hù)!
- * 未經(jīng)第一著作權(quán)所有人書面授權(quán),任何單位和個人不得將以下程序用于商業(yè)用途!
- * 修改此程序請保留上述版權(quán)聲明,引用程序請注明出處!
- **********************************************************************************/
- #include "config.h"
- /********************** 全局變量定義 ************************/
- PWM_s PWM = {0,Disable}; //PWM相關(guān)變量
- IRON_STATUS_e IronStateFlag = NORMAL; //烙鐵工作狀態(tài)標(biāo)志位
- TIMER_s Timer = {0,0,0}; //定時計數(shù)器
- IRONUSE_STATUS_s IronUse_Status = {FREE,FREE}; //烙鐵使用狀態(tài)標(biāo)志位
- /************************************************************
- * 函數(shù)名 : timer0_int
- * 功能說明 : 定時器0中斷,生成PWM波,蜂鳴器響
- *
- * 輸入?yún)?shù) : 無
- * 輸出參數(shù) : 無
- *
- * 修改記錄 : 新增函數(shù),第一次編輯
- * 歷次作者 : 王志浩
- * 日期 : 2017-10-18
- *************************************************************/
- void timer0_int (void) interrupt TIMER0_VECTOR
- {
- static unsigned int BeepCounter = 0;
- static unsigned char PWM_counter = 0;
-
- //PWM生成
- PWM_counter++;
- if((PWM_counter<PWM.Duty) && PWM.Run)
- IRON = 1;
- //IRON = 0;
- else
- IRON = 0;
-
- //蜂鳴器響
- //旋轉(zhuǎn)或按下后BeepCounterFlag被置位,開始計數(shù)
- if(BeepCounterFlag)
- {
- BeepCounter++;
- }
- //計數(shù)小于設(shè)定值時打開,大于時關(guān)閉,Beep_Volume的值決定了占空比
- if((BeepCounter > 0) && (BeepCounter <= MENU_DATA_Table.Other_s.Beep_Volume*BEEP_TIME))
- {
- BEEP_ON;
- }
- else
- {
- BEEP_OFF;
- }
- //清零
- if(BeepCounter >MENU_DATA_Table.Other_s.Beep_Volume*BEEP_TIME)
- {
- BeepCounter = 0;
- BeepCounterFlag = 0;
- }
- }
- /************************************************************
- * 函數(shù)名 : timer1_int
- * 功能說明 : 定時器1中斷,主要控制
- *
- * 輸入?yún)?shù) : 無
- * 輸出參數(shù) : 無
- *
- * 修改記錄 : 新增函數(shù),第一次編輯
- * 歷次作者 : 王志浩
- * 日期 : 2017-10-18
- *************************************************************/
- void timer1_int (void) interrupt TIMER1_VECTOR
- {
- static unsigned int IronUseCounter=0;
- static unsigned int ShutDownCounter = 0;
- static unsigned char P01_Old = 0;
-
- //1ms處理部分
- Timer.mSec++; //定時器0分段計數(shù)器自加
- EC11_Capture(); //捕捉EC11信息
- //10ms處理部分
- if(Timer.mSec%10 == 0)
- {
- if(IronUse_Status.Handle || IronUse_Status.Coder)//烙鐵或編碼器用了,那要看看現(xiàn)在是不是休眠什么的狀態(tài)了
- {
- if(IronStateFlag)
- {
- Timer.Sec = 0;
- Timer.Min = 0;
- ec11_state.Key = KEY_FREE;
- ec11_state.Coder = CODER_FREE;
- IronStateFlag = NORMAL;
- Beep(MENU_DATA_Table.Other_s.Beep_Volume);
- }
- }
- }
-
- //100ms處理部分
- if(Timer.mSec%100 == 0)
- {
- //水銀開關(guān)跳變沿檢測并計數(shù)
- if(SLEEP != P01_Old)
- {
- IronUseCounter++;
- }
- P01_Old = SLEEP;
-
- //溫度控制(正常工作按IronTemp_AM控制,休眠按Slp_Temp控制,否則關(guān)烙鐵)
- if(IronStateFlag == NORMAL)
- {
- IronTempControl(IronTemp.Set);
- }
- else if(IronStateFlag==SLEEPING)
- {
- IronTempControl(MENU_DATA_Table.Temp_s.Slp_Temp);
- }
- else
- {
- IronTempControl(0);
- }
- }
-
- //1s處理部分
- if(Timer.mSec == 1000)
- {
- //一秒內(nèi)看10次跳變沿,如果這10次有N次烙鐵手柄狀態(tài)發(fā)生變化,那么認(rèn)為是確實在使用
- if(IronUseCounter>MENU_DATA_Table.Other_s.Shock_Sensor)
- {
- IronUse_Status.Handle = USING;
- }
- else
- {
- IronUse_Status.Handle = FREE;
- }
- //看完后清計數(shù)器
- IronUseCounter = 0;
-
- //如果認(rèn)為沒有使用,那么開始計時,只要用了就清零(烙鐵沒有使用&&編碼器沒有使用&&沒有進(jìn)菜單)
- if(IronUse_Status.Handle == FREE && IronUse_Status.Coder == FREE && ShutdownCounterFlag==0)
- {
- Timer.Sec++;
- }
- else
- {
- Timer.Sec = 0;
- Timer.Min = 0;
- IronUse_Status.Coder = FREE;
- }
- Timer.mSec = 0;
- }
-
- //1min處理部分
- if(Timer.Sec == 55)//定時不準(zhǔn)
- {
- Timer.Min++;
- Timer.Sec = 0;
- //以下是休眠、關(guān)屏、和軟關(guān)機(jī)
- //如果 (睡眠時間不為0&&在正常工作狀態(tài))
- if((MENU_DATA_Table.Time_s.Slp_Time > 0) && (IronStateFlag == NORMAL))
- {
- if(Timer.Min == MENU_DATA_Table.Time_s.Slp_Time)
- {
- IronStateFlag = SLEEPING;
- Beep(MENU_DATA_Table.Other_s.Beep_Volume);
- //清計時器為待機(jī)做準(zhǔn)備
- Timer.Sec = 0;
- Timer.Min = 0;
- }
- }
- //如果軟關(guān)機(jī)時間>=0&&已經(jīng)休眠
- if((MENU_DATA_Table.Time_s.Shutdown_Time >= 0) && (IronStateFlag == SLEEPING))
- {
- if(Timer.Min == MENU_DATA_Table.Time_s.Shutdown_Time)
- {
- //清計時器為掉電喚醒做準(zhǔn)備
- Timer.Sec = 0;
- Timer.Min = 0;
- //置烙鐵狀態(tài)標(biāo)志位
- IronStateFlag = STANDBY;
- //蜂鳴器響,確保烙鐵關(guān)到位了
- BEEP_ON;
- Delay_ms(100);
- PWM.Run = Disable;
- IRON = 0;
- BEEP_OFF;
- Delay_ms(150);
- BEEP_ON;
- Delay_ms(150);
- OLED_CLS();
- BEEP_OFF;
- //如果關(guān)機(jī)時間大于零,則初始化掉電喚醒定時器為16s,并且進(jìn)入掉電模式,否則直接掉電
- if(MENU_DATA_Table.Time_s.Suicide_Time > 0)
- {
- //掉電喚醒定時器初始化
- WKTCL = 0xfe; //設(shè)置喚醒周期16s
- WKTCH = 0xff; //使能掉電喚醒定時器
- PCON |= 0x02;//掉電
- _nop_();
- _nop_();
- InitSPI();
- }
- else
- {
- PCON |= 0x02;//掉電
- _nop_();
- _nop_();
- InitSPI();
- }
- while(MENU_DATA_Table.Time_s.Suicide_Time > 0)
- {
- //記錄掉電次數(shù),如果等于定時時間則自殺,否則繼續(xù)掉電
- ShutDownCounter++;
- if(ShutDownCounter > MENU_DATA_Table.Time_s.Suicide_Time*4+1)
- {
- SHUTDOWN = 0;
- }
- //如果是由掉電喚醒定時器喚醒,則繼續(xù)掉電;否則清計數(shù)器跳出循環(huán)
- if(WKTCL==0xff && WKTCH==0xff)
- {
- PCON |= 0x02;//掉電
- _nop_();
- _nop_();
- InitSPI();
- }
- else
- {
- ShutDownCounter = 0;
- break;
- }
- _nop_();
- _nop_();
- }
- IronUse_Status.Coder = USING;
- }
- }
- }
- }
- /************************************************************
- * 函數(shù)名 : timer2_int
- * 功能說明 : 大字設(shè)定溫度和擴(kuò)展按鍵掃描,讀室溫和電壓
- *
- * 輸入?yún)?shù) : 無
- * 輸出參數(shù) : 無
- *
- * 修改記錄 : 新增函數(shù),第一次編輯
- * 歷次作者 : 王志浩
- * 日期 : 2017-10-18
- *************************************************************/
- void timer2_int (void) interrupt TIMER2_VECTOR
- {
- static unsigned char SetTempCounter = 0;
- //如果正在設(shè)定溫度,那么大字顯示設(shè)定溫度值
- if(SetTempFlag == 1)
- {
- SetTempCounter++;
- }
- if(SetTempCounter == 50)
- {
- SetTempCounter = 0;
- SetTempFlag = 0;
- if((MENU_DATA_Table.Temp_s.Default_Temp == 0) || (MENU_DATA_Table.Temp_s.Default_CH == 0))
- {
- EEPROM_SectorErase(0x0);
- EEPROM_write_n(0x0,(unsigned char *)&MENU_DATA_Table,sizeof(MENU_DATA_Table));
- }
- }
-
- //讀室溫和電壓
- RoomTemp = GetRoomTemp();
- VCCVoltage = GetVoltage();
-
- //按鍵掃描
- Key_Scan();
- }
- void exint4() interrupt 16
- {}
-
- //float ADC_BandGap_Volt(void) //讀取ADC內(nèi)部電壓數(shù)據(jù),轉(zhuǎn)化為10位
- //{
- // unsigned int BangGap=0;
- // unsigned char code *BandAddr;
- //
- // BandAddr=BangGap_Addr;
- // BangGap=*BandAddr++;
- // BangGap=BangGap<<8;
- // BangGap+=*BandAddr;
- //
- // return (float)BangGap / 4.88f;
- //}
- //u16 ADC_GetDat(u8 Ch,u8 ChASF) //讀ADC數(shù)據(jù)
- //{
- // u16 ADC_Dat=0;
- // P1ASF=ChASF;
- // ADC_CONTR&=~(0x07<<0);
- // ADC_CONTR|=(Ch&0x07)<<0;
- // ADC_CONTR&=~(1<<4);
- // ADC_RES=0;
- // ADC_RESL=0;
- // ADC_CONTR|=1<<3; //啟動ADC轉(zhuǎn)換
- //
- // while((ADC_CONTR&0x10)==0); //等待ADC轉(zhuǎn)換完成
- // ADC_CONTR&=~(1<<4);
- //
- // ADC_Dat=ADC_RES<<8;
- // ADC_Dat+=ADC_RESL;
- //
- // return ADC_Dat;
- //}
- //u16 ADC_BandGap_Dat() //讀取ADC基準(zhǔn)電壓
- //{
- // u16 AD_Return = 0;
- // u8 i;
- //
- // ADC_GetDat(0,0x00); //讀取2次取得穩(wěn)定
- // ADC_GetDat(0,0x00);
- //
- // EA = 0;
- // for (i = 0 ; i <DATA_SUM ; i++ ) //連續(xù)讀取DATA_SUM次基準(zhǔn)電壓 求和取得平均值
- // {
- // AD_Return += ADC_GetDat(0,0x00);
- // }
- // EA = 1;
- // return AD_Return >> DATA_DIV;
- //}
- //u16 ADC_ReadCH_Dat(u8 CH) //讀取通道電壓
- //{
- // u16 AD_Return = 0;
- // u8 i;
- //
- // ADC_GetDat(CH,0xff); //讀取2次取得穩(wěn)定
- // ADC_GetDat(CH,0xff);
- //
- // EA = 0;
- // for (i = 0 ; i <DATA_SUM ; i++ ) //連續(xù)讀取DATA_SUM次基準(zhǔn)電壓求和取得平均值
- // {
- // AD_Return += ADC_GetDat(CH,0xff);
- // }
- // EA = 1;
- // return AD_Return >> DATA_DIV;
- //}
- /************************************************************
- * 函數(shù)名 : Get_ADC10bitResult
- * 功能說明 : 讀ADC值
- *
- * 輸入?yún)?shù) : channel,ADC通道號(0-7)
- * 輸出參數(shù) : 返回ADC值(0-1023)
- *
- * 修改記錄 : 新增函數(shù),第一次編輯
- * 歷次作者 : 王志浩
- * 日期 : 2017-10-18
- *************************************************************/
- unsigned int Get_ADC10bitResult(unsigned char channel)
- {
- u16 adc;
- u8 i;
- ADC_RES = 0;
- ADC_RESL = 0;
- ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;
- NOP(4); //對ADC_CONTR操作后要4T之后才能訪問
- for(i=0; i<250; i++) //超時
- {
- if(ADC_CONTR & ADC_FLAG)
- {
- ADC_CONTR &= ~ADC_FLAG;
- adc = (u16)(ADC_RES & 3);
- adc = (adc << 8) | ADC_RESL;
- return adc;
- }
- }
- return 1024; //錯誤,返回1024,調(diào)用的程序判斷
- }
- /************************************************************
- * 函數(shù)名 : DisableEEPROM
- * 功能說明 : 失能EEPROM
- *
- * 輸入?yún)?shù) : 無
- * 輸出參數(shù) : 無
- *
- * 修改記錄 : 新增函數(shù),第一次編輯
- * 歷次作者 : 王志浩
- * 日期 : 2017-10-18
- *************************************************************/
- void DisableEEPROM(void)
- {
- ISP_CONTR = 0; //禁止ISP/IAP操作
- ISP_CMD = 0; //去除ISP/IAP命令
- ISP_TRIG = 0; //防止ISP/IAP命令誤觸發(fā)
- ISP_ADDRH = 0xff; //清0地址高字節(jié)
- ISP_ADDRL = 0xff; //清0地址低字節(jié),指向非EEPROM區(qū),防止誤操作
- }
- /************************************************************
- * 函數(shù)名 :
- * 功能說明 : 從指定EEPROM首地址讀出n個字節(jié)放指定的緩沖.
- *
- * 輸入?yún)?shù) : EE_address讀出EEPROM的首地址,DataAddress讀出數(shù)據(jù)放緩沖的首地址,number讀出的字節(jié)長度.
- * 輸出參數(shù) : 無
- *
- * 修改記錄 : 新增函數(shù),第一次編輯
- * 歷次作者 : 王志浩
- * 日期 : 2017-10-18
- *************************************************************/
- void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
- {
- EA = 0; //禁止中斷
- ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY); //設(shè)置等待時間,允許ISP/IAP操作,送一次就夠
- ISP_READ(); //送字節(jié)讀命令,命令不需改變時,不需重新送命令
- do
- {
- ISP_ADDRH = EE_address / 256; //送地址高字節(jié)(地址需要改變時才需重新送地址)
- ISP_ADDRL = EE_address % 256; //送地址低字節(jié)
- ISP_TRIG(); //先送5AH,再送A5H到ISP/IAP觸發(fā)寄存器,每次都需要如此
- //送完A5H后,ISP/IAP命令立即被觸發(fā)啟動
- //CPU等待IAP完成后,才會繼續(xù)執(zhí)行程序。
- _nop_();
- *DataAddress = ISP_DATA; //讀出的數(shù)據(jù)送往
- EE_address++;
- DataAddress++;
- }while(--number);
- DisableEEPROM();
- EA = 1; //重新允許中斷
- }
- /************************************************************
- * 函數(shù)名 : EEPROM_SectorErase
- * 功能說明 : 把指定地址的EEPROM扇區(qū)擦除
- *
- * 輸入?yún)?shù) : EE_address:要擦除的扇區(qū)EEPROM的地址.
- * 輸出參數(shù) : 無
- *
- * 修改記錄 : 新增函數(shù),第一次編輯
- * 歷次作者 : 王志浩
- * 日期 : 2017-10-18
- *************************************************************/
- void EEPROM_SectorErase(u16 EE_address)
- {
- EA = 0; //禁止中斷
- //只有扇區(qū)擦除,沒有字節(jié)擦除,512字節(jié)/扇區(qū)。
- //扇區(qū)中任意一個字節(jié)地址都是扇區(qū)地址。
- ISP_ADDRH = EE_address / 256; //送扇區(qū)地址高字節(jié)(地址需要改變時才需重新送地址)
- ISP_ADDRL = EE_address % 256; //送扇區(qū)地址低字節(jié)
- ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY); //設(shè)置等待時間,允許ISP/IAP操作,送一次就夠
- ISP_ERASE(); //送扇區(qū)擦除命令,命令不需改變時,不需重新送命令
- ISP_TRIG();
- _nop_();
- DisableEEPROM();
- EA = 1; //重新允許中斷
- }
- /************************************************************
- * 函數(shù)名 : EEPROM_write_n
- * 功能說明 : 把緩沖的n個字節(jié)寫入指定首地址的EEPROM.
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
0.png (38.48 KB, 下載次數(shù): 76)
下載附件
2018-8-29 17:01 上傳
所有資料51hei提供下載:
白光烙鐵_V3.1.1硬件SPI(天山V1.2).rar
(995.1 KB, 下載次數(shù): 357)
2018-8-29 09:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|