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

其中各位的意義如下:
起始位:先發出一個邏輯”0”信號,表示傳輸字符的開始。
數據位:可以是5~8位邏輯”0”或”1”。如ASCII碼(7位),擴展BCD碼(8位)。小端傳輸
校驗位:數據位加上這一位后,使得“1”的位數應為偶數(偶校驗)或奇數(奇校驗)
停止位:它是一個字符數據的結束標志。可以是1位、1.5位、2位的高電平。
空閑位:處于邏輯“1”狀態,表示當前線路上沒有資料傳送。
注:異步通信是按字符傳輸的,接收設備在收到起始信號之后只要在一個字符的傳輸時間內能和發送設備保持同步就能正確接收。下一個字符起始位的到來又使同步重新校準(依靠檢測起始位來實現發送與接收方的時鐘自同步的)

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));
- }
- }
復制代碼
|
|