《单片机接口设计》 环境测试仪
实验报告
专业:电气与电子工程学院 班级:电1401—2 学号:20142525 姓名:吕坤 指导教师:何朝峰 完成日期:20160905
摘要 随着科技的不断发展,在人们的生活日益提高的同时,也带来了不可忽视的环境方面的问题,人们生活品味不断提高,健康意识越来越受到重视。所以周边环境的质量成了人们议论的话题,现在市面上的各种监测仪多的数不胜数,基于此,我设计了一个基于宏晶单片机STC12C5A60S2、DHT12传感器、热释电红外传感器模块、GP2Y1010AU0F监测仪的一个可便携式的可智能显示的环境测试仪,可以随时随地检测周围环境的温度、湿度以及PM2.5颗粒浓度,让我们能方便观察周围的环境状况,对周围环境做出正确的判断,此设计电路简单,器件少,程序系统,很便于学习和应用。 关键词 STC12C5A60S2、DHT12、GP2Y1010AU0F、热释电红外传感器、环境测试
一、设计题目: 环境监测仪 二、设计目的: 随着科技的不断发展,在人们的生活日益提高的同时,也带来了不可忽视的环境方面的问题,人们生活品味不断提高,健康意识越来越受到重视。所以周边环境的质量成了人们议论的话题,现在市面上的各种监测仪多的数不胜数,基于此,我设计了一个基于宏晶单片机STC12C5A60S2、蓝宙oled、DHT12传感器、GP2Y1010AU0F监测仪的一个可便携式的智能显示的环境测试仪,可以随时随地检测周围环境的温度、湿度以及PM2.5颗粒浓度,让我们能方便观察周围的环境状况,对周围环境做出正确的判断,此设计电路简单,器件少,程序系统,很便于学习和应用。 三、设计任务: 根据硬件连接,和编程互补,达到用stc单片机控制DHT12与GP2Y1010AU0F两个传感器达到各自的功能要求,采集到各自的数据,供单片机调用再通过蓝宙oled显示出温度,湿度,pm2.5粉尘浓度值,可以直观地被我们所看到。 四、所用器件: USB电源、单排插针、10kΩ20kΩ电阻若干、33pF电容、12MHz晶振、22uF电容、220uF电容、DHT12传感器、8050三极管、GP2Y1010AU0F传感器、蓝宙oled屏幕、热释电红外传感器、STC12C5A60S2传感器。 五、电路方案设计 电源供电模块
最小系统模块以及oled模块 两个主要传感器模块 PCB以及电路板3D板模型生成
实物图 六、实验模块程序 在焊接完电路以后,就开始进入调试步骤下面是一些模块的大致程序 (由于程序过多,只提及各模块主程序部分) - //**************pm2.5主程序***************//
- //****单片机产生时序,然后副机发出回应信号,然后再AD取样,再进行数据转换,发送给主函数****//
- for(i=0;i<5;i++)
- {PM2_5=0;
- Delay9800us();
- PM2_5=1;
- Delay270us();
- k=!k;
- ADC_CONTR|=0x08;//启动A/D转换
- status=0;
- while(status==0)//等待A/D转换结束
- {status=ADC_CONTR&0x10;}
- ADC_CONTR&=0xE7;//将ADC_FLAG清0
- result=ADC_RES;
- if(result<31)
- {result=0;}
- VAL =result*5/256;// 将上面的数字量转换成电压值
- Density = (VAL*0.17 -0.1)*1000;//放大数值一千倍
- if(Density<0)//有符号禁止出现负号
- {Density=0;}
- Delay_30us();
- //UARTT(Density);//串口调试送数值显示
- }
- }
- //***********AD采集**********//ad初始化准备捕捉
- void GETPM()
- { unsigned long i;
- unsigned char status;
- ADC_CONTR|=0x80;//开A/D转换电源,第一次使用时要打开内部模拟电源
- for(i=0;i<1000;i++);//适当延时
- P1ASF=0x04;//选择A/D转换通道
- //UARTInit();
- ADC_CONTR=0xE2;
- for(i=0;i<1000;i++);//适当延时
- *****************************dht12主程序以及校验***************************************
- 函数名:DHT12读数据函数
- 参 数:无
- 返回值:失败->-1,-2,-3,-4;成功->0
- **********************************************************************************************/
- char GetData (void)
- { uchar i,j; //for循环变量
- uchar t; //超时判断
- uchar dat8=0; //一次读取的8位数据,需要读5次
-
- DATA = 0; //主机发起始信号
- Delay20ms(); //主机拉低总线至少18ms
- DATA = 1; //主机拉高总线20~40us
- Delay30us();
- t = 80; //设置超时等待时间
- while(DATA && t--); //等待DHT11拉低总线
- if(t == 0) //超时
- {
- DATA = 1;
- return -1; //通信错误退出,返回错误信号:-1
- }
-
- //等80us响应信号
- t = 250; //设置超时等待时间
- while(!DATA && t--); //等待DHT11拉高总线
- if(t == 0) //超时
- {
- DATA = 1;
- return -2; //通信错误退出,返回错误信号:-2
- }
-
- //等80us响应信号
- t = 250; //设置超时等待时间
- while(DATA && t--); //等待DHT11拉低总线
- if(t == 0) //超时
- {
- DATA = 1;
- return -3; //通信错误退出,返回错误信号:-3
- }
-
- for(j=0; j<5; j++) //5次读取
- {
- for(i=0; i<8; i++) //1次8个位
- {
- //等待50us开始时隙
- t = 150; //设置超时等待时间
- while(!DATA && t--); //等待DHT11拉高总线
- if(t == 0) //超时
- { DATA = 1;
- return -4; //通信错误退出,返回错误信号:-4
- }
- t = 0; //记录时间清零
- while(DATA && ++t); //等待并记录高电平持续时间
- dat8 <<= 1;
- if(t > JUDGE) //高电平持续时间较长(70us)
- dat8 += 1; //传输值为1
- }
- dat_r[j] = dat8;
- }
- Delay30us(); //等待DHT11拉低50us
- Delay30us();
- DATA = 1; //结束,拉高总线
- return 0; //返回成功信号
- }
- //************校验函数************//
- char Check (void)
- { uchar i; //for循环变量
- uint chk=0; //校验和
- for(i=0; i<4; i++)
- chk += dat_r[i]; //累加
- if((uchar)chk != dat_r[4]) //比对
- return -1; //返回错误信号:-1
- else
- return 0; //返回正确信号:0
- }
-
- /********************读值函数************************/
- void duTH(void)
- {
- char i,f;
- // UART_Init(); //串口初始化
- Delay1s(); //等待DHT11稳定
- for(f=0;f<2;f++)
- {
- i = GetData(); //读数据
- if(i != 0) //有错误
- {
- // UART_T(-i); //返回错误值
- break; //重新开始
- }
-
- i = Check(); //数据校验
- if(i != 0) //有错误
- {
- //UART_T(-i); //返回错误值
- break; } //重新开始
-
- sg=dat_r[0];
- wg=dat_r[2];
- Delay20ms();
- Delay20ms();
- Delay20ms();
- Delay20ms();
- Delay20ms();
- }
- }
- /**************************oled主函数*******************************/
- int main(void)
- { //u8 t;
- //delay_init(); //延时函数初始化
- // NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 LED_Init(); //LED端口初始化
- OLED_Init(); //初始化OLED
- OLED_Clear() ;
- while(1)
- {//OLED_Clear();
- duTH();
- GETPM();
- XS(); //读温湿度函数的wg,sg,}
- void XS(void) /////显示函数
- { OLED_ShowCHinese(0,0,0);//石 (显示的每行数y加2,列数x可根据需要进行调节)
- OLED_ShowCHinese(18,0,1);//家
- OLED_ShowCHinese(36,0,2);//庄
- OLED_ShowCHinese(54,0,3);//铁
- OLED_ShowCHinese(72,0,4);//道
- OLED_ShowCHinese(90,0,5);//大
- OLED_ShowCHinese(108,0,6);//学
- OLED_ShowCHinese(42,6,7);//℃
- // OLED_ShowString(0,2,"1.3' OLED TEST");
- OLED_ShowString(14,2,"2016/09/01/4"); //2016/08/22/5
- OLED_ShowString(2,4,"PM2.5:");//PM2.5:
- OLED_ShowString(86,4,"ug/m3");//ug/m3
- OLED_ShowString(0,6,"T:"); // T:
- OLED_ShowString(65,6,"H:");// H:
- OLED_ShowString(104,6,"%");// %
- OLED_ShowNum(60,4,Density,3,16);
- OLED_ShowNum(18,6,wg,3,16); //变量温度高位(整数位)的显示
- OLED_ShowNum(80,6,sg,3,16); } // 变量湿度高位(整数位)的显示 */
复制代码
七、实验过程及其结果(部分截图)分别是(1)pm2.5采样时刻与AD采集(2)pm2.5信号激发和产生(3)采集产生信号的间断信号(4)DHT11输出的一组数据波形时序 八、实验总结与心得 这次设计用了很多的时间,尤其是设计和编程部分,要考虑各种电压电流大小合适,调各种时序,要收集各种数据,还要根据数据做出函数,在过程中会用到不同的软件与工具,还有各种的仪器,在这次制作中,几乎所有的东西都要熟悉再汇运用,真的让自己在这个过程中不仅学会耐心,细心,恒心,重要的是一种态度,一种方法,一种认真。希望以后自己可以不断提高。
附录 主要器件简介 蓝宙OLED 简介: OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD),其显示技术与传统的LCD显示方式不同,无需背光源,而是采用很薄的有机材料涂层和玻璃基板,当电流流过时,有材料自己发光,相比传统LCD显示屏,其更轻更薄,可视角度更大,柔软环保且更省电。因为具备轻薄、省电等特性,因此从 2003年开始,这种显示设备在MP3播放器上得到了广泛应用,而对于同属数码类产品的DC 与手机,此前只是在一些展会上展示过采用 OLED屏幕的工程样品。自2007年后,寿命得到很大提高,具备了许多 LCD 不可比拟的优势。 DHT12简介: DHT12 数字式温湿度传感器是一款含有已校准数字信号输出的温湿度复合型传感器,为 DHT11 的升级产品。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有较高的可靠性与卓越的长期稳定性。 应用:暖通空调 、除湿器、测试及检测设备、消费品、汽车 、自动控制、数据记录器、气象站、家电、湿度调节、医疗 、及其他相关湿度检测控制。 DHT12 具有单总线和标准 I2C 两种通讯,且单总线通讯方式完全兼容 DHT11。标准单总线接口,使系统集成变得简易快捷。具有超小的体积、较低的功耗,适合多种多样的应用场合。I2C 通信方式采用标准的通信时序,用户可直接挂在 I2C 通信总线上,无需额外布线,使用简单。两种通信方式可自由切换,用户可自由选择使用方便,应该领域广泛。产品为 4 引线,连接方便,特殊封装形式可根据用户需求而提供。 Pm2.5传感器简介: GP2Y1010AU0F是一款光学空气质量传感器,设计用来感应空气中的尘埃粒子,其内部对角安放着红外线发光二极管和光电晶体管,使得其能够探测到空气中尘埃反射光,即使非常细小的如烟草烟雾颗粒也能够被检测到,通常在空气净化系统中应用。 该传感器具有非常低的电流消耗(最大20mA,典型值11mA),可使用高达7VDC。该传感器输出为模拟电压,其值与粉尘浓度成正比。 参考文献: 百度百科、百度文库、百度贴吧 郭天祥视频教程 Altium Designer快速入门 模拟电子技术基础简明教程 C语言程序设计
|