各位早上好,最近一段时间全市不好的消息,南方的洪水已经超过了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<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毫秒处理程序
}
}
}
}
鉴于篇幅有限,只能写以上部分代码
最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,
如果需要完整代码或设计文件,请加QQ分享群,本博客所有代码开源下载,或私信我,看到后会第一时间回复。
谢谢!
祝大家早日成为单片机大神!