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

📄 -

📁 单片机数控稳压电源proteus仿真
💻
字号:
#include<regx51.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
uchar aa,bb,cc,dd,jj,ii,jjj,iii,key,j;
uchar time1=0;
sbit led1=P2^0;
sbit led2=P2^1;
sbit ce=P2^4;
#define timer0_count 0xfc18//定时器初值,设置time0 1/1000秒中断一次
const seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管的显示
const seg_point[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//有小数点的数码管显示
uchar scan1;//用来分别显示2个数码管
uchar scan2; 
uchar counter[2]={0xf1,0xf2};
uchar vout=0; //j_片选,vout_电压输出

static void timer0_initialize(void)//timer0的初始化
//定时器的初始化程序
{
        EA=0;	//中断控制器IE--停止接受中断  
		TR0=0;        //停止计时
		TMOD=0x01;     //设置工作方式为1
		TL0=(timer0_count & 0x00ff);
	    TH0=(timer0_count>>8);  //设置time0 初值	
		PT0=1;    //设置timer0高优先级
		ET0=1;	  //允许timer0中断
		TR0=1;	   //开始计时
		EA=1;	   //开所有中断
}

void delay(uint t) //tms的延时
{    
	uchar i;
	uint j;
    for(j=0;j<t;j++)
		for(i=0;i<40;i++);
}
void shuc(void)
{	  
 	uchar nn;
 	vout=2*(scan2*10+scan1);//输出的数字量
	P1=vout;
	for(nn=0;nn<250;nn++)
		;
		nn=0;//输出是存在D/A转换时间差所以要延时

}  
void shaom(void)
{
	 P3=0x0f;//扫描是否有按键按下
     if((P3&0x0f)!=0x0f)
     dd=0;
	 else
	 dd=1;
}
void zdbj(void) //自动步进
{
	uchar rr;
	jj=scan2;
	ii=scan1;
	shaom();
	for(;jj<10;jj++)
    {
    	for(;ii<10;ii++)
		{
	 		if(dd)
	 			{
	 				scan1=ii;
	 				scan2=jj;
					shuc();
	 				for(rr=0;rr<250;rr++)
					{
						shaom();
						if(dd)	
	 					delay(70);
						else 
						break;
					}
	 				if(jj==9&&ii==9)
	 				{
	 					ii=0;
	 					jj=0;
	 				}
	
			 	}
			else
	 		{
	 			jj=10;
	 			ii=10;
	 		}
		}
		ii=0;
    }
	jj=0;
	shaom();
	for(;dd==0;)
	shaom();

}

void sjb(void)	//三角波
{ 
	uchar max;
	max=vout;
	shaom();
	for(;dd;)
 	{
   		for(iii=0;iii<=max;iii=iii+2)
   		{
	  		P1=iii;
			shaom();
	 		delay(10);
   			if(dd==0)
    	     break;
		}
		if(dd==0)
    	break;
		for(;iii>0;iii=iii-2)
		{
			P1=iii;
			shaom();
			delay(5);
			if(dd==0)
			break;
		}
		if(dd==0)
    	break;
  	}
   	P1=max;
 	shaom();
 	for(;dd==0;)
	shaom();
}
unsigned char keyscan(void)  //键盘扫描函数,使用行列反转扫描法
{
 	unsigned char cord_h,cord_l;//行列值中间变量
	P3=0x0f;          //行线输出全为0
 	cord_h=P3&0x0f;     //读入列线值
 	if(cord_h!=0x0f)    //先检测有无按键按下
 	{
  		delay(70);        //去抖
  		if((P3&0x0f)!=0x0f)
  		{
    		cord_h=P3&0x0f;  //读入列线值
    		P3=cord_h|0xf0;  //输出当前列线值
    		cord_l=P3&0xf0;  //读入行线值												   ;;
			while((P3&0xf0)!=0xf0);//等待松开并输出
	 		{
	 			time1=time1+1;
    			return(cord_h+cord_l);//键盘最后组合码值
	 		}
  		}
 	}return(0);     //返回该值
}
void timer0_isr(void) interrupt 1   //timer0中断
//用于LED数码管的动态显示
{
	
 	TR0=0;    //停止时钟0
	P2=counter[j];
	switch(j)
	{ 
	 	case 0:P0=seg[scan1];break;										 
	 	case 1:P0=seg_point[scan2];break;
	 		default:break;	//j为其他情况是跳出循环
	}
	j++;
	if(j==2) 
	j=0;
    TL0=(timer0_count & 0x00ff);
	TH0=(timer0_count>>8);  //设置time0 初值
	TR0=1;	 //开时钟     				    
}
			    		  
void main(void)
{	 	
	ce=0;
	delay(5);    
	scan1=(P3/2)%10;
	scan2=P3/20;
	ce=1;
	delay(5);
	shuc();

	timer0_initialize();	//定时器初始化用于LED显示
    do
   {     
    	key=keyscan();
		if(time1==1)
		switch( key)
        {	
			
			case 0xee:aa=1;break;//1 按下相应的键显示相对应的码值
         	case 0xed:aa=2;break;
         	case 0xeb:aa=3;break;
         	case 0xe7:aa=4;break;//4
         	case 0xde:aa=5;break;//5
      	 	case 0xdd:aa=6;break;//5
 		 	case 0xdb:aa=7;break;//6
  	 	 	case 0xd7:aa=8;break;//7
 		 	case 0xbe:aa=9;break;//8
 		 	case 0xbd:aa=0;break;//9
	     	case 0xbb:time1--;break;//确认
  		 	case 0xb7: //三角波
			{
			time1=0;
			sjb();
			}
			break;
  		 	case 0x7e:		//加
		    {
				time1=0;
		     	scan1++;
		        if(scan1==10) 
				{ 
					scan1=0;
				    scan2++;
					if(scan2==10)
					scan2=0;
				}
				shuc();
			}break;//c
 		 	case 0x7d:		//减
		    {
				time1=0;
		        scan1--;				    
				if(scan1==-1)
				{  	
					scan1=9;
					scan2--;
					if(scan2==-1)
					scan2=9;
				}
				shuc();
			}break;
  	   	 	case 0x7b:		//自动步进
			{
				time1=0;
            	zdbj();
			}break;//e
  			case 0x77: time1--;break;	
  		}
	   						
		if(time1==2)
		switch( key)
 		{	
		
			case 0xee:bb=1;break;//0 按下相应的键显示相对应的码值
 			case 0xed:bb=2;break;//1
  			case 0xeb:bb=3;break;//2
 	    	case 0xe7:bb=4;break;//3
     		case 0xde:bb=5;break;//4
 	    	case 0xdd:bb=6;break;//5
     		case 0xdb:bb=7;break;//6
  			case 0xd7:bb=8;break;//7
  			case 0xbe:bb=9;break;//8
  			case 0xbd:bb=0;break;//9
  			case 0xbb:		//确认
			{
		     	scan2=0;
		     	scan1=aa;
  			 	time1=0;
			 	shuc();
			}break;
  			case 0xb7://三角波
			{
			time1=0;
			sjb();
			}
			break;
  			case 0x7e:		//加
			{
				time1=0;
		        scan1++;
		        if(scan1==10) 
				{ 
					scan1=0;
				    scan2++;
					if(scan2==10)
					scan2=0;
				}
				shuc();
			}break;//c
 	    	case 0x7d:		//减   
			{
				time1=0;
		      	scan1--;				    
				if(scan1==-1)
				{  		
					scan1=9;
					scan2--;
					if(scan2==-1)
					 scan2=9;
				}
				shuc();
			}break;
  			case 0x7b:		//自动步进
		    {
				time1=0;
            zdbj();
			}break;//e
  			case 0x77: time1--;break;
 		}
		;
		if(time1>2)
 		switch( key)
 		{	
		
  			case 0xee:time1--;break;//0 按下相应的键显示相对应的码值
  			case 0xed:time1--;break;//1
  			case 0xeb:time1--;break;//2
  			case 0xe7:time1--;break;//3
  			case 0xde:time1--;break;//4
  			case 0xdd:time1--;break;//5
  			case 0xdb:time1--;break;//6
  			case 0xd7:time1--;break;//7
  			case 0xbe:time1--;break;//8
  			case 0xbd:time1--;break;//9
  			case 0xbb:		//确认 		
			{   
				time1=0;
		    	scan2=aa;
  				scan1=bb;
  				time1=0;
				shuc();
			}break;
  			case 0xb7://三角波
			{
			time1=0;
		    sjb();
			}
			break;
  			case 0x7e:		//加 
		    {
		        scan1++;
		        if(scan1==10) 
				{ 
				 	scan1=0;
				    scan2++;
					if(scan2==10)
					scan2=0;
				} 
				shuc();
			}break;//c
 			case 0x7d:		//减
		    {
		    	time1=0;
				scan1--;				    
				if(scan1==-1)
				{  	
					scan1=9;
					scan2--;
					if(scan2==-1)
					scan2=9;
				} 
				shuc();
			} break;
  			case 0x7b:		//自动步进
		    {
				time1=0;
            	zdbj();
			}break;//e
  			case 0x77: time1--;break;
	    }	 
    }                       
	while(1);
}	  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -