1. 程式人生 > >關於微控制器通過串列埠傳送浮點數資訊

關於微控制器通過串列埠傳送浮點數資訊

最近弄一個小東西的時候,需要將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); } }