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

📄 kongwen.c

📁 对8051cf020的温度控制和液晶显示急串口上传的代码
💻 C
📖 第 1 页 / 共 4 页
字号:
  float qqq=0.0;
  float qq[3];
  unsigned int temp_data=0; 
  AMX0SL = 0x0f;                      // 选择温度传感器的信号输入到dac中  
  delay_time(100);
  for(i=0;i<3;i++)
  {
  	AD0INT=0;     //清除转换完成标志
  	AD0BUSY=1;    //启动转换
  	while(AD0INT==0);   //等待转换结束
  	temp_data=ADC0>>4;  // 读取值并进行处理
  	qq[i]=temperature(1,temp_data);
  }
  qqq=(0.5*(qq[1]+qq[2]));
  AMX0SL = 0x00;                      // 选择温度传感器的信号输入到dac中
  delay_time(100);
  data_tx="当前温度为";
  Tdata(data_tx);
  Tdata(mysprint(qqq,1));
  Tdata(c_end);
return qqq;
}

// 定时器1作为串口时钟, 变量<baudrate>代表波特率,8位数据,无校验,1位停止位.
void uart0_init (void)
{
   SCON0   = 0x50;                  // SCON0: mode 1, 8-bit UART, enable RX
 //  IP|=0x10;                        //设置uart为最高优先级中断
   TMOD    = 0x20;                  // TMOD: 定时器1,方式2,8位重装载
   TH1    = -(sysclk/BAUDRATE/16);  // 设定波特率
   TR1    = 1;                      // 启动定时器1
   CKCON |= 0x10;                   // 定时器1选用系统时钟作为时钟源
   PCON  |= 0x80;                   // SMOD0 = 1
  // ES0    = 1;                      // 指示发送准备好
   TI0=1;
}

//定时器4中断服务子程序
void timer4_ISR (void) interrupt 16 using 3
{
   
   static unsigned phase_acc1 = 0;  // 锯齿波相位累加器变量

   static unsigned phase_acc2=0;    //方波相位累加变量
        
   T4CON &= ~0x80;                 // 清定时器4的溢出标志	  
   phase_acc1 += phase_add1;       // 增加相位累加器  
   phase_acc2 += phase_add2;                          
   switch (output_waveform)
   {         
      case heat:  
	   {                          
		    solid=1;
       }
      break;

	  case adjust:
	    {
	      solid=1;
        }
      break;
	  case res:
		   {
		        repeat_value=1;				  
		   }
      break;
	  case vol:
		   {
		        repeat_value=2;				  
		   }
      break;
	  case tem:
		   {
		        repeat_value=3;	
				
		   }
      break;	  
	  case off:
		   {
		        solid=1;  
				repeat_value=0;
		   }
      break;
	  default:
            {
			   data_tx="default";
			   Tdata(data_tx);					  
			   Tdata(c_end);
			   clr_datarx();
			}
   }
}

//串口发送数据
void send_lcd_data(char *str)                 
  {  	 
     unsigned char i;      
        for(i=0;str[i];i++)   //循环发送字符串
        {
           write_ram(str[i]);
        }
  }


//串口发送数据
void Tdata(char *str)                 
  {  	 
     unsigned char i;  
	 ES0=0;     
        for(i=0;str[i];i++)   //循环发送字符串
        {
           SBUF0=str[i];
           while(TI0==0);//发送完成
		   TI0=0;
        }
		ES0= 1; 
  }
//发送单个数据
void Tdatar(char s)
  {     
  		ES0=0; 
        SBUF0=s;
        while(TI0==0);//发送完成
		TI0=0;
		ES0=1; 
  }
//从字符串中取字符   s:字符串指针,begin:开始位置,longth:要取的字符串长度
char * strmid(char * s,unsigned char begin,unsigned char longth)
{
     unsigned char ii;
     ii=0;
     for(ii=0;ii<longth;ii++) array[ii]=s[begin+ii];
     array[ii]='\0';
     return array;     
}
//去除字符串两边的空格
char * trim(char * str)
{
     unsigned char commandlen;
     unsigned char i=1;     
     commandlen=strlen1(str);
     for(i=0;(*(str+i)==32)&&(i<commandlen);i++);
     return (str+i);
}
//相当于c语言中的atoi函数
char atoii(char chr)
{
      switch (chr)
      {
       case 48:
        return 0;   
       case 49:
        return 1;
       case 50:
        return 2;
       case 51:
        return 3;
       case 52:
        return 4;
       case 53:
        return 5;
       case 54:
        return 6;
       case 55:
        return 7;
       case 56:
        return 8;
       case 57:
        return 9;
       default:
        return 10;
     }      
}
//相当于c语言中的atof函数
float atoff(char * c)
{  
   char i=0,j=0,dot=0;
   char flag=0; float xdata t3;    
   unsigned char flag1=0;
   t3=0;
   if(strlen1(c)==0)  return (atoffERROR);  //*******含有非法字符**************
   if(c[0]==45) flag=1; 
   for(i=(flag>0)?1:0;;i++)
   {
        if(c[i]==0||c[i]==0x20||c[i]==0xd||c[i]==44) break;
        if((c[i]>='0')&&(c[i]<='9')||(c[i]=='.'))
        {
             if(flag1) flag1++;
             if(c[i]=='.') flag1++;
             else 
             {
                 t3*=10.0;
                 t3+=(float)(c[i]-0x30);
             }
         }   
         else {return (atoffERROR);}  //*******含有非法字符**************
    }       
    for(i=1;i<flag1;i++) t3/=10;
    if(flag) t3=0-t3;
    return t3;
}
//判断串口接受字符是否为预定义命令
char selfun()
{   
       char bbb;            
       
       clr_datarx();
       return bbb;
}
//字符串查找命令//相当于c语言中的strstr函数
char * strstr1(char *s1,char *s2)
{
    unsigned char i=0,j=1,flag=1;   
    while (*(s1+i)!=0)
    {          
          if(*(s1+i)==*s2)
          { 
              j=1;
              flag=1;
              while ((*(s2+j)!=0)&&(*(s1+i+j)!=0)&&flag)
              {
                  if(*(s1+i+j)!=*(s2+j))
                  {
                     flag=0;
                  }
                  j++;  
              }
              if((flag==1)&&(*(s2+j)==0)) return (s1+i);            
          }
          i++;
    }
    return 0;
}
//字符串长度命令//相当于c语言中的strlen函数
char strlen1(char * s1)
{
     unsigned char i=0;
     while (*(s1+i)!=0)
     {
         i++;
     }
     return i;
}
//字符串合并命令//相当于c语言中的strcat函数
char * strcat1(char *s1,char *s2)
{
     unsigned char i=0,j=0,k;
     i=strlen1(s1);
     for(j=0;j<i;j++) array[j]=s1[j];
     k=strlen1(s2)+i;
     for(j=i;j<k;j++) array[j]=s2[j-i];
     return s1;
}
//清除串口接收数组
void clr_datarx()
{
       unsigned char jj;
       for(jj=0;jj<130;jj++) data_rx[jj]=0;
}
//系统内部自检
char hwtanalyze(void)    //系统内部自检
{
   return 1; //测量温度
}
//各通道执行函数                ,有用与否?????????????
//停止输出波形
char heat_off(void)
{
  output_waveform = off; 
  return 1;
}

//输出电流函数
char current_out(unsigned int current)
{
  unsigned int dac0_data=0;
  if((current<0)||(current>490))
     {
        return 0;
	 }
  else
     {
	    dac0_data=(current*83/10)<<4;
        DAC0=dac0_data;
		return 1;
	 }
}

//接收中断
void UART0_ISR (void) interrupt 4 using 3
{
   unsigned char the_char;
   if (RI0 == 1)
   {                            // handle receive function
      RI0 = 0;                  // clear RX complete indicator   ||(the_char==13))
      the_char=SBUF0;
	  if((uartcount==0)&&((the_char==' ')||(the_char==10)))
        {      
	//	    T4CON |= 0x04;                // 启动定时器4          
            return;
         }
      if(the_char==8)//*******退格
        {
           if(uartcount>0) 	data_rx[(--uartcount)]=0;
	//	   T4CON |= 0x04;                // 启动定时器4
           return;
        }
      else
        {
           data_rx[uartcount]=the_char;   //数据接收,存至Data数组中
		   
           if(data_rx[uartcount++]==13)  //回车符13   ZN122
            {
			  T4CON = 0;                //定时器4停止计数
              uartcount=0;
              uartflag=1;      
            }          
        }
   } 
}
//浮点数到ascii的转换
char *mysprint(float discode,unsigned char a1)
 {
   unsigned int num=13;
   char ret[15];
   long temp; long div=1;
   unsigned char kk,ii;
   unsigned char flag=0;
   for(ii=0;ii<a1;ii++)
   discode*=10;
   temp=discode;
   ret[14]=0;
   if(temp<0)  {flag=1;temp=0-temp;}
   for(ii=0;ii<a1;ii++)
   div*=10;
   for(ii=0;ii<a1;ii++)
    {
      kk=(temp%10);
      temp/=10;
      ret[num--]='0'+kk;
    }
  if(a1)  ret[num--]='.' ;
  kk=(temp%10);
  temp/=10;
  ret[num--]='0'+kk;
  while(1)
    {
       if(temp==0) break;
       kk=(temp%10);
       temp/=10;
       ret[num--]='0'+kk;
    }
  if(flag)  ret[num--]='-';
  return  ret+num+1;
 }


char robot_an()
{
   lookresult=strstr1(data_rx,"m");  //开始查找manner参数,
      if(lookresult==0)              //如果没有则采用上一次设定结果
        {
           robot1.manner=robot2.manner;
        }
      else                          
        {         
           lookresult1=strstr1(lookresult,",");            //有则寻找m后边的","
           if (lookresult1==0)
             {
                clr_datarx();                              //如果没有“,”,则返回,数组清零
                return 0;   //error
             }        
            lookresult=lookresult+1;
            lookresult=trim(lookresult);
            strmid(lookresult,0,lookresult1-lookresult);    
            robot1.manner=atoff(array);                   //计算manner参数   
			if((robot1.manner<=0)|(robot1.manner>30))     //判别参数是否异常
			  {
			     clr_datarx();
			     return 0;                                //异常直接返回
			  }
            else                                          //不异常,备份数据
			  {
			    robot2.manner=robot1.manner;
			  }
         }       
     lookresult=strstr1(data_rx,"sl");  //开始查找sl参数,
         if(lookresult==0)
         {
             robot1.speed_left=robot2.speed_left;            //如果没有则采用上一次设定结果
         }
         else
         {
             lookresult1=strstr1(lookresult,",");
             if (lookresult1==0)
             {
                clr_datarx();
                return 0;   //error                           //如果没有“,”,则返回,数组清零
             }
             lookresult=lookresult+2;
             lookresult=trim(lookresult);
             strmid(lookresult,0,lookresult1-lookresult);
             robot1.speed_left=atoff(array);   
			 if((robot1.speed_left<=0)|(robot1.speed_left>950))    //判别参数是否异常
			  {
			     clr_datarx();
			     return 0;
			  }
             else
			   {
                  robot2.speed_left=robot1.speed_left;
			   }
         }
     lookresult=strstr1(data_rx,"sr");  //开始查找sr___right参数,
         if(lookresult==0)
         {
             robot1.speed_right=robot2.speed_right;            //如果没有则采用上一次设定结果
         }
         else
         {
             lookresult1=strstr1(lookresult,",");
             if (lookresult1==0)
             {
                clr_datarx();
                return 0;   //error                           //如果没有“,”,则返回,数组清零
             }
             lookresult=lookresult+2;
             lookresult=trim(lookresult);
             strmid(lookresult,0,lookresult1-lookresult);
             robot1.speed_right=atoff(array); 
			 if((robot1.speed_right<=0)|(robot1.speed_right>950))    //判别参数是否异常
			  {
			     clr_datarx();
			     return 0;
			  }
			 else
			   {
			      robot2.speed_right=robot1.speed_right;
			   } 
          }
     lookresult=strstr1(data_rx,"so");  //开始查找so____rotate参数,
         if(lookresult==0)
         {
             robot1.speed_rotate=robot2.speed_rotate;            //如果没有则采用上一次设定结果
         }
         else
         {
             lookresult1=strstr1(lookresult,",");
             if (lookresult1==0)
             {
                clr_datarx();
                return 0;   //error                           //如果没有“,”,则返回,数组清零
             }
             lookresult=lookresult+2;
             lookresult=trim(lookresult);
             strmid(lookresult,0,lookresult1-lookresult);

⌨️ 快捷键说明

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