使用波特率為9600bpS,晶振頻率為11.0592MHz,通過計算可知,串口的每位需延時0.104ms,通過執行96個指令周期可能完成0.104ms的延時。與其相關的程序在結構上可分為:IO口定義、串口發送函數、串口接收函數、延時函數。下面依次介紹各個部分。
1.IO口定義程序等
這部分程序主要包括基本的IO口定義、全局變量定義、頭文件包含、函數聲明等。為后面程序提供編程基本。其程序代碼如下:
sbit RXD1 = 0x90;
sbit TXD1 = 0x91;
#define WR_delay 44 //寫延時
#define RD_delay 43 //讀延時
2.串口發送函數
串口發送函數首先發送起始位,再發送數據,根據通信協議選擇是否發送校驗位。最后發送停止位。延時法模擬串口發送流程如圖所示。

其程序代碼如下:
#define Check_bit_switch_on_off 0//不使用校驗位
uchar Check_bit;
//往串口寫一個字節
void Send_Byte(uchar input,bit Check_bit)
{
uchar i=8;
TXD=(bit)0; //發送啟始位
Delay(39);
//發送8位數據位
while(i--)
{
TXD=(bit)(input&0x01); //先傳低位
Delay(36);
input=input >>1;
}
//發送校驗位(無)
#if Check_bit_switch_on_off
{
TXD1=(bit)(Check_bit); //發送校驗位
Delay(36);
}
#else
Check_bit = Check_bit;
#endif
TXD1=(bit)1; //發送結束 位
Delay(46);
}
3.串口接收函數
串口接收函數首先等待起始位,然后接收數據,根據通信協議選擇是否需要接收校驗位。最后等待停止位。延時法模擬串口接收流程如圖所示。

其程序代碼如下:
//從串口讀一個字節
uchar Revice_Byte(void)
{
uchar Output=0;
uchar i=8;
uchar temp=RD_delay;
//發送8位數據位
Delay(RD_delay *1.5); //此處注意,等過起始位
while(i--)
{
Output > >=1;
if(RXD1)
Output |=0x80; //先收低位
Delay(35); //(96-26)/2,循環共
//占用26個指令周期
}
//接收校驗位
#if Check_bit_switch_on_off
(Check_bit)=TXD; //接收校驗位
Delay(35);
#endif
while(--temp) //在指定的
//時間內搜尋結束位。
{
Delay(1);
if(RXD1)
break; //收到結束位便退出
}
return Output;
}
用延時方式可以模擬多個個串口,但是使用延時方式模擬的串口在接收上存在一定的難度,主要是采樣定位要求嚴格,另外還必須知道每條語句的指令周期數。在調試過程中,讀者可以借助編譯軟件通過反匯編的方式查看編譯后的匯編語句,已確定你所使用的C語句的執行時間。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
晶振
+關注
關注
35文章
3560瀏覽量
73436 -
串口
+關注
關注
15文章
1618瀏覽量
82809 -
函數
+關注
關注
3文章
4417瀏覽量
67499 -
波特率
+關注
關注
2文章
320瀏覽量
35558 -
IO口
+關注
關注
3文章
170瀏覽量
25713
發布評論請先 登錄
相關推薦
熱點推薦
有關串口通訊延時問題的討論
最簡單的串口通訊作為子VI(寫、延時50ms、讀),然后單獨運行子VI可以很好的通訊,然后在主程序調用該串口通訊子VI時問題來了,寫進去以后要延時五六秒才能有返回數據,而且只要調用該子
發表于 12-24 16:49
串口通信延時發送問題or調用延時問題
本帖最后由 eehome 于 2013-1-5 10:08 編輯
有沒有人遇到過以下奇怪的串口通信問題哈:簡單的串口讀寫作為子VI供主程序調用,單獨運行時讀寫正常,但是一旦在主程序中運行時就出
發表于 12-25 09:55
串口延時問題
最近寫串口程序,遇到如下問題,在寫與讀之間設置延時,波特率為187500,發的16字節,收的8字節。但是運行一次延時需要設置在7ms以上才能每次都收到數據,只能延時設置小點,只運行一次
發表于 07-01 21:12
Labview串口讀寫的延時問題
先說一下通訊的目的:讀取PLC中保持寄存器(MD)的值,通訊方式采用Modbus 485串口,波特率設置為19200;我采用VISA寫函數將Modbus讀指令寫入串口中,再延時10ms后,采用
發表于 12-01 09:23
單片機IO 口模擬串口通信低到延時法
單片機IO 口模擬串口通信低到延時法,void WByte(uchar input){uchar i=8;TXD=(bit)0;//發送啟始位Delay2cp(39);//發送8位數據位while
發表于 05-18 14:31
為什么4432無線串口模塊有很大延時?
4432無線串口模塊直接接在USB轉TTL上通信就沒有延時。。。。為什么接到單片機上就有延時。。。。。。。而且寫得串口協議也都不能用了。。。
發表于 07-21 21:44
什么是無線串口模塊?無線串口模塊怎么用?
常看到很多網友在百度知道,天涯問答,搜搜問問等問答平臺上提問什么是無線串口模塊,無線串口模塊怎么用等等這樣的問題。可能是剛接觸這個行業的人想了解這樣的產品才會產生疑問,思為無線針對這個
使用延時法模塊串口
評論