温湿度测试实验报告

简易环境参数测试仪设计总结报告

目录:

1. 系统方案………………………………………………………………

1.1方案论证……………………………………………………………

1.2方案选定

1.3系统设计………………………………………………………………

1.4结构框图………………………………………………………………

2. 理论分析与计算………………………………………………

2.1测量与控制方法…………………………………………………………

2.2理论计算……………………………………………………………………

3.电路与程序设计…………………………………………………………………

3.1硬件电路各模块或单元电路的设计

3.2检测与驱动电路设计…………………………………………………………

3.3总体电路设计…………………………………………………………………

3.4软件设计与流程图…………………………………………………………… 4. 结果分析…………………………………………………………………………

4.1与设计指标进行比较,分析产生偏差的原因,并提出改进方法………………

1. 系统方案

1.1方案论证

方案1:温湿度传感器采用传统的模拟式器件,使用光敏电阻测光照,利用单片机进行显示与按键。

方案2:温湿度采用集成式器件,使用光敏电阻测光照,利用单片机进行显示与按键。

方案3:温湿度传感器采用数字式器件,使用光敏传感器,再通过单片机进行显示与按键。 方案论证:比较三种方案,在传感器的选择上,模拟传感器的模拟信号要先经过采样、放大和模数转换电路处理,再将转换得到的表示温度值的数字信号交由微处理器或DSP处理。被测量信号从敏感元件接收的非物理量开始到转换微处理器可处理的数字信号之间。而且模拟信号在传输的过程中容易受到干扰而产生误差。而且魔术转换的精度不可能很高,存在一定的非线性,互换性较差。直接采用数字数传感器就可以避免以上的问题。数字传感器可以直接将被测模拟量直接换成数字量输出,具有很强的抗干扰能力,且具有高的精度和分辨率,稳定性好,信号易处理。其次在光照方面光敏电阻达不到要求故选择光敏传感器。

1.2方案选定:选择方案三

1.3系统设计: 以AT89S52 为核心的单片机。系统整体硬件电路包括,电源电路,传感器电路,温度显示电路,上下限报警电路等。温湿度控制的基本原理为:当DSl8B20 采集到温度信号后,将温度信号送至AT89S52 中处理,同时将温度送到LCD 液晶屏显示,单片机根据初始化设置的温度上下限进行判断处理,即如果温度大于所设的最高温度就启动风扇降温;如果温度小于所设定的最低温度就启动报警装置。同时通过按键对温湿度进行调整与确认。检测光照。

1.4结构框图

温湿度测试实验报告

3.电路与程序设计

3.1硬件电路各模块或单元电路的设计

3.1. 1温度单元模块

DS18B20的特点:

(1) 有独特的单线接口方式。DSl820 在与微处理器连接时仅需要一条接口

线即可实现微处理器与DSl820 的双向通讯。

(2) 多点功能简化了分布式温度检测的应用。

(3) DSl820 在使用中无需任何外围元件。

(4) 可用数据线供电,电压范围从3.0V 到5.5V。

(5) 可测量的温度范围从-55℃到+125℃,增量值0. 5℃;华氏温度范围从

-67 到+257,增量值0.9。

(6)

(7) 支持多点组网功能。多个DS1820 可以并接在同一条总线上,实现多点

测温。

(8) 位的温度分辨率。测量结果以9 位数字量方式串行传送。

(9) 用户可设定温度报警门限值。(9)有超温度搜寻功能

同时DS18B20 的1 脚接地,2 脚(DQ 引脚)与AT89S52 的一根I/O 口线相连,3 脚接+5V。在A89S52 的I/O 口线与+5V 之间连接一4.7K 的上拉电阻,以保证数据采集的正常进行。若要组成多点温度检测系统,可在单片机的同一根I/O 口线上,以相同的连接方法并联多片DS18B20 芯片。

3.1.2. 湿度单元模块

DHT11数字式温湿度传感器是一款含有已校准数字信号输出的温湿度复

合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选择。 3.1.3.光照模块

BH1710FVC光照传感器,是一个六个引脚的芯片,是一个体积很小的芯片,

有一定的温度范围,大概在-30到85摄氏度左右,对应大范围的输入光(1-65,536勒克斯相当,内置A/D转换器,无需外接部件消耗功率为同类产品的1/2,对分光感应特性非常灵敏。

3.1.4.单片机模块

89C52是INTEL公司MCS-51系列单片机中基本的产品,它采用

INTEL公司可靠的CHMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。它结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于80C51增强型单片机版本,集成了时钟输出和向上或向下计数器等更多的功能,适合于类似马达控制等应用场合。80C52内置8位中样处理单元、256字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输

入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。此外,89C52还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能。

3.1.5.LCD1602 液晶屏

1602 液晶显示模块可以和单片机AT89S52 直接接口。

3.1. 6.蜂鸣器驱动电路

由于蜂鸣器的工作电流一般比较大,以致于单片机的I/O 口是无法直接驱动的,所以要利用放大电路来驱动,一般使用三极管来放大电流就可以了。当所测的温度低于6 摄氏度时,报警。

3.1.7 电源模块

采用220V、50Hz交流电源供电。采用此方案,必须搭建一个由变压器,桥式整流电路,滤波电路,稳压电路组成的电源电路,其复杂度会超出方案一的设计。虽然220V的电源会带来一定的危险,但是此方案的优点是不用担心因电源电压下降而影响系统正常工作的问题。

3.2理论分析

同上

计算

3.3总体电路设计

温湿度测试实验报告

原器件清单:

见附件

3.4软件设计 流程图:

主函数—显示—按键—温度—湿度—光照—蜂鸣器—继电器 程序:

温湿度测试实验报告

 

第二篇:白盒测试实验报告

实验二:白盒软件测试

一、实验目的

通过简单程序白盒测试,熟悉测试过程,对软件测试行程初步了解,并养成良好的测试习惯。熟练掌握如何运用基路径测试方法进行测试用例设计,初步熟悉如何利用程序插装技术进行逻辑覆盖率分析。

二、实验内容

背景

被测测试程序功能:计算被输入日期是星期几;

程序定义:已知公元1年1月1日是星期一,只要输入年月日,能自动回复当天是星期几;

测试环境:Windows vista、Dev C++;

说明:本次测试采用插装测试法,由于程序简单,手动输入测试用例。

程序说明

A程序思路:计算输入日期与公元1年1月1日所相差的天数,具体如下:总天数=公元1年到输入日期上一年年底天数+输入年份的1月到上月月底天数+输入日期的天数

B闰年满足条件(year%4==0)&&(year%100!=0)||(year%400==0)

(1)分析各种输入情况,结合程序输出结果,进行等价类划分,并给出详细测试用例;

(2)根据(1)所划分的等价类,进行边界值分析,并给出具体的测试用例;

(3)决策表测试法;

    ①列出输入变量month、 day、 year的有效等价类;(条件桩)

    ②分析程序的规格说明,给出问题规定的可能采取操作;(动作桩)

    ③画出决策表(简化);

    ④根据决策表,给出详细测试用例。

代码:(被测部分为while循环内部语句)

#include <iostream>

using namespace std;

int main()

{

         int x=1,year, month, day;

         while(x)

         {

         1.int i, num=0,total, total1, total2;

         2.cout<<"请输入年份: ";

         3.cin>>year;

         4.cout<<"请输入月份: ";

         5.cin>>month;

         6.cout<<"请输入日期: ";

         7.cin>>day;

//求得输入年份之前一年末的总天数

         8.for(i=1; i<year; i++)

         {

                   9.if((i%4==0)&&(i%100!=0)||(i%400==0))

                            10.num++;

         }

         11.total1 = 365*(year-num-1) + 366*num;

//求得输入年份的总天数

         12.if((year%4==0)&&(year%100!=0)||(year%400==0))

         {

//求得输入月份之前一月末的总天数

                   13.switch(month)

                   {       

                            case 1:total2 = 0;break;

                            case 2:total2 = 31;break;

                            case 3:total2 = 60;break;

                            case 4:total2 = 91;break;

                            case 5:total2 = 121;break;

                            case 6:total2 = 152;break;

                            case 7:total2 = 182;break;

                            case 8:total2 = 213;break;

                            case 9:total2 = 244;break;

                            case 10:total2 = 274;break;

                            case 11:total2 = 305;break;

                            case 12:total2 = 335;break;

                   }

         }

         else

         {

                   14.switch(month)

                   {

                            case 1:total2 = 0;break;

                            case 2:total2 = 31;break;

                            case 3:total2 = 59;break;

                            case 4:total2 = 90;break;

                            case 5:total2 = 120;break;

                            case 6:total2 = 151;break;

                            case 7:total2 = 181;break;

                            case 8:total2 = 212;break;

                            case 9:total2 = 243;break;

                            case 10:total2 = 273;break;

                            case 11:total2 = 304;break;

                            case 12:total2 = 334;break;

                   }

         }

//在加上输入的日,求其总和可得到从公元1年1月1日到输入日期当天的总天数

         15.total = total1 + total2 + day;

         16.int week;

    17. week = total % 7;

         18.cout<<"您输入的日期是";

         19.switch(week)

         {

             case 0:cout<<"星期天"<<endl;break;

             case 1:cout<<"星期一"<<endl;break;

            case 2:cout<<"星期二"<<endl;break;

             case 3:cout<<"星期三"<<endl;break;

             case 4:cout<<"星期四"<<endl;break;

             case 5:cout<<"星期五"<<endl;break;

                   case 6:cout<<"星期六"<<endl;break;

         }

         cout<<"**********退出程序请输入0,否则任一输入继续**********"<<endl;

         cin>>x;

         }

}

2、测试用例设计

1)控制流图

2)环路复杂度计算

由图可知,图中的环路有六条,故环路复杂度为六。

3)基本路径集设计

基本路径集为:

A.1、2、3、4、5、6、7、8、11、12、14、15、16、17、18、19

B.1、2、3、4、5、6、7、8、9、11、12、14、15、16、17、18、19

C.1、2、3、4、5、6、7、8、9、10、11、12、13、15、16、17、18、19

D.1、2、3、4、5、6、7、8、9、10、11、12、14、15、16、17、18、19

注:由源程序代码可知,未走路径10则必定不通过路径13,故省去两条检测路径。

4)测试用例集设计

测试用例集为:

A路径:1-2-26  预期输出:星期一

B路径:2-2-2  预期输出:星期六

C路径:20##-11-16  预期输出:星期二

D路径:20##-8-6  预期输出:星期三

3、插装后源程序清单与判定覆盖率分析结果

#include <iostream>

using namespace std;

int main()

{

         int x=1,year, month, day;

    int m1=0,m2=0,m3=0,m4=0,m=15,n=0,f=0;

        

         while(x)

         {

    n++;

         cout<<"=====请输入测试用例====="<<endl;

         int i, num=0,total, total1, total2,qw;

         cout<<"请输入年份: ";

         cin>>year;

         cout<<"请输入月份: ";

         cin>>month;

         cout<<"请输入日期: ";

         cin>>day;

    cout<<"请输入预期输出结果(星期一到星期天,对应输入1~7):";

    cin>>qw;

         cout<<"程序运行路径:  1->2->3->4->5->6->7->8";

         for(i=1; i<year; i++)

         {

                   if((i%4==0)&&(i%100!=0)||(i%400==0))

                            num++;

         }

         if(i>1)

    {

           cout<<"->9";

           if(m1==0){m++;m1=1;}

    }

         if(num>0)

    {

             cout<<"->10";

             if(m2==0){m++;m2=1;}

    }

         total1 = 365*(year-num-1) + 366*num;

         cout<<"->11->12";

         if((year%4==0)&&(year%100!=0)||(year%400==0))

         {

        cout<<"->13";if(m3==0){m++;m3=1;}

                   switch(month)

                   {       

                            case 1:total2 = 0;break;

                            case 2:total2 = 31;break;

                            case 3:total2 = 60;break;

                            case 4:total2 = 91;break;

                            case 5:total2 = 121;break;

                            case 6:total2 = 152;break;

                            case 7:total2 = 182;break;

                            case 8:total2 = 213;break;

                            case 9:total2 = 244;break;

                            case 10:total2 = 274;break;

                            case 11:total2 = 305;break;

                            case 12:total2 = 335;break;

                   }

         }

         else

         {

        cout<<"->14";if(m4==0){m++;m4=1;}

                   switch(month)

                   {

                            case 1:total2 = 0;break;

                            case 2:total2 = 31;break;

                            case 3:total2 = 59;break;

                            case 4:total2 = 90;break;

                            case 5:total2 = 120;break;

                            case 6:total2 = 151;break;

                            case 7:total2 = 181;break;

                            case 8:total2 = 212;break;

                            case 9:total2 = 243;break;

                            case 10:total2 = 273;break;

                            case 11:total2 = 304;break;

                            case 12:total2 = 334;break;

                   }

         }

    cout<<"->15->16->17->18->19"<<endl;

         total = total1 + total2 + day;

         int week;

    week = total % 7;

         cout<<"-----该测试用例测试结果-----"<<endl;

    cout<<endl;

         cout<<"测试用例"<<n<<" : 输入"<<year<<"."<<month<<"."<<day<<", 预期输出为:";

         switch(qw%7)

         {

             case 0:cout<<"星期天, ";break;

             case 1:cout<<"星期一, ";break;

            case 2:cout<<"星期二, ";break;

             case 3:cout<<"星期三, ";break;

             case 4:cout<<"星期四, ";break;

             case 5:cout<<"星期五, ";break;

                   case 6:cout<<"星期六, ";break;

         }

         cout<<"实际输出为:";

         switch(week)

         {

             case 0:cout<<"星期天, ";break;

             case 1:cout<<"星期一, ";break;

            case 2:cout<<"星期二, ";break;

             case 3:cout<<"星期三, ";break;

             case 4:cout<<"星期四, ";break;

             case 5:cout<<"星期五, ";break;

                   case 6:cout<<"星期六, ";break;

         }

         if(week==qw%7) cout<<"成功!"<<endl;

         else

    {

        cout<<"失败!"<<endl;

        f++;

    }

    cout<<endl;

         cout<<"=====本次测试用例测试已结束,退出测试请输入0,否则任一输入继续测试====="<<endl;

         cin>>x;

         }

    cout<<"最终对main函数中while内循环语句单元测试结果统计:"<<endl;;

         cout<<"共执行"<<n<<"个测试用例, 总的路径覆盖率:"<<m*100/19<<"%, 其中通过"<<n-f<<"个, 失败"<<f<<"个"<<endl;

}

测试截图见附录

三、总结与体会

实验中对于路径测试有了更深的理解,可以更好、更迅速的去划分路径,设计测试用例。通过实验,我对软件测试有了进一步的认识和学习,对白盒测试流程有了较清楚的了解,收获很多。

四、附录