单片机串口通信方式总结_单片机串口通信的感悟

2020-02-28 其他工作总结 下载本文

单片机串口通信方式总结由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“单片机串口通信的感悟”。

IIC总线通信协议————数据传输高位在前p233 1,起始和停止条件

开始信号:SCL为高电平,SDA由高电平向低电平跳变,开始传送数据。void start()// 开始位 { SDA = 1;

//SDA初始化为高电平“1”

SCL = 1;

//开始数据传送时,要求SCL为高电平“1”

_nop_();

//等待一个机器周期

_nop_();

//等待一个机器周期

SDA = 0;

//SDA的下降沿被认为是开始信号

_nop_();

//等待一个机器周期

_nop_();

//等待一个机器周期

_nop_();

//等待一个机器周期

_nop_();

//等待一个机器周期

SCL = 0;

//SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)} 结束信号:SCL为高电平,SDA由低电平向高电平跳变,结束传送数据。void stop()// 停止位 { SDA = 0;

//SDA初始化为低电平“0”

_nop_();

//等待一个机器周期

_nop_();

//等待一个机器周期

SCL = 1;

//结束数据传送时,要求SCL为高电平“1”

_nop_();

//等待一个机器周期

_nop_();

//等待一个机器周期

_nop_();

//等待一个机器周期

_nop_();

//等待一个机器周期

SDA = 1;

//SDA的上升沿被认为是结束信号 }

2,数据格式(数据输入)

在IIC总线开始信号后,送出的第一个字节数据是用来选择器件地址和数据方向的,其格式为

从器件收到地址型号后与自己的地址比较,一致则此器件就是主器件要找的器件,并返回ACK(不管是写数据还是地址都会返回)。IIC传送数据时SCL为低电平时SDA可改变高低电平,SCL转跳为高时数据输入(此时SDA不能跳变),发送数据:bit WriteCurrent(unsigned char y){ unsigned char i;bit ack_bit;

//储存应答位

for(i = 0;i

{

SDA =(bit)(y&0x80);

//通过按位“与”运算将最高位数据送到S

//因为传送时高位在前,低位在后

_nop_();

//等待一个机器周期

SCL = 1;

//在SCL的上升沿将数据写入AT24Cxx

_nop_();

//等待一个机器周期

_nop_();

//等待一个机器周期

SCL = 0;

//将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲

y

//将y中的各二进位向左移一位

} SDA = 1;

// 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,//以让SDA线转由接收设备(AT24Cxx)控制

_nop_();

//等待一个机器周期

_nop_();

//等待一个机器周期

SCL = 1;

//根据上述规定,SCL应为高电平

_nop_();

//等待一个机器周期

_nop_();

//等待一个机器周期

_nop_();

//等待一个机器周期

_nop_();

//等待一个机器周期

ack_bit = SDA;//接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节

//若送高电平,表示没有接收到,传送异常

SCL = 0;

//SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)

return ack_bit;

// 返回AT24Cxx应答位 } 读数据:unsigned char ReadData()// 从AT24Cxx移入数据到MCU { unsigned char i;unsigned char x;

//储存从AT24Cxx中读出的数据

for(i = 0;i

SCL = 1;

//SCL置为高电平

x

//将x中的各二进位向左移一位

x|=(unsigned char)SDA;//将SDA上的数据通过按位“或“运算存入x中

SCL = 0;

//在SCL的下降沿读出数据

} return(x);

//将读取的数据返回 } 发送数据步骤:

oid WriteSet(unsigned char add, unsigned char dat)// 在指定地址addr处写入数据WriteCurrent { start();

//开始数据传递

WriteCurrent(OP_WRITE);//选择要操作的AT24Cxx芯片,并告知要对其写入数据

WriteCurrent(add);

//写入指定地址

WriteCurrent(dat);

//向当前地址(上面指定的地址)写入数据

stop();

//停止数据传递

delaynms(4);

//1个字节的写入周期为1ms, 最好延时1ms以上 } 读数据步骤:

/*************************************************** 函数功能:从AT24Cxx中的当前地址读取数据 出口参数:x(储存读出的数据)

***************************************************/ unsigned char ReadCurrent(){ unsigned char x;start();

//开始数据传递

WriteCurrent(OP_READ);

//选择要操作的AT24Cxx芯片,并告知要读其数据

x=ReadData();

//将读取的数据存入x stop();

//停止数据传递

return x;

//返回读取的数据 } /*************************************************** 函数功能:从AT24Cxx中的指定地址读取数据 入口参数:set_add 出口参数:x

***************************************************/ unsigned char ReadSet(unsigned char set_add)// 在指定地址读取 { start();

//开始数据传递

WriteCurrent(OP_WRITE);

//选择要操作的AT24Cxx芯片,并告知要对其写入数据

WriteCurrent(set_add);

//写入指定地址

return(ReadCurrent());

//从指定地址读出数据并返回 }

单总线协议————数据传输低位在前——p237 1,初始化单总线器件

初始化时序程序:

函数功能:将DS18B20传感器初始化,读取应答信号 出口参数:flag

***************************************************/ bit Init_DS18B20(void){ bit flag;

//储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在DQ = 1;

//先将数据线拉高

for(time=0;time

;DQ = 0;

//再将数据线从高拉低,要求保持480~960us for(time=0;time

;

//以向DS18B20发出一持续480~960us的低电平复位脉冲

DQ = 1;

//释放数据线(将数据线拉高)

for(time=0;time

;//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)

flag=DQ;

//让单片机检测是否输出了存在脉冲(DQ=0表示存在)

for(time=0;time

;return(flag);

//返回检测成功标志 }

单总线通信协议中存在两种写时隙:写0写1。主机采用写1时隙向从机写入1,而写0时隙向从机写入0。所有写时隙至少要60us,且在两次独立的写时隙之间至少要1us的恢复时间。两种写时隙均起始于主机拉低数据总线。产生1时隙的方式:主机拉低总线后,接着必须在15us之内释放总线,由上拉电阻将总线拉至高电平;产生写0时隙的方式为在主机拉低后,只需要在整个时隙间保持低电平即可(至少60us)。在写时隙开始后15~60us期间,单总线器件采样总电平状态。如果在此期间采样值为高电平,则逻辑1被写入器件;如果为0,写入逻辑0。

下图为写时隙(包括1和0)时序

上图中黑色实线代表系统主机拉低总线,黑色虚线代表上拉电阻将总线拉高。下面是代码:

WriteOneChar(unsigned char dat){ unsigned char i=0;for(i=0;i

{

DQ =1;

// 先将数据线拉高

_nop_();

//等待一个机器周期

DQ=0;

//将数据线从高拉低时即启动写时序

DQ=dat&0x01;

//利用与运算取出要写的某位二进制数据,//并将其送到数据线上等待DS18B20采样

for(time=0;time

;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样

DQ=1;

//释放数据线

for(time=0;time

;//延时3us,两个写时序间至少需要1us的恢复期

dat>>=1;

//将dat中的各二进制位数据右移1位

}

for(time=0;time

;//稍作延时,给硬件一点反应时间 }

对于读时隙,单总线器件仅在主机发出读时隙时,才向主机传输数据。所有主机发出读数据命令后,必须马上产生读时隙,以便从机能够传输数据。所有读时隙至少需要60us,且在两次独立的读时隙之间至少需要1us恢复时间。每个读时隙都由主机发起,至少拉低总线1us。在主机发出读时隙后,单总线器件才开始在总线上发送1或0。若从机发送1,则保持总线为高电平;若发出0,则拉低总线。

当发送0时,从机在读时隙结束后释放总线,由上拉电阻将总线拉回至空闲高电平状态。从机发出的数据在起始时隙之后,保持有效时间15us,因此主机在读时隙期间必须释放总线,并且在时隙起始后的15us之内采样总线状态。

下图给出读时隙(包括0或1)时序

图中黑色实线代表系统主机拉低总线,灰色实线代表总局拉低总线,而黑色的虚线则代表上拉电阻总线拉高。代码为:

unsigned char ReadOneChar(void){

unsigned char i=0;

unsigned char dat;//储存读出的一个字节数据

for(i=0;i

{

DQ =1;

// 先将数据线拉高

_nop_();

//等待一个机器周期

DQ = 0;

//单片机从DS18B20读书据时,将数据线从高拉低即启动读时序

dat>>=1;

_nop_();

//等待一个机器周期

DQ = 1;

//将数据线“人为”拉高,为单片机检测DS18B20的输出电平作准备

for(time=0;time

;

//延时约6us,使主机在15us内采样

if(DQ==1)

dat|=0x80;//如果读到的数据是1,则将1存入dat

else

dat|=0x00;//如果读到的数据是0,则将0存入dat

//将单片机检测到的电平信号DQ存入r[i]

for(time=0;time

;

//延时3us,两个读时序之间必须有大于1us的恢复期

}

return(dat);

//返回读出的十进制数据 }

每个单总线器件内部都光刻了一个全球唯一的64位二进制序列码,用于该单总线器件的识别

SPI总线协议

SPI总线有四种工作方式(SP0, SP1, SP2, SP3),其中使用的最为广泛的是SPI0和SPI3方式。

SPI是一个环形总线结构,由(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。

上升沿发送、下降沿接收、高位先发送。

上升沿到来的时候,sdo上的电平将被发送到从设备的寄存器中。

下降沿到来的时候,sdi上的电平将被接收到主设备的寄存器中。读代码:

unsigned char ReadCurrent(void){

unsigned char i;unsigned char x=0x00;

//储存从X5045中读出的数据

SCK=1;

//将SCK置于已知的高电平状态

for(i = 0;i

SCK=1;

//拉高SCK

SCK=0;

//在SCK的下降沿输出数据

x

x|=(unsigned char)SO;//将SO上的数据通过按位“或“运算存入 x

} return(x);

//将读取的数据返回

} 写代码:

void WriteCurrent(unsigned char dat){

unsigned char i;SCK=0;

//将SCK置于已知的低电平状态

for(i = 0;i

{

SI=(bit)(dat&0x80);

//通过按位“与”运算将最高位数据送到S

//因为传送时高位在前,低位在后

SCK=0;

SCK=1;

//在SCK上升沿写入数据

dat

//将y中的各二进位向左移一位,因为首先写入的是字节的最高位

} } RS232通讯协议 串行通讯方式3 RS485通讯协议 串行通讯方式1

《单片机串口通信方式总结.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
单片机串口通信方式总结
点击下载文档
相关专题 单片机串口通信的感悟 通信 串口 单片机 单片机串口通信的感悟 通信 串口 单片机
[其他工作总结]相关推荐
    [其他工作总结]热门文章
      下载全文