完善资料让更多小伙伴认识你,还能领取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; } |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
479 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-内核编译之初次编译
229 浏览 0 评论
334 浏览 0 评论
165 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》 第十六章 WATCH_DOG实验
496 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11972 浏览 31 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 12:43 , Processed in 0.508891 second(s), Total 73, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号