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

📄 mcs51-项目开发经典.c

📁 带keil工程。调试成功
💻 C
📖 第 1 页 / 共 2 页
字号:
//数据长度为16BIT
//前导选择为MSB first(即高位MSB先进、先出)
//极性选择为unipolar
uchar code ad_chunnel_select[]={0x0C,0x1C,0x2C,0x3C,0x4C,0x5C,0x6C,0x7C,0x8C,0x9C,0xAC};
//-------------------------------------------------------------------------------------------------
//TLC2543操作的关键是:将16位状态及通道选择设置数据的每一位送入的同时,
//AD转换的结果数据的每一位同时输出,这一操作结束后该通道的下一次转换自动开始。
//一个隐含的问题必须注意,在TLC2543芯片通电后每个通道第一次获得的AD数据无意义。
uint ad2543_measure(uchar chunnel_select)//chunnel_select = 0 to 10
{   uint  din;
    uchar dout, i;
    din=0;
    dout=ad_chunnel_select[chunnel_select];//选择控制命令
    while(EOC_2543==0);
    CLK_2543=0;
    CS_2543=0;
    for(i=0;i<16;i++)
      {if(dout&0x80) DIN_2543=1;//控制命令从MSB-LSB,向AD发数
       else          DIN_2543=0;
       CLK_2543=1;
       dout<<=1 ;
       din<<=1 ;
       if(DOUT_2543==1) din|=0x0001;//接收AD数据,从MSB-LSB
       CLK_2543=0;
      }
    CS_2543=1;
    return (din>>4);  //因为是12位精度,而AD数据的MSB却在uint型变量din的最高位,所以右移4位
}


//=================================================================================================
// 串口UART操作相关程序
//=================================================================================================
//函数功能:串口发射1个字节
void uart_byte_out(uchar uart_data_out)
{ SBUF = uart_data_out;
  while(TI==0);
  TI=0;
}
//-------------------------------------------------------------------------------------------------
//函数功能:串口发射字符数组。通常将要发送的字符数组定义在CODE代码区。
void uart_string_out(char * char_array)
{  uchar i;
   for(i=0; i<strlen(char_array) ;i++)
     {
	  uart_byte_out(char_array[i]);
	 }
}
//-------------------------------------------------------------------------------------------------
//函数功能:串口输出数据十进制到PC机屏幕上
//形参:范围 0-65535 ;例如:data_to_out=12345(或0x3039),则计算机屏幕就显示12345
void uart_data_decimalist_out(uint data_to_out)
{  bit   entrance;
   uchar ge,shi,bai,qian,wan;
   wan  = (data_to_out/10000)     ;//拆分万位,并转化为ASKII码
   qian = (data_to_out%10000)/1000;//拆分千位,并转化为ASKII码
   bai  = (data_to_out%1000)/100  ;//拆分百位,并转化为ASKII码
   shi  = (data_to_out%100)/10    ;//拆分十位,并转化为ASKII码
   ge   = (data_to_out%10)        ;//拆分个位,并转化为ASKII码
   entrance=1;//开放个、十、百、千、万的判断传输入口
   if(wan && entrance)
     {uart_byte_out(change_hex_to_askii(wan));
	  uart_byte_out(change_hex_to_askii(qian));
	  uart_byte_out(change_hex_to_askii(bai));
	  uart_byte_out(change_hex_to_askii(shi));
	  uart_byte_out(change_hex_to_askii(ge));
	  entrance=0;//如果万位不为0,则不再判断其它位
	 }
   else if(qian && entrance)
     {uart_byte_out(change_hex_to_askii(qian));
	  uart_byte_out(change_hex_to_askii(bai));
	  uart_byte_out(change_hex_to_askii(shi));
	  uart_byte_out(change_hex_to_askii(ge));
	  entrance=0;//如果千位不为0,则不再判断其它位
	 }
   else if(bai && entrance)
     {uart_byte_out(change_hex_to_askii(bai));
	  uart_byte_out(change_hex_to_askii(shi));
	  uart_byte_out(change_hex_to_askii(ge));
	  entrance=0;//如果百位不为0,则不再判断其它位
	 }
   else if(shi && entrance)
     {uart_byte_out(change_hex_to_askii(shi));
	  uart_byte_out(change_hex_to_askii(ge));
	  entrance=0;//如果十位不为0,则不再判断其它位
	 }
   else
     {uart_byte_out(change_hex_to_askii(ge));
	 }
}
//-------------------------------------------------------------------------------------------------
// 函数功能:串口显示的回车换行
// 形参:newline_number 表示一共换几行
void uart_newline(uchar newline_number)
{ uchar i;
  for(i=0;i<newline_number;i++)
     {
	  uart_byte_out(0x0d);
      uart_byte_out(0x0a);
	 }
}
//-------------------------------------------------------------------------------------------------
// 函数功能:串口显示的空格
// 形参:space_number 表示空几个格
void uart_space(uchar space_number)
{ uchar i;
  for(i=0;i<space_number;i++)
     {
	  uart_byte_out(0x20);
	 }  
}

//=================================================================================================
// 数制转换相关程序
//=================================================================================================
uchar change_bcd_to_hex(uchar shu)//转换BCD码成十进制数
{ uchar shu_h;
  uchar shu_l;
  shu_l=shu&0x0f;
  shu_h=shu&0xf0;
  shu_h=shu_h>>4;
  return (shu_h*10+shu_l);
}
//-------------------------------------------------------------------------------------------------
uchar change_hex_to_bcd(uchar shu)//转换十进制数成BCD码
{ uchar shu_h;
  uchar shu_l;
  shu_l=shu%10;
  shu_h=shu/10;
  return ((shu_h<<4)|shu_l);
}
//-------------------------------------------------------------------------------------------------
uchar change_askii_to_hex(uchar askii)//转换ASKII码成HEX,实参范围:30-39、41-46
{ if(askii<=0x39) return(askii-0x30);
  else return(askii-0x37);
}
//-------------------------------------------------------------------------------------------------
uchar change_hex_to_askii(uchar data_hex)//HEX转换成ASKII,实参范围:0-9、A-F
{ if(data_hex<=0x09) return(data_hex+0x30);
  else return(data_hex+0x37);
}
//=================================================================================================
// 函数功能:将格式为"data1,data2,...datan#" 的字符串中的data数据全部取出,并存储于temporary_data[]
//=================================================================================================
void get_data(uchar * how_much_data)
{ 
  uchar i;
  uchar j=0;
  uchar k=0;
  uchar how_much_temp_askii=0;
  uchar temp_askii[5];
  uint  return_data;

  for(i=0; i<strlen(how_much_data); i++)
    {
	 if( (how_much_data[i] != ',') && (how_much_data[i] != '#') )
	   {
	    temp_askii[j] = how_much_data[i];
   		j=j+1;
        how_much_temp_askii=how_much_temp_askii+1;
	   }
	 else
	   {j=0;
	    switch (how_much_temp_askii)
		  {case 1:{return_data = change_askii_to_hex(temp_askii[0]);
				   break;
				  }
		   case 2:{return_data = change_askii_to_hex(temp_askii[0])*10+
	                             change_askii_to_hex(temp_askii[1]);
				   break;
				  }
		   case 3:{return_data = change_askii_to_hex(temp_askii[0])*100+
		                         change_askii_to_hex(temp_askii[1])*10 +
							     change_askii_to_hex(temp_askii[2]);
				   break;
				  }
		   case 4:{return_data = change_askii_to_hex(temp_askii[0])*1000+
	                             change_askii_to_hex(temp_askii[1])*100 +
							     change_askii_to_hex(temp_askii[2])*10  +
							     change_askii_to_hex(temp_askii[3]);
				   break;
				  }
		   case 5:{return_data = change_askii_to_hex(temp_askii[0])*10000+
	                             change_askii_to_hex(temp_askii[1])*1000 +
								 change_askii_to_hex(temp_askii[2])*100  +
								 change_askii_to_hex(temp_askii[3])*10   +
								 change_askii_to_hex(temp_askii[4]);
				   break;
				  }
		   default:break;
		  }
	    temporary_data[k] = return_data;
		k=k+1;
	    how_much_temp_askii=0;
	   }
    }
}
//=================================================================================================
// 函数功能:字符串匹配函数
//=================================================================================================
char * strstr(char * haystack, char * needle)
{  char *ptr1, *ptr2;
   weizhi=0;
   // Protect against NULL pointer
   if (*needle == 0) return(haystack);
   for( ; *haystack; haystack++ ,weizhi++)
	 {// Look for needle in haystack.  If there is a
      // match then this will continue all the way
      // until ptr1 reaches the NULL at the end of needle 
	  for(ptr1 = needle, ptr2 = haystack; *ptr1 && (*ptr1 == *ptr2); ++ptr1, ++ptr2);
	  // If there is a match then return pointer to needle in haystack
      if(*ptr1 == 0) return(haystack);
	 }
   return NULL;// no matching string found
}

//=================================================================================================
// 串口UART中断服务程序
// 可以自动接收格式为"@xxx...xxx#"的字符串,长度小于等于30
//=================================================================================================
void UART_interrupt (void) interrupt 4
{ RI=0;
  if( SBUF == '@' ) //判断头
    {uart_buffer_address = 0;
  	 uart_buffer[uart_buffer_address] = SBUF;
	 uart_buffer_address++;
     uart_receive_start = 1; //置uart0接收启动标志
     return;
    }
  if( uart_receive_start == 1 ) //接收中间数据
    {uart_buffer[uart_buffer_address] = SBUF;
     uart_buffer_address++; //每接收1字节缓冲区地址加1
    }
  if( (uart_receive_start == 1)&&(SBUF == '#') ) //判断尾
    {uart_buffer[uart_buffer_address] = 0;//置字符串结束符号 \0,为字符串处理函数提供标准格式
	 uart_buffer_address = 0; //清缓冲区地址指针
     uart_receive_start  = 0; //清uart0接收启动标志
	 uart_receive_ok     = 1; //置已接收完整串口命令标志
     return;
    }
  if(uart_buffer_address>39)  //uart0接收缓冲区地址溢出故障处理:
    {uart_buffer_address = 0; //清缓冲区地址指针
     uart_receive_start  = 0; //清uart0接收启动标志
     uart_receive_ok     = 0; //清已接收完整串口命令标志
    }
}

//=================================================================================================
// T1中断服务程序
//=================================================================================================
void T1_interrupt(void) interrupt 3
{
  TH1=0x4c;//11.0592M晶振时T1定时时间长度为50毫秒
  TL1=0x00;
  t1_delay_time++;//在需要延时的地方清空并判断该变量

 }
//=================================================================================================
//                           end of the file 
//=================================================================================================

⌨️ 快捷键说明

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