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