⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 数控电源.c

📁 数控稳压电源,输出范围-5---+5v.显示采用LCD 可直接输入电压按确认后输出,也可以按+/-自动加减.
💻 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 + -