AM2322温湿度传感器STM8S208驱动更新_第1页
AM2322温湿度传感器STM8S208驱动更新_第2页
AM2322温湿度传感器STM8S208驱动更新_第3页
AM2322温湿度传感器STM8S208驱动更新_第4页
AM2322温湿度传感器STM8S208驱动更新_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、AM2322温湿度传感器STM8S208驱动AM2322温湿度传感器STM8S208驱动该程序测试能用,AM2322产品都是共用一个器 件地址0 xB8,所以只能挂一个AM2322器件,如果挂两个就有两个相同的器件地址,这 样IIC没有办法寻址,但这并不代表不能与其它器件共存,比喻AT24C02,它的器件地址是 0 xA0,它们可以在同一条IIC部上面工作的。AM2322温度采集成功后,得到高8位和低8位的数据。将其组合成一个16位的值, 再换算成十进制的温湿值,该值是实际值的10倍,除以10后就是正确温湿度值了。例如:采集到的湿度值为:高8位是0 x03低8位是0 x39,组合成16位的值就

2、是0 x0339, 换算成十进制是825,再除以10就是82.5,表示相对湿度82.5%,温度值也是这样计算。 该程序采用模拟IIC通讯,总共有四个文件:IIC.c、IIC.h、AM2322.C、AM2322.h,在工程新建这四个文件依次添加以下代码:在IIC.c文件中添加以下代码(通用的IIC底层驱动):void I2C_Configuration()/初始化 IIC 端口 (GPIO_Init(I2C_PORT, I2C_SCL_PIN, GPIO_MODE_OUT_PP_HIGH_SLOW);GPIO_Init(I2C_PORT, I2C_SDA_PIN, GPIO_MODE_OUT_P

3、P_HIGH_SLOW); )/产生IIC起始信号void IIC_Start(void) (I2C_SDA_OUT;/sda 线输出I2C_SDA_H;I2C_SCL_H;delay_us(14);I2C_SDA_L;/开始:当SCL为高时,数据从高到低变化delay_us(14);I2C_SCL_L;/钳住I2C总线,准备发送或接收数据)/产生IIC停止信号void IIC_Stop(void) (I2C_SDA_OUT;/sda 线输出I2C_SCL_L;I2C_SDA_L;/停止:当SCL为高时,数据从低到高变化delay_us(14);I2C_SCL_H;delay_us(14);I

4、2C_SDA_H;/发送I2C总线结束信号 )/等待应答信号到来/返回值:1,接收应答失败/0,接收应答成功u8 IIC_Wait_Ack(void) (u8 ucErrTime=0;I2C_SCL_L;I2C_SDA_H;I2C_SDA_IN;/SDA 设置为输入delay_us(14);I2C_SCL_H;delay_us(14);while(GPIO_ReadInputPin(I2C_PORT, I2C_SDA_PIN)/等至U SDA 变低 (ucErrTime+;if(ucErrTime250)(IIC_Stop();return 1;)delay_us(1);)I2C_SCL_L;

5、/时钟输出 0delay_us(10);return 0;)/产生ACK应答void IIC_Ack(void) I2C_SDA_OUT;I2C_SCL_L;I2C_SDA_L;delay_us(50);I2C_SCL_H;delay_us(50);I2C_SCL_L;/I2C_SDA_H;)/产生非ACK应答void IIC_NAck(void) I2C_SDA_OUT;I2C_SCL_L;I2C_SDA_H;delay_us(50);I2C_SCL_H;delay_us(50);I2C_SCL_L;/ I2C_SDA_H;)/IIC发送一个字节/返回从机有无应答/1,有应答/0,无应答vo

6、id IIC_Send_Byte(u8 txd) (u8 t;I2C_SDA_OUT;I2C_SCL_L;/拉低时钟开始数据传输for(t=0;t8;t+) (I2C_SCL_L;if(txd&0 x80)I2C_SDA_H; elseI2C_SDA_L;txd=1;delay_us(15);/延时I2C_SCL_H;delay_us(15);I2C_SCL_L;读1个字节,ack=1时,发送ACK, ack=0,发送nACKu8 IIC_Read_Byte(unsigned char ack) unsigned char i,receive=0;I2C_SDA_IN;/SDA 设置为输入fo

7、r(i=0;i8;i+ ) I2C_SCL_L;delay_us(50);I2C_SCL_H;delay_us(50);receive=1;if(GPIO_ReadInputPin(I2C_PORT, I2C_SDA_PIN)receive+; I2C_SCL_L;if (!ack)IIC_NAck();/ nACKelseIIC_Ack();/发送 ACKreturn receive;在IIC.h中添加以下代码:#ifndef H_I2C_H 宏定义,定义文件名称#define H_I2C_H/*头文件引用*/#include stm8s.h/引用 STM8 头文件#define I2C_S

8、CL_PIN GPIO_PIN_1 /如果将IIC端口换到它引脚 只修改这里,其它的不用动#define I2C_SDA_PIN GPIO_PIN_2 /如果将IIC端口换到它引脚 只修改这里,其它的不用动#define I2C_PORT GPIOE /如果将IIC端口换到它引脚 只修改这里,其它的不用动#define I2C_SCL_L GPIO_WriteLow(I2C_PORT,I2C_SCL_PIN);#define I2C_SCL_H GPIO_WriteHigh(I2C_PORT,I2C_SCL_PIN);#define I2C_SDA_L GPIO_WriteLow(I2C_PO

9、RT,I2C_SDA_PIN);#define I2C_SDA_H GPIO_WriteHigh(I2C_PORT,I2C_SDA_PIN);#define I2C_SDA_OUT GPIO_Init(I2C_PORT, I2C_SDA_PIN, GPIO_MODE_OUT_OD_HIZ_FAST);#define I2C_SDA_IN GPIO_Init(I2C_PORT, I2C_SDA_PIN, GPIO_MODE_IN_PU_NO_IT);/以下是函数声明:void I2C_Configuration();void IIC_Start(void);void IIC_Stop(void)

10、;u8 IIC_Wait_Ack(void);void IIC_Ack(void);void IIC_NAck(void);void IIC_Send_Byte(u8 txd);u8 IIC_Read_Byte(unsigned char ack);#endif在AM2322.C中添加以下代码:u8 WR_Flag;u8 WriteNByte(unsigned char sla,unsigned char *s)/写数据 (IIC_Start();/起始条件IIC_Send_Byte(sla);/发送器件地址IIC_Wait_Ack();/等待 ACK 响应IIC_Send_Byte(s0);

11、/发送字节地址IIC_Wait_Ack();/等待 ACK 响应IIC_Send_Byte(s1);/发送字节地址IIC_Wait_Ack();等待 ACK 响应IIC_Send_Byte(s2);发送字节地址IIC_Wait_Ack();等待 ACK 响应IIC_Stop();执行停止条件return(0);)u8 ReadNByte(unsigned char Sal, unsigned char *p)/接收或叫读数据 (IIC_Start();/发送起始条件IIC_Send_Byte(Sal|0 x01);/发送器件地址IIC_Wait_Ack();/等待 ACK 响应delay_us

12、(50);p0=IIC_Read_Byte(1);/功能码p1=IIC_Read_Byte(1);/据长度p2=IIC_Read_Byte(1);/湿度高 8 位p3=IIC_Read_Byte(1);/湿度低 8 位p4=IIC_Read_Byte(1);/温度高 8 位p5=IIC_Read_Byte(1);/温度低 8 位p6=IIC_Read_Byte(1);/CRC 高 8 位p7=IIC_Read_Byte(0);/CRC 低 8 位IIC_Stop();/发送停止条件)void Waken(void)(IIC_Start();)void Waken(void)(IIC_Start

13、();IIC_Send_Byte(0 xB8);IIC_Wait_Ack();的时钟否则会出错 delay_ms(1);你只要大于1MS IIC_Stop();)唤醒器件/启动I2C/ 发送器件地址/唤醒指令时传感器不会回ACK但是第一定要发检测ACK/至少延时1个ms说明书里,有个最大值,实际当中在AM2322.h中添加以下代码:#ifndef H_AM2322_H 宏定义,定义文件名称#define H_AM2322_H/*头文件引用*/#include stm8s.h/引用 STM8 头文件u8 WriteNByte(unsigned char sla,unsigned char *s)

14、;u8 ReadNByte(unsigned char Sal, unsigned char *p);void Waken(void);#endif最后注意要在main.c中引用IIC.h和AM2322.h两个头文件。以下MAIN.C内容#include pbdata.h这个头文件引用了所有的其它头文件void BSP_Configuration(void);/初始化函数弓用 u16 stp;unsigned char IIC_TX_Buffer=0 x03,0 x00,0 x04; /读温湿度命令(无 CRC 校验) unsigned char IIC_RX_BufferIIC_RX_Len

15、gth = 0 x00;/读回的温湿度unsigned char Uart_RX_Buffer30 = 0 x00;/接收数据存储数组 void main() BSP_Configuration();/端口初始化while(1)/唤醒/唤醒WriteNByte(IIC_Add, IIC_TX_Buffer);/发送指命令函数 /*IIC_Add 为器件地址 0 xB8,IIC_TX_Buffer 是一个数组, 值为 0 x03,0 x00,0 x08:0 x03是功能码(手册第9页)读一个或多个寄存器0 x00是读寄存器的第一个地址,总共0 x00-0 x07 (手册第9页) 0 x08是要读

16、寄存器的个数*/delay_ms(2);/唤醒后等 2msReadNByte(IIC_Add,IIC_RX_Buffer);/IIC_Add是器件地址0 xB8, IIC_RX_Buffer是接收数据的数组/*以下是一个示例:数据成功全部读取后,数组第一个字节是功能码,第二个字节是数据长度,第三四个字节是温度,第五六个字节是湿度,第七八个字节是CRC值,需要读的就个四个寄存器,其它的是传感自动返回的(手册第10页)*/stp=IIC_RX_Buffer4;stp=(stp8)|IIC_RX_Buffer5;stp=IIC_RX_Buffer4;stp=(stp8)|IIC_RX_Buffer5;printf(%d,stp/10);printf(.%d,stp%10);温度的高8位/与上温度的低8位/从串口输出,显示整数位/从串口输出,显示整数位I2C_SCL_H;I2C_SDA_H;I2C_SCL_H;I2C_SDA_H;delay_ms(2000);/确认释放总线*/重复读传感器间隔时间必须大于2)void BSP_Configuration(void)(CLK_ClockSwitchCmd(ENABLE)能时钟切换功能DISABLE,/CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论