单片机学习小组
直播中

何柳青

7年用户 205经验值
私信 关注

单片机SPI通信和UART通信原理详解

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:";
  • ***it rs=P2^0;
  • ***it e=P2^1;
  • ***it rst=P2^2;
  • ***it sclk=P2^3;
  • ***it dio=P2^4;
  • ***it A7=ACC^7;
  • ***it 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);
  •                 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);
  •                 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));
  •   }
  • }

更多回帖

发帖
×
20
完善资料,
赚取积分