《AM2320温湿度传感器STC12程序word资料6页.doc》由会员分享,可在线阅读,更多相关《AM2320温湿度传感器STC12程序word资料6页.doc(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、如有侵权,请联系网站删除,仅供学习与交流AM2320温湿度传感器STC12程序【精品文档】第 6 页#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,接电源时地址为0xB8sbit SCL=P06; /
2、IIC时钟引脚定义sbit SDA=P07; /IIC数据引脚定义typedef unsigned char BYTE;typedef unsigned short WORD;BYTE BUF_TP8; /接收数据缓存区 int dis_data_Tem; /全局温度int dis_data_Hum; /全局湿度void delay5us(void) /这个延时函数 要大于2.5US以上_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_
3、nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();void delay10us(void) /这个延时函数 要大于5US以上_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_(); _nop_(); _nop_();_nop_(); _nop_();
5、_nop_();起始信号void AM232X_Start() SDA = 1; /拉高数据线 SCL = 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
6、 = ack; /写应答信号SCL = 0;delay10us(); SCL = 1; /拉高时钟线 delay10us(); 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
7、) BYTE i; for (i=0; i8; i+) /8位计数器 dat = 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) BYTE i; for (i=0; i8; i+) /8位计数器
8、 dat = 1; /移出数据的最高位 SDA = CY; /送数据口delay5us(); SCL = 1; /拉高时钟线 delay10us(); SCL = 0; /拉低时钟线 delay5us(); AM232X_RecvACK();从IIC总线接收一个字节数据BYTE AM232X_RecvByte() BYTE i; BYTE dat = 0; SDA = 1; /使能内部上拉,准备读取数据, for (i=0; i8; i+) /8位计数器 dat = 1; SCL = 1; /拉高时钟线 delay10us(); dat |= SDA; /读数据 SCL = 0; /拉低时钟线
9、 delay10us(); return dat;void Waken_AM232X(void) AM232X_Start(); /起始信号AM232X_SendFrist(SlaveAddress);/发送设备地址+写信号 / AM232X_Stop(); /发送停止信号void Write_AM232X(void) AM232X_Start(); /起始信号 AM232X_SendByte(SlaveAddress); /发送设备地址+写信号delay10us();delay10us(); AM232X_SendByte(0x03); /内部寄存器地址 AM232X_SendByte(0x
10、00); /内部寄存器地址AM232X_SendByte(0x04); /内部寄存器地址 AM232X_Stop(); /发送停止信号/连续读出AM232X内部数据void Multiple_read_AM232X(void)uchar i; AM232X_Start();/起始信号 AM232X_SendByte(SlaveAddress | 0x01);/发送设备地址+读信号delay10us(); delay10us();delay10us();/ 延时时间必须大于30us 只要大于 30us 以上的值都可以for (i=0; i8; i+)/连续读取2个地址数据,存储中BUF BUF_
11、TPi = AM232X_RecvByte(); /BUF_TP0存储0x32地址中的数据 if (i = 8) AM232X_SendACK(1);/最后一个数据需要回NOACK else AM232X_SendACK(0);/回应ACK AM232X_Stop();/停止信号 / Delay5ms();/初始化AM232X,根据需要请参考pdf进行修改*void Waken_Stop_AM232X(void) AM232X_Stop(); /计算CRC校验码unsigned int CRC16(unsigned char *ptr, unsigned char len) unsigned
12、int crc=0xffff; unsigned char i; while(len-) crc =*ptr+; for(i=0;i=1; crc=0xa001; else crc=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;else return 0
13、x0;void TEM_AM232X(void)/1ms读取一次,全局函数static uint TEM_c;static uchar TEM_Err = 0;if(+TEM_c) 2000)TEM_c = 0;if(TEM_c = 0)Waken_AM232X();/ power onelse if(TEM_c = 1)Waken_Stop_AM232X();/发送停止信号else if(TEM_c = 5)Write_AM232X();/写请求数据else if(TEM_c = 10)Multiple_read_AM232X();/连续读出数据,存储在BUF中else if(TEM_c = 11)if(CheckCRC(BUF_TP,8)/测试CRC16是否正确dis_data_Tem = BUF_TP4*256+BUF_TP5;dis_data_Hum = BUF_TP2*256+BUF_TP3;TEM_Err = 0;/没错误TEM_c+;/没错误else if(TEM_c = 12)/校验出错if(+TEM_Err) 5)/数据错误达到5次TEM_Err = 1;/防止数据溢出dis_data_Tem = 0xffff;/当两个数据都是0xffff的时候,传感器出错dis_data_Hum = 0xffff;
限制150内