由於博主近期參與了合泰晶元的專案開發,所以此次就用合泰微控制器來測試(具體型號為ht66f70a),ide為ht-ide3000(合泰官方)。
首先需要了解兩個概念:
1.幀
是序列通訊的資料單元,其中各位的意義如下:
起始位:先發出乙個邏輯」0」的訊號,表示傳輸資料的開始。
資料位:緊接著起始位之後,資料位的個數可以是4、5、6、7、8等,(通常使用8位)構成乙個字元,通常採用ascii碼,從最低位開始傳送,通過時鐘定位。
奇偶校驗位:資料位加上這一位後,使得「1」的位數應為偶數(偶校驗)或奇數(
奇校驗),以此來校驗資料傳送的正確性。
停止位:它是乙個字元資料的結束標誌。可以是1位、1.5位、2位的高電平。 由於資料是在傳輸線上定時的,並且每乙個裝置有其自己的時鐘,很可能在通訊中兩台
裝置間出現了小小的不同步。因此停止位不僅僅是表示傳輸的結束,並且提供計算機校正時鐘同步的機會。適用於停止位的位數越多,不同時鐘同步的容忍程度越大,但是資料傳輸率同時也越慢。
2.波特率
是衡量資料傳輸速率的指標,表示每秒鐘傳送的符號數(symbol),單位為bit/s。博主使用的微控制器為8mhz的時鐘,故定時器裝載值=(時鐘x定時時間)≈833(十進位制)=341(十六進製制),對相應暫存器賦值時_tm0al=0x41;(低八位賦值),_tm0ah =0x03;(高二位賦值);
總結:使用的波特率為9600bps,傳輸1bit的時間約等於0.104ms。
資料由1bit起始位+8bit資料位+1bit停止位共10bit的資料幀組成,起始位為低電平,停止位為高電平。
io口預設拉高,資料傳輸由低位到高位。
當我們搞清楚原理之後,寫**什麼的自然也就不在話下。實驗中只需要配置好定時器0.104ms產生一次中斷以保證每位之間的時間間隔即可。
/*********************合泰微控制器io口模擬uart串列埠通訊實驗**********************/
uart原始檔
#include "uart.h"
#include "ht66f70a.h"
#include "tm.h"
#include "string.h"
//全域性變數區
volatile unsigned int flag = 0;
char buff[num];
char buff[32] = "\0";
unsigned int count = 0;
void uart_init(void)
void waitflag(void)
void wbyte(unsigned char input)
txd=1;
waitflag();
_t0on = 0;
}void send(char *buf)
}void send_num(unsigned int s,char *buf)}
void send_array(void)
unsigned char rbyte(void)
_t0on = 0;
return receive;
}void receive(void)
}void receive_num(unsigned int s,char *buf)
}void receive_if(char *buf)
}}
uart標頭檔案
#ifndef _uart_h_
#define _uart_h_
//定義txd rxd
#define txd _pc2
#define rxd _pc3
//定義接收字串長度
#define num 16
void uart_init(void);
void waitflag();
void wbyte(unsigned char input);
unsigned char rbyte(void);
void send(char *buf);//傳送char型字串
void send_num(unsigned int s,char *buf);//傳送s個字元
void send_array(void);//傳送緩衝區
void receive(void);//接收num個字元到緩衝區
void receive_num(unsigned int s,char *buf);//接收s個字元
void receive_if(char *buf);//以'\n'結尾的條件接收
#endif
定時器配置原始檔
#include "ht66f70a.h"
#include "tm.h"
//專用於模擬串列埠的定時器
void tm0_init(void)
定時器標頭檔案
#ifndef _tm_h_
#define _tm_h_
void tm0_init(void);
#endif
中斷服務標頭檔案
#ifndef _interrupt_h_
#define _interrupt_h_
#endif
#define isr_tmr0//定義為tm0或tm2
void __attribute((interrupt(0x14))) isr_tmr0_tmr2(void)//tm0和tm2公用中斷入口
test主函式#include "ht66f70a.h"
#include "interrupt.h"
#include "tm.h"
#include "uart.h"
#include "string.h"
//全域性變數區
extern char buff[num];
extern char buff[32];
extern unsigned int count;
//函式宣告區
void delay1s(void);
//主程式入口
void main()
while(1);
}void delay1s(void) //誤差 -1us
*此版為2018/4/3最新穩定更新版(copy可用版),還是老問題,接收時用receive_if()做條件接收./****************************end******************************/
用普通 I O 口模擬標準 UART 序列口
用普通 i o 口也可以模擬標準 uart 序列口,進行序列通訊。幀 uart 通訊規範是以 8 位二進位制數為一幀,低位在前,逐位的傳輸。為了區分各個幀,在每一幀之前,要有乙個 0 作為起始標記,之後,有乙個 1,作為結束符。在結束符之前,還可選髮乙個 校驗位 但是,目前多數的應用都不選擇這個位。...
模擬串列埠UART的實現
我所禱告的,就是要你們的愛心,在知識和見識上,多而又多,使你們能分辨是非,做誠實無過的人,直到 的日子。腓立比書 1 9 10 最近在調的mcu的型號為stm32f030,配置晶元相較之前的mcu都比較簡單,功能配置很順利。但是在寫串列埠程式的時候,發現串列埠一直不通,使用示波器也沒有波形。因為基本...
CC2430 串列埠通訊UART
cc2430有兩個序列通訊介面usart0和usart1,本實驗採用第乙個介面。要實現的功能是在超級終端傳送資料到開發板,並且在lcd上顯示。那麼,此實驗中uart中主要用的是接受功能。當u0csr.re 1時,在uart上資料接收就開始了。然後uart會在輸入引腳中尋找有效起始位,並且設定u0cs...