關於微控制器通過串列埠傳送浮點數資訊
阿新 • • 發佈:2019-01-07
最近弄一個小東西的時候,需要將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檔案是比第一種大的。當然現在很多儲存都是夠的。倒也不是什麼大問題,不過大家進行方法選擇的時候,可以進行一些測試,以免儲存不夠的情況出現。
下面是我進行測試的程式碼
#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);
}
}