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

您所在的位置:网站首页 超级电容自制点焊机控制板电路图 创意小发明:使用51系列单片机的DIY点焊机控制项目(程序+原理图)

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

2023-11-20 19:17| 来源: 网络整理| 查看: 265

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

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

在这里插入图片描述 机箱面板上有3个LED指示灯,最上面红色的是电源指示灯,面板上开关打开接通控制电源后常亮。中间橙色的是工作指示灯,点焊机变压器接通后点亮,关闭后即灭。下面绿色的是准备好信号灯,当倒计时为零时此灯闪烁,只有绿色信号灯闪烁时点焊按钮才有效,这个信号灯在焊把上也同时存在。 下面是控制线路的原理图: 在这里插入图片描述

单片机程序参考源代码如下: /******************************************************************************* * *小型点焊机焊接控制装置 * 结构说明: 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分享群,本博客所有代码开源下载,或私信我,看到后会第一时间回复。

谢谢!

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3