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

51單片機串口模擬

發布時間:2023-05-16 13:53:30

① 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單片機串列口實驗virtualterminal窗口在哪裡

1. virtual terminal 默認顯示字元,如果單片機發送的是非顯示字元,褲畝和則虛擬終端不會顯示,會導致用戶認為通訊未通。 運行程序,在虛擬終端窗口裡面點擊右鍵,在彈出菜單裡面: 選HEX DISPLAY MODE,則顯示按十六耐舉進制胡盯顯示,能顯示所有字元。

2.virtual terminal 默認情況下不顯示回顯字元, 運行程序,在虛擬終端窗口裡面點擊右鍵,在彈出菜單裡面: 選Echo Typed Characters 顯示回顯字元

3.virtual terminal 和模擬物理串口COMPIM不能同時使用,同時使用會發生相互影響。

③ 請教51單片機高手,關於IO管腳模擬串口的問題呢,我寫了一個發送的函數,收到的始終是81(16進制顯示)

應該是延時時間不準確,造成波特絕世櫻率不對,所以輸出的返兄字元必然也就不對了。
另外實際應用時程序里可能還會有別的中斷,那麼運行這段程序時要把中斷先關掉,否則也會導致波特率並叢不對。

④ 51單片機模擬串口控制lcd12864,顯示不完全求解

第1種代碼:單片機運行到while(1);這條語句後就不會往下走了,一直在這里死循環,運行空語句。就不會給液晶送數據了。
第2種代碼:單片機運行到while(1)後會往下執行,進入while循環,循環的給液晶送數據。循環的輸出。就是有分號和沒分號的區別。
如果沒有把while(1);語句放在末尾還是會循環輸出,因為在循環的執行main函數。
交流與聯系加我扣扣,我賬號里的數字是扣扣號。
第1種代碼:
---------------------------------------------------------------------------------------------------------------------
void main(void)
{
uchar i=0; //敗升循環輸出
uchar code a[]="01234567"; // 7沒有顯示,6在反白里
T0_init(); //T0初始化
LCD_init(); //LCD初始化

I_com(0x80); //地址定位
while(1); /臘枯好*將這個循環改為整個語句循環放倒「地址定位」處就沒有問題了但一直循環輸出,糾結 */
for(i=0;a[i]!='\0';++i)
{
I_data(a[i]);
}
}
-----------------------------------------------------------------------------------------------------------------------第2種輪鉛代碼:
void main(void)
{
uchar i=0; //循環輸出
uchar code a[]="01234567"; // 7沒有顯示,6在反白里
T0_init(); //T0初始化
LCD_init(); //LCD初始化

I_com(0x80); //地址定位
while(1) /*將這個循環改為整個語句循環放倒「地址定位」處就沒有問題了但一直循環輸出,糾結 */
for(i=0;a[i]!='\0';++i)
{
I_data(a[i]);
}
}

⑤ 你好~我這個程序是51單片機IO口模擬串口通信的

在代碼最衫侍後加一個大括弧,其它一概不改氏塌稿,模擬運行的結果輸出的數據時序關系完全正常,說明您的程序功能都是對的。

您的波特率設置是9600(晶振為11.0592M)現在是按照初始化為160(注釋說140估計是筆誤,哦鍵誤),溢出周期是 96, 11059200/96/12 =9600

如果晶振為12M可能殲孝有點誤差,要改為 256-104 =152 (=0x98)

⑥ 在51單片機中,用io口模擬出來的串口,也會有串口中斷的功能嗎

如果你用豎棗來模擬串口接收的I/O是兩個外中斷口(p3.2和p3.3)之一,可以數握做到接余畢拆收中斷。發送是CPU直接操作的,中斷沒有意義。

⑦ 51單片機要接電腦的usb口模擬串口,需不需要接其他的晶元

需要電壓轉換晶元 即驅動晶元。
單片機一般是3.3V或者5V的,電腦的串口在主板上有一個電源轉換晶元,將低壓升級到RS232標准電壓,+-12V,因此,單片機和電腦轉口連接,也需要一個電壓轉換晶元。
這種那個晶元很多,如MAX232等,可以實現2路串口電壓轉換。

⑧ 51單片機串口不夠用,怎麼樣模擬

給你發一個 我做得模擬串口發送程序吧,模擬悔姿成功。希望對你能有碧肢絕幫助。
#include<reg51.h>

#define uint unsigned int
#define uchar unsigned char

sbit Rxd=P1^0;
sbit Txd=P1^1;
uchar b[10]="fengfeng";

void delay(uint z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void init()
{
TMOD=0x02;
P1=0xff;
TL0=0xa0; //波特率 9600
TH0=0xa0;
TR0=0;
TF0=0;
}

void send(uchar aa)
{
uint i=8;

TL0=0xa0; //飢磨波特率 9600
TH0=0xa0;

TR0=1;
Txd=(bit)1;
while(!TF0);
TF0=0;

Txd=(bit)0; //起始位
while(!TF0);
TF0=0;

while(i--)
{
Txd=(bit)(aa&0x01);
while(!TF0);
TF0=0;
aa=aa>>1;
}

Txd=(bit)1;
while(!TF0);
TF0=0;

Txd=(bit)1;
while(!TF0);
TF0=0;

TR1=0;

}

void Putstring(uchar *buf)
{
while(*buf!='\0')
{
send(*buf);
buf++;
delay(200);
}
}

void main()
{
init();
while(1)
{
// Putstring("I Love You!");
// delay(200);
send(0x11);
delay(1000);
send(0x12);
delay(1000);
send(0x13);
delay(1000);
send(0x14);
delay(1000);
}
}

⑨ 51單片機模擬串口通訊,起始位判斷問題

這屬於技巧問題。發送端孫慎設置發送隊列起始標志位元組,這標志位元組可以不止一個,最後發送校驗位元組,校驗演算法自己決定。接收嫌信端設置接收隊列,不管什麼起始位結束芹凱輪位,對整個隊列進行移位處理,接收一位後判斷起始標志位元組,不是起始標志退出,是則判斷校驗位元組,正確了你就完整收到一對列數據了。

⑩ 51單片機擴展模擬串口問題

你這個程序太亂了,可以循環方式的,而且164就是一個簡單的移位寄存器,沒必要一定要操作到ACC,也不用模擬串口。
我的建議:
先斷開你的數碼管,取消中斷方式,把164接好(RESET接地,A1接高,P3^2接A2,P3^3接SCK)
define P3^2 A2
define P3^3 SCK
temp = 0x44;//Seg[4];
for(i=0;i++;i<8)
{
SCK = 0;
if(temp & 0x01) A2 =1
else A2 = 0;
SCK = 1;
temp = temp<<1
}
大概就是這個意思,用萬用表測試輸出的QA-QH有沒有變化,等164調好了,再加中斷或其他程序什麼的

閱讀全文

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

熱點內容
鏤空加密隔斷牆效果圖 瀏覽:539
windows7怎麼安裝證書伺服器 瀏覽:952
證券業務的程序員 瀏覽:202
u點伺服器wifi密碼如何設置 瀏覽:864
寶馬x5大燈編程 瀏覽:673
python安裝和使用 瀏覽:381
加密的門禁卡復制了用不了 瀏覽:714
javacsv讀寫 瀏覽:806
ug編程教程pdf 瀏覽:763
latex編譯軟體安卓版 瀏覽:248
如何在信合app上交居民醫保 瀏覽:109
丑惡pdf 瀏覽:365
陝西定頻壓縮機銷售公司 瀏覽:795
安卓系統如何幫人打王者 瀏覽:427
sbtlinux安裝 瀏覽:141
阿里雲sip伺服器 瀏覽:73
身為程序員的你怎麼拚命 瀏覽:453
android圖片手勢放大 瀏覽:586
錢的所有演算法 瀏覽:13
光模塊伺服器怎麼直接連電腦 瀏覽:376