⑴ 單片機與單片機之間如何進行串列通信
找個單片機教程上面都有 兩機RXD TXD 對連,然後編寫各個的通訊程序!也有的單片機是帶CAN 的 那就按照說明連 ,編寫對應的通訊程序!
⑵ 使用8051單片機的串列通信方式1,要求波特率9600bps,請編寫初始化程序。
初始化程序:
SCON = 0x50 ; //方式1,允許接受
TMOD = 0x20 ; //設置time1,方式2
TH1 = 0xfd; //波特率9600b/s 晶振12MHz
TL1 = 0xfd;
ES = 1 ; //允許串口中斷
EA = 1; //中斷總開啟
TR1 = 1 ; //T1開啟
⑶ STM32F103單片機的串列口通信電路和GPRS通信電路怎麼實現
實現單片機模塊與設備模塊之間的串口通訊,首先需要將雙方正確地連接起來。非同步串列通訊是很常用的一種模塊間互連方式,一般會使同三條連接線,分別標記為Tx(或TxD)、Rx(或RxD),以及GND。其中Tx用於數據發送,是輸出信號; Rx用於數據接收,是輸入信亐,GND為公共地線。
題目圖1中的USART1_Rx表示單片機的數據接收端,應該與圖2中的GSM_TxD相連接,而圖1中的∪SART1_Tx表示單片機的數據犮送端,應與圖2中的GSM_RxD相連,單片機的GND與GSM模塊的GND共在一起。然後就是軟體工作,雙方要約定一致的通訊參數(如波特率,數據位,校驗位,停止位等),在單片機一端編寫串口設置程序,並根據GSM模塊的命令集和命令格式編寫控製程序。
需要注意一點,常用的非同步串列通訊介面的電平標准有RS232和TTL,RS232用於遠距離長線連接,而TTL用於短距離連接。這兩者是不可以直接互聯的。如果需要連接,必須先轉換成相同的電平標准。單片機引腳:信號是TTL標準的,而外購模塊串口電平與模塊製造廠家,模塊型號等有關,需要查看模塊的技術說明文件。
⑷ 請大神幫忙編寫一個單片機C語言程序,串列通信的。
這是基於STC12C5A60S2 單片機編寫的程序,應該也兼容51單片機。這里只是串口的收發,和數碼管顯示,由於我的數碼可能和你的不一樣所以需要更改。
#include<stc.h>
#define uchar unsigned char
#define uint unsigned int
//unsigned char code dofly[16]={0,0x3f,0x79,0x5e,0x07,0x7f,0x6f,0x39,0x66,0x6d,0x7d,0x7c,0x06,0x5b,0x4f,0x77};
unsigned char code dofly[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit LED=P1^2;
sbit an=P1^0; //數碼管端碼使能端
sbit wei=P1^1;//數碼管位碼使能端
uchar flag,a;
void init();
void main()
{
an=0;
P0=0x55;
an=1;
wei=0;
init();
while(1)
{
if(flag==1)
{
ES=0; //當進入中斷後,把中斷關閉
flag=0; //把標記位清零
SBUF=a; //把A的值發送出去
while(!TI); //等待數據發送完,如果沒有發送完會一直等待。當收到或發送數據TI會由硬體自動置1。
TI=0; //把TI清零
ES=1; //打開串口
}
}
}
void init() //串口寄存器的設置
{
TMOD=0x20; //設置定時器1的工作模式2
TH1=0xfd; //波特率初值
TL1=0xfd; //波特率初值
TR1=1; //打開定時器
REN=1; //串口允許位
SM0=0; //通過設置SM0和SM1定義串口工作方式1
SM1=1; //通過設置SM0和SM1定義串口工作方式1
EA=1; //打開總定時器
ES=1; //打開串口中斷
ET1=0;
}
void ser() interrupt 4 //串口中斷
{
RI=0; //關閉中斷請求,軟體把中斷請求清零
a=SBUF; //A接收數據
P0=a; //讓數碼管顯示收到的數據
flag=1; //標記位
}
首先你想法是不正確的,AD的值不能直接給數組(uchar a[8])應該先賦給一個變數AD_ DATA
發送應該是SBUF=AD_DATA ,這條語句是把AD變數的值賦給SBUF串口寄存器。
建議你先把串口調試出來在作其他的。
⑸ 怎麼設計一個多機通信系統(單片機)
簡單說明用一個主機串口實現上述要求的思路:
從機地址分別為01和02
從機的串口相同引腳相互並聯作為一個串口連接於主機串口,注意接線正確。
主機命令:地址號 + 命令字元串
從機命令:地址號 + 命令字元串
然後在各自收發代碼中利用地址號來區別命令執行
其它請參閱如下網址本人的答復:
http://..com/question/12535506.html
http://..com/question/12522809.html
http://..com/question/11725744.html
http://..com/question/11040704.html
http://..com/question/10941227.html
補充:
串列通訊的基本知識
每台計算機都提供了一個或多個串列埠。它們被依次命名為:COM1、COM2 等等。在標準的 PC 中,滑鼠通常被連接到 COM1 埠。數據機可能連接到 COM2,掃描儀被連接到 COM3,等等。串列埠提供了計算機與這些外部串列設備之間的數據傳輸通道。
串列埠的本質功能是作為 CPU 和串列設備間的編碼轉換器。當數據從 CPU 經過串列埠發送出去時,位元組數據被轉換為串列的位。在接收數據時,串列的位將被轉換為位元組數據。
我的理解:串列口數據通信的實質是ASCII(美國標准信息交換碼)的傳輸。你可理解是傳輸ASCII碼,而實際傳輸的是ASCII碼(其二進制形式,8位組成一位元組)。它又可看成是8位二進制數,例字元A 其二進製表示為 01000001,MSCOMM發送時完全按照此二進制信號發送,由低位至高位傳輸。又能理解為10進制的64。在計算機內通常以16進製表示為41。由2個8位二進制數據組成16位二進制數,通常用於數據的二進制通信。你的程序代碼採用以文本方式取回數據,這是在MSCOMM控制項內部進行解決,而無須VB編程員來處理。
見MSCOMM控制項的:
InputMode 常數
常數 值 描述
comInputModeText 0 (預設)通過 Input 屬性以文本方式取回數據。
comInputModeBinary 1 通過 Input 屬性以二進制方式檢取回數據。
以下是由MICROSOFT提供的關於串列通訊和MSCOMM控制項的一些說明,可能對你答辯有用,供參考。
串列通訊的基本知識
每台計算機都提供了一個或多個串列埠。它們被依次命名為:COM1、COM2 等等。在標準的 PC 中,滑鼠通常被連接到 COM1 埠。數據機可能連接到 COM2,掃描儀被連接到 COM3,等等。串列埠提供了計算機與這些外部串列設備之間的數據傳輸通道。
串列埠的本質功能是作為 CPU 和串列設備間的編碼轉換器。當數據從 CPU 經過串列埠發送出去時,位元組數據被轉換為串列的位。在接收數據時,串列的位將被轉換為位元組數據。
要完成數據的傳輸,還需要進一步一個解釋層。在操作系統一邊,Windows 使用了通訊驅動程序 Comm.drv,以便使用標準的 Windows API 函數發送和接收數據。驅動程序通常由串列設備製造商提供,以便將其硬體與 Windows 連接。在使用 Communications 控制項時,實際上使用了 API 函數,API 函數將被 Comm.drv 解釋並傳輸給設備驅動程序。
作為程序員,只需關心如何與 Windows 打交道。作為 Visual Basic 程序員,只需要關心 Communications 控制項提供的對 Windows 通訊驅動程序的 API 函數的介面。換句話說,只需要設置和監視 Communications 控制項的屬性和事件。
建立串列埠連接
使用 Communications 控制項的第一步是建立與串列埠的連接。下表列出了用於建立串列埠連接的屬性:
屬性 描述
CommPort 設置或返回通訊埠號。
Settings 以字元串形式設置或返回波特率、奇偶校驗、數據位和停止位。
PortOpen 設置或返回通訊埠的狀態。以及打開和關閉埠。
打開串列埠
要打開串列埠,可以使用 CommPort、PortOpen 和 Settings 屬性。例如:
'打開串列埠
MSComm1.CommPort = 2
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
CommPort 屬性確定打開哪個串列埠。假如 COM2 上連接有一個數據機,則在上面的例子中需要將值設置為 2 (COM2) 才能連接到該數據機。CommPort 屬性值可以設置為 1 到 16 之間的任何值(預設值為 1),然而,如果將該值設置為系統中並不存在的 COM 埠,將會產生錯誤。
Settings 屬性可以用來指定波特率、奇偶校驗、數據位數和停止位數。按照預設規定,波特率被設置為 9600。奇偶校驗設置為了進行數據校驗。這通常是不用的,並設置為"N"。數據位數指定了代表一個數據塊的比特數。停止位指出了何時接收到一個完整數據塊。
在指定了要打開的埠,以及如何進行數據通訊之後,就可以使用 PortOpen 屬性建立連接了。它是一個布爾值,即取值范圍為 True 或 False。然而,如果埠無效,或者 CommPort 屬性設置有誤,或者該設備不支持指定的設置,就會產生錯誤;即使沒有產生錯誤,外部設備也不能正常工作。將 PortOpen 屬性設置為 False 即可關閉該埠。
緩沖區內存分配
InBufferSize 和 OutBufferSize 屬性指定了為接收和發送緩沖區分配的內存數量。按照預設規定,它們被分別設置為上圖所示的值。這兩個值設置得越大,應用程序中可用的內存就越少。然而,如果緩沖區太小,就要冒緩沖區溢出的風險,除非採用握手信號。
注意 鑒於現在大多數微機可用的內存量,由於有更多的可用資源,緩沖區內存分配已不那麼至關緊要了。換言之,可以把緩沖區的值設得高一些而不影響應用程序的性能。
RThreshold 和 SThreshold 屬性
RThreshold 和 SThreshold 屬性,表示在 OnComm 事件發生之前,接收緩沖區或發送緩沖區中可以接收的字元數。OnComm 事件被用來監視和響應通訊狀態的變化。如果將每個屬性的值都設置為零 (0),就可以避免發生 OnComm 事件。如果將該值設置為非零的值(比如 1),那麼每當緩沖區中接收到一個字元時,就會產生 OnComm 事件。
Output 屬性被用來向發送緩沖區發出命令和數據。
與 Input 屬性類似,數據可以以文本或二進制格式發送。Output 屬性必須用字元串變體型發送文本,用 Byte 數組變體型發送二進制數據。
可用 Output 屬性發送命令、文字字元串或 Byte 數組數據。
MSComm 控制項
MSComm 控制項通過串列埠傳輸和接收數據,為應用程序提供串列通訊功能。
語法
MSComm
說明
MSComm 控制項提供下列兩種處理通訊的方式:
事件驅動通訊是處理串列埠交互作用的一種非常有效的方法。在許多情況下,在事件發生時需要得到通知,例如,在 Carrier Detect (CD) 或 Request To Send (RTS) 線上一個字元到達或一個變化發生時。在這些情況下,可以利用 MSComm 控制項的 OnComm 事件捕獲並處理這些通訊事件。OnComm 事件還可以檢查和處理通訊錯誤。所有通訊事件和通訊錯誤的列表,參閱 CommEvent 屬性。
在程序的每個關鍵功能之後,可以通過檢查 CommEvent 屬性的值來查詢事件和錯誤。如果應用程序較小,並且是自保持的,這種方法可能是更可取的。例如,如果寫一個簡單的電話撥號程序,則沒有必要對每接收一個字元都產生事件,因為唯一等待接收的字元是數據機的"確定"響應。
每個使用的 MSComm 控制項對應著一個串列埠。如果應用程序需要訪問多個串列埠,必須使用多個 MSComm 控制項。可以在 Windows"控制面板"中改變埠地址和中斷地址。
盡管 MSComm 控制項有很多重要的屬性,但首先必須熟悉幾個屬性。
屬性 描述
CommPort 設置並返回通訊埠號。
Settings 以字元串的形式設置並返回波特率、奇偶校驗、數據位、停止位。
PortOpen 設置並返回通訊埠的狀態。也可以打開和關閉埠。
Input 從接收緩沖區返回和刪除字元。
Output 向傳輸緩沖區寫一個字元串。
OnComm 事件
無論何時當 CommEvent 屬性的值變化時,就產生 OnComm 事件,標志發生了一個通訊事件或一個錯誤。
語法
Private Sub object_OnComm ()
OnComm 事件語法包括下列部分:
部分 描述
object 對象表達式,其值是"應用於"列表中的對象。
說明
CommEvent 屬性包含實際錯誤或產生 OnComm 事件的數碼。注意,設置 Rthreshold 或 Sthreshold 屬性為 0,分別使捕獲 comEvReceive 和 comEvSend 事件無效。
MSComm 控制項常數
Handshake 常數
常數 值 描述
comNone 0 無握手。
comXonXoff 1 XOn/Xoff 握手。
comRTS 2 Request-to-send/clear-to-send 握手。
comRTSXOnXOff 3 Request-to-send 和 clear-to-send 握手皆可。
OnComm 常數
常數 值 描述
comEvSend 1 發送事件。
comEvReceive 2 接收事件。
comEvCTS 3 clear-to-send 線變化。
comEvDSR 4 data-set ready 線變化。
comEvCD 5 carrier detect 線變化。
comEvRing 6 振鈴檢測。
comEvEOF 7 文件結束。
Error 常數
常數 值 描述
comEventBreak 1001 接收到中斷信號
comEventCTSTO 1002 Clear-to-send 超時
comEventDSRTO 1003 Data-set ready 超時
comEventFrame 1004 幀錯誤
comEventOverrun 1006 埠超速
comEventCDTO 1007 Carrier detect 超時
comEventRxOver 1008 接收緩沖區溢出
comEventRxParity 1009 Parity 錯誤
comEventTxFull 1010 傳輸緩沖區滿
comEventDCB 1011 檢索埠 設備控制塊 (DCB) 時的意外錯誤
InputMode 常數
常數 值 描述
comInputModeText 0 (預設)通過 Input 屬性以文本方式取回數據。
comInputModeBinary 1 通過 Input 屬性以二進制方式檢取回數據。
Output 屬性
往傳輸緩沖區寫數據流。該屬性在設計時無效,在運行時為只讀。
語法
object.Output [ = value ]
Output 屬性語法包括下列部分:
部分 描述
object 對象表達式,其值是"應用於"列表中的對象。
value 要寫到傳輸緩沖區中的一個字元串。
說明
Output 屬性可以傳輸文本數據或二進制數據。用 Output 屬性傳輸文本數據,必須定義一個包含一個字元串的 Variant。發送二進制數據,必須傳遞一個包含位元組數組的 Variant 到 Output 屬性。
正常情況下,如果發送一個 ANSI 字元串到應用程序,可以以文本數據的形式發送。如果發送包含嵌入控制字元、Null 字元等等的數據,要以二進制形式發送。
數據類型
Variant