数控直流恒流源的设计与制作
数控恒流源程序
#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;
}
- gxl2000_rc
-
0 发帖143 回复218 积分
- 私信他 +关注
- 普通用户_58f16fbbb74d45f
-
0 发帖5 回复110 积分
- 私信他 +关注
- 普通用户_2b5490f97fbf4b4
-
0 发帖39 回复178 积分
- 私信他 +关注
块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖