| 本帖最后由 joly314 于 2014-5-26 22:17 编辑 
 /********************************************************
 *   文件名称:
 *               tmp275.c
 *       文件说明:
 *       使用口线模拟IIC读取 tmp275 温度值
 口对应:  SDA--P6.7   SCL--P6.6
 *********************************************************/
 
 #include <msp430x44x.h>
 
 #define uchar unsigned char
 #define uint unsigned int
 
 /*********************************************************
 相关口及寄存器定义,若要换IO口,只需修改这7句即可
 *********************************************************/
 #define OUTPUT_ZERO  P6OUT &= ~(BIT6+BIT7)
 #define IN           P6IN
 #define SDA          BIT7
 #define SDA_HIGH     P6DIR &= ~BIT7
 #define SDA_LOW      P6DIR |= BIT7
 #define SCL_HIGH     P6DIR &= ~BIT6
 #define SCL_LOW      P6DIR |= BIT6
 /*********************************************************
 *   数据定义
 *********************************************************/
 unsigned char temp1,     //温度值高字节
 temp2,     //温度值低字节
 ack_Flag;  //应答标识
 /************************************************
 *   延迟
 ************************************************/
 void iic_Delay(void)
 {
 _NOP();
 _NOP();
 _NOP();
 }
 /*********************************************************
 *   启动IIC
 *********************************************************/
 void start_IIC(void)
 {
 OUTPUT_ZERO; //设置P6OUT
 SDA_HIGH;  //SDA = 1
 iic_Delay();
 SCL_HIGH;  //SCL = 1
 iic_Delay();
 SDA_LOW;   //SDA = 0
 iic_Delay();
 SCL_LOW;   //SCL = 0
 iic_Delay();
 
 }
 /*******************************************************
 *   停止IIC
 *******************************************************/
 void stop_IIC(void)
 {
 SDA_LOW;   //SDA = 0
 iic_Delay();
 SCL_HIGH;  //SCL = 1
 iic_Delay();
 SDA_HIGH;  //SDA = 1
 iic_Delay();
 SDA_LOW;   //SDA = 0
 iic_Delay();
 SCL_LOW;   //SCL = 0
 }
 
 /*******************************************************
 *   发送 0
 *******************************************************/
 void send_Zero(void)
 {
 SDA_LOW;   //SDA = 0
 iic_Delay();
 SCL_HIGH;  //SCL = 1
 iic_Delay();
 SCL_LOW;   //SCL = 0
 iic_Delay();
 
 }
 /*******************************************************
 *   发送 1
 *******************************************************/
 void send_One(void)
 {
 SDA_HIGH;  //SDA = 1
 iic_Delay();
 SCL_HIGH;  //SCL = 1
 iic_Delay();
 SCL_LOW;   //SCL = 0
 iic_Delay();
 SDA_LOW;   //SDA = 0
 //  iic_Delay();
 }
 /*******************************************************
 *   发送一个字节数据
 *******************************************************/
 void send_Char(uchar x)
 {
 uchar cnt,tmp=0x80;
 for(cnt=0;cnt<8;cnt++)
 {
 if((x & tmp )> 0)
 send_One();        // 发送1
 else
 send_Zero();   // 发送0
 tmp /= 2;       // tmp右移一位
 }
 }
 
 /*******************************************************
 *   读一个byte数据
 *******************************************************/
 uchar read_Char(void)
 {
 uchar cnt,tmp=0x80;
 uchar x = 0x00;
 for(cnt=0;cnt<8;cnt++)
 {
 SDA_HIGH;   //SDA = 1
 iic_Delay();
 SCL_HIGH;   //SCL = 1
 iic_Delay();
 if((IN & SDA) > 0x00)  // 收到 1
 x |= tmp;
 SCL_LOW;  //SCL = 0
 iic_Delay();
 tmp = tmp/2;
 }
 return x;
 }
 
 /*************************************************
 *   应答信号
 *************************************************/
 void iic_ACK(void)
 {
 ack_Flag = 0x00;
 SDA_HIGH;  //SDA = 1
 iic_Delay();
 SCL_HIGH;  //SCL = 1
 iic_Delay();
 if ((IN & BIT7) >0 )
 {
 ack_Flag = 1;
 }
 SCL_LOW;   //SCL = 0
 iic_Delay();
 
 }
 /***********************************************
 *  iic_NACK
 ************************************************/
 void iic_NACK(void)
 {
 SDA_LOW;   //SDA = 0
 iic_Delay();
 SCL_HIGH;  //SCL = 1
 iic_Delay();
 SCL_LOW;   //SCL = 0
 iic_Delay();
 }
 
 /************************************************
 *   写一个数据到tmp275
 *************************************************/
 void write_tmp275(uchar register_addr,uchar content)
 {
 start_IIC();      // 启动 I2c
 send_Char(0x90); // 发送器件地址
 iic_ACK(); // 确认
 send_Char(register_addr); // 发送寄存器地址
 iic_ACK();                // 读确认
 send_Char(content);       // 写入数值
 iic_ACK();            // 读响应信息
 stop_IIC();                // 停止 IIC
 }
 /*************************************************
 *   从tmp275读数据
 *************************************************/
 void read_temperature(void)
 {
 start_IIC();       //启动 I2c
 send_Char(0x90);//发送器件地址
 iic_ACK();         //读取应答
 send_Char(0x00);     // 发送寄存器地址
 iic_ACK();             // 读响应
 start_IIC();       //启动 I2c
 send_Char(0x91);      // 发送器件地址
 iic_ACK();            // 获取响应
 temp1 = read_Char();  //读温度寄存器高字节
 iic_NACK();         // 主设备发响应
 temp2 = read_Char();  //读温度寄存器高字节
 iic_NACK();         // 主设备发响应
 stop_IIC();                  // 停止 IIC
 }
 
 /********************************************************
 *        文件名称:
 *               tmp275.c
 *       文件说明:
 *                使用口线模拟IIC读取 tmp275 温度值
 口对应:  SDA--P6.7   SCL--P6.6
 *********************************************************/
 
 #include <msp430x44x.h>
 
 #define uchar unsigned char
 #define uint unsigned int
 
 /*********************************************************
 相关口及寄存器定义,若要换IO口,只需修改这7句即可
 *********************************************************/
 #define OUTPUT_ZERO  P6OUT &= ~(BIT6+BIT7)
 #define IN           P6IN
 #define SDA          BIT7
 #define SDA_HIGH     P6DIR &= ~BIT7
 #define SDA_LOW      P6DIR |= BIT7
 #define SCL_HIGH     P6DIR &= ~BIT6
 #define SCL_LOW      P6DIR |= BIT6
 /*********************************************************
 *        数据定义
 *********************************************************/
 unsigned char temp1,     //温度值高字节
 temp2,     //温度值低字节
 ack_Flag;  //应答标识
 /************************************************
 *        延迟
 ************************************************/
 void iic_Delay(void)
 {
 _NOP();
 _NOP();
 _NOP();
 }
 /*********************************************************
 *        启动IIC
 *********************************************************/
 void start_IIC(void)
 {
 OUTPUT_ZERO; //设置P6OUT
 SDA_HIGH;        //SDA = 1
 iic_Delay();
 SCL_HIGH;        //SCL = 1
 iic_Delay();
 SDA_LOW;        //SDA = 0
 iic_Delay();
 SCL_LOW;        //SCL = 0
 iic_Delay();
 
 }
 /*******************************************************
 *        停止IIC
 *******************************************************/
 void stop_IIC(void)
 {
 SDA_LOW;        //SDA = 0
 iic_Delay();
 SCL_HIGH;        //SCL = 1
 iic_Delay();
 SDA_HIGH;        //SDA = 1
 iic_Delay();
 SDA_LOW;        //SDA = 0
 iic_Delay();
 SCL_LOW;        //SCL = 0
 }
 
 /*******************************************************
 *        发送 0
 *******************************************************/
 void send_Zero(void)
 {
 SDA_LOW;        //SDA = 0
 iic_Delay();
 SCL_HIGH;        //SCL = 1
 iic_Delay();
 SCL_LOW;        //SCL = 0
 iic_Delay();
 
 }
 /*******************************************************
 *        发送 1
 *******************************************************/
 void send_One(void)
 {
 SDA_HIGH;        //SDA = 1
 iic_Delay();
 SCL_HIGH;        //SCL = 1
 iic_Delay();
 SCL_LOW;        //SCL = 0
 iic_Delay();
 SDA_LOW;        //SDA = 0
 //  iic_Delay();
 }
 /*******************************************************
 *        发送一个字节数据
 *******************************************************/
 void send_Char(uchar x)
 {
 uchar cnt,tmp=0x80;
 for(cnt=0;cnt<8;cnt++)
 {
 if((x & tmp )> 0)
 send_One();             // 发送1
 else
 send_Zero();        // 发送0
 tmp /= 2;                // tmp右移一位
 }
 }
 
 /*******************************************************
 *        读一个byte数据
 *******************************************************/
 uchar read_Char(void)
 {
 uchar cnt,tmp=0x80;
 uchar x = 0x00;
 for(cnt=0;cnt<8;cnt++)
 {
 SDA_HIGH;        //SDA = 1
 iic_Delay();
 SCL_HIGH;        //SCL = 1
 iic_Delay();
 if((IN & SDA) > 0x00)  // 收到 1
 x |= tmp;
 SCL_LOW;  //SCL = 0
 iic_Delay();
 tmp = tmp/2;
 }
 return x;
 }
 
 /*************************************************
 *        应答信号
 *************************************************/
 void iic_ACK(void)
 {
 ack_Flag = 0x00;
 SDA_HIGH;        //SDA = 1
 iic_Delay();
 SCL_HIGH;        //SCL = 1
 iic_Delay();
 if ((IN & BIT7) >0 )
 {
 ack_Flag = 1;
 }
 SCL_LOW;        //SCL = 0
 iic_Delay();
 
 }
 /***********************************************
 *  iic_NACK
 ************************************************/
 void iic_NACK(void)
 {
 SDA_LOW;        //SDA = 0
 iic_Delay();
 SCL_HIGH;        //SCL = 1
 iic_Delay();
 SCL_LOW;        //SCL = 0
 iic_Delay();
 }
 
 /************************************************
 *        写一个数据到tmp275
 *************************************************/
 void write_tmp275(uchar register_addr,uchar content)
 {
 start_IIC();           // 启动 I2c
 send_Char(0x90); // 发送器件地址
 iic_ACK();        // 确认
 send_Char(register_addr); // 发送寄存器地址
 iic_ACK();                // 读确认
 send_Char(content);           // 写入数值
 iic_ACK();            // 读响应信息
 stop_IIC();                // 停止 IIC
 }
 /*************************************************
 *        从tmp275读数据
 *************************************************/
 void read_temperature(void)
 {
 start_IIC();            //启动 I2c
 send_Char(0x90);//发送器件地址
 iic_ACK();                    //读取应答
 send_Char(0x00);     // 发送寄存器地址
 iic_ACK();             // 读响应
 start_IIC();            //启动 I2c
 send_Char(0x91);           // 发送器件地址
 iic_ACK();            // 获取响应
 temp1 = read_Char();  //读温度寄存器高字节
 iic_NACK();         // 主设备发响应
 temp2 = read_Char();  //读温度寄存器高字节
 iic_NACK();         // 主设备发响应
 stop_IIC();                  // 停止 IIC
 }
 
 上面这个程序网上下的,说是MSP430上验证过的,转成C51也不能读出来,真不知道问题在哪,郁闷啊
 
 |