① 單片機與pc機之間進行通信用同步方式和用非同步方式有什麼區別
非同步通信(UART)指兩個互不同步的設備通過計時機制或其他技術進行數據傳輸。非同步通信中兩個字元之間的時間間隔是不固定的,而在一個字元內各位的時間間隔是固定的。基本上,發送方可以隨時傳輸數據,而接收方必須在信息到達時准備好接收。相反,同步傳輸是一個精確同步的位流,其中字元的起始是由計時機制來定位的。
非同步通信中,數據通常以字元或者位元組為單位組成字元幀傳送。字元幀由發送端逐幀發送,通過傳輸線被接收設備逐幀接收。發送端和接收端可以由各自的時鍾來控制數據的發送和接收,這兩個時鍾源彼此獨立,互不同步。
通信協議(通信規程):使用非同步串口傳送一個字元的信息時,對資料格式有如下約定:規定有空閑位、起始位、資料位、奇偶校驗位、停止位。
同步通信(SPI)是一種比特同步通信技術,要求發收雙方具有同頻同相的同步時鍾信號,只需在傳送報文的最前面附加特定的同步字元,使發收雙方建立同步,此後便在同步時鍾的控制下逐位發送/接收。
沒有數據發送時,傳輸線處於MARK狀態。為了表示數據傳輸的開始,發送方先發送一個或兩個特殊字元,該字元稱為同步字元。當發送方和接收方達到同步後,就可以一個字元接一個字元地發送一大塊數據,而不再需要用起始位和停止位了,這樣可以明顯地提高數據的傳輸速率。
採用同步方式傳送數據時,在發送過程中,收發雙方還必須用一個時鍾進行協調,用於確定串列傳輸中每一位的位置。接收數據時,接收方可利用同步字元使內部時鍾與發送方保持同步,然後將同步字元後面的數據逐位移入,並轉換成並行格式,供CPU讀取,直至收到結束符為止。
採用同步通信時,將許多字元組成一個信息組,每組信息(通常稱為幀)的開始要加上同步字元,在沒有信息要傳輸時,要填上空字元,因為同步傳輸不允許有間隙。收發雙方不停地發送和接收連續的同步比特流。
不知道你理解了沒有,歡迎追問~
同步通信是把所傳送的數據以多個位元組(100位元組以上)為單位,在其前後添加標志。|同步字元|信息組|錯誤校驗| 同步字元一般為1~2個,錯誤校驗一般為CRC冗餘校驗。
② 關於51單片機串口非同步通信的問題
發送時是自己主動的,當然可以不用中斷方式,使用查詢法。
接收時自己是被動的,你不知道什麼時候會發來數據,所以採用中斷方式,沒有中斷的時候運行其他的程序段。
查詢法是不斷地查詢是否有數據接受到或數據是否發送完成。
中斷法是指當接收到數據或發送數據後進入中斷子程序,子程序完成後再返回執行原來被中斷的程序。
③ 兩個單片機之間的簡單非同步串列通信
因為你是用查詢方式進行通信的,而程序沒有中沒有設置兩機通信的聯絡信號,即接受機接收到的第一位數據不一定是發送機發送的第一位數據,而有可能是第二、第三位數據,這樣接受到的八位數據就可能是發送機發送多次數據中截取的八位數據,又因兩機延時時間不同,因此接受到的第一位數據不可能固定不變的。
所以就會出現你說的現象。如果採用的是查詢方式進行串列通信,兩機之間需要建立握手信號,告知接受機發送機開始發送地位數據,接受機才開始接受數據。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
void uart_init()
{
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
PCON=0x00;
TR1=1;
SCON=0x50;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
void main()
{
uart_init();
do
{
SBUF=0x01;
while(TI==0);
TI=0;
while(RI==0);
REN=0;
}
while(SBUF!=0x02) ;
while(1)
{
SBUF=0x07;
while(TI==0);
TI=0;
delay(500) ;
SBUF=0x00;
while(TI==0);
TI=0;
delay(500) ;
}
}
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
void uart_init()
{
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
PCON=0x00;
TR1=1;
SM0=0; //串口方式1
SM1=1;
REN=1;
}
void main()
{
uart_init();
do
{
SBUF=0x02;
while(TI==0);
TI=0;
while(RI==0);
RI=0;
P2=SBUF;
}
while(P2!=0x01);
while(1)
{
while(RI==0);
P1=SBUF;
RI=0;
}
}
④ mcs-51單片機的串列通信中非同步通訊方式和同步通訊方式的非同步和同步怎樣理解
同步串列通信進行數據傳輸時,發送和接收雙方要保持完全的同步,也就是雙方的速率要相等,因此要使用同一時鍾
非同步通信中,在每一幀的數據前後放上了控制字元,雙方的時鍾可以彼此獨立
⑤ 怎麼用單片機操作三相非同步電動機
1.知道怎麼改變單片機輸出引腳的高低電平嗎?
2.知道怎麼控制三相非同步電動機嗎?
3.單片機是+5V(或更低)輸出電平,電動機是220AC電壓,不能直接控制,需要加中間繼電器做電平轉換。
4.控制電動機有幾個接觸器,就需要有多少個單片機輸出IO口。
5.每一路都需要加中間繼電器。
挺簡單的嘛。
⑥ 單片機同步串列數據與非同步串列數據的區別
一般來說非同步串列每個信息單元之間有控制信號,發送和接收端分別用近似的時鍾工作,標准設備就是串口。同步串列一般會有一個時鍾信號,收發端均以該時鍾信號為收發時鍾,該信號一般由發送端產生,每個信息單元之間不再有起始,終於控制。
iic也算是同步串列設備。
⑦ 單片機非同步通訊怎樣實現啊1+8+1+1開始位加數據位加驗證加結束!1代表的是8位還是1位啊
非同步通信就是USART通訊,用串口實現;
1+8+1+1的意思是1位開始位,8位數據位,1位校驗位,1位停止位;
1代表的1位;
標準的非同步串口通訊會自己判斷,一邊低電平為開始位,高電平為結束位;
⑧ 什麼單片機非同步非歸零
所有任務可以分成兩種,一種是同步任務(synchronous),另一種是非同步任務(asynchronous)。
同步任務指的是,在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行後一個任務;
非同步任務指的是,不進入主線程、而進入"任務隊列"(task queue)的任務,只有等主線程任務執行完畢,"任務隊列"開始通知主線程,請求執行任務,該任務才會進入主線程執行。
具體來說,非同步運行機制如下:
(1)所有同步任務都在主線程上執行,形成一個執行棧(execution context stack)。
(2)主線程之外,還存在一個"任務隊列"(task queue)。只要非同步任務有了運行結果,就在"任務隊列"之中放置一個事件。
(3)一旦"執行棧"中的所有同步任務執行完畢,系統就會讀取"任務隊列",看看裡面有哪些事件。那些對應的非同步任務,於是結束等待狀態,進入執行棧,開始執行。
(4)主線程不斷重復上面的第三步。
⑨ 51單片機非同步串列通信的幀結構由哪些部分組成。
中央處理器、程序存儲器、數據存儲器。
51子系列單片機由CPU、數據存儲器RAM、程序存儲器ROM、特殊功能寄存器、4個I/O口、串列口、定時器/計數器、中斷系統等八個功能部件組成。
⑩ 單片機多機串列非同步通信
//===================================================================== // 多機通訊從機1程序 //cong1.c //writer:穀雨 2008年3月22日於EDA實驗室 //註: //===================================================================== #include<reg52.h> #define addr 0x31 //從機1地址 unsigned char receive; unsigned char xx[ ]={"1234567890"}; void Uart_Init(void) { TMOD = 0x20; //定時器T1使用工作方式2 TH1 = 0XF3; TL1 = 0XF3; PCON = 0x00; //SMOD=1; SCON = 0xf0; //工作方式3,9位數據位,波特率9600bit/s,允許接收 TR1 = 1; //開始計時 EA = 1; //中斷允許 ES = 1; //串列中斷允許 } void Serial_INT() interrupt 4 { if(!RI) return; RI=0; if(RB8==1) { if(SBUF==addr) SM2=0; else SM2=1; } if(RB8==0) receive=SBUF; } void SendOneByte(unsigned char c) { TB8=0; SBUF = c; while(!TI); TI = 0; } void SendListChar(unsigned char *DData,unsigned char Ef) { unsigned char L=0; if(Ef!=0) { for( ;L<Ef;L++) //顯示有效長度 SendOneByte(DData[L]); //發送單個字元 }else while (DData[L]!='\0') //發送至字串結束 { SendOneByte(DData[L]); //發送單個字元 L++; //下一個字元 } } void main() { Uart_Init(); while(1) { switch(receive) { case 0xff: break; case 0x01: //在此可以寫入要完成的動作,最多可完成256個動作 SendListChar(xx,0); break; case 0x02: break; case 0x33: P1=!P1; //為方便其間,賦值給P1口,測P1口電平來檢測該程序 break; default: break; } receive=0xff; } } //===================================================================== // 多機通訊主機程序 //zhuji.c //writer:穀雨 2008年3月22日於EDA實驗室 //註:主機先發送地址,接收到應答後,再發送數據 //===================================================================== #include<reg52.h> #define addr1 0x31 //從機1地址 #define addr2 0x32 //從機2地址 unsigned char xx[10]; unsigned char p = 0; void delay_1ms(unsigned int i) { unsigned char j; while ((i--)!=0) {for (j=0;j<125;j++);} } void Uart_Init(void) { TMOD = 0x20; //定時器T1使用工作方式2 TH1 = 0XF3; TL1 = 0XF3; PCON = 0x00; //SMOD=1; SCON = 0xf0; //工作方式3,9位數據位,波特率9600bit/s,允許接收 SM2 = 0; TR1 = 1; //開始計時 EA = 1; //中斷允許 ES = 1; //串列中斷允許 } void Serial_INT() interrupt 4 { if(!RI) return; ES = 0; RI = 0; xx[p] = SBUF; p++; ES = 1; } void send_addr(unsigned char addr) //發送地址 { p = 0; TB8 = 1; //發送地址幀 SBUF=addr; //發送地址 while(!TI); //等待發送完畢 TI=0; //軟體復位TI } void send_data(unsigned char ddata) //發送數據 { TB8=0; //發送數據幀 SBUF=ddata; //發送數據 while(!TI); TI=0; //軟體復位TI } void main() { Uart_Init(); delay_1ms(2000); while(1) { send_addr(addr1); //向從機1發地址 send_data(0x33); send_data(0x01); delay_1ms(500); if(xx[9]=='0') P1=0xaa; delay_1ms(500); send_addr(addr2); //向從機2發地址 send_data(0x33); send_data(0x01); delay_1ms(500); if(xx[9]=='9') P1=0x55; delay_1ms(500); } // while(1); }