资源简介
模拟iic读取TMP75
今天花了一上午,把那几天没有弄出来的TMP75,搞出来了……
其实我驱动程序都是写对了的,以前没有正确接收到温度的原因,在于C语言不扎实,想传个参数过去接收I2C的温度值 ,但是总会出错,接收到的数据总是0XFF,今天用了个最笨的方法,就是定义了两个全局温度变量来接收I2C的数据,结果一下子就不再是那个0XFF了,现在就把整个TMP75 驱动完成了 还有测试图片 精确率选的是12bits 0.625摄氏度,还是很准确de。
代码片段和文件信息
#include “i2c.h“
#if 1
//#define NOP() _nop_() /* 定义空指令 */
#define _Nop() _nop_() /*定义空指令*/
#define NOPS();{_nop_();_nop_();_nop_();_nop_();_nop_();}
sbit SCL=P0^1; //I2C 时钟
sbit SDA=P0^0; //I2C 数据 bit ack; /*应答标志位*/
UINT8 ack=0;
/*******************************************************************
起动总线函数
函数原型: void Start_I2c();
功能:启动I2C总线即发送I2C起始条件.
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号
********************************************************************/
void I2C_Start(void)
{
SDA=1; //发送起始条件的数据信号
SCL=1;
NOPS();
SDA=0;
NOPS();
SCL=0; //钳住I2C总线,准备发送或接收数据
}
/********************************************************
结束 i2c传输
SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号
********************************************************/
void I2C_Stop(void)
{
SCL=0;
SDA=0;
NOPS();
SCL=1;
NOPS();
SDA=1;
}
INT8 I2C_WaitAck(void)
{
UINT8 errtime=255;
SCL=0;
SDA=1;
NOPS();
SCL=1;
NOPS();
while(SDA)
{
errtime--;
if(errtime==0)
{
SCL=0;
return 1;
}
}
SCL=0;
return 0;
}
UINT8 I2C_SendByte(UINT8 sdata)
{
UINT8 ret;
UINT8 i;
for(i = 0;i<8;i++)
{
SCL=0;
if((sdata< SDA=1;
else
SDA=0;
NOPS();
SCL=1;
NOPS();
}
if(I2C_WaitAck()==0)
ret=0;
else
ret=1;
return ret;
}
UINT8 I2C_RcvByte(void)
{
UINT8 ret=0;
UINT8 i;
SDA=1;
for(i=0;i<8;i++)
{
SCL=0;
NOPS();
SCL=1;
NOPS();
ret=ret<<1;
if(SDA==1)
ret|=0x01;
}
SCL=0;
return ret;
}
void I2C_SendACk(void)
{
SDA=0;
NOPS();
SCL=1;
NOPS();
SCL=0;
}
/*void I2C_SendNotAck(void)
{
SDA =1 ;
NOPS();
SCL = 1;
NOPS();
SCL = 0;
}*/
#endif
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 2300 2015-07-30 10:33 TMP75.c
文件 584 2015-07-30 10:33 TMP75.h
文件 1937 2015-07-30 10:33 i2c.c
文件 305 2015-07-30 10:33 i2c.h
----------- --------- ---------- ----- ----
5126 4
评论
共有 条评论