偶然弄了两根T12的烙铁芯。学习了它的相关知识自己瞎捣鼓了一下,利用一个杂牌936焊台的主机壳子用3d打印机打了一个面板。
有办法,找了一条深颜色的汽车贴膜贴上去
果然帅多了
装好
开烧。。。。
电路稍微做了调整,LM358放大倍数调整为200多倍。
STC15F204_T12_C.rar (45 K) 下载次数:2 C程序如下。头文件、源程序、电路图上面附件中也有,初学阶段仅供参考。待机状态温度显示基本稳定上下浮动1、2度,使用状态遇到大焊点会偏差几度,这个以后慢慢学习改进。
#include "STC15F204EA.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit baiwei=P3^7;
sbit shiwei=P3^6;
sbit gewei=P3^5;
sbit danwei=P3^4;
sbit dian=P2^3;
sbit out=P3^3;
sbit up=P3^2;
sbit down=P3^1;
sbit xiumian=P1^0;
uchar code led[]={0xd7,0x42,0xe5,0xe6,0x72,0xb6,0xb7,0xc2,0xf7,0xf6}; //定义数码管0-9数组
uint ADC_result6,shan_sz,shan_dw,wendu,sheding,aa,tt01,tt_xm1,tt_xm2,tt_aj,js_xm;
uchar sheding_bz,jiare_bz,bz1,bz2,qieh_w,tt00,jiareshu,bz_xs,tt1,ab1,ab2,fen,miao; //定义变量
void delay(uint z) //延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
/*********AD转换,得出热电偶被放大后的电压值**********/
uint get_ad_result(uchar channel)
{
uchar ad_finished=0; //存储A/D转换标志
ADC_RES=0; //高8位清零
ADC_RESL=0; //低2位清零
channel&=0x07; //0000 0111 清零高5位
ADC_CONTR=0x60; //转换速率为70个时钟周期转换1次
_nop_();
ADC_CONTR|=channel; //选择A/D当前通道
_nop_();
ADC_CONTR|=0x80; //启动A/D电源
delay(1); //延时一下使输入电压达到稳定
ADC_CONTR|=0x08; //0000,1000 令 ADCS = 1, 启动A/D转换,
ad_finished=0;
while(ad_finished==0) //等待A/D转换结束
{
ad_finished=(ADC_CONTR&0x10); //0001,0000 测试A/D转换结束否
}
ADC_CONTR&=0xE7; //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,
return(ADC_RES*256+ADC_RESL); //返回 A/D 高8位+低2位转换结果
}
/*********初始化*********/
void init()
{
TMOD=0x11; //设定定时器工作方式
EA=1; //开总中断
ET0=1; //开定时器0
TR0=1; //启动定时器0
TH0=(65536-1000)/256; //高8位装初值 1ms
TL0=(65536-1000)%256; //低8位装初值
ET1=1; //开定时器1
TR1=1; //启动定时器1
TH1=(65536-2000)/256; //高8位装初值 2ms
TL1=(65536-2000)%256; //低8位装初值
}
/********EEPROM读写程序*******/
void OPEN_IAP() //开启ISP/IAP
{
EA=0; //关闭总中断避免中断影响
IAP_CONTR=0x82; //允许ISP/IAP,系统时钟<20Mhz时,设置等待时间
}
void CLOSE_IAP() //关闭ISP/IAP
{
IAP_CONTR=0x00; //禁止ISP/IAP
IAP_ADDRH=0xFF;
IAP_ADDRL=0xFF;
EA=1;
}
uint READ_IAP_BYTE(uchar addr) //从EEPROM指定单元中读数据
{
IAP_CMD=0x01;
IAP_ADDRH=(addr&0xFF00)>>8;
IAP_ADDRL=addr&0x00FF;
IAP_TRIG=0x5A;
IAP_TRIG=0xA5; //对IAP_TRIG先写0x5A再写0xA5,命令才会生效
return IAP_DATA;
}
void ERASE_IAP_SECTOR(int addr) //写数据前要先擦除扇区
{
IAP_CMD=0x03;
IAP_ADDRH=(addr&0xFF00)>>8;
IAP_ADDRL=addr&0x00FF;
IAP_TRIG=0x5A;
IAP_TRIG=0xA5; //对IAP_TRIG先写0x5A再写0xA5,命令才会生效
}
void WRITE_IAP_BYTE(int addr,uchar writeval) //把一个字节写入指定单元
{
IAP_CMD=0x02;
IAP_ADDRH=(addr&0xFF00)>>8;
IAP_ADDRL=addr&0x00FF;
IAP_DATA=writeval;
IAP_TRIG=0x5A;
IAP_TRIG=0xA5; //对IAP_TRIG先写0x5A再写0xA5,命令才会生效
}
/*********主程序********/
void main()
{
init();
P1ASF=0x40; //0100 0000 将P1.6置为模拟口
AUXR1|=0x04; //0000 0100 令ADRJ=1,10位A/D转换结果的最高2位放在ADC_RES寄存器,低8位放在ADC_RESL
ADC_CONTR|=0x80; //打开A/D转换电源启动A/D转换
P3M0=0xf8; //1111 1000 设定P3.3/4/5/6/7口为强推挽输出模式
P2M0=0xff; //1111 1111 设定P2口为强推挽输出模式
jiare_bz=1;
out=0;
sheding_bz=0;
delay(500); //初始化后适当延时后再读写EEPROM,保证有效性
OPEN_IAP();
ab1=READ_IAP_BYTE(0x0001); //读出保存的百位
ab2=READ_IAP_BYTE(0x0002); //读出保存的十位、个位
CLOSE_IAP();
sheding=ab1*100+ab2; //算出上次的设定值,高两位*100+低两位
if(sheding<2000)
sheding=2000; //如果设定值过低默认成2000
while(1)
{
if(sheding_bz) //写入EEPROM,每次更改设定值后写入一次
{
out=0;
OPEN_IAP(); //开启
ERASE_IAP_SECTOR(0x0001); //擦除扇区
WRITE_IAP_BYTE(0x0001,sheding/100); //设定值的百位写入0001地址
WRITE_IAP_BYTE(0x0002,sheding%100); //设定值的十位、个位写入0002地址
CLOSE_IAP(); //关闭
sheding_bz=0; //标志置0,使得写EEPROM操作运行一次即可
jiare_bz=1;
}
}
}
void timer0() interrupt 1 //定时器0中断程序 1ms
{
TH0=0xfc; //(65536-1000)/256
TL0=0x18; //(65536-1000)%256
/**************按键检测、测温、加热程序***************/
if((up&down)==0)
{
bz_xs=1; //显示切换标志置1
tt01=0; //计时变量tt01置0
bz2=1; //标志2置1
jiare_bz=0; //加热标志置0
miao=0;
fen=0; //按键按下清除休眠计时
shan_dw=0;
shan_sz=0;
if(tt_aj<1000)
tt_aj++;
if(tt_aj>500) //超过500ms说明是长按,1ms一次快速加减
{
if(up==0)
{
if(sheding<4500)
sheding++;
}
if(down==0)
{
if(sheding>200)
sheding--;
}
}
else
{
if(bz1==0) //根据标志位情况短按自加减一次
{
if(up==0)
{
if(sheding<4500)
sheding+=10;
}
if(down==0)
{
if(sheding>200)
sheding-=10;
}
bz1=1;
}
}
}
else //按键抬起 ,测温、加热步骤
{
tt_aj=0;
bz1=0;
if(tt01<2000)
tt01++;
if(tt01>1500) //按键弹起1.5秒后显示标志置0显示实际温度
{
if(bz2) //标志2为1,设定标志置1,让新数值写入EEPROM
{
sheding_bz=1;
bz2=0; //同时标志2置0,目的是让只写入一次即可
}
bz_xs=0;
}
if(jiare_bz) //加热标志为1时才启动加热动作
{
tt00++;
if(jiareshu>tt00)
out=1;
else
out=0;
if(wendu>4500) //超温停止加热
out=0;
if(tt00>=200) //加热200ms之后断电测温
{
if(tt00<205) //5ms时间断电检测
{
out=0;
if(tt00>203) //断电延时后采集热电偶温度数据
ADC_result6=get_ad_result(6); //A/D转换6通道
// wendu=ADC_result6*4.8;
wendu=ADC_result6*8.0; //热电偶电压经过运放放大200多倍后采样显示,模拟大概温度
if(fen<2) //休眠计时不到设定值时加热温度为设定温度
aa=sheding+5;
else if(fen<5) //2-5分钟内温度降低为250度
{
if(sheding>2500)
aa=2500;
}
else if(fen<10) //5-10分钟内降低为200度
{
if(sheding>2000)
aa=2000;
}
else if(fen<20) //10-20分钟内为150度
{
if(sheding>1500)
aa=1500;
}
else //超过20分钟为0
aa=0;
if(wendu>aa) //烙铁温度高于设定温度
{
if(wendu-aa<=30)
jiareshu=wendu-aa;
else
jiareshu=0;
}
else //温度低于设定温度
{
if(aa-wendu>400) //逐渐逼近式加热方式
jiareshu=200;
else if(aa-wendu>300)
jiareshu=180;
else if(aa-wendu>200)
jiareshu=150;
else if(aa-wendu>100)
jiareshu=130;
else
jiareshu=aa-wendu+aa/100;
}
}
else //加热、断电测量温度后充值计数变量tt00
tt00=0;
}
}
else
out=0;
}
}
void timer1() interrupt 3 //定时器1服务程序 2ms
{
TH1=0xf8; //(65536-2000)/256
TL1=0x30; //(65536-2000)%256
/***********显示程序************/
if(bz_xs) //按键按下显示正在调整的数值
wendu=sheding; //显示设定时的数值
if(qieh_w>=3) //位切换标识变量,2ms轮流显示一位 休眠时数字闪亮
qieh_w=0;
else
qieh_w++;
switch(qieh_w)
{
case 0:
baiwei=0;
// P2=led[wendu%10];
P2=0x9d; //1001 1101 显示单位 ℃ 度
if(shan_dw<250) //烙铁离开烙铁架时℃闪亮
danwei=1; //显示单位
else
danwei=0;
break;
case 1: //4位数实际显示3位,最右一位不显示。比如1234显示123
danwei=0;
if(wendu>4500)
P2=0x20; //温度超过4500显示---℃
else
P2=led[wendu%100/10]; //显示个位
if(shan_sz<250) //休眠时几位数字闪烁
gewei=1;
else
gewei=0;
break;
case 2:
gewei=0;
if(wendu>4500)
P2=0x20;
else
P2=led[wendu%1000/100]; //显示十位
if(wendu>=100&shan_sz<250)
shiwei=1;
else
shiwei=0;
break;
case 3:
shiwei=0;
if(wendu>4500)
P2=0x20;
else
P2=led[wendu/1000]; //显示百位
if(wendu>=1000&shan_sz<250)
baiwei=1;
else
baiwei=0;
break;
}
if(xiumian) //休眠 ,高电平有效
{
tt_xm2=0;
shan_dw=0;
if(tt_xm1<2000) //休眠变量最大控制在2000避免加飞
tt_xm1++;
if(tt_xm1>500) //放在烙铁架上超过1秒开始进入休眠计时
{
if(fen>1) //2分钟后数字开始闪烁
{
if(shan_sz<500)
shan_sz++;
else
shan_sz=0;
}
js_xm++;
if(js_xm>=500) //1秒时间到,秒自加、分钟自加
{
miao++;
if(miao>=60)
{
if(fen<100)
fen++;
miao=0;
}
js_xm=0;
}
}
}
else //退出休眠进入正常状态时
{
tt_xm1=0;
if(tt_xm2<2000)
tt_xm2++;
if(tt_xm2>250)
{
js_xm=0; //休眠计时、秒、分变量置0
miao=0;
fen=0;
shan_sz=0; //数字不闪
shan_dw++; //烙铁拿起来℃闪烁
if(shan_dw>500)
shan_dw=0;
}
}
}