数控电源程序.docx
《数控电源程序.docx》由会员分享,可在线阅读,更多相关《数控电源程序.docx(14页珍藏版)》请在冰豆网上搜索。
![数控电源程序.docx](https://file1.bdocx.com/fileroot1/2022-10/29/e15c4d12-a400-4f79-be99-1198601a7657/e15c4d12-a400-4f79-be99-1198601a76571.gif)
数控电源程序
#include
#include
/**********************************************************************************/
#defineucharunsignedchar
#defineuintunsignedint
//-------------------——————————————--------
//LCD
#defineLCM_RS_1PORTD|=4
#defineLCM_RS_0PORTD&=~4
#defineLCM_RW_1PORTD|=2
#defineLCM_RW_0PORTD&=~2
#defineLCM_EN_1PORTD|=1
#defineLCM_EN_0PORTD&=~1
#defineDATA_PORTBPORTB
//**************DA5630****************//
#defineDA_DIN_1PORTA|=BIT(4)
#defineDA_DIN_0PORTA&=~BIT(4)
#defineDA_SCLK_1PORTA|=BIT(5)
#defineDA_SCLK_0PORTA&=~BIT(5)
#defineDA_FS_1PORTA|=BIT(6)
#defineDA_FS_0PORTA&=~BIT(6)
#defineDA_LDAC_1PORTA|=BIT(3)
#defineDA_LDAC_0PORTA&=~BIT(3)
#defineDA_DDR_1DDRA|=0X78
#defineDA_DDR_0DDRA&=0X87
uchartab[]={"0123456789"};
uintadc_rel;
uchardatah,datal;
uintU[],I[];
uintU_l,U_h,U_real,U_out,I_l,I_h,I_real,I_out,limit_U=10000,limit_I=10000;
voiddelay(void)
{
uchari,j;
for(i=0;i<200;i++)
for(j=0;j<200;j++);
}
uintlcd_buzy()
{
uintresult;
LCM_RS_0;_NOP();_NOP();
LCM_RW_1;_NOP();_NOP();
LCM_EN_1;_NOP();_NOP();
delayns
(1);
DDRB=0X00;_NOP();_NOP();
if((PINB&0x80)==0x80)result=1;
elseresult=0;
LCM_EN_0;
DDRB=0XFF;
returnresult;
}
voidlcd_w_order(unsignedcharcmd)
{
while(lcd_buzy());//判断LCD是否忙碌
LCM_RS_0;_NOP();_NOP();
LCM_RW_0;_NOP();_NOP();
LCM_EN_1;_NOP();_NOP();
DATA_PORTB=cmd;
LCM_EN_0;_NOP();_NOP();
}
voidlcd_w_data(uchardat)
{
while(lcd_buzy());//判断LCD是否忙碌
LCM_RS_1;_NOP();_NOP();
LCM_RW_0;_NOP();_NOP();
LCM_EN_1;_NOP();_NOP();
DATA_PORTB=dat;
LCM_EN_0;_NOP();_NOP();
}
voidlcd_post(unsignedcharpos)
{
lcd_w_order(pos|0x80);
}
voidlcd_init()
{
lcd_w_order(0x38);//显示模式设置
lcd_w_order(0x0c);//显示光标设置,开显示
lcd_w_order(0x06);//显示光标移动(右移)
lcd_w_order(0x01);//清屏
}
voiddelayns(uinttime)
{
unsignedchari;
for(;time>0;time--)
for(i=0;i<250;i++);
}
voidadc_U_init(void)//模数转换初始化子函数
{//模数转换初始化子函数开始
ADCSRA=0xE7;//ADC工作在自由转换模式
ADMUX=0xc7;//选择ADC输入通道为7
}//模数转换初始化子函数结束
uintADC_U_Convert(void)//模数转换子函数
{uinttemp1,temp2;//定义无符号整型局部变量
temp1=(uint)ADCL;//取得模数转换值
temp2=(uint)ADCH;
temp2=(temp2<<8)+temp1;
return(temp2);//返回取得的模数转换值
}
uintADC_I_Convert(void)//模数转换子函数
{uinttemp1,temp2;//定义无符号整型局部变量
temp1=(uint)ADCL;//取得模数转换值
temp2=(uint)ADCH;
temp2=(temp2<<8)+temp1;
return(temp2);//返回取得的模数转换值
}
voidconv_U(void)//数据转换子函数,定义i为无符号整型变量
{
longx,y;//定义无符号长整型局部变量
//uinty;//定义无符号整型局部变量
x=5*2588*(unsignedlong)(U_l);///1024;//将变量i转换成需要显示的形式
x>>=18;
y=5*2588*(unsignedlong)(U_h);
y>>=13;
U_real=(uint)(x+y);//将无符号长整型变量x强制转换成无符号整型变量y
//return(y);//返回y的值
}
voidadc_I_init(void)//模数转换初始化子函数
{//模数转换初始化子函数开始
ADCSRA=0xE7;//ADC工作在自由转换模式
ADMUX=0xc0;//选择ADC输入通道为0
}//模数转换初始化子函数结束
voidconv_I(void)//数据转换子函数,定义i为无符号整型变量
{
longx,y;//定义无符号长整型局部变量
//uinty;//定义无符号整型局部变量
x=5*2588*(unsignedlong)(I_l);///1024;//将变量i转换成需要显示的形式
x>>=18;
y=5*2588*(unsignedlong)(I_h);
y>>=13;
I_real=(uint)(x+y);//将无符号长整型变量x强制转换成无符号整型变量y
//return(y);//返回y的值
}
//******************DA********************************//
voidDAC(ucharn,uintdat)
{
dat=(dat+(n<<12));
DA_send(dat);
delay();
DA_LDAC_0;
_NOP();_NOP();
DA_LDAC_1;
}
voidDA_ini()
{
DA_DDR_1;//DATA_DDRC|=0XF0;
//DATA_PORTC|=0XF0;
DA_send(0x800c);
delay();
DA_send(0x9000);
}
voidDA_send(uintdat)
{uchartemp;
DA_LDAC_1;_NOP();_NOP();
DA_FS_0;_NOP();_NOP();
DA_SCLK_1;_NOP();_NOP();
DA_FS_1;_NOP();_NOP();
DA_SCLK_0;_NOP();_NOP();
DA_FS_0;_NOP();_NOP();
for(temp=16;temp>0;temp--)
{
DA_SCLK_1;_NOP();_NOP();
if(dat&BIT(temp-1))DA_DIN_1;
elseDA_DIN_0;
DA_SCLK_0;
_NOP();_NOP();
}
DA_FS_1;_NOP();_NOP();
DA_SCLK_1;_NOP();_NOP();
delay();
}
//*************************显示函数**************************//
voiddisplay_U(uintnum)
{
ucharg,s,b,q,w;
uinttemp;
temp=num;
g=temp%10;
temp=(temp-g)/10;
s=temp%10;
temp=(temp-s)/10;
b=temp%10;
temp=(temp-b)/10;
q=temp%10;
temp=(temp-q)/10;
w=temp%10;
//lcd_post(0x82);
if(w==0)
lcd_w_data('');
else
lcd_w_data(tab[w]);
lcd_w_data(tab[q]);
lcd_w_data('.');
lcd_w_data(tab[b]);
lcd_w_data(tab[s]);
//lcd_w_data(tab[g]);
}
voiddisplay_I(uintnum)
{
ucharg,s,b,q,w;
uinttemp;
temp=num;
g=temp%10;
temp=(temp-g)/10;
s=temp%10;
temp=(temp-s)/10;
b=temp%10;
temp=(temp-b)/10;
q=temp%10;
temp=(temp-q)/10;
w=temp%10;
//lcd_post(0x42);
lcd_w_data(tab[w]);
lcd_w_data('.');
lcd_w_data(tab[q]);
lcd_w_data(tab[b]);
lcd_w_data(tab[s]);
//lcd_w_data(tab[g]);
}
ucharerror(ucharnum)
{
chartemp;
if(num==0)
{
if((U_real>limit_U)&&(U_real-lim