最近做了一个用单片机的点焊机控制装置,使用的是89C51单片机、LCD5110显示屏和微型继电器,通过检测按钮信号,精确控制点焊机变压器的导通时间和两次焊接的间隔时间。变压器导通时间从40毫秒到2600毫秒之间,按20毫秒为一档连续可调,两次焊接的间隔时间则为5秒和10秒两档,这两个参数均通过7+1位拨码开关由用户根据需要动态设置,设置结果即时显示在屏幕上。参见下图:
003电子点焊机.jpg(44 KB, 下载次数: 0)
下载附件
前天 13:17 上传
屏幕中间显示的是设置的点焊时间,以毫秒为单位,通过左起的7位拨码开关设置。下部左边显示的的是设置的间隔时间,为5秒和10秒两档, 通过最右边的拨码开关设置。屏幕右下角显示的是间隔时间倒计时,只有倒计时为零时,单片机才接收点焊按钮的信号。下图是点焊机的正面:
115控制板制作_通电测试.jpg(140.45 KB, 下载次数: 0)
下载附件
前天 13:16 上传
机箱面板上有3个LED指示灯,最上面红色的是电源指示灯,面板上开关打开接通控制电源后常亮。中间橙色的是工作指示灯,点焊机变压器接通后点亮,关闭后即灭。下面绿色的是准备好信号灯,当倒计时为零时此灯闪烁,只有绿色信号灯闪烁时点焊按钮才有效,这个信号灯在焊把上也同时存在。
下面是控制线路的原理图:
整个控制线路用了两块万用板搭焊,一块安装了3个LED信号灯、LCD5110显示屏和8位拨码开关,另一块则是单片机及外围电路、微型继电器以及7805稳压块等。
单片机源程序如下:
- /*******************************************************************************
- * *
- * 点焊机控制器 *
- --------------------------------------------------------------------------------
- * 结构说明: 51单片机计时控制 *
- * 在检测到点焊手柄发出的工作信号时, *
- * 立即接通点焊机的电源,点焊机开始工作,设定的时间结束后切断电源,*
- * 在设定的间隔时间内,不接收点焊手柄发出的工作信号。 *
- * 版本说明: 胡家峻@2018年8月 *
- *******************************************************************************/
- /*
- * 单片机P0^0~P0^4口分配给LCD5110使用:RET、CE、D/C、DIN、CLK(在LCD_5110.h中定义
- * P0^5 设备等待(可以工作)信号灯
- * P0^6 设备工作间隙(不接收点焊信号)信号灯
- *
- * P1^0~P1^6 开关设置点焊时间(20毫秒为1单位,0~127单位)
- * P1^7 工作间隙:0=5秒,1=10秒
- *******************************************************************************/
- #include<reg51.h>
- //#include<intrins.h>
- #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毫秒处理程序
- }
- }
- }
- }
复制代码
所有资料51hei提供下载:
点焊机.rar
(708.39 KB, 下载次数: 252)
Keil项目文件包
|