历史上的今天
今天是:2025年02月20日(星期四)
2020年02月20日 | 单片机温湿度光照二氧化碳 智能检测
2020-02-20 来源:51hei
仿真原理图如下
单片机源程序如下:
#include #include "lcd.h" #include #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define NACK 0 #define ACK 1 #define MEASURE_TEMP 0x03 //000 0001 1 #define MEASURE_HUMI 0x05 //000 0010 1 #define STATUS_REG_W 0x06 //000 0011 0 #define STATUS_REG_R 0x07 //000 0011 1 #define RESET 0x1E //000 1111 0 ulong volt;//测量的电压值 sbit Data=P2^3; //定义数据线 sbit CLK=P3^3;//定义时钟信号口 sbit DIN=P3^1;//定义2543数据写入口 sbit DOUT=P3^0;//定义2543数据读取口 sbit CS=P3^2;//定义2543片选信号口 sbit Data_P = P2^4; // SHT11传感器的数据管脚 sbit Sck_P = P2^3; // SHT11传感器的时钟管脚 sbit BEEP =P2^5; uchar tmpe,h; uchar rec_dat[9]; //用于显示的接收数据数组 uchar temp_max = 30; uchar humi_min = 60; ulong C2_max = 3500000; ulong LUX_max = 3500000; ulong C2_now = 0; ulong LUX_now = 0; unsigned char temp; // 保存温度 unsigned char humi; // 保存湿度 enum { TEMP,HUMI }; typedef union //定义共用同类型 { unsigned int i; float f; }value; int display = 0; void delay(uchar ms) { // 延时子程序 uchar i; while(ms--) { for(i = 0;i<250;i++); } } char ShtWriteByte(unsigned char value) { unsigned char i,error=0; for(i=128;i>0;i>>=1) // 高位为1,循环右移 { if (i&value) Data_P=1; // 和要发送的数相与,结果为发送的位 else Data_P=0; Sck_P=1; _nop_(); // 延时3us _nop_(); _nop_(); Sck_P=0; } Data_P=1; // 释放数据线 Sck_P=1; error=Data_P; // 检查应答信号,确认通讯正常 _nop_(); _nop_(); _nop_(); Sck_P=0; Data_P=1; return error; // error=1 通讯错误 } char ShtReadByte(unsigned char ack) { unsigned char i,val=0; Data_P=1; // 释放数据线 for(i=0x80;i>0;i>>=1) // 高位为1,循环右移 { Sck_P=1; if(Data_P) val=(val|i); // 读一位数据线的值 Sck_P=0; } Data_P=!ack; // 如果是校验,读取完后结束通讯 Sck_P=1; _nop_(); // 延时3us _nop_(); _nop_(); Sck_P=0; _nop_(); _nop_(); _nop_(); Data_P=1; // 释放数据线 return val; } void ShtTransStart(void) { Data_P=1; Sck_P=0; _nop_(); Sck_P=1; _nop_(); Data_P=0; _nop_(); Sck_P=0; _nop_(); _nop_(); _nop_(); Sck_P=1; _nop_(); Data_P=1; _nop_(); Sck_P=0; } void ShtConnectReset(void) { unsigned char i; Data_P=1; //准备 Sck_P=0; for(i=0;i<9;i++) //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位 { Sck_P=1; Sck_P=0; } ShtTransStart(); //启动传输 } char ShtMeasure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) { unsigned error=0; unsigned int i; ShtTransStart(); // 启动传输 switch(mode) // 选择发送命令 { case 1 : // 测量温度 error+=ShtWriteByte(0x03); break; case 2 : // 测量湿度 error+=ShtWriteByte(0x05); break; default: break; } for(i=0;i<65535;i++) if(Data_P==0) break; // 等待测量结束 if(Data_P) error+=1; // 如果长时间数据线没有拉低,说明测量错误 *(p_value) =ShtReadByte(1); // 读第一个字节,高字节 (MSB) *(p_value+1)=ShtReadByte(1); // 读第二个字节,低字节 (LSB) *p_checksum =ShtReadByte(0); // read CRC校验码 return error; // error=1 通讯错误 } void CalcSHT11(float *p_humidity ,float *p_temperature)
史海拾趣
|
内容简介: 本书由浅入深地介绍了C++语言的各个方面,并在所涉及的各个知识点给出了详细的例子,使读者能够更容易了解C++语言的内容。无论读者是从未接触过 C++语言的新手,还是对C++语言有一定经验的开发人员,本书都能使你对这门编程语言有全 ...… 查看全部问答> |
|
#include #include \"taskLib.h\" #include \"locale.h\" #include \"string.h\" #include \"stdlib.h\" #include \"Vxworks.h\" //#include \"configAll.h\" #include \"dosFsLib.h\" #include \"sioLib.h\" #include \"stdio.h\" /* ...… 查看全部问答> |
|
我的s3c2410开发板的BANK3上接了一块cs8900, 我用的是IO模式, 中断接收方式, 相关寄存器的初始化如下: put_reg(PP_RxCFG, get_reg(PP_RxCFG) | RxOKiE | BufferCRC );   ...… 查看全部问答> |
|
我想用单片机产生一个频率可程控按指数衰减的正弦信号, 我的思想是:用DDS产生可程控频率的正弦信号; 用单片机产生指数信号,在将两信号经过乘法器 进行调幅得到频率可程控按指数衰减的正弦信号 请问可行吗? ...… 查看全部问答> |
|
项目大楷要求: 1,可以使用TI的LM3S9B90 ARM 2,ARM通过外部总线连接一个ALTER公司FPGA 3,整个流程 PC通过100M网络传送打印数据到ARM,ARM通过外部总线传送到FPGA外扩的64M SDRAM中,后面的工作依靠FPGA从SDRAM中取出数 ...… 查看全部问答> |
|
(已解决)C编写的延时60S的程序,但是软件仿真延时不到1S 谢谢大家的鼎力相助和给力支持~~!我已经找到错误所在,就是少了个中断函数,应该加个void timer0() interrupt1 的函数,然后把定时器设定放在里面。只是这样的话就没有用delay函数来的方便,而且定时器中断不能反复调用,个人觉得没有delay的调 ...… 查看全部问答> |




