完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
对着参考手册看了一遍,还是没找到哪里不对,再加上才接触IIC,对其理解不深刻,身边又没有示波器之类的,难受哦
#ifndef __SHT20_H_ #define __SHT20_H_ #include "msp430x14x.h" /***************************** 宏定义 *****************************/ #define SCL_H P3OUT |= BIT6 #define SCL_L P3OUT &= ~BIT6 #define SDA_H P3OUT |= BIT7 #define SDA_L P3OUT &= ~BIT7 #define SDA_in P3DIR &= ~BIT7 //SDA 改成输入模式 #define SDA_out P3DIR |= BIT7 //SDA 变回输出模式 #define SDA_val P3IN&BIT7 //SDA 的位值 #define ACK 0 #define NACK 1 #define SHT20ADDR 0x80 void Delay(void); void Start(void); void Stop(void); void Mack(void); void MNack(void); unsigned char Check(void); void Write1(void); void Write0(void); unsigned char WriteByte(unsigned char wdata); unsigned char ReadByte(void); void Delay_10ms(); float Sht21Work(unsigned char order); #endif #include "sht20.h" /***************************************************************** 【函数名称】 Start 【功 能】完成 IIC 的起始条件操作 【参 数】无 【返回值 】无 *****************************************************************/ void Start(void) { SCL_H; SDA_H; delay_us(15); SDA_L; delay_us(15); SCL_L; delay_us(15); } /***************************************************************** 【函数名称】 Stop 【功 能】完成 IIC 的终止条件操作 【参 数】无 【返回值 】无 *****************************************************************/ void Stop(void) { SDA_L; delay_us(15); SCL_H; delay_us(15); SDA_H; delay_us(15); } /***************************************************************** 【函数名称】 Mack 【功 能】完成 IIC 的主机应答操作 【参 数】无 【返回值 】无 *****************************************************************/ void Mack(void) { SDA_L; _NOP(); _NOP(); SCL_H; delay_us(15); SCL_L; _NOP(); _NOP(); SDA_H; delay_us(15); } /***************************************************************** 【函数名称】 MNack 【功 能】完成 IIC 的主机无应答操作 【参 数】无 【返回值 】无 *****************************************************************/ void MNack(void) { SDA_H; _NOP(); _NOP(); SCL_H; delay_us(15); SCL_L; _NOP(); _NOP(); SDA_L; delay_us(15); } /***************************************************************** 【函数名称】 Check 【功 能】检查从机的应答操作 ,1--有, 0--无 【参 数】无 【返回值 】ACK (应答信号) or NACK (非应答信号) *****************************************************************/ unsigned char Check(void) { unsigned char ack; SDA_H; _NOP(); _NOP(); SCL_H; _NOP(); _NOP(); SDA_in; _NOP(); _NOP(); ack = SDA_val; //读入 SDA 数值 SCL_L; delay_us(15); SDA_out; if(ack) return NACK; else return ACK; } /***************************************************************** 【函数名称】 Write1 【功 能】向 IIC 总线发送一个 1 【参 数】无 【返回值 】无 *****************************************************************/ void Write1(void) { SDA_H; delay_us(15); SCL_H; delay_us(15); SCL_L; delay_us(15); } /***************************************************************** 【函数名称】 Write0 【功 能】向 IIC 总线发送一个 0 【参 数】无 【返回值 】无 *****************************************************************/ void Write0(void) { SDA_L; delay_us(15); SCL_H; delay_us(15); SCL_L; delay_us(15); } /***************************************************************** 【函数名称】 WriteByte 【功 能】向 IIC 总线发送一个字节 【参 数】 wdata 为待写数据 【返回值 】respond 为从机返回的应答信号 *****************************************************************/ unsigned char WriteByte(unsigned char wdata) { unsigned char i,respond; for(i = 8;i > 0;i--) { if(wdata & 0x80) Write1(); else Write0(); wdata <<= 1; } SDA_H; _NOP(); respond = Check(); return respond; } /***************************************************************** 【函数名称】 ReadByte 【功 能】从 IIC 总线读取一个字节 【参 数】无 【返回值 】rdata 为读取的数据 *****************************************************************/ unsigned char ReadByte(void) { unsigned char rdata = 0x00,i; unsigned char flag; for(i = 0;i < 8;i++) { SDA_H; delay_us(15); SCL_H; SDA_in; delay_us(15); flag = SDA_val; rdata <<= 1; if(flag) rdata |= 0x01; SDA_out; SCL_L; delay_us(15); } return rdata; } /***************************************************************** 【函数名称】 Sht21Work 【功 能】 Sht21 测量温湿度 【参 数】 order = 0xf3 时测量温度; order = 0xf5 时测量湿度 【返回值 】wendu、shidu *****************************************************************/ float Sht21Work(unsigned char order) { float temp = 0,TH = 0; unsigned char MSB,LSB; Start(); if(WriteByte(SHT20ADDR & 0xfe) == ACK) { if(WriteByte(order) == ACK) { do { delay_ms(10); Start(); }while(WriteByte(SHT20ADDR | 0x01) == NACK); MSB = ReadByte(); Mack(); LSB = ReadByte(); MNack(); Stop(); LSB &= 0xfc; temp = MSB*256+LSB; if (order == 0xf3) { TH = ((float)temp * 0.00268127) - 46.85; return TH; } else { TH = ((float)temp * 0.00190734) - 46.85; return TH; } } } return 1; } |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
795 浏览 2 评论
【youyeetoo X1 windows 开发板体验】+ 影音处理和AI模型移植
668 浏览 5 评论
I.MX6ULL-飞凌 ElfBoard ELF1板卡- 移植zbar的方法
845 浏览 0 评论
1508 浏览 3 评论
由于 Windows 无法加载这个设备所需的驱动程序,导致这个设备工作异常?
2409 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
3726 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-3-29 06:24 , Processed in 0.474364 second(s), Total 35, Slave 29 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 深圳华秋电子有限公司
电子发烧友 (电路图) 粤公网安备 44030402000349 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号