一、單片機(jī)與PC機(jī)串行通信的設(shè)計(jì)
工業(yè)現(xiàn)場(chǎng)的測(cè)控系統(tǒng)中,常使用單片機(jī)進(jìn)行監(jiān)測(cè)點(diǎn)的數(shù)據(jù)采集,然后單片機(jī)通過(guò)串口與PC通信,把采集的數(shù)據(jù)串行傳送到PC機(jī)上,再在PC機(jī)上進(jìn)行數(shù)據(jù)處理。
PC機(jī)配置的都是RS-232標(biāo)準(zhǔn)串口,為D型9針插座,輸入/輸出為RS-232電平。D型9針插頭引腳如下:
如下表為RS-232C的D型9針插頭的引腳定義。
引腳號(hào) | 功能 | 符號(hào) | 方向 |
---|---|---|---|
1 | 數(shù)據(jù)暫替檢測(cè) | DCD | 輸入 |
2 | 接收數(shù)據(jù) | RXD | 輸入 |
3 | 發(fā)送數(shù)據(jù) | TXD | 輸出 |
4 | 數(shù)據(jù)終端就緒 | DTR | 輸出 |
5 | 信號(hào)地 | GND | |
6 | 數(shù)據(jù)通信設(shè)備準(zhǔn)備好 | DSR | 輸入 |
7 | 請(qǐng)求發(fā)送 | RTS | 輸出 |
8 | 清除發(fā)送 | CTS | 輸入 |
9 | 振鈴指示 | RI | 輸入 |
由于兩者電平不匹配,因此必須把單片機(jī)輸出的TTL電平轉(zhuǎn)換為RS-232電平。
單片機(jī)與PC的接口如下圖所示。圖中的轉(zhuǎn)換芯片為MAX232,接口連接只用了3條線,即RS-232插座中的2引腳、3引腳與5引腳。
二、單片機(jī)向PC發(fā)送數(shù)據(jù)示例
要求單片機(jī)通過(guò)串行口的TXD引腳向PC機(jī)串行發(fā)送8個(gè)數(shù)據(jù)字節(jié)。在proteus中使用兩個(gè)串行口虛擬終端觀察串行口線上出現(xiàn)的串行傳輸數(shù)據(jù)。
兩個(gè)虛擬終端窗口為VT1和VT2,其中窗口VT1顯示的數(shù)據(jù)表示單片機(jī)串口發(fā)送給PC機(jī)的數(shù)據(jù),窗口VT2顯示的數(shù)據(jù)表示由PC機(jī)經(jīng)RS-232串口模型COMPIM接收到的數(shù)據(jù),由于使用了串口模型COMPIM,從而省去了PC機(jī)的模型。
proteus仿真原理圖如下:
需要注意要設(shè)置虛擬終端的波特率與代碼中設(shè)置的波特率保持一致。經(jīng)過(guò)MAX232轉(zhuǎn)換后電平是相反的,設(shè)置VT2屬性中的【RX/TX Polarity】為【Inverted】。
軟件設(shè)計(jì),首先初始化串口通信,設(shè)置串口工作方式1,定時(shí)器工作方式2,波特率9600bps,波特率不加倍,代碼如下:
void UsartInit()
{
SCON=0x40; // 設(shè)置串口工作方式1
TMOD=0x20; // 設(shè)置定時(shí)器T1工作方式2
TH1=TL1=0xFD; // 設(shè)置波特率為9600bps,波特率不倍增
PCON=0x00;
EA=1;
TR1=1;
}
發(fā)送數(shù)據(jù)功能單獨(dú)編寫(xiě)一個(gè)函數(shù),如下:
void send(u8 dat)
{
SBUF=dat; // 將待發(fā)送數(shù)據(jù)寫(xiě)入發(fā)送緩沖器SBUF
while(!TI); // 等待串行口發(fā)送完畢
_nop_(); // 空操作
TI=0; // 1個(gè)字節(jié)發(fā)送完成,清零TI
}
主函數(shù)中首先調(diào)用串口通信初始化函數(shù),然后調(diào)用發(fā)送數(shù)據(jù)函數(shù),調(diào)用8次后,如果不想再次發(fā)送數(shù)據(jù)進(jìn)入while(1)循環(huán)。如下:
void main()
{
u8 i;
UsartInit(); // 串口通信初始化
for(i=0;i<8;i++)
{
send(sendBytes[i]); // 發(fā)送數(shù)據(jù)
delay(); // 每次發(fā)送完數(shù)據(jù)延時(shí)200ms
}
while(1);
}
其中sendBytes定義如下:
// 單片機(jī)發(fā)送給PC機(jī)的數(shù)據(jù)
u8 code sendBytes[]="12345678";
proteus仿真結(jié)果如下:
三、單片機(jī)接收PC機(jī)發(fā)送的數(shù)據(jù)使用示例
單片機(jī)接收PC機(jī)發(fā)送的串行數(shù)據(jù),并把接收到的數(shù)據(jù)送P1口的8位LED顯示。采用單片機(jī)的串行口模擬P機(jī) 串行口。proteus仿真原理圖如下:
軟件設(shè)計(jì),發(fā)送數(shù)據(jù)的代碼如下:
/*
實(shí)現(xiàn)功能:串口通信,單片機(jī)與PC機(jī)通信,單片機(jī)接收PC機(jī)發(fā)送的數(shù)據(jù)。
使用一個(gè)單片機(jī)模擬PC機(jī)
[2024-01-15] zoya
*/
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
u8 sendBytes=0xFE;
// 延時(shí)函數(shù),單位ms
void delay(u16 i)
{
u8 j;
for(;i>0;i--)
{
for(j=0;j<125;j++);
}
}
// 串口通信初始化函數(shù)
void UsartInit()
{
SCON=0x40; // 串口工作方式1,只發(fā)送不接收
TMOD=0x20; // 定時(shí)器工作方式2
TH1=TL1=0xFD; // 設(shè)置波特率為9600bps,波特率不倍增
PCON=0x00;
TR1=1; // 啟動(dòng)計(jì)數(shù)
}
void main()
{
u8 i;
UsartInit();
while(1)
{
for(i=0;i<7;i++)
{
// 發(fā)送數(shù)據(jù)
SBUF = sendBytes;
while(!TI);
_nop_();
TI=0;
delay(200);
sendBytes=_crol_(sendBytes,1);
}
for(i=0;i<7;i++)
{
// 發(fā)送數(shù)據(jù)
SBUF = sendBytes;
while(!TI);
_nop_();
TI=0;
delay(200);
sendBytes=_cror_(sendBytes,1);
}
}
}
接收數(shù)據(jù)的代碼如下:
/*
實(shí)現(xiàn)功能:串口通信,單片機(jī)與PC機(jī)通信,單片機(jī)接收PC機(jī)發(fā)送的數(shù)據(jù)。
接收PC機(jī)數(shù)據(jù)
[2024-01-15] zoya
*/
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define GPIO_LED P1
void UsartInit()
{
SCON=0x50; // 串口工作方式1,接收數(shù)據(jù)
TMOD=0x20; // 定時(shí)器T1工作方式2
TH1=TL1=0xFD; // 波特率9600bps,不倍增
PCON=0x00;
TR1=1; // 啟動(dòng)計(jì)數(shù)
}
void main()
{
u8 tmp;
UsartInit();
while(1)
{
while(!RI); // 等待接收數(shù)據(jù)結(jié)束
RI=0;
tmp=SBUF;
GPIO_LED=tmp;
}
}
仿真結(jié)果:
四、PC機(jī)與單片機(jī)或與多個(gè)單片機(jī)的串行通信
一臺(tái)PC機(jī)與若干臺(tái)單片機(jī)可構(gòu)成小型分布式測(cè)控系統(tǒng),如下圖所示,該系統(tǒng)在許多實(shí)時(shí)的工業(yè)控制和數(shù)據(jù)采集系統(tǒng)中,可以充分發(fā)揮單片機(jī)功能強(qiáng)、抗干擾性好、面向控制等優(yōu)點(diǎn),同時(shí)又可利用PC機(jī)彌補(bǔ)單片機(jī)在數(shù)據(jù)處理和人機(jī)對(duì)話等方面的不足。
在應(yīng)用系統(tǒng)中,一般是以PC機(jī)作為主機(jī),定時(shí)掃描以AT89S52單片機(jī)為核心的前沿單片機(jī),以便采集數(shù)據(jù)或發(fā)送控制信息。
在這樣的系統(tǒng)中,以AT89S52單片機(jī)為核心的智能式測(cè)量和控制儀表(從機(jī))既能獨(dú)立地完成數(shù)據(jù)處理和控制任務(wù),又可將數(shù)據(jù)傳送給PC機(jī)(主機(jī))。PC機(jī)將這些數(shù)據(jù)進(jìn)行處理,或顯示,或打印,同時(shí)將各種控制命令傳送給各從機(jī),以實(shí)現(xiàn)集中管理和最優(yōu)控制。
要組成上圖的分布式測(cè)控系統(tǒng),首先要解決的是PC機(jī)與單片機(jī)之間的串行通信接口問(wèn)題。
下面以采用RS-485接口的串行多機(jī)通信為例,說(shuō)明PC機(jī)與數(shù)臺(tái)AT89S52單片機(jī)進(jìn)行多機(jī)通信的接口電路設(shè)計(jì)方案。PC機(jī)配有RS-232串行標(biāo)準(zhǔn)接口,可通過(guò)電路板卡轉(zhuǎn)換成RS-485串行接口,AT89S52單片機(jī)本身具有全雙工的串行口,該串行口加上驅(qū)動(dòng)電路后就可以實(shí)現(xiàn)RS-485接口的串行通信。
PC機(jī)與數(shù)臺(tái)AT89S52單片機(jī)進(jìn)行多機(jī)通信的RS-485串行通信接口電路如下所示:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-796636.html
上圖中,AT89S52單片機(jī)的串行口通過(guò)75176芯片驅(qū)動(dòng)后就可以轉(zhuǎn)換成RS-485標(biāo)準(zhǔn)接口,根據(jù)RS-485標(biāo)準(zhǔn)接口的電器特性,從機(jī)數(shù)量不多于32個(gè)。PC機(jī)與AT89S52單片機(jī)之間的串行通信采用主從方式,PC機(jī)為主機(jī),各AT89S52為從機(jī),由PC機(jī)來(lái)確定與哪個(gè)單片機(jī)進(jìn)行通信。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-796636.html
到了這里,關(guān)于【51單片機(jī)系列】單片機(jī)與PC進(jìn)行串行通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!