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

📄 dc_current_souce.c.bak

📁 利用单片机控制电流大小
💻 BAK
字号:
#include<reg51.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;    //设置键标志
unsigned int  control;    //频率字
unsigned char keycontrol;          //频率缓存
char ReadKB();                //读键盘
void sent(unsigned char sent_buf);        //向7289发数据
void delay(unsigned char time)reentrant;            //延时
void display(unsigned char k)reentrant;             //显示
void transkey1(void);       //将所设定的数值转化为控制字(10进制转16进制)
void dis_control(unsigned char keycontrol)reentrant;      //显示控制如:左移,右移,显示setting

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

       }
   else if(set)             //======只有当设置键按下才判断
	  {  
       if(KeyCode==0x0e)         //确定键
	      {  set=0;
		    if(i)    //只有当I不为0时才发送
		    {
		     transkey1();         //将所设定的数值转化为控制字(10进制转16进制)
			 if(control>2000)
			 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;
     }	     
     loop1:   EX1=1;


   }


main()
{
   unsigned int time;
   char m;
   EX1=1;
   EA=1;
   IT1=1;
   set=0;  
   i=0;
   keycontrol=0xa4;        //复位
   dis_control(keycontrol);	   
   control=0;
	     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);
 while(1)
   {
    if(!set)
	 {   keycontrol=0xa4;        //复位
         dis_control(keycontrol);
	   if(control<2000)
	   {        
		dispbuff[7]=0;
		display(7);
		dispbuff[6]=0;
		display(6);
		dispbuff[5]=0;
		display(5);
		dispbuff[4]=0;
		display(4);
	    for(time=0;time<800;time++)
         delay(200);
		 }
	   else if(control>2000)
	   {
	   for(m=0;m<i+1;m++)
	      {
	          keycontrol=0xa0; 
              dis_control(keycontrol);                    //显示左移一位
		      dispbuff[7]=keybuf[m];
			  display(7);
	      }	 
          for(time=0;time<800;time++)
         delay(200); 
	   }
	 }
   
   //for(time=0;time<800;time++)
     //  delay(200);
  }

}
 
 char ReadKB()             //读键盘
{  char kb=0,i;
   CS=1;
   CLK=0;
   delay (50);
   sent(0x15);//发送读键盘指令
   delay(10);
   DIO=1;      //要读dio的值,必须先对其置一。
   CLK=1;
   delay(50);
   for(i=0;i<8;i++)
  {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 i;
   CLK=0;                            /*置SPI时钟线为低*/
   CS=0;                              /*置SPI片选线为低*/
   delay (50);                          /*延时50us*/
  for(i=0;i<8;i++)                      /*发送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) reentrant         //延时
{
  unsigned char i;
  for(i=0;i<time;i++);
}


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

void transkey1(void)   //将所设定的数值转化为控制字(10进制转16进制)
{   
   //i--;
   for(;i<1;i--)
   control=control*0x0a+keybuf[i];  	   
}

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


















⌨️ 快捷键说明

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