久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 16566|回復: 34
收起左側

天山OLED白光烙鐵單片機源碼與使用手冊V3.1.1 王志浩

  [復制鏈接]
ID:138450 發表于 2018-8-29 09:35 | 顯示全部樓層 |閱讀模式
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。軟硬件均已經開源,希望各位朋友在研究、使用的同時切實遵守開源協議,尊重各版本作者勞動成果,共同營造一個自由、平等、排除商業模式干擾的交流平臺。再次感謝開發本焊臺過程中向我提供過幫助的所有人,衷心感謝!


修訂歷史
版本
更新日期
更新說明
作者
V1.0
2017-06-05
第一次發布
王志浩
V2.0
2017-08-23
增加中文菜單,優化溫度控制,修復若干BUG
王志浩
V2.1
2017-08-29
修復工廠模式中的若干BUG,優化溫度控制
王志浩
V2.2
2017-08-30
修復蜂鳴器音量的相關BUG
王志浩
V2.3
2017-08-31
調整進入工廠模式的方法
王志浩
V2.4
2017-09-01
調整顯示界面,修復若干BUG
王志浩
V2.5
2017-09-03
提高回溫速度,提高烙鐵可靠性
王志浩
V2.6
2017-09-13
修改程序適用于采用V1.0beta版硬件
王志浩
V2.7
2017-09-18
修改休眠和待機邏輯
王志浩
V2.7A
2017-09-19
修復若干BUG
王志浩
V2.8
2017-09-21
修復重要BUG,改進程序修改方法
王志浩
V2.9.0
2017-10-07
增加進口頭的兼容性,調整程序結構,修復BUG
王志浩
V2.9.1
2017-10-08
優化程序結構,優化對進口頭的兼容性
王志浩
V2.9.2
2017-10-09
優化溫度顯示,增加按鍵功能
王志浩
V2.9.3
2017-10-10
優化按鍵功能,優化菜單顯示,修復BUG
王志浩
V2.9.4
2017-10-11
徹底移除STC庫函數
王志浩
V2.9.5
2017-10-20
修改程序結構,為移植UI做最后準備
王志浩
V3.0.0
2017-10-21
更換菜單界面,取消工廠模式,修改焊咀校準
BEAT
V3.0.1
2017-10-22
修復若干BUG
BEAT
V3.0.2
2017-10-23
修復若干BUG
王志浩
V3.1.0
2017-10-27
更換新的UI界面,修復若干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。


單片機源程序如下:
  1. /*********************************************************************************
  2. * COPYRIGHT NOTICE
  3. * Copyright (c) 2017, XinJiang University
  4. * All rights reserved.
  5. *
  6. * 文件名                :        Sys_Basic.c
  7. * 描述                 :        系統基礎函數,包括中斷和MCU底層,延時函數等
  8. *
  9. * 版本                        :        V3.0.2
  10. * 作者                        :        王志浩
  11. * 日期                        :        2017-10-22
  12. *
  13. * 以下全部程序之著作權歸屬新疆大學所有,受《中華人民共和國著作權法》保護!
  14. * 未經第一著作權所有人書面授權,任何單位和個人不得將以下程序用于商業用途!
  15. * 修改此程序請保留上述版權聲明,引用程序請注明出處!
  16. **********************************************************************************/
  17. #include "config.h"

  18. /********************** 全局變量定義 ************************/
  19. PWM_s                                                        PWM                                                 =         {0,Disable};        //PWM相關變量
  20. IRON_STATUS_e                        IronStateFlag         =         NORMAL;                                //烙鐵工作狀態標志位
  21. TIMER_s                                                Timer                                                 =         {0,0,0};                        //定時計數器
  22. IRONUSE_STATUS_s        IronUse_Status         =         {FREE,FREE};        //烙鐵使用狀態標志位


  23. /************************************************************
  24. * 函數名                :        timer0_int
  25. * 功能說明        :        定時器0中斷,生成PWM波,蜂鳴器響
  26. *
  27. * 輸入參數        :        無
  28. * 輸出參數        :        無
  29. *
  30. * 修改記錄        :        新增函數,第一次編輯
  31. * 歷次作者        :        王志浩
  32. * 日期                        :        2017-10-18
  33. *************************************************************/
  34. void timer0_int (void) interrupt TIMER0_VECTOR
  35. {
  36.         static unsigned int                 BeepCounter = 0;
  37.         static unsigned char         PWM_counter        =        0;
  38.        
  39.         //PWM生成
  40.         PWM_counter++;
  41.         if((PWM_counter<PWM.Duty) && PWM.Run)
  42.                 IRON = 1;
  43.                 //IRON = 0;
  44.         else
  45.                 IRON = 0;
  46.        
  47.         //蜂鳴器響
  48.         //旋轉或按下后BeepCounterFlag被置位,開始計數
  49.         if(BeepCounterFlag)
  50.         {
  51.                 BeepCounter++;
  52.         }
  53.         //計數小于設定值時打開,大于時關閉,Beep_Volume的值決定了占空比
  54.         if((BeepCounter > 0) && (BeepCounter <= MENU_DATA_Table.Other_s.Beep_Volume*BEEP_TIME))
  55.         {
  56.                 BEEP_ON;
  57.         }
  58.         else
  59.         {
  60.                 BEEP_OFF;
  61.         }
  62.         //清零
  63.         if(BeepCounter >MENU_DATA_Table.Other_s.Beep_Volume*BEEP_TIME)
  64.         {
  65.                 BeepCounter = 0;
  66.                 BeepCounterFlag = 0;
  67.         }
  68. }


  69. /************************************************************
  70. * 函數名                :        timer1_int
  71. * 功能說明        :        定時器1中斷,主要控制
  72. *
  73. * 輸入參數        :        無       
  74. * 輸出參數        :        無
  75. *
  76. * 修改記錄        :        新增函數,第一次編輯
  77. * 歷次作者        :        王志浩
  78. * 日期                        :        2017-10-18
  79. *************************************************************/       
  80. void timer1_int (void) interrupt TIMER1_VECTOR
  81. {
  82.         static unsigned int                 IronUseCounter=0;
  83.         static        unsigned int         ShutDownCounter = 0;
  84.         static unsigned char         P01_Old = 0;
  85.        
  86.         //1ms處理部分
  87.         Timer.mSec++;                        //定時器0分段計數器自加
  88.         EC11_Capture();                //捕捉EC11信息       

  89.         //10ms處理部分
  90.         if(Timer.mSec%10 == 0)
  91.         {
  92.                 if(IronUse_Status.Handle || IronUse_Status.Coder)//烙鐵或編碼器用了,那要看看現在是不是休眠什么的狀態了
  93.                 {
  94.                         if(IronStateFlag)
  95.                         {
  96.                                 Timer.Sec = 0;
  97.                                 Timer.Min = 0;
  98.                                 ec11_state.Key = KEY_FREE;
  99.                                 ec11_state.Coder = CODER_FREE;
  100.                                 IronStateFlag = NORMAL;
  101.                                 Beep(MENU_DATA_Table.Other_s.Beep_Volume);
  102.                         }
  103.                 }
  104.         }
  105.        
  106.         //100ms處理部分
  107.         if(Timer.mSec%100 == 0)
  108.         {
  109.                 //水銀開關跳變沿檢測并計數
  110.                 if(SLEEP != P01_Old)
  111.                 {
  112.                         IronUseCounter++;
  113.                 }
  114.                 P01_Old = SLEEP;
  115.                
  116.                 //溫度控制(正常工作按IronTemp_AM控制,休眠按Slp_Temp控制,否則關烙鐵)
  117.                 if(IronStateFlag == NORMAL)
  118.                 {
  119.                         IronTempControl(IronTemp.Set);
  120.                 }
  121.                 else if(IronStateFlag==SLEEPING)
  122.                 {
  123.                         IronTempControl(MENU_DATA_Table.Temp_s.Slp_Temp);
  124.                 }
  125.                 else
  126.                 {
  127.                         IronTempControl(0);
  128.                 }
  129.         }
  130.        
  131.         //1s處理部分
  132.         if(Timer.mSec == 1000)
  133.         {
  134.                 //一秒內看10次跳變沿,如果這10次有N次烙鐵手柄狀態發生變化,那么認為是確實在使用
  135.                 if(IronUseCounter>MENU_DATA_Table.Other_s.Shock_Sensor)
  136.                 {
  137.                         IronUse_Status.Handle = USING;
  138.                 }
  139.                 else
  140.                 {
  141.                         IronUse_Status.Handle = FREE;
  142.                 }
  143.                 //看完后清計數器
  144.                 IronUseCounter = 0;
  145.                
  146.                 //如果認為沒有使用,那么開始計時,只要用了就清零(烙鐵沒有使用&&編碼器沒有使用&&沒有進菜單)
  147.                 if(IronUse_Status.Handle == FREE && IronUse_Status.Coder == FREE && ShutdownCounterFlag==0)
  148.                 {
  149.                         Timer.Sec++;
  150.                 }
  151.                 else
  152.                 {
  153.                         Timer.Sec = 0;
  154.                         Timer.Min = 0;
  155.                         IronUse_Status.Coder = FREE;
  156.                 }
  157.                 Timer.mSec = 0;
  158.         }
  159.        
  160.         //1min處理部分
  161.         if(Timer.Sec == 55)//定時不準
  162.         {
  163.                 Timer.Min++;
  164.                 Timer.Sec = 0;
  165.                 //以下是休眠、關屏、和軟關機
  166.                 //如果 (睡眠時間不為0&&在正常工作狀態)
  167.                 if((MENU_DATA_Table.Time_s.Slp_Time > 0) && (IronStateFlag == NORMAL))
  168.                 {
  169.                         if(Timer.Min == MENU_DATA_Table.Time_s.Slp_Time)
  170.                         {
  171.                                 IronStateFlag = SLEEPING;
  172.                                 Beep(MENU_DATA_Table.Other_s.Beep_Volume);
  173.                                 //清計時器為待機做準備
  174.                                 Timer.Sec = 0;
  175.                                 Timer.Min = 0;
  176.                         }
  177.                 }
  178.                 //如果軟關機時間>=0&&已經休眠
  179.                 if((MENU_DATA_Table.Time_s.Shutdown_Time >= 0) && (IronStateFlag == SLEEPING))
  180.                 {
  181.                         if(Timer.Min == MENU_DATA_Table.Time_s.Shutdown_Time)
  182.                         {
  183.                                 //清計時器為掉電喚醒做準備
  184.                                 Timer.Sec = 0;
  185.                                 Timer.Min = 0;
  186.                                 //置烙鐵狀態標志位
  187.                                 IronStateFlag = STANDBY;
  188.                                 //蜂鳴器響,確保烙鐵關到位了
  189.                                 BEEP_ON;
  190.                                 Delay_ms(100);
  191.                                 PWM.Run = Disable;
  192.                                 IRON = 0;
  193.                                 BEEP_OFF;
  194.                                 Delay_ms(150);
  195.                                 BEEP_ON;
  196.                                 Delay_ms(150);
  197.                                 OLED_CLS();
  198.                                 BEEP_OFF;
  199.                                 //如果關機時間大于零,則初始化掉電喚醒定時器為16s,并且進入掉電模式,否則直接掉電
  200.                                 if(MENU_DATA_Table.Time_s.Suicide_Time > 0)
  201.                                 {
  202.                                         //掉電喚醒定時器初始化
  203.                                         WKTCL = 0xfe;                           //設置喚醒周期16s
  204.                                         WKTCH = 0xff;                           //使能掉電喚醒定時器
  205.                                         PCON |= 0x02;//掉電
  206.                                         _nop_();
  207.                                         _nop_();
  208.           InitSPI();
  209.                                 }
  210.                                 else
  211.                                 {
  212.                                         PCON |= 0x02;//掉電
  213.                                         _nop_();
  214.                                         _nop_();
  215.           InitSPI();
  216.                                 }
  217.                                 while(MENU_DATA_Table.Time_s.Suicide_Time > 0)
  218.                                 {
  219.                                         //記錄掉電次數,如果等于定時時間則自殺,否則繼續掉電
  220.                                         ShutDownCounter++;
  221.                                         if(ShutDownCounter > MENU_DATA_Table.Time_s.Suicide_Time*4+1)
  222.                                         {
  223.                                                 SHUTDOWN = 0;
  224.                                         }
  225.                                         //如果是由掉電喚醒定時器喚醒,則繼續掉電;否則清計數器跳出循環
  226.                                         if(WKTCL==0xff && WKTCH==0xff)
  227.                                         {
  228.                                                 PCON |= 0x02;//掉電
  229.                                           _nop_();
  230.                                           _nop_();
  231.             InitSPI();
  232.                                         }
  233.                                         else
  234.                                         {
  235.                                                 ShutDownCounter = 0;
  236.                                                 break;
  237.                                         }
  238.                                         _nop_();
  239.                                         _nop_();
  240.                                 }
  241.                                 IronUse_Status.Coder = USING;
  242.                         }
  243.                 }
  244.         }
  245. }


  246. /************************************************************
  247. * 函數名                :        timer2_int
  248. * 功能說明        :        大字設定溫度和擴展按鍵掃描,讀室溫和電壓
  249. *
  250. * 輸入參數        :        無
  251. * 輸出參數        :        無
  252. *
  253. * 修改記錄        :        新增函數,第一次編輯
  254. * 歷次作者        :        王志浩
  255. * 日期                        :        2017-10-18
  256. *************************************************************/       
  257. void timer2_int (void) interrupt TIMER2_VECTOR
  258. {
  259.         static unsigned char SetTempCounter = 0;

  260.         //如果正在設定溫度,那么大字顯示設定溫度值
  261.         if(SetTempFlag == 1)
  262.         {
  263.                 SetTempCounter++;
  264.         }
  265.         if(SetTempCounter == 50)
  266.         {
  267.                 SetTempCounter = 0;
  268.                 SetTempFlag = 0;
  269.                 if((MENU_DATA_Table.Temp_s.Default_Temp == 0) || (MENU_DATA_Table.Temp_s.Default_CH == 0))
  270.                 {
  271.                         EEPROM_SectorErase(0x0);
  272.                         EEPROM_write_n(0x0,(unsigned char *)&MENU_DATA_Table,sizeof(MENU_DATA_Table));
  273.                 }
  274.         }
  275.        
  276.         //讀室溫和電壓
  277.         RoomTemp = GetRoomTemp();
  278.         VCCVoltage = GetVoltage();
  279.        
  280.         //按鍵掃描
  281.         Key_Scan();
  282. }

  283. void exint4() interrupt 16
  284. {}
  285.        
  286. //float ADC_BandGap_Volt(void)     //讀取ADC內部電壓數據,轉化為10位
  287. //{
  288. //        unsigned int         BangGap=0;
  289. //        unsigned char code *BandAddr;
  290. //       
  291. //        BandAddr=BangGap_Addr;
  292. //        BangGap=*BandAddr++;
  293. //        BangGap=BangGap<<8;
  294. //        BangGap+=*BandAddr;
  295. //       
  296. //        return (float)BangGap / 4.88f;
  297. //}

  298. //u16 ADC_GetDat(u8 Ch,u8 ChASF)   //讀ADC數據
  299. //{
  300. //        u16 ADC_Dat=0;
  301. //        P1ASF=ChASF;
  302. //        ADC_CONTR&=~(0x07<<0);
  303. //        ADC_CONTR|=(Ch&0x07)<<0;
  304. //        ADC_CONTR&=~(1<<4);
  305. //         ADC_RES=0;
  306. //         ADC_RESL=0;
  307. //        ADC_CONTR|=1<<3;  //啟動ADC轉換
  308. //       
  309. //        while((ADC_CONTR&0x10)==0);  //等待ADC轉換完成
  310. //        ADC_CONTR&=~(1<<4);
  311. //       
  312. //        ADC_Dat=ADC_RES<<8;
  313. //        ADC_Dat+=ADC_RESL;
  314. //       
  315. //        return ADC_Dat;
  316. //}

  317. //u16 ADC_BandGap_Dat()    //讀取ADC基準電壓
  318. //{
  319. //        u16 AD_Return = 0;
  320. //        u8  i;
  321. //       
  322. //        ADC_GetDat(0,0x00);  //讀取2次取得穩定
  323. //        ADC_GetDat(0,0x00);
  324. //       
  325. //        EA = 0;
  326. //        for (i = 0 ; i <DATA_SUM ; i++ )   //連續讀取DATA_SUM次基準電壓 求和取得平均值
  327. //        {
  328. //                AD_Return += ADC_GetDat(0,0x00);
  329. //        }
  330. //        EA = 1;
  331. //        return AD_Return        >>        DATA_DIV;
  332. //}
  333. //u16 ADC_ReadCH_Dat(u8 CH)   //讀取通道電壓
  334. //{
  335. //        u16 AD_Return = 0;
  336. //        u8  i;
  337. //       
  338. //        ADC_GetDat(CH,0xff);    //讀取2次取得穩定
  339. //        ADC_GetDat(CH,0xff);
  340. //       
  341. //        EA = 0;
  342. //        for (i = 0 ; i <DATA_SUM ; i++ )   //連續讀取DATA_SUM次基準電壓求和取得平均值
  343. //        {
  344. //                AD_Return += ADC_GetDat(CH,0xff);
  345. //        }
  346. //        EA = 1;
  347. //        return AD_Return >> DATA_DIV;
  348. //}
  349. /************************************************************
  350. * 函數名                :        Get_ADC10bitResult
  351. * 功能說明        :        讀ADC值
  352. *
  353. * 輸入參數        :        channel,ADC通道號(0-7)
  354. * 輸出參數        :        返回ADC值(0-1023)
  355. *
  356. * 修改記錄        :        新增函數,第一次編輯
  357. * 歷次作者        :        王志浩
  358. * 日期                        :        2017-10-18
  359. *************************************************************/       
  360. unsigned int        Get_ADC10bitResult(unsigned char channel)
  361. {
  362.         u16        adc;
  363.         u8        i;

  364.         ADC_RES = 0;
  365.         ADC_RESL = 0;

  366.         ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;
  367.         NOP(4);                        //對ADC_CONTR操作后要4T之后才能訪問

  368.         for(i=0; i<250; i++)                //超時
  369.         {
  370.                 if(ADC_CONTR & ADC_FLAG)
  371.                 {
  372.                         ADC_CONTR &= ~ADC_FLAG;
  373.                         adc = (u16)(ADC_RES & 3);
  374.                         adc = (adc << 8) | ADC_RESL;
  375.                         return        adc;
  376.                 }
  377.         }
  378.         return        1024;        //錯誤,返回1024,調用的程序判斷
  379. }


  380. /************************************************************
  381. * 函數名                :        DisableEEPROM
  382. * 功能說明        :        失能EEPROM
  383. *
  384. * 輸入參數        :        無
  385. * 輸出參數        :        無
  386. *
  387. * 修改記錄        :        新增函數,第一次編輯
  388. * 歷次作者        :        王志浩
  389. * 日期                        :        2017-10-18
  390. *************************************************************/       
  391. void        DisableEEPROM(void)
  392. {
  393.         ISP_CONTR = 0;                        //禁止ISP/IAP操作
  394.         ISP_CMD   = 0;                        //去除ISP/IAP命令
  395.         ISP_TRIG  = 0;                        //防止ISP/IAP命令誤觸發
  396.         ISP_ADDRH = 0xff;                //清0地址高字節
  397.         ISP_ADDRL = 0xff;                //清0地址低字節,指向非EEPROM區,防止誤操作
  398. }


  399. /************************************************************
  400. * 函數名                :       
  401. * 功能說明        :        從指定EEPROM首地址讀出n個字節放指定的緩沖.
  402. *
  403. * 輸入參數        :        EE_address讀出EEPROM的首地址,DataAddress讀出數據放緩沖的首地址,number讀出的字節長度.
  404. * 輸出參數        :        無
  405. *
  406. * 修改記錄        :        新增函數,第一次編輯
  407. * 歷次作者        :        王志浩
  408. * 日期                        :        2017-10-18
  409. *************************************************************/       
  410. void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
  411. {
  412.         EA = 0;                //禁止中斷
  413.         ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY);        //設置等待時間,允許ISP/IAP操作,送一次就夠
  414.         ISP_READ();                                                                                                                                        //送字節讀命令,命令不需改變時,不需重新送命令
  415.         do
  416.         {
  417.                 ISP_ADDRH = EE_address / 256;                                                        //送地址高字節(地址需要改變時才需重新送地址)
  418.                 ISP_ADDRL = EE_address % 256;                                                        //送地址低字節
  419.                 ISP_TRIG();                                                                                                                                //先送5AH,再送A5H到ISP/IAP觸發寄存器,每次都需要如此
  420.                                                                                                                                                                                         //送完A5H后,ISP/IAP命令立即被觸發啟動
  421.                                                                                                                                                                                         //CPU等待IAP完成后,才會繼續執行程序。
  422.                 _nop_();
  423.                 *DataAddress = ISP_DATA;                                                                        //讀出的數據送往
  424.                 EE_address++;
  425.                 DataAddress++;
  426.         }while(--number);

  427.         DisableEEPROM();
  428.         EA = 1;                //重新允許中斷
  429. }


  430. /************************************************************
  431. * 函數名                :        EEPROM_SectorErase
  432. * 功能說明        :        把指定地址的EEPROM扇區擦除
  433. *
  434. * 輸入參數        :        EE_address:要擦除的扇區EEPROM的地址.
  435. * 輸出參數        :        無
  436. *
  437. * 修改記錄        :        新增函數,第一次編輯
  438. * 歷次作者        :        王志浩
  439. * 日期                        :        2017-10-18
  440. *************************************************************/       
  441. void EEPROM_SectorErase(u16 EE_address)
  442. {
  443.         EA = 0;                //禁止中斷
  444.                                                                                                                                                                                         //只有扇區擦除,沒有字節擦除,512字節/扇區。
  445.                                                                                                                                                                                         //扇區中任意一個字節地址都是扇區地址。
  446.         ISP_ADDRH = EE_address / 256;                                                                //送扇區地址高字節(地址需要改變時才需重新送地址)
  447.         ISP_ADDRL = EE_address % 256;                                                                //送扇區地址低字節
  448.         ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY);        //設置等待時間,允許ISP/IAP操作,送一次就夠
  449.         ISP_ERASE();                                                                                                                                //送扇區擦除命令,命令不需改變時,不需重新送命令
  450.         ISP_TRIG();
  451.         _nop_();
  452.         DisableEEPROM();
  453.         EA = 1;                //重新允許中斷
  454. }


  455. /************************************************************
  456. * 函數名                :        EEPROM_write_n
  457. * 功能說明        :        把緩沖的n個字節寫入指定首地址的EEPROM.
  458. ……………………

  459. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png
所有資料51hei提供下載:
白光烙鐵_V3.1.1硬件SPI(天山V1.2).rar (995.1 KB, 下載次數: 357)

評分

參與人數 4黑幣 +38 收起 理由
daiya + 10 絕世好帖!
wangxindir + 8 很給力!
楊雪飛 + 15 曾經的過往是誰啊,你同學嗎?
youyou1979 + 5 很給力!很好的學習資料、案例

查看全部評分

回復

使用道具 舉報

ID:98992 發表于 2018-8-30 11:03 | 顯示全部樓層
感謝分享 我想做一個
回復

使用道具 舉報

ID:73182 發表于 2018-8-30 15:14 | 顯示全部樓層
這個可以有,感謝
回復

使用道具 舉報

ID:57896 發表于 2018-8-31 11:31 | 顯示全部樓層
謝謝分享,花這么多精力寫的,這么好的源碼能拿出來共享不是一般人能做得到的,謝謝!
回復

使用道具 舉報

ID:61140 發表于 2018-8-31 21:42 | 顯示全部樓層
可惜沒代碼,下載不了
回復

使用道具 舉報

ID:394041 發表于 2018-9-5 15:22 | 顯示全部樓層
謝謝樓主分享,學習下。
回復

使用道具 舉報

ID:392501 發表于 2018-9-25 09:19 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:402026 發表于 2018-9-25 10:19 | 顯示全部樓層
感謝樓主分享,下載學習!
回復

使用道具 舉報

ID:399799 發表于 2018-9-25 10:52 | 顯示全部樓層
謝謝,我也學習一下
回復

使用道具 舉報

ID:399179 發表于 2018-9-25 11:06 來自手機 | 顯示全部樓層
這個好復雜啊!
回復

使用道具 舉報

ID:327783 發表于 2018-9-30 20:23 | 顯示全部樓層
下載研究一下!
回復

使用道具 舉報

ID:411954 發表于 2018-10-18 21:50 | 顯示全部樓層
感謝樓主分享,下載學習!
回復

使用道具 舉報

ID:408539 發表于 2018-11-2 03:34 | 顯示全部樓層
樓主無私精神
回復

使用道具 舉報

ID:199427 發表于 2018-11-5 14:10 | 顯示全部樓層
謝謝樓主分享的資料。
回復

使用道具 舉報

ID:525688 發表于 2019-5-1 20:30 | 顯示全部樓層

謝謝,我也學習一下
回復

使用道具 舉報

ID:62553 發表于 2019-5-5 09:01 | 顯示全部樓層
謝謝樓主   謝謝   
回復

使用道具 舉報

ID:432192 發表于 2019-5-11 22:31 來自手機 | 顯示全部樓層
感謝樓主開源
回復

使用道具 舉報

ID:462163 發表于 2019-5-14 09:32 | 顯示全部樓層
硬件套件你有賣嗎?想買來玩玩
回復

使用道具 舉報

ID:538330 發表于 2019-5-29 14:06 | 顯示全部樓層
感謝樓主開源
回復

使用道具 舉報

ID:384581 發表于 2019-11-22 00:15 | 顯示全部樓層

謝謝分享,  不支知樓主有用PID, 能自整定不?
回復

使用道具 舉報

ID:392145 發表于 2019-12-13 22:52 | 顯示全部樓層
原理圖在什么文件里面?
回復

使用道具 舉報

ID:392145 發表于 2019-12-13 22:52 | 顯示全部樓層
原理圖在什么文件里面 ,請問,有知道的嗎?
回復

使用道具 舉報

ID:716660 發表于 2020-11-21 17:08 | 顯示全部樓層
程序寫的太牛了,可惜沒有原理圖參考
回復

使用道具 舉報

ID:353831 發表于 2021-3-1 21:45 | 顯示全部樓層
qin531100 發表于 2019-12-13 22:52
原理圖在什么文件里面 ,請問,有知道的嗎?

同問????
回復

使用道具 舉報

ID:95809 發表于 2021-3-2 08:39 | 顯示全部樓層
呦呦奧利給 發表于 2020-11-21 17:08
程序寫的太牛了,可惜沒有原理圖參考

原理圖,固件版本不同,可以自己修改IO.

天山T12_V1.0原理圖.pdf

25.4 KB, 下載次數: 73, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:707558 發表于 2022-1-26 09:51 | 顯示全部樓層
非常感謝樓主的開源程序,程序非常牛,且可以根據自己需要進行修改,真的很好。
回復

使用道具 舉報

ID:707558 發表于 2022-1-26 09:59 | 顯示全部樓層
呦呦奧利給 發表于 2020-11-21 17:08
程序寫的太牛了,可惜沒有原理圖參考

這是同時支持4位數碼管和OLED12864顯示的T12控制板原理圖,不過IO與天山版的有所不同,需要修改IO。

數顯T12控制板.PDF

79.9 KB, 下載次數: 31, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:1043341 發表于 2022-8-30 18:05 | 顯示全部樓層
剛買了個T12 用的這個方案
回復

使用道具 舉報

ID:1060550 發表于 2023-1-6 23:11 | 顯示全部樓層
非常感謝樓主的開源程序
回復

使用道具 舉報

ID:1057863 發表于 2023-1-13 09:54 | 顯示全部樓層
程序有點多啊,不過oled固定在里面也是挺厲害,不容易損壞
回復

使用道具 舉報

ID:20772 發表于 2024-1-9 14:36 | 顯示全部樓層
學習一下
回復

使用道具 舉報

ID:1109254 發表于 2024-1-15 09:18 | 顯示全部樓層
文章真是好,抽時間學習!!
回復

使用道具 舉報

ID:1139591 發表于 2024-12-21 23:16 | 顯示全部樓層
多年以后i感謝樓主開源
回復

使用道具 舉報

ID:402677 發表于 2024-12-22 10:47 | 顯示全部樓層
感謝樓主把最好的東西無私的分享給大家
回復

使用道具 舉報

ID:705870 發表于 2024-12-23 13:08 | 顯示全部樓層
下載復刻一個T12,消耗一下手里的T12耗材。感謝作者開源。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 五月婷婷亚洲 | 欧美亚洲成人网 | 亚洲精品大片 | 成人网在线 | 一区二区三区在线 | 毛片久久久 | 99久久国产免费 | 成人午夜网站 | 一区二区三区四区av | 日韩综合色 | 人人操日日干 | 日韩免费视频一区二区 | 欧美日韩一区二区视频在线观看 | 天堂综合网久久 | 久久综合一区 | 亚洲精品一区二区三区 | 精品久久久久久久久久久久 | 国产精品jizz在线观看老狼 | 国产精品久久久久久久久久久免费看 | 国产超碰人人爽人人做人人爱 | 精品国产乱码久久久久久影片 | 91精品国产91 | 国产欧美一区二区久久性色99 | 精品国产乱码久久久久久88av | 九九国产| 日韩在线视频免费观看 | 久久久久中文字幕 | av色噜噜| 久久免费视频2 | 亚洲欧美日韩精品久久亚洲区 | 国产精品久久久久久久久久不蜜臀 | 亚洲一区中文字幕 | 国产1区2区 | 成人在线激情 | 婷婷免费视频 | 日韩免费成人av | 亚洲精品乱码久久久久久久久 | 中文字幕在线一区 | 91精品国产麻豆 | 国产精品不卡一区 | 国产精品久久久 |