您的当前位置:首页正文

tlc0831 的C程序理解

2021-12-30 来源:好走旅游网


tlc0831 的C程序理解

悬赏分:20 - 解决时间:2009-5-15 17:12

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit SCL2=P1^3; //SCL2定义为P1口的第3位脚,连接ADC0831SCL脚

sbit SDA2=P1^4; //SDA2定义为P1口的第4位脚,连接ADC0831SDA脚

sbit CS2=P1^6; //CS2定义为P1口的第4位脚,连接ADC0831CS脚

sbit RST = P1^5;

void delay(uchar z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

unsigned char ad0831read(void); //定义该函数为读取ADC0831的数据

void main(void) //入口函数

{

unsigned char tmp;

RST=0;

while(1)

{

tmp=ad0831read();

P2=tmp;

}

}

unsigned char ad0831read(void)

{ unsigned char i=0,tmp=0;

SDA2=1;

CS2=0;

delay(1);

SCL2=0;

delay(1);

SCL2=1;

delay(1);

SCL2=0;

delay(1);

SCL2=1;

delay(1);

SCL2=0;

delay(1);

for(i=0;i<8;i++)

{

tmp<<=1;

if(SDA2)

tmp++;

SCL2=1;

delay(1);

SCL2=0;

delay(1);

}

CS2=1;

return tmp;

}

其中unsigned char ad0831read(void)的程序中

for(i=0;i<8;i++){ tmp<<=1; if(SDA2) tmp++; ……}怎么理解?

一,tem这个数值是0,1,2,3……怎么可以左移

二,if(SDA2) 难道在数据传输使,SDA2(即图中的D0线)有变为0的情况吗?

谢谢您来解答!

提问者: 106011144 - 四级

最佳答案

一、tmp是无符号字符型变量,其实就是一个字节,可以表示0到255的数值,但在单片机C语言编程中比较灵活,你要对一个字符型变量赋值(比如令其为25),既可以用tmp=0x19,也可以直接用tmp=25,编译出来的结果是一样的。而作为一个字节自然是

可以进行移位操作的。

二、你可能还没有理解串行通信的含义,与并行通信不同,串行通信只用到两根或三根线,具体分为:

1.UART(异步)串口:三根线——TXD发射、RXD接收、GND地线

2.SPI(同步)串口:三根线——SDI数据入、SDO数据出、SCK时钟线

3.I2C:两根线——SDA数据出入、SCK时钟线

无论是哪种串行通信,数据都是通过一根线进行传递的,你可以想象一个8位的字节要通过串口传递,一定是根据某种协议(时钟),按照一定的顺序格式逐位进行的,而具体形式就是0或1,在这个tlc0831的读取程序中,是通过单片机的I/O口模拟SPI时序来进行数据读取的,按照SPI协议在每个时钟信号的下降沿,就有一个数据位传送过来。

而根据tlc0831的工作、读取时序要求(如图),在CS被置0(启动一次转换)之后,读取数据之前,需要有一段建立时间(settling time),在这段时间内需要外部持续提供一定频率的时钟信号。

说到这里你应该就能读懂整个程序了。

因篇幅问题不能全部显示,请点此查看更多更全内容