📄 数控电源.c
字号:
/***************************************************/
//ADC\DAC读数比较并自动调整部分
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define _Nop() _nop_()
#define DAT P0
#define KEY P1
//位定义
sbit SPEAKER =P2^0;
sbit LED =P2^1;
sbit E =P2^2;
sbit RS =P2^4;
sbit RW =P2^3;
sbit DAC_WR =P2^5;
sbit CS =P2^6;
sbit INT_0 =P3^2;
sbit INT_1 =P3^3;
bit hold =0;
bit _Int =0;
bit k =0;
bit m =0;
bit fushu =0;
bit q =0;
//全局变量定义
uint DAdat;//存放送到DA的数据
uint x;
uchar ADdat;//存放从ADC读出的数据
uchar vol; //存放输入电压值
uchar keynum;
uchar kyreg;
uchar temp;//存放功能状态
uchar hh;
///数组定义
static code uchar Disp[]="0123456789-";
static code uchar Disp2[]="Error! ";
static code uchar Disp3[]="Vol is:";
static code uchar Disp4[]="WARNNING!CLR V! ";
//函数声明
uchar keycmp(void);
uchar keyread(void);
void reADC(void);
uchar cmp(uchar ADdat,uchar DAdat);
void lcdinit();
void lcdcmd(uchar cmd);
void lcddata(uchar dat);
void seDAC(uchar DAdata);
void delay(uchar t);
void extint(void);
void volchange();
/***********************DAC送数*********************/
main()
{
unsigned int vol;
uchar i,j,a=0,b=0;
bit dian=0;
bit o=0,p=0; //负数标志位、确认标志位
delay(255);
EA=1;
EX0=1;
PX0=1;
IT0=1;
//EX1=1;
//IT1=1;
pp:
a=b=0;dian=0;o=p=0,x=0;
lcdinit();
lcdcmd(0x80);
for(j=0;j<7;j++) //开机送0V并显示到LCD
{
lcddata(Disp3[j]);
}
seDAC(128);
DAdat=128;
lcddata('0');
lcddata('.');
lcddata('0');
lcddata('V');
while(1)
{
while(!k)
{ delay(200);
i=keycmp();
if(!m)
{
lcdcmd(0x1);
for(j=0;j<7;j++)
lcddata(Disp3[j]);
m=1;
}
if(i>=0&&i<=9) //累加按键值并输出
{
a=10*b;b=i;
if(o)
{
lcdcmd(0x1);o=0;
for(j=0;j<7;j++)
lcddata(Disp3[j]);
}
if(dian){x=vol=a+b;} // 计算期望电压值*10
lcddata(Disp[i]);
dian=~dian;
if(dian)lcddata('.');
}
else if(i==10)
{
if(o)
{
lcdcmd(0x1);o=0;
for(j=0;j<7;j++)
lcddata(Disp3[j]);
}
fushu=1;lcddata(Disp[i]); //记录下负数标志,输出“-”号
}
else if(i==11){m=0;goto pp;} //复位
else if(i==12){temp=1;k=1;q=!q;hh=1;;} //加1
else if(i==13){temp=2;k=1;q=!q;hh=1;;} //减1
// else if(i==14) {hold=~hold;} //锁定
else if(i==15&&!dian)
{
lcddata('V'); //输出‘V’字样
o=1;
k=1; //K=1退出循环
}
}
if(vol>50)
{ lcdcmd(0x01);
delay(2);
lcdcmd(0x80);
for(i=0;i<16;i++)
lcddata(Disp2[i]);
p=1; //溢出标志,P=1溢出
}
if(!fushu&&!hh) //送入DAC的数字量
{
DAdat=128*vol/50+128;
if(DAdat==256)
DAdat=255; hh=0;
}
else if(fushu&&!hh)
{
DAdat=128-128*vol/50;fushu=0;
hh=0;
}
if((temp==0)&&(!p))seDAC(DAdat);
else if(temp==1){volchange();seDAC(DAdat);temp=0;}
else if(temp==2){volchange();seDAC(DAdat);temp=0;}
p=0;
k=0;
} }
/*******************输出电压自增自减程序************************/
void volchange()
{ uchar i,a,b,y,z;
if(temp==1&&(DAdat<255))
{
if(q)
{ if(z==9){DAdat+=3;z=0;}
else DAdat+=2;
}
else DAdat+=3;
z++;
if(DAdat>=129)
{x=x+1;
lcdcmd(0x01);
for(i=0;i<7;i++)
lcddata(Disp3[i]);
a=x/10;b=x%10;
lcdcmd(0x01);
for(i=0;i<7;i++)
lcddata(Disp3[i]);
lcddata(Disp[a]);
lcddata('.');
lcddata(Disp[b]);
lcddata('V');}
else
{
x=x-1;
lcdcmd(0x01);
for(i=0;i<7;i++)
lcddata(Disp3[i]);
a=x/10;b=x%10;
lcdcmd(0x01);
for(i=0;i<7;i++)
lcddata(Disp3[i]);
if(!(a==0&&b==0))
lcddata('-');
lcddata(Disp[a]);
lcddata('.');
lcddata(Disp[b]);
lcddata('V');
}
}
else if(temp==2&&(DAdat>1))
{
if(q)
{
if(y==9){DAdat-=3;y=0;}
else DAdat-=2;
}
else DAdat-=3;
y++;
if(DAdat<127)
{x=x+1;
a=x/10;b=x%10;
lcdcmd(0x01);
for(i=0;i<7;i++)
lcddata(Disp3[i]);
lcddata('-');
lcddata(Disp[a]);
lcddata('.');
lcddata(Disp[b]);
lcddata('V');
}
else
{ x=x-1;
a=x/10;b=x%10;
lcdcmd(0x01);
for(i=0;i<7;i++)
lcddata(Disp3[i]);
lcddata(Disp[a]);
lcddata('.');
lcddata(Disp[b]);
lcddata('V');
}
}
hh=0;
}
/********************DAC送数******************************/
void seDAC(uchar DAdat)
{
DAC_WR=1;
CS=0;
_Nop();_Nop();
DAT=DAdat;
DAC_WR=0;
_Nop();_Nop();
DAC_WR=1;
CS=1;
}
/*******************读键值***************************/
uchar keycmp()
{ uchar kysta=1; //按键标志,kysta=1无按键
while(kysta) //判断有无按键
{KEY=0xf0;
kyreg=KEY;
kyreg&=0xf0;
if(kyreg!=0xf0) //有按键则调keyread();读按键值
{delay(20);
keyread( );
kysta=0; //清零按键标志
}
}
return(keynum); //返回键值
}
//************读键值*******
uchar keyread()
{
uchar a,b,i;
b=0xfe;
for(i=0;i<4;i++) //i为行号
{
KEY=b;
a=KEY;
if((a&0x10)==0) keynum=i*4; //第一列
if((a&0x20)==0) keynum=i*4+1; //第二列
if((a&0x40)==0) keynum=i*4+2; //第三列
if((a&0x80)==0) keynum=i*4+3; //第四列
b<<=1;b++;
}
return (keynum);
}
/********************延时*********************/
void delay(uchar t)
{
uchar i=100;
while(t--)
{while(i--);}
}
void delay1(uchar time)
{
while(time--);
}
/*******************LCD驱动**************************/
//写控制字函数
void lcdcmd(uchar cmd)
{
RS=0;
RW=0;
DAT=cmd;
E=1;
_Nop();
_Nop();
E=0;
delay(2);
}
//写数据函数
void lcddata(uchar dat)
{ RS=1;
RW=0;
DAT=dat;
_Nop();
E=1;
_Nop();
_Nop();
E=0;
delay(2);
}
//LCD初始化函数
void lcdinit() //显示初始化
{
lcdcmd(0x38);
delay(2);
lcdcmd(0x38);
delay(2);
lcdcmd(0x38);
delay(2);
lcdcmd(0x01);
lcdcmd(0x06);
lcdcmd(0x0c);
}
void extint() interrupt 0 using 0
{
uchar i;
seDAC(128);
x=0;
lcdcmd(0x80);
for(i=0;i<16;i++)
lcddata(Disp4[i]);
LED=0;SPEAKER=0;
delay(255);
lcdcmd(0x01);
lcdcmd(0x80);
for(i=0;i<7;i++)
lcddata(Disp3[i]);
lcddata('0');
lcddata('.');
lcddata('0');
lcddata('V');
LED=1;SPEAKER=1;
m=0;
}
/*****************ADC反馈读数***********************/
/*
void reADC() interrupt 2 using 1
{ uchar result; bit state;
OE=1;_Nop(); _Nop();
DAT=0xff;
ADdat=DAT;
_Nop();_Nop();
OE=0;
if(ADdat>=DAdat)
{
result=ADdat-DAdat;
state=0;
}
else
{
result=DAdat-ADdat;
state=1;
}
if(result>=2)
{
result/=2;
if(state) result=DAdat-result;
else result=DAdat+result;
}
else result=DAdat;
////////////////////////
_Int=1;
}
*/
/******************反馈比较*************************/
/*
uchar cmp(uchar x,uchar y)
{
uchar result;
bit state;
if(x>=y)
{
result=x-y;
state=0;
}
else
{
result=y-x;
state=1;
}
if(result>=2)
{
result/=2;
if(state) result=y-result;
else result=y+result;
}
else result=y;
return(result);
} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -