甲醛浓度检测仪

  • IT技术
  • 2019-11-18
  • 人已阅读
简介只要求把 开始测量,数据存储,时间设置弄好就行,。通讯设置可以去掉。然后把“安徽建工学院”改成“常熟理工学院”把“机电学院工作室”去掉。就是这些要求。最后的是测得电压信号再转化一下甲醛的浓度。

只要求把 开始测量,数据存储,时间设置弄好就行,。通讯设置可以去掉。然后把“安徽建工学院”改成“常熟理工学院”把“机电学院工作室”去掉。就是这些要求。最后的是测得电压信号再转化一下甲醛的浓度。就ok 了。

 

 

 

 

 

 

 


5.1主界面显示图

 

二,系统接下来显示,4个基本操作功能,小对号为该操作显示项,如图5.2

 

 

 

 

 

 

 


5.2 功能界面

 

三,选择“开始测量”,单击“OK”键,便有下面测量选择界面,如图5.3

 

 

 

 

 

 

 


                       5.3 测量选择界面

,再按“OK”,则显示检测数据,范围0-10ppm.如图5.4

 

 



 

 

 

 


5.4测量界面显示图

五,4个功能的操作和演示是相同的,以下为“时间设置”显示图,如图5.5

 

 

 

 

 

 


5.5当前时间显示图

六,小结:本系统原先打算设计“开始测量”、“数据存储”、“时间设置”“通讯设置”等4个基本功能,后由于条件所限,我们并未做出全部的功能,但这次的毕业设计,收获还是很多的!今后我们会进一步进完善该系统。

源代码

附录二 检测主程序程序

 

#include <AT89X52.H>      //调用外函数//

#include <ctype.h>

#include <string.h>

#include <stdlib.h>

#include <stdio.h>

#include <math.h>

#include <LCD.h> /**********初始化CPU************/

void init_cpu()           //初始化cPu

{        EA=1;

       TR0=1;

       TR1=1;

www.zhulong.com说明: 38说明: 108说明: 108       TMOD=0x11;

       TH1=0x3c;

       TL1=0xb0;

}

/*void time1(void) interrupt 3 using 1

   {   

TH1=(65536-50000)/256;

       TL1=(65536-50000)%256;

        keyval=P1; 

} *                        //初始化CPU结束//

void main_menu_initial()             //LCD主菜单初始化.//

{

   main1_menu[0].menu_count=4;        //4个菜单项.//

   main1_menu[0].display=measurearray;   //定义一个”开始测量“数组//

   main1_menu[0].subs=NULL;   

   main1_menu[0].children_menus=measure_menu;    //当前菜单子菜单的指针

   main1_menu[0].parent_menus=NULL;

   ……                       //还有“数据存储”、“时间设置”……//

}

void measure_menu_initial()             //“开始测量”菜单设置//

{

    measure_menu[0].menu_count=2;

    measure_menu[0].display=qr;                 //开始测量函数确认.

    measure_menu[0].subs=start_measure_function;  //开始测量函数

    measure_menu[0].children_menus=NULL;

    measure_menu[0].parent_menus=main1_menu;

  

    measure_menu[1].menu_count=2;

www.zhulong.com说明: 66 measure_menu[1].display=qx;            //开始测量函数取消.

    measure_menu[1].subs=NULL;

    measure_menu[1].children_menus=NULL;

    measure_menu[1].parent_menus=main1_menu;

}

……    //还有void store_menu_initial()void time_menu_initial()//

void led_menu_pro()               {

   max_item=menu_led->menu_count;

   switch(keyval)

   {

       case 0: break;

       case 1:                 //向上键.

          if(user_choosen==0)

          {         

              user_choosen=max_item;

          }

          shuaxin=1;

          user_choosen--;

          break;

       }

……                  //向上”“向下”“确认”“取消//

if(shuaxin)               //是否需要刷新LCD标志位.

   {   Clr_Scr();

       shuaxin=0;

   }

       led_menu_show(); 

}

v oid led_menu_show()

{

www.zhulong.com说明: 88   uchar n;

   max_item=menu_led->menu_count;

   if (max_item>=4)               //菜单项为3则表示为主菜单.

   {            

       for(n=0;n<4;n++)

       {  draw_bmp(n*2,20,96,0,menu_led[n].display);

       }

       select_item(user_choosen);        //标记出当前菜单项.

   }

   else

   {

       switch(temp_choosen)

       {   case 0:

          draw_bmp(0,20,96,0,measurearray);     //开始测量数组//

              break;

          ……

             default:

              break;

       }

       for(n=0;n<max_item;n++)

       {

          draw_bmp((n+1)*2,20,32,0,menu_led[n].display);

       }

       select_item(user_choosen+1);    }   }    

void select_item(uchar n)

{

   draw_bmp(n*2,2,16,0,curflag);

 

void start_measure_function(void)        //开始测量函数//

{main_Menu();

}

……

 

/*----------------主函数-------------------*/

main()

 {

  init_cpu();

  Init_Clock();

  init_lcd();

  Disp_Img(FirstPage);

delay(2000);                 //延时//

ClockMsg();

 Refresh();

 delay(2500);

 Clr_Scr();

 main_Menu();

 Clr_Scr();

   main_menu_initial();

   measure_menu_initial();

   store_menu_initial();

   time_menu_initial();

   communication_menu_initial();

    while(1)

 {  keyval=get_key();               //读键.

   led_menu_pro();

}

 }              // 适当延时防止因为不断查忙而耗费大量CUP资源 //

 

 

 

说明: 66说明: 38附录三  ADC0832程序

 

#define uint unsigned int     //常量/变量定义//

uchar k,i,j;

float xdata lv;

sbit ADCS =P3^1;  //ADC0832 chip seclect   //接口定义//

……             //其它引脚略……

uchar xdata dsw[20];  //存放sprintf转换字符

uchar xdata value[149]; //点阵字符储存

uchar code table[]={    //字符查表

0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*".",0*/

……};//采集并返回

 

unsigned int Adc0832(unsigned char channel)     //AD转换,返回结果

{  

uchar i=0;

    uchar j;

    uint dat=0;

    uchar ndat=0;

 

    if(channel==0)channel=2;

    if(channel==1)channel=3;

    ADDI=1;

    _nop_();

    _nop_();

    ADCS=0;//拉低CS

    _nop_();

    _nop_();

    ADCLK=1;//拉高CLK

    _nop_();

www.zhulong.com说明: 38    _nop_();

    ADCLK=0;//拉低CLK,形成下降沿1

    _nop_();

    _nop_();

    ADCLK=1;//拉高CLK

    ADDI=channel&0x1;

    _nop_();

    _nop_();

    ADCLK=0;//拉低CLK,形成下降沿2

    _nop_();

    _nop_();

    ADCLK=1;//拉高CLK

    ADDI=(channel>>1)&0x1;

    _nop_();

    _nop_();

    ADCLK=0;//拉低CLK,形成下降沿3

    ADDI=1;//控制命令结束

    _nop_();

    _nop_();

    dat=0;

    for(i=0;i<8;i++)

    {

        dat|=ADDO;//收数据

        ADCLK=1;

        _nop_();

        _nop_();

        ADCLK=0;//形成一次时钟脉冲

        _nop_();

        _nop_();

        dat<<=1;

        if(i==7)dat|=ADDO;

www.zhulong.com说明: 108    } 

    for(i=0;i<8;i++)

    {

        j=0;

        j=j|ADDO;//收数据

        ADCLK=1;

        _nop_();

        _nop_();

        ADCLK=0;//形成一次时钟脉冲

        _nop_();

        _nop_();

        j=j<<7;

        ndat=ndat|j;

        if(i<7)ndat>>=1;

}

    ADCS=1;//拉低CS

    ADCLK=0;//拉低CLK

    ADDO=1;//拉高数据端,回到初始状态

    dat<<=8;

    dat|=ndat;

    return(dat);            //return ad k

}

/*----------------------点阵字符采集函数--------------------------*/

void tra(uchar *p)    //数组dsp[]里面的字符查询后,再储储存到另一个显示数组value[]

 

void  main_Menu()

 {   Clr_Scr();         // 先清屏 //

     CS2=1;CS1=0;

  hz_disp16(0,32,1,jiaquan); ……    //////////////////……

 

delay(2000);

  do{

 /* k=Adc0832(0);   //AD转换结果

    l=k/255.0*100.0;

    ltemp=floor(l);

    dsw[0]=ltemp/10;

    dsw[1]=ltemp%10;

//  sprintf(dsw,"%2.3f",l);

  // dsw[0]=1;

 switch(dsw[0])

 {

 case 0:

  sz_disp16(2,32,1,sz0);

  break;

  case 1:……sz_disp16(2,32,1,sz9);

}

 switch(dsw[1])

 {

 case 0:

  sz_disp16(2,40,1,sz0);

  break;

  case 1:……sz_disp16(2,40,1,sz9);

 } */

// sz_disp16(2,40,1,sz0);

   /*  tra(dsw);

     CS2=1;CS1=0;

     sz_disp16(2,56,1,value);   */

  }

  while(P1_3);

}

 

 

附录四 按键程序 

#define nullkey 0    //定义//

……

uchar get_key()     //读键//

{

  uchar pass,kcodebuf;

    static uchar lastkcode,keytime=0;  //定义为静态变量,外部不可见,但需要常驻内存.

    static uchar havekey=0;

    static uchar keylock=0;

      

    kcodebuf=P1 & 0xff;

    keytime++;

    if (kcodebuf!=lastkcode) keytime=0;

    if (kcodebuf==0xff)

   

{  havekey=0;

       keylock=0;

       keytime=0;

       pass=0;   }

   ……

 

    else pass=nusekey;

    lastkcode=kcodebuf;

 

return(pass);

/*uchar get_key()

    else pass=nusekey;

说明: 108

return(pass);

}   */

 

 

 

附录五 时钟程序

/*--------------------引脚连接-------------------------------------*/

sbit RST2 = P3^5;          // 复位线引脚 //

sbit CLK = P3^6;           // 时钟线引脚 //

……                    // 其它引脚略……

/*---------------定义时间日期显示缓存 ----------------------*/

unsigned char Curtime[7];

idata unsigned char day,sec,min,hour,date,month,year,hms,n,fla_cou;          

unsigned char code yejing[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};

/*------------------子函数声明 (时钟部分 )--------------*/

void InputByte(unsigned char Date);             

void WriteTo1302(unsigned char Addr,unsigned char Date);

ReadFrom1302(unsigned char Addr);

void SetTime(unsigned char *pSecDa);

void GetTime(unsigned char Curtime[]);

void Init_T0(void);

void FlashKey(void);

void Add(void);

void Init_Clock(void);

void Refresh(void);

void StartMenu(void)

/*------------------------时钟固定汉字显示-----------------------*/

void ClockMsg(void)

www.zhulong.com说明: 66说明: 108 {

 Clr_Scr();                  // 先清屏

 CS2=1;CS1=0;              // 左屏

 hz_disp16(1,32,1,xing);……  ////// 2// 0// //

 

CS2=0;CS1=1;              // 右屏

 hz_disp16(3,0,1,yue);……        ////////      

 }

 

 

 

 

 

/*----------------时钟部分-------------------------------*/

/*----------------函数:写入字节子函数-----------*/

void InputByte(unsigned char dat)

{

  unsigned char i;

  ACC = dat;

  for(i=8; i>0; i--)

   {

    IO = ACC0;     

    CLK = 1;          //下降沿写入数据//

    CLK = 0;

    ACC = ACC >> 1;

   }

 }

/*----------------函数:读出字节子函数-----------*/

OutputByte(void)      //上升沿读出数据//

……

/*----------------函数:设置初始时间-------------------*/

说明: 38void SetTime(unsigned char *pSecDa)

{ ……

  WriteTo1302(0x8e,0x00);          // 控制命令,WP=0,写操作 //

  for(i =7;i>0;i--)

   {

    WriteTo1302(Addr,*pSecDa);     // 秒 分 时 日 月 星期 年 //

    pSecDa++;

    Addr +=2;

   }

  WriteTo1302(0x8e,0x80);          // 控制命令,WP=1,写保护 //

 }                                                         

/*----------------函数:读取DS1302当前时间-------------------*/

void GetTime(void)

 { ……

   for (i=0;i<7;i++)

   { Curtime[i] = ReadFrom1302(Addr);      

    Addr += 2;

   }

  sec = Curtime[0];……  //Min//hour //day //date //month //year  }

 

/*----------------函数:初始化定时器T0子函数-------------------*/

void Init_T0(void)

 {

  TMOD=0x01;           //定时器T0,工作模式1//

  TH0=0x3c;             //50ms//

  ……

 }

/*----------------函数:产生闪烁信号子函数------------------------*/

void T0_flash(void) interrupt 1          // 中断程序,产生时钟秒信号 //

/*----------------函数:时间闪烁子函数----------------------------*/

/*----------------功能:选择确定闪烁位等待调整--------- -----*/

说明: 88void FlashKey(void)                 //闪烁子函数//

void Add(void)                     //调时子函数//

void Init_Clock(void)                //时钟初始化子函数//

void Refresh(void)                  //刷新显示子函数//

void Add(void)                     //调时子函数//

 {

  if(P1_2==0)                      //P0_2键进行时间调整//

   {

    while(P1_2==0)

     Refresh();

    if(KT==1)                      //检验可调标志位KT//

     {

      hms++;

      switch(n)

       {case 1:year=hms;break;  //根据n不同,返回给不同的位:n=1  -> 返回给小时位//

       ……}

if((sec&0x0f)==0x0a) {sec&=0xf0; sec+=0x10;}    // 如果秒位满十,向十秒位进一

  ……

      if(day==8) {day=1;}           // 如果星期满七,重新从星期一开始计 //

     

      if((sec&0xf0)==0x60) {sec&=0x0f;}     // 如果十秒位满六,清零 //

    

if(((date&0xf0)==0x30)&((date&0x0f)==0x02)) {date&=0x00;}

    if(((month&0xf0)==0x10)&((month&0x0f)==0x03)) {month&=0x00;}

    if((year&0xf0)==0xa0) {year&=0x0f;}

      Curtime[0] = sec;

      Curtime[1] = min;

      ……

www.zhulong.com      SetTime(&Curtime[0]);         // 将调整过后的时间值写入DS1302 //

     }

 

/ *-------------------------时钟初始化子函数----------------------------*/

void Init_Clock(void)

 {

  K1=1; K2=1; K3=1; K4=1; K5=1;

  K6=1; K7=1; KT=0; n=0;

  Init_T0();

 }

/*-------------------------- 刷新显示子函数--------------------------*/            

void Refresh(void)

 {

  GetTime();

  CS1=1;CS2=0;

  if(K6)

   { sz_disp16(5,40,1,shuzi[sec&0x0f]);       // 秒位 //

     sz_disp16(5,32,1,shuzi[sec>>4]); }       // 十秒位 //

  else

   { hz_disp16(5,32,1,kongbai2); }             // 秒位  十秒位 //

 

  if(K5)

   { sz_disp16(5,8,1,shuzi[min&0x0f]);        // 分钟位 //

     sz_disp16(5,0,1,shuzi[min>>4]); }        // 十分位 //

  else

   { hz_disp16(5,0,1,kongbai2); }

  /*-----------------------------状态判断于提示------------------------*/

www.zhulong.comvoid State(void)

{CS1=1;CS2=0;

if(KT==1)

   { hz_disp16(1,32,1,tiao);

      hz_disp16(1,48,1,shi2);}

  else

   { hz_disp16(1,32,1,kongbai2);

      hz_disp16(1,48,1,kongbai2); }

 

 

附录六 液晶程序

/*--------------------------位定义--------------------------*/

sbit RST = P2^0;           // 复位端 //

sbit E   = P2^1;           // 使能端 //

    ……

#define Disp_On  0x3f      // 显示开指令 //

#define Disp_Off 0x3e       // 显示关指令 //

#define Col_Add  0x40      // 定位到第0列指令 //

#define Page_Add 0xb8      // 定位到第0页指令 //

#define Start_Line 0xc0     // 定位从DDROM中的第0行开始往屏幕上显示

 

unsigned char code measurearray[]  /*调入了一幅图像:测量:宽度x高度=96x16*/

unsigned char code storearray[]     /*调入了一幅图像:存储:宽度x高度=96x16*/

……                            //还有时间设置,开始测量等图像……//

 

 

 

 

www.zhulong.com说明: 38说明: 108说明: 108/*------------------------------汉字点阵码————————*/

char code huan[]={    // 16*16 //

0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,0x0F,0xE8,0x08,0x08,0x28,0x18,0x08,0x00,

0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,0x0C,0x03,0x06,0x18,0x30,0x60,0x20,0x00

};……//迎,使,用,等汉字如其所示//

/*------------------------------字母点阵码---------------------------*/

char code Kg_K[]={    // 字母K  8*16 //

0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,

};

nsigned char code FirstPage[]={    // 开机画面 DPY工作室 //

 

void delay(unsigned int t)          //延时//

 {

  unsigned int i,j;

  for(i=0;i<t;i++)

  for(j=0;j<10;j++)

  ; }

/*-------------------------写命令到LCD------------------------------*/

void write_command(unsigned char cmdcode)

 {

  RS = 0;

  RW = 0;

  P0 = cmdcode;

  delay(0);

  E = 1;

  delay(0);

www.zhulong.com说明: 108  E = 0;

 }

/*-------------------------写数据到LCD----------------------------*/

void write_data(unsigned char Dispdata)

……

 

/*------------------------清显示屏--------------------------------*/

void Clr_Scr()

 {

  unsigned char j  ,k;

  CS2=1;CS1=0;             // 清左半屏 //

   {

    write_command(Page_Add+0);

    write_command(Col_Add+0);

    for(k=0;k<4;k++)               // 清左上半屏 //

     {

    // write_command(Page_Add+k);

      for(j=0;j<64;j++)

      write_data(0x00);

     }

    for(k=0;k<4;k++)               // 清左下半屏 //

     {

      write_command(Page_Add+4);

      for(j=0;j<64;j++)

      write_data(0x00);

     }

   }

  CS2=0;CS1=1;                     // 清右半屏 //

   {

    write_command(Page_Add+0);

    write_command(Col_Add+0);

www.zhulong.com说明: 108说明: 66    for(k=0;k<4;k++)               // 清右上半屏 //

     {

      for(j=0;j<64;j++)

      write_data(0x00);

     }

    for(k=0;k<4;k++)               // 清右下半屏 //

     {

      write_command(Page_Add+4);

      for(j=0;j<64;j++)

      write_data(0x00);

     }

   }

 }

 /***********************************************************/

 

 

/*------------------显示12864图片------------------------------*/

void Disp_Img(unsigned char code *img)

/*---------------------指定位置显示数字8*16----------------*/

void sz_disp16(unsigned char pag,unsigned char col,unsigned char mod, unsigned char code *szk)

 {

  unsigned char j=0,i=0;

  for(j=0;j<2;j++)

   {

    write_command(Page_Add+pag+j);

    write_command(Col_Add+col);

    for(i=0;i<8;i++)

       if(mod)

     write_data(szk[8*j+i]);

      else

www.zhulong.com说明: 88      write_data(~szk[8*j+i]);

   }

 }

/*-----指定位置显示汉字16*16-----------------------*/

void hz_disp16(unsigned char pag,unsigned char col, unsigned char mod,unsigned char code *hzk)

/*------------------初始化LCD--------------------------*/

void init_lcd()

 {

  RST=0;

  delay(100);

  RST=1;

  delay(100);

 

  CS2=1;

  CS1=1;

delay(100);

  write_command(Disp_Off);

  write_command(Page_Add+0);

  write_command(Start_Line+0);

  write_command(Col_Add+0);

  write_command(Disp_On);  }

 

附录七 主程序嵌套子程序

菜单程序:主界面显示的一些相关项函数。有“开始测量”、“时间设置”……

#define uchar unsigned char

void start_measure_function(void);

void data_store_function(void);

……

void led_menu_show(void);

www.zhulong.com说明: 108void select_item(unsigned char);

idata unsigned char user_choosen=0;

idata unsigned char max_item=0;

idata unsigned char temp_choosen;

idata unsigned char shuaxin=0; 

struct menu_item

{

    uchar menu_count;                //菜单项个数.

     uchar *display;                    //指针,即菜单项内容.

    void (*subs)();                    //指向函数的指针.

    struct menu_item *children_menus;    //当前菜单子菜单的指针.

    struct menu_item *parent_menus;    //当前菜单父菜单的指针.

};

idata struct menu_item main1_menu[4]; //每个菜单项为一个元素.整个菜单地址即为数组名.

data struct menu_item measure_menu[2];

idata struct menu_item store_menu[2];

 

换算程序:主要功能是负责系统信号转换,甲醛含量显示等信号换算。

#ifndef __MATH_H__

#define __MATH_H__

#pragma SAVE

#pragma REGPARMS

extern char  cabs  (char  val);

extern int    abs  (int   val);

……              //数学基本函数的调用……//

#pragma RESTORE

#endif

 

文章评论

共有条评论来说两句吧...

用户名:

验证码:

Top