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

📄 dc_current_souce.c

📁 利用单片机控制电流大小
💻 C
字号:
#include<reg52.H>
#include<absacc.h>
#include<intrins.h>

#define uchar unsigned char

sbit CS=P1^0;
sbit CLK=P1^1;
sbit DIO=P1^2;
unsigned char KeyCode;    //键盘值
char  dispbuff[8];         //显示缓存
unsigned int volatile keybuf[4];   //键盘读数频率值
char volatile i;    //位标志 
bit volatile set,up_down;    //设置键标志
unsigned char num;
int volatile control;    //频率字
unsigned char keycontrol;          //频率缓存
unsigned int cc; 
char xdata *max530_ad;
char ReadKB();                //读键盘
void sent(unsigned char sent_buf);        //向7289发数据
void delay(unsigned char time);            //延时
void display(unsigned char k)reentrant;             //显示
void transkey1(void);       //将所设定的数值转化为控制字(10进制转16进制)
void dis_control(unsigned char keycontrol)reentrant;      //显示控制如:左移,右移,显示setting
void dacconvent(void)reentrant;   //da转换
void xiuzheng(void);   //对电流的误差进行分段修正,让电流更加准确

void KeyBoard() interrupt 2          //键盘辨别
{     EX1=0;
      KeyCode=ReadKB();      //读键盘
   if(KeyCode==0x0f)                //======判断是否是设置键按下
	   { i=0;
	     set=1;
		 keycontrol=0xa4;        //复位
         dis_control(keycontrol);	
	     dispbuff[6]=0x0d;
	     display(6);
	     goto loop1;

       }
    else if(set)             //======只有当设置键按下才判断
	  {  
        if(KeyCode==0x0e)         //确定键
	      {  set=0;
		    if(i)    //只有当I不为0时才发送
		     {
		      transkey1();         //将所设定的数值转化为控制字(10进制转16进制)
              dacconvent();			 
              keycontrol=0xa4;        //复位
              dis_control(keycontrol);	  
			  goto loop1;	               
			 }
             goto loop1;
		   }
	     if((KeyCode<=9)&&(KeyCode>=0)&&(i<4))
	       {  
		     keycontrol=0xa0; 
             dis_control(keycontrol);                    //显示左移一位
		     keybuf[i]=KeyCode; 
             dispbuff[7]=keybuf[i];
			 display(7);
			  i++;
			 goto loop1;
		   }
         if((KeyCode==0x0d)&&(i>0))           //删除一位,
           {  
             keycontrol=0xa1;           //第一个显示变黑,右移一位
             dis_control(keycontrol); 
		     i--;
			 goto loop1;
		    }
          goto loop1;
        }	     
    if(KeyCode==0x0c)    // 步进选择(up_down=1为1ma步进,=0时为10ma步进)
        {  
          up_down=!up_down;
          goto loop1;
		 }
	if((KeyCode<=9)&&(KeyCode>=1))    //选择步进系数即:数字*1ma,数字*10ma
	    {
		   num=KeyCode;
		   goto loop1;
		}
    if(KeyCode==0x0b)              //加
        {  		   
		   if(up_down)
		    control=control+num;
		   else control=control+10*num;
		   goto loop1;
		}
	if(KeyCode==0x0a)   // 减
        {
		   if(up_down)
		    control=control-num;
		   else control=control-10*num;
		   goto loop1;
		}    
     loop1:   EX1=1;
   if(control<=0)
      control=0;
   if(control>2000)
	  control=2000;
   dacconvent();
}


main()
{
   unsigned int time;
   char m;
   EX1=1;
   EA=1;
   IT1=1;
   set=0;  
   i=0;
   control=500;  //初始化电流500ma
   up_down=0;   //初始化步进10ma档
   num=1;       //初始化步进系数1
   keycontrol=0xa4;        //复位
   dis_control(keycontrol);	
     
   	     dispbuff[2]=0x09;
	     display(2);
		 dispbuff[3]=0x00;
	     display(3);
		 dispbuff[4]=0x00;
	     display(4);
		 dispbuff[5]=0x0D;
	     display(5);		 
	for(time=0;time<800;time++)
        delay(100);
		dacconvent();
 while(1)
 {  
    
    if(!set)
	 {  keycontrol=0xa4;        //复位
          dis_control(keycontrol);
 	   dispbuff[1]=num;
 	     display(1);
	   if(up_down==0)
	     {
	       dispbuff[2]=0;
           display(2);
		 }
       
	   if(control<2000) 
		 {
		  if((control/1000))
		    {
             cc=control;
			 dispbuff[4]=cc/1000;
			 display(4);
			 m=dispbuff[4];
             cc=cc-1000*m;
			 dispbuff[5]=cc/100;
			 display(5);
			 m=dispbuff[5];
			 cc=cc-100*m;
			 dispbuff[6]=cc/10;
			 display(6);
			 m=dispbuff[6];
			 cc=cc-10*m;
			 dispbuff[7]=cc;
			 display(7);
			 }
		   else if((control/100))
             {  
			   cc=control;
               dispbuff[5]=cc/100;
			   display(5);
			   m=dispbuff[5];
			   cc=cc-100*m;
			   dispbuff[6]=cc/10;
			   display(6);
			   m=dispbuff[6];
			   cc=cc-10*m;
			   dispbuff[7]=cc;
			   display(7);
             }
           else if((control/10))
		     {
			   cc=control;
			   dispbuff[6]=cc/10;
			   display(6);
			   m=dispbuff[6];
			   cc=cc-10*m;
			   dispbuff[7]=cc;
			   display(7);			 
			 }
		   else  
		    { 
			   dispbuff[7]=control;
               display(7);
			 }
		  }   
        else  if(control==2000)
		 {
		   dispbuff[7]=0;
		   display(7);
	 	   dispbuff[6]=0;
		   display(6);
	 	   dispbuff[5]=0;
		   display(5);
		   dispbuff[4]=2;
		   display(4);		    
	      }
	 }
   dacconvent();
	 for(time=0;time<200;time++)
            delay(200);
   }
  
}
 
 char ReadKB()             //读键盘
{  char kb=0,j;
   CS=1;
   CLK=0;
   delay (50);
   sent(0x15);//发送读键盘指令
   delay(10);
   DIO=1;      //要读dio的值,必须先对其置一。
   CLK=1;
   delay(50);
   for(j=0;j<8;j++)
  {CLK=0;
   kb=kb*2+(char)DIO;//读1位数据
   delay(10);
   CLK=1;
   delay(10);
   } 
   CS=1;
   return(kb);
   }
   
void sent(unsigned char sent_buf)            //发送数据
{
   char j;
   CLK=0;                            /*置SPI时钟线为低*/
   CS=0;                              /*置SPI片选线为低*/
   delay (50);                          /*延时50us*/
  for(j=0;j<8;j++)                      /*发送8位数据*/
    {
      sent_buf=sent_buf<<1;     /*从数据最高位开始,将要发发送的数据位移入进位位CY*/
      DIO=CY;                          /*数据位送数据线*/
      CLK=1;                           /* 置SPI时钟线为高*/
      delay (10);                         /*延时10us*/
      CLK=0;                          /* 置SPI时钟线为低,发送完1位数据*/
      delay (10);/*延时10us*/
    }
   DIO=0;//为何dio清零??
}

void delay(unsigned char time)          //延时
{
  unsigned char j;
  for(j=0;j<time;j++);
}


void display(unsigned char k)reentrant        //显示
{
     CS=1;
	 sent(0xc8+k);
	 sent(dispbuff[k]);
	 CS=1;
   
}

void transkey1(void)   //将所设定的数值转化为控制字(10进制转16进制)
{   unsigned char y;
    control=0;
    for(y=0;y<i;y++)
    {
	 control=control*10;
	 control=control+keybuf[y]; 
     }
	if(control>2000)
	  control=2000;
}

void dis_control(unsigned char keycontrol)reentrant   //控制显示函数(可再入)
{   
	 sent(keycontrol);
	 CS=1;
}


void dacconvent(void)reentrant   //da转换采用ldac/=0的接法,先发送低八位数据,再发送高八位数据
{  
   unsigned int voltage;     //电流变量
   unsigned char nh4,nl8;
   voltage=control*2;     
   nh4=voltage/256;
   nl8=voltage%256;
   max530_ad=0x0000; ;  //cs0地址片选(高四位)
   *max530_ad=nl8;
   max530_ad=0x0003; //cs0地址片选(低八位)
   *max530_ad=nh4; 
}

void xiuzheng(void)    //对电流的误差进行分段修正,让电流更加准确
{

}











⌨️ 快捷键说明

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