点焊机控制装置(51单片机)
本帖最后由 hujj 于 2018-12-17 15:29 编辑最近做了一个用单片机的点焊机控制装置,使用的是89C51单片机、LCD5110显示屏和微型继电器,通过检测按钮信号,精确控制点焊机变压器的导通时间和两次焊接的间隔时间。变压器导通时间从40毫秒到2600毫秒之间,按20毫秒为一档连续可调,两次焊接的间隔时间则为5秒和10秒两档,这两个参数均通过7+1位拨码开关由用户根据需要动态设置,设置结果即时显示在屏幕上。参见下图:
屏幕中间显示的是设置的点焊时间,以毫秒为单位,通过左起的7位拨码开关设置。下部左边显示的的是设置的间隔时间,为5秒和10秒两档, 通过最右边的拨码开关设置。屏幕右下角显示的是间隔时间倒计时,只有倒计时为零时,单片机才接收点焊按钮的信号。下图是点焊机的正面:
机箱面板上有3个LED指示灯,最上面红色的是电源指示灯,面板上开关打开接通控制电源后常亮。中间橙色的是工作指示灯,点焊机变压器接通后点亮,关闭后即灭。下面绿色的是准备好信号灯,当倒计时为零时此灯闪烁,只有绿色信号灯闪烁时点焊按钮才有效,这个信号灯在焊把上也同时存在。
下面是控制线路的原理图:
整个控制线路用了两块万用板搭焊,一块安装了3个LED信号灯、LCD5110显示屏和8位拨码开关,另一块则是单片机及外围电路、微型继电器以及7805稳压块等。
由于我选用的LCD5110没有带字库,自建了12*14点阵的汉字软字库子集和7*12点阵的ASCII码软字库子集供显示用。整个程序如下:
1、main.c文件
/*******************************************************************************
* *
* ?????????? *
--------------------------------------------------------------------------------
* ?????: 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; //????????????????£?
//--??????????--//
u8sdsj = 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?????????
}
}
}
}
2、LCD_5110.c
#include<reg51.h>
#include<intrins.h>
#include"LCD_5110.h"
#include"charcode.h" //12*16(14)?????????
#include"asciicode.h" //7*16(12)????ASCII???
/*********************************************
* ?????????LCD_write_byte
* ????????????SPI??????д????/????LCD
* ????????data??????:д????????
* dc :д????1/????0???
* ???????????
* ????????D/C(LCD_DC)???????д????????D/C=0)?????????D/C=1)
*********************************************/
void LCD_write_byte(unsigned char dat,bit dc)
{
unsigned char i;
LCD_CE = 0; //5110????Ч??????????????
LCD_DC = dc; //dc=0д????dc=1д????
for (i=0; i<8; i++) //????8λ????
{
if (dat & 0x80)
{
LCD_DIN = 1;
}
else
{
LCD_DIN = 0;
}
LCD_CLK = 0;
dat = dat << 1; //?????λ????????
LCD_CLK = 1; //??????????
}
LCD_CE = 1; //???5110
}
/*********************************************
* ?????????LCD_init
* ?????????5110?????
* ??????????
* ???????????
* ???????????????????RES???????帴λ????VDD?????????????100ms,RST?????????<0.3VDD??
*********************************************/
void LCD_init(void)
{
LCD_RST = 0; //?????????LCD??λ?????????
_nop_();
_nop_();
LCD_RST = 1;
LCD_CE = 0; //???LCD
_nop_();
_nop_();
LCD_CE = 1; //???LCD
LCD_write_byte(0x21,0); //??????LCD??????LCD??
LCD_write_byte(0xc8,0); //????????????
LCD_write_byte(0x06,0); //???У??????????2??
LCD_write_byte(0x13,0); //1:48
LCD_write_byte(0x20,0); //??????????V=0??????
LCD_write_byte(0x0c,0); //?趨??????????????
LCD_clear(); //????
LCD_CE = 0; //???LCD??
}
/*********************************************
* ?????????LCD_clear
* ?????????5110??????????д???????
* ??????????
* ???????????
* ???????
*********************************************/
void LCD_clear(void)
{
unsigned char i,j;
LCD_set_XY(0,0); //????????????
for (i=0; i<6; i++)
{
for (j=0; j<84; j++)
{
LCD_write_byte(0x00,1);
}
}
}
/*********************************************
* ?????????LCD_set_XY
* ?????????????LCD??????
* ????????X ??????:0-83??
* Y :0-5
* ???????????
* ?????
*********************************************/
void LCD_set_XY(unsigned char X,unsigned char Y)
{
LCD_write_byte(0x40 | Y,0); //column??
LCD_write_byte(0x80 | X,0); //row??
}
/*********************************************
* ?????????LCD_write_ASCII
* ????????????????????7*12(16)
* ????????x,y,cid??:????????0 1 2 3 4 5 6 7 8 9=ms
* ??????????? ?????к??0,1,2,3,4,5,6,7,8,9,10,11,12
* ?????ASCII????????ASC_7????
*********************************************/
void LCD_write_ASCII(unsigned char X,unsigned char Y,unsigned char cid)
{
unsigned char i;
LCD_set_XY(X,Y); //?趨???λ?????????
for (i=0; i<7; i++) //?????п??????д7?е????????????????
{
LCD_write_byte(ASC_7,1);
}
LCD_set_XY(X,Y+1); //??λ????У?д?°??????
for (i=7; i<14; i++)
{
LCD_write_byte(ASC_7,1);
}
}
/*********************************************
* ?????????LCD_write_CHAR
* ????????????????????12*14(16)
* ????????x,y,cid??:???????????????????????
* ??????????? ?????к??0,1,2,3,4,5,6,7,8,9,10
* ?????CHAR????????CHAR_12????
*********************************************/
void LCD_write_char(unsigned char x,unsigned char y,unsigned char cid)
{
unsigned char i;
LCD_set_XY(x,y); //?趨???λ?????????
for (i=0; i<12; i++) //?????п??????д7?е????????????????
{
LCD_write_byte(CHAR_12,1);
}
LCD_set_XY(x,y+1); //??λ????У?д?°??????
for (i=12; i<24; i++)
{
LCD_write_byte(CHAR_12,1);
}
}
/*********************************************
* ?????????LCD_write_val
* ????????????λ????????
* ????????X??Y??????:???????????????
* l ;????????λ???????????
* vol ;???
* ???????????
* ?????
*********************************************/
void LCD_write_val(unsigned char x,unsigned char y,unsigned char l,unsigned long val)
{
unsigned char i, v;
unsigned long temp_x;
if (l == 4)
{
temp_x = 1000;
for (i=0; i<2; i++)
{
if (val > temp_x)
{
v = val / temp_x;
}
else
{
v = 0;
}
LCD_write_ASCII(x,y,v); //??????λ????
val = val - v * temp_x;
temp_x = 100;
x = x + 8;
}
}
if (val > 9)
{
v = val / 10;
}
else
{
v = 0;
}
LCD_write_ASCII(x,y,v); //??????λ????
v = val - v * 10;
x = x + 8;
LCD_write_ASCII(x,y,v); //???????λ????
}
3、LCD_5110.h
#ifndef __LCD5110_H
#define __LCD5110_H
#include<reg51.h>
#include<intrins.h>
/*****************************************
*
* ????LCD?????????
*
*****************************************/
sbit LCD_RST = P0^0; //??λ???
sbit LCD_CE= P0^1; //?????
sbit LCD_DC= P0^2; //????/?????????
sbit LCD_DIN = P0^3; //?????????
sbit LCD_CLK = P0^4; //????????
/**************??????????******************
***************????????**********************/
void LCD_write_byte(unsigned char dat,bit dc);
void LCD_init(void);
void LCD_clear(void);
void LCD_set_XY(unsigned char X,unsigned char Y);
void LCD_write_ASCII(unsigned char X,unsigned char Y,unsigned char cid);
void LCD_write_char(unsigned char x,unsigned char y,unsigned char cid);
void LCD_write_val(unsigned char X,unsigned char Y,unsigned char l,unsigned long val);
/***************????????????****************/
#endif
keil项目文档压缩包上传在5楼。 程序代码从keil拷贝复制过来后,汉字全显示为?号了,整个项目文件压缩打包后有762K,作为附件又因文件太大上传不了。 都单片机了,为什么还用拨码开关,就算不用编码器,至少也可以用按钮开关啊。
PS 代码可以传百度云 y5000 发表于 2018-12-17 14:17
都单片机了,为什么还用拨码开关,就算不用编码器,至少也可以用按钮开关啊。
PS 代码可以传百度云
单片机断电之后无法保设置的参数,另外加flash存储芯片保存的话又要添加按键,就更复杂化了,所以选用拨码开关来做参数设置。按钮开关的功能与拨码开关有区别,用来设置参数是不方便的。 我将原理图文件排除之后,压缩包降至709K,终于满足<750K的限制了。
高大上的点焊机~~~ 液晶做显示不知道点焊机工作时会不会有干扰,我之前用数码管和编码器做过一个,程序还没完工,工作太忙,没时间弄 单片机电源上 用了一个470微法的电解电容,测试时没有发现LCD显示屏受影响。 hujj 发表于 2018-12-17 14:10
程序代码从keil拷贝复制过来后,汉字全显示为?号了,整个项目文件压缩打包后有762K,作为附件又因文件太大 ...
从高级模式标题栏中,点击<>符号添加代码文字功能按钮,将程序代码复制到里面发表,就不会发生以上问题了。 本帖最后由 hujj 于 2018-12-18 21:51 编辑
谢谢指教!尝试这个功能,但仍然不能显示汉字。 /////////////////////////////////////////////////////////////////////////
// ????????? //
// ?????: ????12.dot ?????????λ,????????:???????????? //
/////////////////////////////////////////////////////////////////////////
#ifndef __CHARCODE_H
#define __CHARCODE_H
//#ifdef CHAR_CODE
//struct CHAR_12TypeDef code CHAR_12 =//?????,11?????????????24?????
code unsigned char CHAR_12 =//?????,11?????????????24?????
{
//"??",
0x00,0xF0,0x90,0x90,0x90,0xFE,0x90,0x90,0x90,0xF8,0x10,0x00,
0x00,0x07,0x04,0x04,0x04,0x3F,0x24,0x44,0x44,0x47,0x40,0x38,
//"??",
0x00,0x80,0x84,0x84,0x82,0x82,0xE2,0x92,0x8A,0x86,0xC0,0x80,
0x00,0x00,0x00,0x10,0x20,0x40,0x7F,0x00,0x00,0x00,0x00,0x00,
//"??",
0x00,0x00,0xC0,0x40,0x40,0x7E,0x48,0x48,0x48,0xCC,0x08,0x00,
0x20,0x18,0x03,0x0A,0x32,0x02,0x0A,0x32,0x02,0x0A,0x10,0x20,
//"??",
0x70,0x00,0xFE,0x20,0x00,0xBE,0xAA,0xAA,0xAA,0xAA,0xBE,0x00,
0x60,0x18,0x07,0x08,0x14,0x04,0x04,0x04,0x7F,0x04,0x04,0x04,
//"??",
0x10,0xD0,0xFE,0x90,0x10,0x00,0xF8,0x08,0x08,0xFC,0x08,0x00,
0x03,0x00,0x7F,0x00,0x21,0x10,0x0F,0x00,0x00,0x3F,0x40,0x38,
//"??",
0x10,0x10,0xFE,0x50,0x20,0x28,0x38,0xAA,0x6A,0x38,0xA8,0x20,
0x22,0x41,0x3F,0x40,0x21,0x15,0x1B,0x09,0x0D,0x13,0x21,0x41,
//"??",
0x00,0xF8,0x02,0x04,0xE0,0x24,0x24,0xE4,0x04,0x04,0xFE,0x04,
0x00,0x7F,0x00,0x00,0x1F,0x09,0x09,0x0F,0x20,0x40,0x7F,0x00,
//"??",
0xFC,0x24,0x54,0x8C,0x82,0xBA,0xAA,0xAA,0xAA,0xBA,0x83,0x82,
0x7F,0x01,0x02,0x01,0x7F,0x0A,0x0B,0x3E,0x0B,0x0A,0x40,0x3F,
//"??",
0x80,0x44,0x44,0x74,0x54,0x56,0x54,0xA4,0x74,0x46,0x44,0xC0,
0x10,0x10,0x11,0x15,0x15,0x3F,0x55,0x55,0x55,0x51,0x50,0x60,
//"??",
0x24,0xA4,0xFC,0x22,0x22,0x00,0xF0,0x00,0xFE,0x10,0x20,0x40,
0x06,0x01,0x7F,0x01,0x42,0x21,0x10,0x10,0x0D,0x04,0x03,0x01,
//"?",
0xFC,0x90,0x90,0x90,0xFC,0x20,0xA0,0x20,0x20,0xFE,0x28,0x20,
0x0F,0x04,0x04,0x04,0x0F,0x00,0x11,0x26,0x40,0x7F,0x00,0x00,
};
// ??????
// ???????????????
#endif //end of CHAR_CODE
//#endif
本帖最后由 gxg0000 于 2018-12-19 19:54 编辑
/*******************************************************************************
* *
* 点焊机控制器 *
--------------------------------------------------------------------------------
* 结构说明: 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; //点焊按钮信号(低电平按下)
//--定义全局变量--//
u8sdsj = 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=正在工作
这时你的程序,我发了一段没有问题,有可能keil字体设置不好,乱码了。 也许是吧,我对Keil的操作还不熟悉,可能还有哪里没有设置好。 keil的字体要设置的,不然中文就显示乱码 ddzx 发表于 2018-12-19 20:06
keil的字体要设置的,不然中文就显示乱码
在Keil里面显示汉字是正常的,只是复制粘贴到帖子里时成了乱码。