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)
|