51串口程序各种函数,留用。


#include <string.h>	  
/******************************************************************
功能:将一个32位长整型变量dat转为字符串,比如把1234转为"1234"
参数:dat:待转的long型的变量
      str:指向字符数组的指针,转换后的字节串放在其中    
返回:转换后的字符串长度			        
 ******************************************************************/ 
unsigned char Long_Str(long dat,unsigned char *str) // 长整型数转换为字符串,返回值为转换后的字符串长度
{
	signed char i=0;
	unsigned char len = 0;
	unsigned char buf[11];	   // 长整数最大值4294967295,转ASCII码后占用10+1=11字节 
	if (dat < 0)               // 如果为负数,首先取绝对值,并添加负号
	{
		dat = -dat;
		*str++ = '-';
		len++;
	}
	do 
	{                               // 低位在前高位在后顺序排列
		buf[i++] = dat % 10+0x30;	// C语言中数组下标固定从0开始
		dat /= 10;
	} while (dat > 0);
    len += i;                 // i最后的值就是有效字符的个数
    while (i-- > 0)           // 高位在前低位在后顺序排列
    {
        *str++ = buf[i] ;
    }     
	*str = 0;                 // 添加字符串结束符方便使用KEIL自带的字符串处理函数处理
	return len;               // 返回字符串长度
}

/******************************************************************
功能:将一个字符串转为32位长整型变量,比如"1234"转为1234
参数:str:指向待转换的字符串           
返回:转换后的数值		
//分析,假如传来‘1234’字符串,strlen之后,len=4,,刚好是字符串指针地址0.1.2.3
循环体内部,
str[3]=‘4’,字符4=0x34,-0x30=4,*fact=4*1=4,temp=4,,fact=10
str[2]='3',字符3=0x33,-0x30=3,*fact=3*10=30
str[1]='2',,,,2*100=200,
str[0]='1',,,,1*1000=1000
temp=1000+200+30+4=1234,转换成长整型变量了
 ******************************************** **********************/ 
unsigned long Str_Long(char *str) 
{
	 unsigned long temp=0;
	 unsigned long fact=1;
	 unsigned char len=strlen(str);	// <string.h>头文件包含strlen()函数	
	 unsigned char i;		// strlen()函数计算的字符串长度不包含最后一个空字符(值0)
	 for(i=len;i>0;i--)															   
	 {
		temp+=((str[i-1]-0x30)*fact);  // 数组下标从0开始
		fact*=10;
	 }
	 return temp;
}

/**************************************************************************
/**************************************************************************
功能:STC15单片机的串口发送字节的函数
参数:dat:要发送的一个字节   
**************************************************************************/
void UART_Send_Byte(unsigned char dat)
{
	ES=0;		 // 使用查询发送结束方式,禁止中断干预
	SBUF = dat;
	while(!TI);	    
 	TI=0;	 //此句可以不要,不影响后面数据的发送,只供代码查询数据是否发送完成
	ES=1;
}	
/**************************************************************************
功能:STC15单片机的串口发送0d 0a ,即回车换行 
注:此函数就是发送0d 0a这两个字节,在"串口助手"上会有回车换行的效果
 **************************************************************************/  
void UART_Send_Enter()
{
	UART_Send_Byte(0x0d); // 转义字符常量\r,ASCII码值(10进制)=13,光标移到本行行首
	UART_Send_Byte(0x0a); // 转义字符常量\n,ASCII码值(10进制)=10,光标移到下行行首
}

/*
void UART_Send_Str(char *buf)
{
	while (*buf != '\0')   //说明:C语言字符串数组结尾必然有一个"\0"字符,在内存中数值为0
	{
		UART_send_byte(*buf++);	 //说明:* 和 ++优先级相同,结合性从右到左,但是++运
	}							 //算符有个特性就是先让变量参与运算,后进行加1操作
}	 */

/**************************************************************************
功能:51单片机的串口发送字符串  
参数:s:指向字符串的指针	  
注:如果在字符串中有'\n',则会发送一个回车换行
 **************************************************************************/
void UART_Send_Str(char *s)
{
	unsigned int i; 	
	unsigned int len=strlen(s)-1;		// 最后一个字符单独处理
	for(i=0;i<len;i++) 
		UART_Send_Byte(s[i]);		// 	while (*buf != '\0')  UART_Send_Byte(*s++);
	if(s[i]=='\n') 			     
	{
		UART_Send_Enter();
	}
	else
	{
		UART_Send_Byte(s[i]);	// 普通字符正常发送
	}
}
/**************************************************************************
功能:51单片机的串口发送数值
参数:dat:要发送的数值(长整数)
  注:函数中会将数值转为相应的字符串,发送出去。比如 4567 转为 "4567" 
 **************************************************************************/
void UART_Send_Num(unsigned long dat)
{
	unsigned char temp[11];		// 长整数最大值4294967295,转ASCII码后占用10字节
	    //	由于后面程序要使用strlen()库函数计算长度,需增加1个字节存放结束符0
	Long_Str(dat,temp);	  
	UART_Send_Str(temp);
	UART_Send_Enter();          // 发送回车 
}
/**************************************************************************
功能:51单片机的串口发送调试信息(字符串+数值)	  
参数:inf:指向提示信息字符串的指针
      dat:一个数值,前面的提示信息就是在说明这个数值的意义
 **************************************************************************/
void UART_Send_StrNum(char *inf,unsigned long dat)
{
	UART_Send_Str(inf);
	UART_Send_Num(dat);	
} 

/**************************************************************************
功能:16进制转ASCII码函数
 **************************************************************************/
unsigned char Hex_ASCII(unsigned int hex,char *str)
{
	unsigned char temp=0;
	
	temp=((hex&0xf000)>>12);	  // 4位1表示范围0_9_A_F
	str[0]=(temp>=10)?(temp-10+'A'):(temp+0x30);
		// 0_9的ASCII码是0_9+ 0x30,
	    // A_F的ASCII码: A代表数值10,A的ASCII码是65,因此数值+55=ASCII
		// 因此算式(temp-10+'A')=(temp-10+65)=(temp+55)
		// 分析依据:ASCII码表
	temp=((hex&0x0f00)>>8);
	str[1]=(temp>=10)?(temp-10+'A'):(temp+0x30);
	
	temp=((hex&0x00f0)>>4);
	str[2]=(temp>=10)?(temp-10+'A'):(temp+0x30);
	
	temp=((hex&0x000f)>>0);
	str[3]=(temp>=10)?(temp-10+'A'):(temp+0x30);
	
	str[4]=0;	    // 由于要使用KEIL自带的字符串处理函数处理,必须有结束标记。 
	
	return 0;
} 

/**************************************************************************
功能:51单片机的串口输出ASCII码函数(接收端按字符形式接收则显示为HEX格式	)
 **************************************************************************/
void UART_Send_Hex(unsigned int hex)
{
	unsigned char temp[11];
	Hex_ASCII(hex,temp);
	UART_Send_Str(temp);
	UART_Send_Enter();          // 发送回车
}

/**************************************************************************
功能:51单片机的串口发送调试信息(二进制数据显示)	  
参数:dat:需要按2进制形式显示变量
 **************************************************************************/
void UART_Send_binary(unsigned char dat)
{
	unsigned char i;
	unsigned char a[17];
	for(i=0;i<8;i++)
	{
		a[i]=((dat<<i)&0x80)?'1':'0';
	}
	a[i]=0;
	for(i=0;i<strlen(a);i++)
	{
		UART_Send_Byte(a[i]);
		UART_Send_Byte(' ');
	}
	UART_Send_Enter();          // 发送回车
}
/**************************************************************************
功能:51单片机的串口1中断处理函数	
 **************************************************************************/
void UART1(void) interrupt 4  // 串行口1中断函数  
{ ; }


void main()
{
	unsigned char a=0x55;
	unsigned int b=0xAB98;
	unsigned long c=1234567890; 
	unsigned char Buf[]="欢迎使用STC15单片机!\n"; //字符串在内存结尾必然有一个附加字符:\0				 
	UART_init();						 //	波特率:9600 /22.1184MHZ
	UART_Send_Str("串口设置完毕:123ABC\n"); 	 // 发送字符串
	UART_Send_Str(Buf);
	UART_Send_Num(b);							 // 发送数值
	UART_Send_StrNum("数值=:",c);  		  // 发送字符串+数值
	UART_Send_Hex(b) ;	                  // 发送16进制
	UART_Send_binary(a);                  // 发送2进制
		
	while(1);
}

猜你喜欢

转载自blog.csdn.net/lmf666/article/details/100044467