|
I2C為雙線串行通信,UART為單線串行通信如DS18B20,SPI為三線或四線通信,如DS1302。
UART通信,即通用異步收發(fā)傳輸(Universal Asynchronous Receiver/Transmitter)
UART使用的是異步,串行通信。
串行通信是指利用一條傳輸線將資料一位位地順序傳送。特點(diǎn)是通信線路簡(jiǎn)單,利用簡(jiǎn)單的線纜就可實(shí)現(xiàn)通信,降低成本,適用于遠(yuǎn)距離通信,但傳輸速度慢的應(yīng)用場(chǎng)合。
異步通信以一個(gè)字符為傳輸單位,通信中兩個(gè)字符間的時(shí)間間隔多少是不固定的,然而在同一個(gè)字符中的兩個(gè)相鄰位間的時(shí)間間隔是固定的。
數(shù)據(jù)傳送速率用波特率來(lái)表示,即每秒鐘傳送的二進(jìn)制位數(shù)。例如數(shù)據(jù)傳送速率為120字符/秒,而每一個(gè)字符為10位(1個(gè)起始位,7個(gè)數(shù)據(jù)位,1個(gè)校驗(yàn)位,1個(gè)結(jié)束位),則其傳送的波特率為10×120=1200字符/秒=1200波特。
數(shù)據(jù)通信格式如下圖:

其中各位的意義如下:
起始位:先發(fā)出一個(gè)邏輯”0”信號(hào),表示傳輸字符的開(kāi)始。
數(shù)據(jù)位:可以是5~8位邏輯”0”或”1”。如ASCII碼(7位),擴(kuò)展BCD碼(8位)。小端傳輸
校驗(yàn)位:數(shù)據(jù)位加上這一位后,使得“1”的位數(shù)應(yīng)為偶數(shù)(偶校驗(yàn))或奇數(shù)(奇校驗(yàn))
停止位:它是一個(gè)字符數(shù)據(jù)的結(jié)束標(biāo)志?梢允1位、1.5位、2位的高電平。
空閑位:處于邏輯“1”狀態(tài),表示當(dāng)前線路上沒(méi)有資料傳送。
注:異步通信是按字符傳輸?shù),接收設(shè)備在收到起始信號(hào)之后只要在一個(gè)字符的傳輸時(shí)間內(nèi)能和發(fā)送設(shè)備保持同步就能正確接收。下一個(gè)字符起始位的到來(lái)又使同步重新校準(zhǔn)(依靠檢測(cè)起始位來(lái)實(shí)現(xiàn)發(fā)送與接收方的時(shí)鐘自同步的)

SPI通訊的DS1302
- #include"reg52.h"
- #define uchar unsigned char
- uchar dd2[]="date:";
- uchar dd1[]="Time:";
- sbit rs=P2^0;
- sbit e=P2^1;
- sbit rst=P2^2;
- sbit sclk=P2^3;
- sbit dio=P2^4;
- sbit A7=ACC^7;
- sbit B0=B^0;
- void delay(uchar us)
- {
- while(us--);
- }
- void w1602(bit rw,uchar dat)
- {
- rs=rw;
- e=0;
- P3=dat;
- delay(3);
- e=1;
- delay(8);
- e=0;
- }
- void init1602()
- {
- w1602(0,0x38);
- w1602(0,0x06);
- w1602(0,0x0c);
- w1602(0,0x01);
- }
- uchar r1302(uchar addr)
- {
- uchar i;
- rst=0;
- sclk=0;
- rst=1;
- B=addr;
- for(i=0;i<8;i++)
- {
- sclk=0;
- dio=B0;
- sclk=1;
- B=B>>1;
- }
- for(i=0;i<8;i++)
- {
- A7=dio;
- sclk=1;
- ACC=ACC>>1;
- sclk=0;
- }
- rst=0;
- return(ACC);
- }
- void main()
- {
- uchar i;
- init1602();
- while(1)
- {
- w1602(0,0x80);
- for(i=0;i<5;i++)
- w1602(1,dd1[i]);
- w1602(1,0x30+((r1302(0x85)>>4)& 0x0f));
- w1602(1,0x30+(r1302(0x85)& 0x0f));
- w1602(1,0x2d);
- w1602(1,0x30+((r1302(0x83)>>4)& 0x0f));
- w1602(1,0x30+(r1302(0x83)& 0x0f));
- w1602(1,0x2d);
- w1602(1,0x30+((r1302(0x81)>>4)& 0x0f));
- w1602(1,0x30+(r1302(0x81)& 0x0f));
-
- w1602(0,0xc0);
- for(i=0;i<5;i++)
- w1602(1,dd2[i]);
- w1602(1,0x30+((r1302(0x87)>>4)& 0x0f));
- w1602(1,0x30+(r1302(0x87)& 0x0f));
- w1602(1,0x2d);
- w1602(1,0x30+((r1302(0x89)>>4)& 0x0f));
- w1602(1,0x30+(r1302(0x89)& 0x0f));
- w1602(1,0x2d);
- w1602(1,0x30+((r1302(0x8d)>>4)& 0x0f));
- w1602(1,0x30+(r1302(0x8d)& 0x0f));
- }
- }
復(fù)制代碼
|
|