创意小发明:使用51系列单片机的DIY点焊机控制项目(程序+原理图)

各位早上好,最近一段时间全市不好的消息,南方的洪水已经超过了98年是史上最厉害的洪水,但愿灾难赶紧过去

最近做了一个用单片机的点焊机控制装置,使用的是89C51单片机、LCD5110显示屏和微型继电器,通过检测按钮信号,精确控制点焊机变压器的导通时间和两次焊接的间隔时间。变压器导通时间从40毫秒到2600毫秒之间,按20毫秒为一档连续可调,两次焊接的间隔时间则为5秒和10秒两档,这两个参数均通过7+1位拨码开关由用户根据需要动态设置,设置结果即时显示在屏幕上。参见下图:
创意小发明:使用51系列单片机的DIY点焊机控制项目(程序+原理图)_第1张图片
项目说明:
屏幕中间显示的是设置的点焊时间,以毫秒为单位,通过左起的7位拨码开关设置。下部左边显示的的是设置的间隔时间,为5秒和10秒两档, 通过最右边的拨码开关设置。屏幕右下角显示的是间隔时间倒计时,只有倒计时为零时,单片机才接收点焊按钮的信号。下图是点焊机的正面:

创意小发明:使用51系列单片机的DIY点焊机控制项目(程序+原理图)_第2张图片
机箱面板上有3个LED指示灯,最上面红色的是电源指示灯,面板上开关打开接通控制电源后常亮。中间橙色的是工作指示灯,点焊机变压器接通后点亮,关闭后即灭。下面绿色的是准备好信号灯,当倒计时为零时此灯闪烁,只有绿色信号灯闪烁时点焊按钮才有效,这个信号灯在焊把上也同时存在。
下面是控制线路的原理图:
创意小发明:使用51系列单片机的DIY点焊机控制项目(程序+原理图)_第3张图片

单片机程序参考源代码如下:
/*******************************************************************************
*
*小型点焊机焊接控制装置 *

  • 结构说明: 51单片机计时控制 *
  • 在检测到点焊手柄发出的工作信号时, *
  • 立即接通点焊机的电源,点焊机开始工作,设定的时间结束后切断电源,*
  • 在设定的间隔时间内,不接收点焊手柄发出的工作信号。 *
  • 版本说明: 胡家峻@2018年8月 *
    ******************************************************************************/
    /
  • 单片机P00~P04口分配给LCD5110使用:RET、CE、D/C、DIN、CLK(在LCD_5110.h中定义
  • P0^5 设备等待(可以工作)信号灯
  • P0^6 设备工作间隙(不接收点焊信号)信号灯

P10~P16 开关设置点焊时间(20毫秒为1单位,0~127单位)

  • P1^7 工作间隙:0=5秒,1=10秒
    *******************************************************************************/

#include
//#include
#include"LCD_5110.h" //包含LCD显示驱动文件

#define u8 unsigned char //单字节
#define u16 unsigned int //双字节
#define u64 unsigned long //四字节

#define SZP1 P1 //P1口为初始设置的数据,低七位为定时数值(0-127)*20ms,
//第八位为间隙时间,0=5秒,1=10秒
sbit LED_work = P0^5; //设备工作信号(低电平点焊机接通)
sbit LED_read = P0^6; //设备就绪信号(低电平可以工作)
sbit work = P0^7; //点焊按钮信号(低电平按下)

//–定义全局变量–//
u8 sdsj = 0; //设定的点焊单位
u64 shsj = 0; //设定的点焊时间(双字节,以毫秒为单位)
u8 wait = 5; //设置的间隔时间(5秒或10秒,根据P1.7确定)

u8 time_work = 0; //焊接时间计时(20毫秒/单位)
u8 time_wait = 0; //等待时间计时(单位秒)
bit time_1s = 0; //秒信号
bit time_20ms = 0; //20毫秒信号
bit flag = 0; //定时工作标志(0=待机或间隔,1=正在工作

/*******************************************************************************

  • 函 数 名 : ReadSet

  • 函数功能 : 读设置并显示

  • 输 入 : 无

  • 输 出 : 无
    *******************************************************************************/
    void ReadSet(void)
    {
    sdsj = SZP1; //从P1口读入一个字节的数据
    if (sdsj>127) wait = 10; //最高位1,间隔时间=10秒
    else wait = 5;
    LCD_write_val(27,4,2,wait);//显示设定的间隔时间

    sdsj = (sdsj & 0x7f) + 3; //取低7位定时值再加3(60毫秒)
    shsj = sdsj * 20; //20毫秒基本单位
    LCD_write_val(27,2,4,shsj);//显示设定的点焊时间
    }

/*******************************************************************************

  • 函 数 名 : timehand
  • 函数功能 : 20毫秒处理函数,即每隔20毫秒处理一次
  • 输 入 : 无
  • 输 出 : 无
    *******************************************************************************/
    void TimeHand(void)
    {
    if (flag == 0) //待机状态
    {
    if (work == 0) //收到点焊按钮信号
    {
    flag = 1; //设置工作标志
    time_work = sdsj;//取设定时间
    LED_work = 0; //开通工作电源
    LED_read = 1; //关闭等待信号灯
    }
    else //无点焊按钮信号
    {
    ReadSet(); //检查更新设置
    }
    }
    else //工作状态
    {
    time_work–;
    if (time_work == 0)//定时时间到
    {
    LED_work = 1; //关闭点焊机电源
    LED_read = 1; //取消准备好信号灯
    flag = 0; //撤销工作标志
    time_wait = wait;//恢复间隔时间
    LCD_write_val(61,4,2,time_wait);//显示剩余间隔时间
    }
    }
    }

/*******************************************************************************

  • 函 数 名 :

  • 函数功能 : T0中断服务函数

  • 输 入 : 无

  • 输 出 : 无
    *******************************************************************************/
    void InterruptTimer0() interrupt 1
    {
    static u8 i = 0; //毫秒
    static u8 j = 0; //20毫秒

    TH0 = 0xFC; //重新加载初值,定时1ms
    TL0 = 0x66;

    i++;
    if (i > 19) //20毫秒计时到
    {
    i = 0;
    time_20ms = 1; //置20毫秒标志
    j++;
    if (j > 49) //1秒
    {
    j = 0;
    time_1s = 1; //置1秒标志
    }
    }
    }

/*******************************************************************************

  • 函 数 名 : main

  • 函数功能 : 主函数

  • 输 入 : 无

  • 输 出 : 无
    *******************************************************************************/
    void main(void)
    {
    //设置初始屏幕显示
    u8 i, x ,y;

    LED_work = 1; //测试
    LED_read = 1;
    LCD_init(); //初始化5110屏幕

    x = 8; //显示的起始位置
    y = 0;
    for (i = 0; i < 5; i++)//显示“电子点焊机”
    {
    LCD_write_char(x,y,i);//
    x = x + 14; //下一字的显示位置
    }
    x = 0;
    y = 2;
    LCD_write_char(x,y,3); //显示“焊”
    x = 14;
    LCD_write_char(x,y,5); //显示“接”
    x = 59;
    LCD_write_char(x,y,8); //显示“毫”
    x = 72;
    LCD_write_char(x,y,9); //显示“秒”
    x = 0;
    y = 4;
    LCD_write_char(x,y,6); //显示“间”
    x = 14;
    LCD_write_char(x,y,7); //显示“隔”
    x = 44;
    LCD_write_char(x,y,9); //显示“秒”
    x = 76;
    LCD_write_ASCII(x,y,12);//显示“s”

    ReadSet(); //读取设定定时时间并显示
    LCD_write_val(61,4,2,time_wait);//显示剩余间隔时间
    LED_read = 0; //显示准备好信号灯

    TMOD = 0x01; //设置T0为模式1
    // TH0 = 0xF8; //为T0赋初值0xF8CD,定时2ms
    // TL0 = 0xCD;
    TH0 = 0xFC; //为T0赋初值0xFC67,定时1ms
    TL0 = 0x66;
    // TH0 = 0xFC;
    // TL0 = 0xC3; //为T0赋初值0xFA02,定时1ms
    ET0 = 1; //开T0中断
    TR0 = 1; //启动定时器0
    EA = 1; //开总中断

    while(1)
    {
    if (time_1s == 1) //每秒处理
    {
    time_1s = 0; //重置秒标志

    if (time_wait > 0)
    {
    time_wait–;
    if (time_wait == 0)
    {
    LED_read = 0;//显示就绪信号
    }
    LCD_write_val(61,4,2,time_wait);//显示剩余间隔时间
    }
    else
    {
    if (LED_work == 1)
    {
    LED_read = ~LED_read;//等待时每秒闪一次
    }
    }
    }

    if (time_20ms == 1)
    {
    time_20ms = 0; //重置20毫秒标志
    if (time_wait == 0)
    {
    TimeHand(); //调用20毫秒处理程序
    }
    }
    }
    }

鉴于篇幅有限,只能写以上部分代码
最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,
如果需要完整代码或设计文件,请加QQ分享群,本博客所有代码开源下载,或私信我,看到后会第一时间回复。

谢谢!

祝大家早日成为单片机大神!

你可能感兴趣的:(项目,编程,项目,DIY,电焊机,嵌入式)