hujj 发表于 2018-12-17 13:58:28

点焊机控制装置(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楼。

hujj 发表于 2018-12-17 14:10:19

程序代码从keil拷贝复制过来后,汉字全显示为?号了,整个项目文件压缩打包后有762K,作为附件又因文件太大上传不了。

y5000 发表于 2018-12-17 14:17:01

都单片机了,为什么还用拨码开关,就算不用编码器,至少也可以用按钮开关啊。

PS 代码可以传百度云

hujj 发表于 2018-12-17 15:19:15

y5000 发表于 2018-12-17 14:17
都单片机了,为什么还用拨码开关,就算不用编码器,至少也可以用按钮开关啊。

PS 代码可以传百度云

单片机断电之后无法保设置的参数,另外加flash存储芯片保存的话又要添加按键,就更复杂化了,所以选用拨码开关来做参数设置。按钮开关的功能与拨码开关有区别,用来设置参数是不方便的。

hujj 发表于 2018-12-17 15:24:53

我将原理图文件排除之后,压缩包降至709K,终于满足<750K的限制了。


lxa000 发表于 2018-12-17 19:23:43

高大上的点焊机~~~

ddzx 发表于 2018-12-17 20:17:04

液晶做显示不知道点焊机工作时会不会有干扰,我之前用数码管和编码器做过一个,程序还没完工,工作太忙,没时间弄

hujj 发表于 2018-12-17 20:46:54

单片机电源上 用了一个470微法的电解电容,测试时没有发现LCD显示屏受影响。

gxg0000 发表于 2018-12-18 18:15:48

hujj 发表于 2018-12-17 14:10
程序代码从keil拷贝复制过来后,汉字全显示为?号了,整个项目文件压缩打包后有762K,作为附件又因文件太大 ...

从高级模式标题栏中,点击<>符号添加代码文字功能按钮,将程序代码复制到里面发表,就不会发生以上问题了。

hujj 发表于 2018-12-18 21:48:08

本帖最后由 hujj 于 2018-12-18 21:51 编辑

谢谢指教!尝试这个功能,但仍然不能显示汉字。

hujj 发表于 2018-12-18 21:50:20

/////////////////////////////////////////////////////////////////////////
// ?????????                                                          //
// ?????: ????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:45:38

本帖最后由 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字体设置不好,乱码了。

hujj 发表于 2018-12-19 20:00:41

也许是吧,我对Keil的操作还不熟悉,可能还有哪里没有设置好。

ddzx 发表于 2018-12-19 20:06:37

keil的字体要设置的,不然中文就显示乱码

hujj 发表于 2018-12-19 20:34:27

ddzx 发表于 2018-12-19 20:06
keil的字体要设置的,不然中文就显示乱码

在Keil里面显示汉字是正常的,只是复制粘贴到帖子里时成了乱码。
页: [1] 2 3
查看完整版本: 点焊机控制装置(51单片机)