C51 串口函数
admin
2024-05-02 22:30:15
0

#include
/******************************************************************
功能:将一个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=41=4,temp=4,,fact=10
str[2]=‘3’,字符3=0x33,-0x30=3,fact=310=30
str[1]=‘2’,2100=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); // 头文件包含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 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< }
a[i]=0;
for(i=0;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);

}

相关内容

热门资讯

把人挤出底线,算犯规吗? 把人挤出底线,算犯规吗?不算 不过动作幅度过大有可能就算了不算 但不要故意往底线整 人家站0度三...
这才是煎豆腐最好吃的家常做法,... 周末傍晚,隔壁厨房飘来一阵勾人的焦香,混着一点辛辣的诱惑。我忍不住探出头,只见楼下王姨正端着盘金黄微...
感冒吃药上瘾怎么办? 感冒吃药上瘾怎么办?戒掉...那是一件很严重的事情,现在市面上的感冒药大多都有抗生素,抗生素是治病的...
你觉得你会如何度过生命中最后的... 你觉得你会如何度过生命中最后的时光?生命的结束是人生旅途的最后部分,如果知道明天终将离去,那么,回头...
怀君属秋夜,散步咏凉天的含义 怀君属秋夜,散步咏凉天的含义《秋夜寄邱员外》作者:韦应物怀君属秋夜,散步咏凉天。空山松子落,幽人应未...
忽然觉得自己很累,有人说生活就... 忽然觉得自己很累,有人说生活就像一场梦亦真亦假,难道真的如此嘛?其实生活不是一场梦,只是我们太不懂稿...
关于和好朋友发生争执的作文 关于和好朋友发生争执的作文如果你觉得作文题目有什么不适合你的题意,你可以自己再重新定,仅供参考   ...
有得必有失的例子。 有得必有失的例子。塞翁失马焉知非福。最经典的例子。
我是不是不该活在这个世上? 我是不是不该活在这个世上?自知者,不怨人;知命者,不怨天。怨人者穷;怨天者无智。。。。。。。。。。。...
带有 百 的成语 带有 百 的成语带有 百 的成语百里挑一、百依百顺、千回百转、
光明如实纯牛奶为什么难喝 光明如实纯牛奶为什么难喝因为,这个纯牛不添加调味剂,不添厅销加防腐剂,不添加香精,不添加色素,甚至连...
支的拼音怎写 支的拼音怎写支 zhī 撑持,伸出,竖起:支撑。支援。体力不吵禅支。 受得住:乐不可支。 领款或付款...
曹宣宾都创作过哪些歌曲 曹宣宾都创作过哪些歌曲去湖南台的节节高升找啊,更全
关于柯南中的一些疑问 关于柯南中的一些疑问1,基德知道柯南是新一麽?好像我看到的都只是他知道柯南很聪明而已。。有说到他知道...
有什么行酒令! 有什么行酒令!一般酒令为:“独一枚,哥俩好,三星照,四季财,五魁首,六六顺,七个巧,八匹马,九长寿,...
你要结婚了,会怎样? 你要结婚了,会怎样?ukhpiuojkln;oigil/oj,bn/['yhjukfgvl;m,h'...
“无形杀”的女主角是谁? “无形杀”的女主角是谁? 姓名:冯波 江苏人  生日:9月24日  星座:天枰座  体重:48k...
史上最大难题:带孩子究竟该听谁... 史上最大难题:带孩子究竟该听谁的这么说吧,男人女人,老人年轻人,每个人都有自己的观点个看法。所以我个...
对不起同学的事 对不起同学的事我和其他同学在他翻栏杆时捉弄他,让他的那个地方隔住了,他说非常痛,第二天他告诉我昨天做...