找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11687|回复: 31
收起左侧

天山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, 下载次数: 340)

评分

参与人数 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, 下载次数: 70, 下载积分: 黑币 -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, 下载次数: 30, 下载积分: 黑币 -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 | 显示全部楼层
文章真是好,抽时间学习!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表