
#include #include #include "LCD1602.h" /******************************************************** 宏定义 ********************************************************/ #define uint unsigned int #define uchar unsigned char #define noACK 0 #define ACK 1 #define STATUS_REG_W 0x06 #define STATUS_REG_R 0x07 #define MEASURE_TEMP 0x03 #define MEASURE_HUMI 0x05 #define RESET 0x1e enum { TEMP, HUMI }; typedef union //定义共用同类型 { unsigned int i; float f; } value; /******************************************************** 位定义 ********************************************************/ sbit SCK = P1 ^ 0; sbit DATA = P1 ^ 1; /******************************************************** 变量定义 ********************************************************/ uchar wendu[6]; uchar shidu[6]; /******************************************************** 50us延时函数 ********************************************************/ void delay_50us(uint t) { uint j; for (; t>0; t--) for (j = 19; j>0; j--); } /******************************************************* 液晶显示函数 ********************************************************/ void displaywendu(void) { uchar i; write_com(0x80+0x40); write_data('T'); write_data(':'); for (i = 0; i<3; i++) { write_data(wendu[i]); delay_50us(1); } for (i = 0; i<1; i++) { write_data('.'); delay_50us(1); } for (i = 4; i<5; i++) { write_data(wendu[i]); delay_50us(1); } write_data(0xDF); write_data('C'); } /******************************************************** 液晶显示函数 ********************************************************/ void displayshidu(void) { uchar i; write_com(0x80); write_data('H'); write_data(':'); for (i = 0; i<3; i++) { write_data(shidu[i]); delay_50us(1); } for (i = 0; i<1; i++) { write_data('.'); delay_50us(1); } for (i = 4; i<5; i++) { write_data(shidu[i]); delay_50us(1); } write_data('%'); write_data('R'); write_data('H'); } /******************************************************** SHT11写字节程序 ********************************************************/ char s_write_byte(unsigned char value) { unsigned char i, error = 0; for (i = 0x80; i>0; i >>= 1) //高位为1,循环右移 { if (i&value) DATA = 1; //和要发送的数相与,结果为发送的位 else DATA = 0; SCK = 1; _nop_(); _nop_(); _nop_(); //延时3us SCK = 0; } DATA = 1; //释放数据线 SCK = 1; error = DATA; //检查应答信号,确认通讯正常 _nop_(); _nop_(); _nop_(); SCK = 0; DATA = 1; return error; //error=1 通讯错误 } /******************************************************** SHT11读字节程序 ********************************************************/ char s_read_byte(unsigned char ack) { unsigned char i, val = 0; DATA = 1; //释放数据线 for (i = 0x80; i>0; i >>= 1) //高位为1,循环右移 { SCK = 1; if (DATA) val = (val | i); //读一位数据线的值 SCK = 0; } DATA = !ack; //如果是校验,读取完后结束通讯; SCK = 1; _nop_(); _nop_(); _nop_(); //延时3us SCK = 0; _nop_(); _nop_(); _nop_(); DATA = 1; //释放数据线 return val; } /******************************************************** SHT11启动传输 ********************************************************/ void s_transstart(void) { DATA = 1; SCK = 0; //准备 _nop_(); SCK = 1; _nop_(); DATA = 0; _nop_(); SCK = 0; _nop_(); _nop_(); _nop_(); SCK = 1; _nop_(); DATA = 1; _nop_(); SCK = 0; } /******************************************************** SHT11连接复位 ********************************************************/ void s_connectionreset(void) { unsigned char i; DATA = 1; SCK = 0; //准备 for (i = 0; i<9; i++) //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位 { SCK = 1; SCK = 0; } s_transstart(); //启动传输 } /******************************************************** SHT11温湿度检测 ********************************************************/ char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) { unsigned error = 0; unsigned int i; s_transstart(); //启动传输 switch (mode) //选择发送命令 { case TEMP: error += s_write_byte(MEASURE_TEMP); break; //测量温度 case HUMI: error += s_write_byte(MEASURE_HUMI); break; //测量湿度 default: break; } for (i = 0; i<65535; i++) if (DATA == 0) break; //等待测量结束 if (DATA) error += 1; // 如果长时间数据线没有拉低,说明测量错误 *(p_value) = s_read_byte(ACK); //读第一个字节,高字节 (MSB) *(p_value + 1) = s_read_byte(ACK); //读第二个字节,低字节 (LSB) *p_checksum = s_read_byte(noACK); //read CRC校验码 return error; // error=1 通讯错误 } /********************************************************
上一篇:STC8951单片机的外部中断资源
下一篇:基于51单片机的温度报警器
推荐阅读
史海拾趣
- 直播已结束【使用 TI 低成本 MSPM0 MCU 快速开发 – 生态详解系列之二】(9:45开始入场)
- 答题赢好礼|以人为本、生命无价 ADI 楼宇烟雾探测技术
- 我爱 TI Webench 之学课程传设计,赢礼100% !
- 【评论有礼!】Sleepace RestOn 智能睡眠监测仪拆解
- 看泰克视频讲座,了解先进医疗电子测试方案,填问卷,赢好礼!
- 西门子电子书下载《PCB 制造流程 - 通过数字化转型进行优化》
- 2024安路科技FPGA技术研讨会-广州站 火热报名中
- 艾睿电子直播:聚焦“TI FPD-Link III 汽车芯片组” ,汽车视频传输理想解决方案
- 有奖直播 | “PCIM Asia 2024” ROHM 展位线上直播





ASM10DTBD-S664






京公网安备 11010802033920号