基于51单片机光照强度检测系统
介绍
本设计采用单片机作为数据处理与控制单元,为了进行数据处理,通过光敏电阻来感应光强弱变化,经过ADC0804转换,直接将数字信号送入到单片机中进行数据处理。单片机数据处理之后,将光照强度发送到LCD进行显示,并通过和LCD进行声光。
硬件仿真
控制主程序
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; // 和要发送的数相与,结果为发送的位elseData_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)
{const float C1=-4.0; // 12位湿度精度 修正公式const float C2=+0.0405; // 12位湿度精度 修正公式const float C3=-0.0000028; // 12位湿度精度 修正公式const float T1=+0.01; // 14位温度精度 5V条件 修正公式const float T2=+0.00008; // 14位温度精度 5V条件 修正公式float rh=*p_humidity; // rh: 12位 湿度float t=*p_temperature; // t: 14位 温度float rh_lin; // rh_lin: 湿度 linear值float rh_true; // rh_true: 湿度 ture值float t_C; // t_C : 温度 ℃t_C=t*0.01 - 40; //补偿温度rh_lin=C3*rh*rh + C2*rh + C1; //相对湿度非线性补偿rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相对湿度对于温度依赖性补偿*p_temperature=t_C; //返回温度结果*p_humidity=rh_true; //返回湿度结果
}unsigned char TempCorrect(int temp)
{if(temp<0) temp=0;if(temp>970) temp=970;if(temp>235) temp=temp+10;if(temp>555) temp=temp+10;if(temp>875) temp=temp+10;temp=(temp%1000)/10;return temp;
}unsigned char HumiCorrect(unsigned int humi)
{if(humi>999) humi=999;if((humi>490)&&(humi<951)) humi=humi-10;humi=(humi%1000)/10;return humi+4;
}void ReadShtData()
{value humi_val,temp_val; // 定义两个共同体,一个用于湿度,一个用于温度unsigned char error; // 用于检验是否出现错误unsigned char checksum; // CRCunsigned int temp1,humi1; // 临时读取到的温湿度数据error=0; //初始化error=0,即没有错误error+=ShtMeasure((unsigned char*)&temp_val.i,&checksum,1); //温度测量error+=ShtMeasure((unsigned char*)&humi_val.i,&checksum,2); //湿度测量if(error!=0) //如果发生错误,系统复位ShtConnectReset();else{humi_val.f=(float)humi_val.i; //转换为浮点数temp_val.f=(float)temp_val.i; //转换为浮点数CalcSHT11(&humi_val.f,&temp_val.f); //修正相对湿度及温度temp1=temp_val.f*10;temp=TempCorrect(temp1);humi1=humi_val.f*10-50;humi=HumiCorrect(humi1);humi1=humi1-1;}}void read2543(uchar addr)
{uint ad=0;uchar i;CLK=0;CS=0;//片选段,启动2543addr<<=4;//对地址位预处理for(i=0;i<12;i++) //12个时钟走完,完成一次读取测量{if(DOUT==1)ad=ad|0x01;//单片机读取ad数据DIN=addr&0x80;//2543读取测量地址位CLK=1;;;;//很短的延时CLK=0;//产生下降沿,产生时钟信号;;;addr<<=1;ad<<=1;//将数据移位准备下一位的读写}CS=1;//关2543ad>>=1;volt=ad;//取走转换结果volt=volt*1221;//例子的满量程为5V,转换分辩率为12位(2的12次方=4096) 。即最大值是255,5/4096=1221mV,即例子中的1V代表实际1221mV
}void main(void)
{LcdInit();ShtConnectReset();DisplayListChar(0,0,"tmpe:");DisplayListChar(8,0,"HR:");DisplayListChar(0,1,"LUX:");DisplayOneChar(5,1,'.');DisplayListChar(9,1,"C2:");DisplayOneChar(13,1,'.');while(1){ReadShtData();DisplayOneChar(11,0,(char)(humi/10+'0'));DisplayOneChar(12,0,(char)(humi%10+'0'));DisplayOneChar(5,0,(char)(temp/10+'0'));DisplayOneChar(6,0,(char)(temp%10+'0'));read2543(0);//调用2543驱动程序测量地址为LUX_now=volt;DisplayOneChar(4,1,(char)(volt/1000000+'0'));DisplayOneChar(6,1,(char)((volt/100000)%10+'0'));DisplayOneChar(7,1,(char)((volt/10000)%10+'0'));read2543(1);//调用2543驱动程序测量地址为C2_now=volt;DisplayOneChar(12,1,(char)(volt/1000000+'0'));DisplayOneChar(14,1,(char)((volt/100000)%10+'0'));DisplayOneChar(15,1,(char)((volt/10000)%10+'0'));if(LUX_now>LUX_max || C2_now>C2_max || humi<humi_min || temp>temp_max){BEEP=0;}else{BEEP=1;}}
}
需要完整程序私信!
基于51单片机光照强度检测系统相关推荐
- 基于51单片机的光照强度检测c语言程序,基于51单片机光照强度检测报告.doc
基于51单片机光照强度检测报告 课程设计报告 课程名称: 智能仪器课程设计 题 目: 基于51单片机的光照强度 摘要 光敏电阻测光强度系统,该系统可以自动检测光照强度的强弱并显示让人们知道此时光照强度 ...
- 单片机课程设计——基于51单片机温湿度检测系统的设计与实现
本文主要介绍了怎么使用51单片机最小系统板和温湿度传感器制作一个温湿度检测系统. 本次设计主要涉及了温湿度的测量.显示以及实现简单控制.硬件方面有五个模块,即STC89C52单片机主控模块.传感器模块 ...
- T045基于51单片机温湿度检测系统无线蓝牙传输Proteus仿真原理图PCB
功能: 0.本项目采用STC89C52作为单片机系统的控制MCU 1.系统内采用DHT11作为湿度传感器,支持温湿度检测上传 2.系统具备无线蓝牙模块,支持定时循环发送手机端当前的温湿度状态 3.采用 ...
- 51单片机计算机实物焊接,基于51单片机的最小系统焊接图 浅谈单片机最小系统...
本文主要是关于51单片机的相关介绍,并对基于51单片机的最小系统焊接进行了详尽的阐述. 单片机最小系统 单片机最小系统主要由电源.复位.振荡电路以及扩展部分等部分组成. 对于一个完整的电子设计来讲,首 ...
- 基于51单片机的温控系统
基于51单片机的温控系统 本文是基于STC89C52单片机的温度控制系统,主要由主控模块.显示模块及外围电路几个部分组成. 通过DS18B20检测外部温度,通过LCD1602显示,按键可调节上下限.当 ...
- 基于51单片机的电子温度计系统的设计与实现
设计一个基于51单片机的电子温度计系统,其采用STC12C5A60S2芯片作为控制中心,DS18B20温度传感器为测温元件,LCD为显示器件.硬件设计部分包括温度传感电路设计.温度控制电路设计及显示电 ...
- 基于51单片机的病房呼叫系统
基于51单片机的病房呼叫系统 声明:本系统仅仅是模拟基础功能,包括矩阵按键模块,数码管模块,蜂鸣器模块,独立按键模块,仅供学习使用.首先,考虑到51单片机开发板的矩阵按键只有4*4=16个,数码管显示 ...
- 基于51单片机的时钟系统
这一次带来的项目是课程设计级别的基于51单片机的时钟系统,本次的项目共有两种,一种是基础功能时钟,上电后自动从00-00-00开始计时,另一种加上了调时功能,上电后自动从00-00-00开始,当需要 ...
- 基于51单片机篮球计分系统
目录 一.项目功能概述 二.仿真 三.程序 四.论文 五.资料清单 资料下载地址:基于51单片机篮球计分系统 一.项目功能概述 液晶显示比赛时间.甲队和乙队的得分: 甲 甲队和乙队的得分分别有加1分 ...
最新文章
- 机器学习内卷化:博士数量激增,本硕毕业生有点慌 | reddit热议
- 程序员为什么不会修电脑?
- 三种方法实现Linux系统调用方法分享
- 成功解决sys:1: DtypeWarning: Columns (39,41,42,217) have mixed types.Specify dtype option on import or s
- python代码生成可执行程序_Python—脚本程序生成exe可执行程序(pyinstaller)
- jzoj6274-[NOIP提高组模拟1]梦境【贪心,堆】
- 鸿蒙有安卓内核吗,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪
- css背景图片添加url_CSS背景图片–如何向您的Div添加图片URL
- php位值,php中,如何取得一个整型值的低位和高位值?
- php中configuration,php configuration
- 【拓扑排序】排队-C++
- java使用rabbitmq
- 用java实现串匹配问题_java实现字符串匹配问题之求最大公共子串
- python目录和文件的基本操作_python学习笔记(七)——文件和目录操作
- BCM94360Z4刷蓝牙固件魔改, Mac真正免驱无线网卡,实现原装网卡一样完美黑苹果,啊哈哈
- vue获取麦克风_HTML5操作麦克风获取音频数据(WAV)的一些基础技能
- win7安装打印机 计算机,Win7如何安装网络打印机丨Win7安装网络打印机解决方法...
- gcc: libc: __ASSEMBLER__; Kernel: __ASSEMBLY__
- rabbitMQ概述/在springboot下测试五种模式
- java vbs_一键定位配置JAVA SDK 环境变量 VBS脚本全自动操作正式开源