導航:首頁 > 操作系統 > 單片機模擬串口

單片機模擬串口

發布時間:2022-05-05 10:56:29

Ⅰ 如何使用只有模擬串口的單片機進行串列通信

數模是將單片機內的數據輸出轉換為模擬信號。是單片機通過數模轉換器以模擬量的方式與外部建立聯系。
模數是將外部模擬信號變為數字信號輸入單片機。是外部模擬信號通過模數轉換器與單片機建立聯系。
串口通訊是單片機與外設之間數字信號的交互。
$bar1->echoName();

Ⅱ 51 單片機模擬串口的問題 目前發送數據沒有問題,接收數據時只能接收前兩位,如發送010203 只能接收到01

我前幾天也做模擬串口程序,也遇到了與你類似的問題,不過現在解決了。
數據格式由一個起始位,八個數據位,一個或兩個結束位組成。在數據發送是結束位是不能省。
但在數據接收時,程序中就沒有必要等待結束位了,因為在等待結束位的過程中,把下一個數據的起始中斷也等待過去了。
把函數uchar RByte()中的最後一個WaitTF0();刪除,程序就能連續接收數據了。
下面是我的程序,你看一下就明白了。
/*
模擬串口收發程序
改程序發送口採用任一IO口,接收口採用外部中斷0口,實現了9600bit/s的串口通信
信號產生與接收採用定時器定時溢出標志來進行控制
注意問題:
1、中斷的中斷標志要保證狀態正確
2、定時器定時要精確
*/

#include<reg52.h>
sbit txd=P3^1;
sbit rxd=P3^2;
sbit en=P1^7;
sbit clk=P3^7;

#define uchar unsigned char

uchar number,flag;
uchar num[10]={0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};

void wait(uchar i);
void send(uchar aa);

void main()
{
uchar i;
IE=0;EA=1;
TMOD=0x12;
TR0=0;EX0=1;
IT0=1;en=0;
while(1)
{
if(num[0]==0x49&&num[1]==0x85&&num[2]==0x54&&num[3]==0x31&&num[4]==0x59&&num[5]==0x87&&num[6]==0x91&&num[7]==0x25&&num[8]==0x34&&num[9]==0x62)
{
en=1;
number=0;
for(i=0;i<10;i++)
{send(num[i]);num[i]=0x00;}
en=0;
}
}
}

void send(uchar aa)
{
uchar i;
txd=0;
wait(0xb9);
for(i=0;i<8;i++)
{txd=aa&0x01;aa>>=1;wait(0xb9);}
txd=1;
wait(0xb9);
flag=0;
}

void int0() interrupt 0
{
uchar i;
EX0=0;clk=!clk;
wait(0xad);
for(i=0;i<7;i++)
{
number>>=1;clk=!clk;
if(rxd)number=0x80|number;
else number=0x00|number;
wait(0xb9);
}

number>>=1;clk=!clk;
if(rxd)number=0x80|number;
else number=0x00|number;
wait(0xd9);

num[flag]=number;
flag++;clk=!clk;
IE0=0;EX0=1;
if(flag>=10)flag=0;
}

void wait(uchar i)
{
TF0=0;
TH0=i;TL0=i;
TR0=1;
while(TF0==0);
TF0=0;TR0=0;
}

Ⅲ 我這個程序是51單片機IO口模擬串口通信的

你不用中斷服務程序來置標志,當溢出是TF0自動置1,你只需清0就OK了。
你的問題肯定是波特率不一致造成的,一是你兩個設備的波特率是否一致,你查探一下,另一個是因為你用中斷服務程序處理標志,會影響波特率的,給其造成誤差。

Ⅳ 單片機模擬串口通信有什麼利弊

串口通信,或者 IIC 通信,應該是由專門的硬體,來完成的。

CPU 對這些硬體,設置一下,再傳送一下數據,就可以等待結果了。

有些單片機,太簡陋,沒有相應的硬體,只能用軟體編程,模擬硬體,來實現。

執行這些程序,當然,必須佔用 CPU 的時間。這就是《佔用大量的cpu資源》。

有時,還要使用定時器、中斷源,這也是《佔用大量的資源》。

Ⅳ 單片機模擬串口 收到的數據存在哪裡了 或者是怎麼將收到的數據存起來

你開接收中斷,將接收的數據存到一個數組里,然後在調用數組,分別取處理就OK了

Ⅵ 51單片機模擬串口

接收端是不會判斷所謂某個位元組的起始位的,接收機如果是在接收的狀態,那麼只要它的接收引腳檢測到有低電平(這個低電平不是檢測一次,而是檢測3次,判斷有2次均是低電平則最終判斷為低電平,即起始位),那麼接收端就開始以設定的波特率接收數據,判斷數據時也是判斷3次2次有效,也就是說,只要檢測到低電平它就接收。
假如發送端已經在發送過程中,再接上接收端,那麼接收的數據一定是錯的,你可以試試,隨便將接收狀態下的RXD用導線接地一下,接收機肯定收到數據。
那麼是不是不可避免這種情況的發生呢?
是可以的避免的,但是發送端的時間需要有個數據的時間間隔,否則永遠出不來這個循環錯誤:1,確保接收端就緒先於發送端,那麼第一個位元組的起始位必定被檢測到; 2,發送第9位,接收到數據後,判斷數據和第9位是對應,若對應則再接收之後的數據;3, 添加必要地起始位元組如0xaa,當接收端接收到第一個數據,並且為0xaa時,才進入接收真正的有效數據,一個起始位元組不夠就兩個;
總之在接收時就作條件判斷,直至同步為止。

Ⅶ 用STC單片機模擬串口,接收的時候,只有第一個位元組是正確的,後邊的都錯誤,而且接收的數據比正確的數據短

不要用函數調用來延時!!
對於時間精度要求高的場合,函數調用是很不合適,因為函數的參數傳遞,當前狀態的進棧出棧都要消耗時間,而這些時間你未必能完全掌握,就象你的串口接收,我估計波特率的偏差肯定非常大,所以才會造成你所說的情況。
建議你還是用定時器來延時,以while(TF0)或while(TF1)來等待延時結束。

Ⅷ STC單片機,普通IO口模擬串口通訊,不使用定時器,使用軟體程序延時,相同的延時程序,能夠正常發送數據。

STC單片機不是有獨立波特率發生器么?幹嘛不用呢
如果你不用PWM模塊的話,PWM也可以做定時器,
為什麼一定要軟體模擬呢

如果一定要用延時的方式來接收,首先你必須用中斷來接收起始位,並且在中斷中完成所有的接收工作,如果是用定時器查詢的話,使用中間點檢測,並且保證此時只有定時器一個中斷在開放

Ⅸ 如何使用52單片機的IO模擬串口

其實A和B通信不一定要用串口啊,用IO模擬SPI或者I2C都可以啊

閱讀全文

與單片機模擬串口相關的資料

熱點內容
蘋果平板如何開啟隱私單個app 瀏覽:700
空調壓縮機一開就停止 瀏覽:524
如何下載虎牙app 瀏覽:847
日語年號的演算法 瀏覽:953
dev裡面的編譯日誌咋調出來 瀏覽:298
php函數引用返回 瀏覽:816
文件夾和文件夾的創建 瀏覽:259
香港加密貨幣牌照 瀏覽:838
程序員鼓勵自己的代碼 瀏覽:393
計算機網路原理pdf 瀏覽:752
吃雞國際體驗服為什麼伺服器繁忙 瀏覽:94
php中sleep 瀏覽:490
vr怎麼看視頻演算法 瀏覽:86
手機app如何申報個人所得稅零申報 瀏覽:692
如何截獲手機app連接的ip 瀏覽:331
冰箱壓縮機是否需要電容 瀏覽:346
python列表每一行數據求和 瀏覽:274
自己有一台伺服器可以玩什麼 瀏覽:656
社會學波普諾pdf 瀏覽:584
解壓做食物的小視頻 瀏覽:758