IO口模擬UART串列埠

2021-08-15 13:22:40 字數 3621 閱讀 3481

由於博主近期參與了合泰晶元的專案開發,所以此次就用合泰微控制器來測試(具體型號為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

/****************************end******************************/
*此版為2018/4/3最新穩定更新版(copy可用版),還是老問題,接收時用receive_if()做條件接收.

用普通 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...