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),在这段时间内需要外部持续提供一定频率的时钟信号。 说到这里你应该就能读懂整个程序了。 因篇幅问题不能全部显示,请点此查看更多更全内容