您的位置:首页 > 其它

关于单片机通过串口发送浮点数信息

2015-07-27 16:16 232 查看
最近弄一个小东西的时候,需要将AD采集的数据,通过串口发送上位机。由于还得在下位机部分显示出来,所以这个AD采集的数据转换之后发送到串口,比较容易点。但是问题来了,以前的串口,只有从GPS模块接收的信息是浮点类型外。其他的东西,都只是把字符类型或者字符串类型的数据发到串口。

查阅了一点资料,这里是资料的链接。

单片机将浮点数从串口发送出去:

1.http://www.51hei.com/bbs/dpj-31223-1.html

采用了将浮点数转换为四个字节的数据,放到数组中,发送到串口。

2.http://blog.sina.com.cn/s/blog_a8576df901011efv.html

加入了标准输入输出头文件,可以通过对TI标志位的判断,直接对数据进行串口输出。

同时自己进行了一个测试,觉得第二种方法比第一种方法来的简单。但是第二种多了一个头文件,大概估计了一下,觉得第二种方法生成的hex文件是比第一种大的。当然现在很多存储都是够的。倒也不是什么大问题,不过大家进行方法选择的时候,可以进行一些测试,以免存储不够的情况出现。

下面是我进行测试的代码

[code]#include<reg52.h>
#include<stdio.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

float ad_vo=9.0987;
void init()
{
    //设定T1定时器工作方式2, T0定时器工作方式1
    TMOD = 0x21;
    //为T0定时器装入初值
    TH0 = (65536 - 50000) / 256;
    TL0 = (65536 - 50000) % 256;
    //为T1定时器装入初值
    TH1 = 0xfd;
    TL1 = 0xfd;
    //ET1 = 1;  这里不需要开启定时器1中断,因为定时器1工作在方式2,为8位自动重装方式,进入中断也无事可做
    //启动T1定时器
    TR1 = 1;
    //开启定时器0中断
    ET0 = 1;
    //启动定时器0
    //TR0 = 1; TR0的初始化放在主函数的while中,方便检测到串口发送数据后的1s延时,即延时1s从串口发送完数据开始
    //设定串口工作方式
    //11位异步收发,含9位数据,波特率可变,且由定时器1溢出率控制
    SM0 = 1;
    SM1 = 1;
    //容许串口中断
    REN = 1;
    //开启总中断
    EA = 1;
    //开启串口中断
    ES = 1;
}
void delay(uint count)
{
    uint i=0,j=0;
    for(i=count;i>0;i--)
        for(j=110;j>0;j--);
}

void main()
{
    while(1)
    {
      delay(1000);
      init();
      ES=0;
      TI=1;
      printf("%f\n",ad_vo);
      printf("\n\n\n\n");
      while(!TI);
      TI=0;
      ES=1;
      delay(1000);
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: