AM2320温湿度传感器STC12程序_第1页
AM2320温湿度传感器STC12程序_第2页
AM2320温湿度传感器STC12程序_第3页
AM2320温湿度传感器STC12程序_第4页
AM2320温湿度传感器STC12程序_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、#include STC12C5A60S2.h#include /#include INTRINS.H / #include BASE.H / 自定义全局变量函数文件#define uchar unsigned char#define uint unsigned int#define SlaveAddress 0xB8 /定义器件在IIC总线中的从地址 根据 ALT ADDRESS地址 引脚不同修改/ALT ADDRESS引脚接地时地址为 0x46,接电源时地址 为 0xB8sbitSCL=P0A6;/IIC时钟引脚定义sbitSDA=P0A7; /IIC数据引脚定义typedefunsign

2、ed char BYTE;typedefunsigned short WORD;BYTEBUF_TP8;/ 接收数据缓存区intdis_data_Tem;/ 全局温度intdis_data_Hum;/ 全局湿度/void delay5us(void) / 这个延时函数 要大于 2.5US 以上 _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop

3、_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); /void delaylOus(void)/这个延时函数要大于5US以上_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_()

4、;_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); /*起始信号*/void AM232X_Start()SDA = 1;SCL

5、 = 1;delay10us();SDA = 0;delay10us();SCL = 0;delay10us();*停止信号*void AM232X_Stop()SDA = 0; delay5us();SCL = 1;delay10us();SDA = 1;/ 拉高数据线 / 拉高时钟线/ 产生下降沿/ 拉低时钟线/ 拉低数据线/ 拉高时钟线/ 产生上升沿delay10us();/* 发送应答信号入口参数 :ack (0:ACK 1:NAK) */ void AM232X_SendACK(bit ack) SDA = ack;SCL = 0;delay10us();SCL = 1;delay1

6、0us();SCL = 0;SDA = 1;delay10us(); /*接收应答信号*/bit AM232X_RecvACK()/ SCL=0;SDA=1;delay10us();SCL = 1;delay5us();CY = SDA;delay5us();SCL = 0;delay10us();return CY;/ 写应答信号/ 拉高时钟线/ 拉低时钟线/ 产生上升沿/ 拉高时钟线/ 读应答信号/ 拉低时钟线 /* 向 IIC 总线发送一个字节数据 */ void AM232X_SendFrist(BYTE dat) BYTE i;for (i=0; i8; i+)/8 位计数器dat

7、= 1;/ 移出数据的最高位SDA = CY;/ 送数据口delay5us();SCL = 1;/ 拉高时钟线delay10us();SCL = 0;/ 拉低时钟线delay5us();/ 送数据口/ 拉高时钟线/ 送数据口SDA = 1;delay5us();SCL = 1;delay10us();SCL = 0;SDA = 0; delay5us(); /* 向 IIC 总线发送一个字节数据 */ void AM232X_SendByte(BYTE dat) for (i=0; i8; i+) dat = 1; SDA = CY; delay5us();SCL = 1;delay10us(

8、);SCL = 0;delay5us();BYTE i;/8 位计数器/ 移出数据的最高位/ 送数据口/ 拉高时钟线/ 拉低时钟线AM232X_RecvACK();*从 IIC 总线接收一个字节数据*BYTE AM232X_RecvByte()BYTE i;BYTE dat = 0;SDA = 1;for (i=0; i8; i+) dat = 1;SCL = 1;delay10us(); dat |= SDA;SCL = 0;delay10us(); return dat;/ 使能内部上拉 ,准备读取数据 /8 位计数器/ 拉高时钟线/ 读数据/ 拉低时钟线/*void Waken_AM23

9、2X(void)AM232X_Start();/ 起始信号AM232X_SendFrist(SlaveAddress);/ 发送设备地址 +写信号/ AM232X_Stop();/ 发送停止信号/*void Write_AM232X(void)AM232X_Start();/ 起始信号AM232X_SendByte(SlaveAddress); / 发送设备地址 +写信号 delay10us();delay10us();AM232X_SendByte(0x03);AM232X_SendByte(0x00);AM232X_SendByte(0x04);/ 内部寄存器地址/ 内部寄存器地址/ 内部

10、寄存器地址AM232X_Stop();/ 发送停止信号/*/ 连续读出 AM232X 内部数据/ 起始信号/ 发送设备地址 +读信号/ 延时时间必须大于 30us 只要大于/连续读取 2个地址数据,存储中 BUF/BUF_TP0 存储 0x32 地址中的数据/ 最后一个数据需要回 NOACK/ 回应 ACK/ 停止信号/* void Multiple_read_AM232X(void)uchar i;AM232X_Start();AM232X_SendByte(SlaveAddress | 0x01); delay10us();delay10us();delay10us();30us 以上的值

11、都可以for (i=0; i8; i+)BUF_TPi = AM232X_RecvByte();if (i = 8)AM232X_SendACK(1);elseAM232X_SendACK(0);AM232X_Stop();/ Delay5ms();/初始化AM232X,根据需要请参考 pdf进行修改*void Waken_Stop_AM232X(void)AM232X_Stop();/计算CRC校验码unsigned int CRC16(unsigned char *ptr, unsigned char len) unsigned int crc=0xffff;unsigned char i

12、;while(len-)crc 人=*ptr+;for(i=0;i=1; crcA=0xa001;elsecrc=1;return crc;/检测CRC校验码是否正确unsigned char CheckCRC(unsigned char *ptr,unsigned char len) unsigned int crc;crc=(unsigned int)CRC16(ptr,len-2); if(ptrlen-1=(crc8) & ptrlen-2=(crc & 0x00ff)return 0xff;elsereturn 0x0;/*void TEM_AM232X(void)/1ms 读取一次

13、,全局函数 static uint TEM_c;static uchar TEM_Err = 0;if(+TEM_c) 2000)TEM_c = 0;if(TEM_c = 0)Waken_AM232X();else if(TEM_c = 1)Waken_Stop_AM232X();else if(TEM_c = 5)Write_AM232X();else if(TEM_c = 10)/ power on/ 发送停止信号/ 写请求数据/ 连续读出数据,存储在 BUF 中/测试CRC16是否正确 if(+TEM_Err) 5)TEM_Err = 1;dis_data_Tem = 0xffff;感器出错/数据错误达到 5 次/防止数据溢出/ 当两个数据都是 0xffff 的时候,传

温馨提示

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

评论

0/150

提交评论