单片机源程序如下:
#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单片机的温度报警器
推荐阅读最新更新时间:2024-11-02 04:47
设计资源 培训 开发板 精华推荐
- 使用 Semtech 的 SC1456 的参考设计
- 使用 Analog Devices 的 LT1184CS 的参考设计
- REF191 电压基准故障安全 5V 基准的典型应用电路
- DC2079A,使用 LT3954 DC-DC 转换器作为恒流源和恒压稳压器工作的演示板,PWM 调光
- TAR5S32U 点稳压器(低压差稳压器)的典型应用
- 使用 Analog Devices 的 LTC1596-1CISW 的参考设计
- LTC3876EUHF 演示板、高效率、双路输出 DDR 电源
- AD8330-EVALZ,评估套件是一种易于使用的附件,可用于对 AD8330 可变增益放大器 (VGA) 进行动手评估
- VIPER37HE-使用VIPer™Plus的15W、12V输出的隔离式反激转换器
- LTC3829 的典型应用 - 三相、单输出同步降压型 DC/DC 控制器