打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
山寨T12焊台温控器,单片机、数码管显示、按键调温
偶然弄了两根T12的烙铁芯。学习了它的相关知识自己瞎捣鼓了一下,利用一个杂牌936焊台的主机壳子用3d打印机打了一个面板。

这个山寨版的控制器大致功能如下:

1.按键调节温度高低并用数码管显示出来,按键短按依次加减,按键长按快速加减。
2.本次开机后默认上次关机前的调节温度。(正在弄还没有实现)
3.带有休眠功能,烙铁放在烙铁架上一段时间后自动降温到一设定值,达到休眠目的。从烙铁架上拿起来后恢复到原来设定的温度。
4.慢慢再补充。

先从电路做起



制作过程










电路基本搞定,再来面板。CAD初学,简单弄的
面板






简易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;              
                }
        }
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
开源啦!STC15F204EA旋转编码器版白光T12控制器代码完工(附运行视频)|我爱单片机
shan
也许想念只是一种一瞬(2)【图文】
xm
H3xm
24020901001010 研磨锅.PDF(2)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服