[资料] 数控直流恒流源的设计与制作
690 查看
7 回复
 楼主 | 发布于 2019-08-08 | 只看楼主
分享到:

数控直流恒流源的设计与制作

数控恒流源程序

#include <reg52.h>
#include <absacc.h>
#include<string.h>
#include<intrins.h>
#define unit unsigned int
#define uchar unsigned char
#define DELAY_TIME 60
#define TRUE 1
#define FALSE 0

uchar keyup;
uchar keydown;
uchar keyupstate;
uchar keydownstate;

static unsigned int s=0;
static unsigned int b=1;
static unsigned int q=0;
static unsigned int c=0;
static unsigned int a;

code unsigned char table[19]=
{11,17,23,28,34,39,45,51,56,62,68,73,79,84,90,96,101,107,113};
code unsigned char Seg7Code[11]=                //用十六进数作为数组下标,可直接取得对应的七段编码字节
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xBF}

sbit SCL=P1^4;
sbit SDA=P1^5;

void DELAY(unsigned int t) /*延时函数*/
    {
        while(t!=0)
            t--;
    }

void I2C_Start(void)
    {
        /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
        SDA=1;
        SCL=1;
        DELAY(DELAY_TIME);
        SDA=0;
        DELAY(DELAY_TIME);
        SCL=0;
        DELAY(DELAY_TIME);
    }

void I2C_Stop(void)
    {
        /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
        SDA=0;
        SCL=1;
        DELAY(DELAY_TIME);
        SDA=1;
        DELAY(DELAY_TIME);
        SCL=0;
        DELAY(DELAY_TIME);
    }

void SEND_0(void)   /* SEND ACK */
    {
        /*发送0,在SCL为高电平时使SDA信号为低*/
        SDA=0;
        SCL=1;
        DELAY(DELAY_TIME);
        SCL=0;
        DELAY(DELAY_TIME);
    }

void SEND_1(void)
    {
        /*发送1,在SCL为高电平时使SDA信号为高*/
        SDA=1;
        SCL=1;
        DELAY(DELAY_TIME);
        SCL=0;
        DELAY(DELAY_TIME);
    }

bit Check_Acknowledge(void)
    {
        /*发送完一个字节后检验设备的应答信号*/
        SDA=1;
        SCL=1;
        DELAY(DELAY_TIME/2);
        F0=SDA;
        DELAY(DELAY_TIME/2);
        SCL=0;
        DELAY(DELAY_TIME);
        if(F0==1)
            return FALSE;
        return TRUE;
    }

void WriteI2CByte(char b)reentrant
    {
        /*向I2C总线写一个字节*/
        char i;
        for(i=0;i<8;i++)
            if((b<<i)&0x80)
                SEND_1();
            else
                SEND_0();
    }

 

char ReadI2CByte(void)reentrant
    {
        /*从I2C总线读一个字节*/
        char b=0,i;
        for(i=0;i<8;i++)
        {
            SDA=1;    /*释放总线*/
            SCL=1;    /*接受数据*/
            DELAY(10);
            F0=SDA;
            DELAY(10);
            SCL=0;
            if(F0==1)
                {
                    b=b<<1;
                    b=b|0x01;
                }
            else
                b=b<<1;
        }
        return b;
    }


/**********以下为读写24c02的函数**********/
void Write_One_Byte(char addr,char thedata)
{
          bit acktemp=1;
          /*write a byte to mem*/
          I2C_Start();
          WriteI2CByte(0xa0);
          acktemp=Check_Acknowledge();
          WriteI2CByte(addr);/*address*/
          acktemp=Check_Acknowledge();
          WriteI2CByte(thedata);/*thedata*/
          acktemp=Check_Acknowledge();
          I2C_Stop();

}

char Read_One_Byte(char addr)
{         bit acktemp=1;
          char mydata;
           /*read a byte from mem*/
          I2C_Start();
          WriteI2CByte(0xa0);
          acktemp=Check_Acknowledge();
          WriteI2CByte(addr);/*address*/
          acktemp=Check_Acknowledge();
          I2C_Start();
          WriteI2CByte(0xa1);
          acktemp=Check_Acknowledge();

          mydata=ReadI2CByte();
          acktemp=Check_Acknowledge();

          return mydata;
          I2C_Stop();
}

void DisplayBrush( void )          //显示输出函数
{
unit m;
 P0=0xff;
 P0 = Seg7Code[ 10 ];   
 P1=0xfe; 
    for(m=0;m<1000;m++);
 
 P0 = Seg7Code[ s ];
 P1=0xfd;
 for(m=0;m<1000;m++);

 P0 = Seg7Code[ b ];
 P1=0xfb;
 for(m=0;m<1000;m++);

 P0 = Seg7Code[ q ];
 P1=0xf7;
 for(m=0;m<1000;m++);
}

void jisuan (void)
{ s=a/100;
 b=(a/10)%10;
 q=a%10;
 }

void delays(void)                        //按键去斗延时函数
{  uchar i;
   for(i=300;i>0;i--);
}

void main( void )
{ c=Read_One_Byte(0x10);
 a=Read_One_Byte(0x20);
 if (c>18||a>100)
 {c=0;a=10;}
 P2=table[c];
  jisuan();
 DisplayBrush();
 EA=1;IT0=1;IT1=1;EX0=1;EX1=1;

while (1)
 {
 if (keyupstate!=keyup)
  { delays();
  if (c<=18)
   {if (a==100)
    goto L1;
       else a+=5;
     c++;}
 L1: keyupstate=keyup;
  P2=table[c];
   jisuan();
  DisplayBrush();
  Write_One_Byte(0x10,c);
  Write_One_Byte(0x20,a);
  }
///////////////////////////////////////////////////////
 if (keydownstate!=keydown)
  { delays();
  if (a==10)
     goto L2;
     else a-=5;
  c--;
 L2: keydownstate=keydown;
  P2=table[c];
   jisuan();
  DisplayBrush();
  Write_One_Byte(0x10,c);
  Write_One_Byte(0x20,a);
  }
  DisplayBrush();

 }
}
 

void intsvr0(void)  interrupt 0 using 1
{  
 keyup=!keyup;
}


void intsur0(void)  interrupt 2 using 1

 keydown=!keydown;
}

本帖有更多资源,需 登录 才可以下载,没有帐号?立即 注册

(0 ) (0 )
回复 举报

回复于 2019-08-10 沙发

谢谢分享!!!
(0 )
评论 (1) 举报

回复于 2019-08-11 2#

支持下,谢谢分享~!
(0 )
评论 (1) 举报

回复于 2019-08-13 3#

感谢分享
(0 )
评论 (1) 举报

回复于 2019-10-30 4#

dddddddddddddddddddddd
(0 )
评论 (1) 举报

回复于 2020-04-14 5#

瞅瞅看看,研究研究
(0 )
评论 (1) 举报

回复于 2020-04-17 6#

谢谢lz分享....................
(0 )
评论 (1) 举报

回复于 2020-04-30 7#

6666
(0 )
评论 (0) 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部