基于单片机的CO2浓度检测与显示系统设计_第1页
基于单片机的CO2浓度检测与显示系统设计_第2页
基于单片机的CO2浓度检测与显示系统设计_第3页
基于单片机的CO2浓度检测与显示系统设计_第4页
基于单片机的CO2浓度检测与显示系统设计_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

西安建筑科技大学课程设计(论文)页共39页参考文献1.刘雨棣,雷新颖.计算机控制技术[M].西安交通大学出版社.2013年11月2.林敏.计算机控制技术及工程应用[M].国防工业出版社.2010年6月3.李建忠.单片机原理及应用.西安电子科技大学出版社,20084.杨居义.单片机课程设计指导.清华大学出版社,20095.张福学著.传感器应用及其电路精选.电子工业出版社.1992.76.高光天.传感器与信号调理器件应用技术[M].北京:科学技术出版社,2002,84-85附录检测主程序#include<AT89X52.H>//调用外函数//#include<ctype.h>#include<string.h>#include<stdlib.h>#include<stdio.h>#include<math.h>#include<LED.h>/**********初始化CPU************[2]/voidinit_cpu()//初始化cpu{EA=1; TR0=1; TR1=1; TMOD=0x11; TH1=0x3c; TL1=0xb0;}/*voidtime1(void)interrupt3using1 {TH1=(65536-50000)/256; TL1=(65536-50000)%256;keyval=P1;}//初始化CPU结束//voidmain_menu_initial() //LED主菜单初始化.//{ main1_menu[0].display=measurearray;//定义一个”开始测量“数组// main1_menu[0].subs=NULL; main1_menu[0].children_menus=measure_menu; main1_menu[0].parent_menus=NULL;}voidmeasure_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; measure_menu[1].display=qx; measure_menu[1].subs=NULL;measure_menu[1].children_menus=NULL; measure_menu[1].parent_menus=main1_menu; }//还有voidstore_menu_initial()、voidtime_menu_initial()//voidled_menu_pro(){ max_item=menu_led->menu_count; switch(keyval) { case0:break; case1: //向上键 if(user_choosen==0) { user_choosen=max_item; } shuaxin=1; user_choosen--; break; }if(shuaxin) //是否需要刷新LCD标志位. {Clr_Scr(); shuaxin=0; } led_menu_show(); }voidled_menu_show() { ucharn; 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) {case0: 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); } } voidselect_item(ucharn){ draw_bmp(n*2,2,16,0,curflag);}voidstart_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资源///*模数转换程序*/#defineuintunsignedint//常量/变量定义//uchark,i,j;floatxdatalv;sbitADCS=P3^1;//ADC0832chipseclect//接口定义//ucharxdatadsw[20];//存放sprintf转换字符ucharxdatavalue[149];//点阵字符储存ucharcodetable[]={//字符查表0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*".",0*/};//采集并返回unsignedintAdc0832(unsignedcharchannel)//AD转换,返回结果[6]{uchari=0;ucharj;uintdat=0;ucharndat=0;if(channel==0)channel=2;if(channel==1)channel=3;ADDI=1;_nop_();_nop_();ADCS=0;//拉低CS端_nop_();_nop_();ADCLK=1;//拉高CLK端_nop_();_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端,形成下降沿3ADDI=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;}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);//returnadk}/**/voidtra(uchar*p)//数组dsp[]里面的字符查询后,再储储存到另一个显示数组value[]voidmain_Menu(){Clr_Scr();//先清屏//CS2=1;CS1=0;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]){case0:sz_disp16(2,32,1,sz0);break;case1:}switch(dsw[1]){case0:sz_disp16(2,40,1,sz0);break;case1:……sz_disp16(2,40,1,sz9);} CS2=1;CS1=0;while(P1_3);}/*时钟程序*//*引脚连接*/sbitRST2=P3^5;//复位线引脚//sbitCLK=P3^6;//时钟线引脚//……//其它引脚略……/*定义时间日期显示缓存*/unsignedcharCurtime[7];idataunsignedcharday,sec,min,hour,date,month,year,hms,n,fla_cou;Unsignedcharcodeyejing[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};/*子函数声明(时钟部分)*/[7]voidInputByte(unsignedcharDate);voidWriteTo1302(unsignedcharAddr,unsignedcharDate);ReadFrom1302(unsignedcharAddr);voidSetTime(unsignedchar*pSecDa);voidGetTime(unsignedcharCurtime[]);voidInit_T0(void);voidFlashKey(void);voidAdd(void);voidInit_Clock(void);voidRefresh(void);voidStartMenu(void)/*写入字节子函数*/voidInputByte(unsignedchardat){unsignedchari;ACC=dat;for(i=8;i>0;i--){IO=ACC0;CLK=1;//下降沿写入数据//CLK=0;ACC=ACC>>1;}}/*读出字节子函数*/OutputByte(void)//上升沿读出数据///*函数:设置初始时间*/voidSetTime(unsignedchar*pSecDa){WriteTo1302(0x8e,0x00);//控制命令,WP=0,写操作//for(i=7;i>0;i--){WriteTo1302(Addr,*pSecDa);pSecDa++;Addr+=2;}WriteTo1302(0x8e,0x80);//控制命令,WP=1,写保护//}/*读取时间*/voidGetTime(void){for(i=0;i<7;i++){Curtime[i]=ReadFrom1302(Addr);Addr+=2;}sec=Curtime[0];}/*初始化定时器I0子函数*/voidInit_T0(void){TMOD=0x01;//定时器T0,工作模式1//TH0=0x3c;//50ms//}/*函数:产生闪烁信号子函数*/voidT0_flash(void)interrupt1//中断程序,产生时钟秒信号///*函数:时间闪烁子函数*//*功能:选择确定闪烁位等待调整*/voidFlashKey(void)//闪烁子函数//voidAdd(void)//调时子函数//voidInit_Clock(void)//时钟初始化子函数//voidRefresh(void)//刷新显示子函数//voidAdd(void)//调时子函数//{if(P1_2==0)//按P0_2键进行时间调整//{while(P1_2==0)Refresh();if(KT==1)//检验可调标志位KT//{hms++;switch(n){case1: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;SetTime(&Curtime[0]);//将调整过后的时间值写入//}/*时钟初始化子函数*/voidInit_Clock(void){K1=1;K2=1;K3=1;K4=1;K5=1;K6=1;K7=1;KT=0;n=0;Init_T0();}/*刷新显示子函数*/voidRefresh(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);}/*状态判断于*/voidState(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);}/*显示程序*//*位定义*/sbitRST=P2^0;//复位端//sbitE=P2^1;//使能端//#defineDisp_On0x3f//显示开指令//#defineDisp_Off0x3e//显示关指令//#defineCol_Add0x40//定位到第0列指令//#definePage_Add0xb8//定位到第0页指令//#defineStart_Line0xc0//定位从DDROM中的第0行开始往屏幕上显示unsignedcharcodemeasurearray[] unsignedcharcodestorearray[]/*写命令到LED*/voidwrite_command(unsignedcharcmdcode){RS=0;RW=0;P0=cmdcode;delay(0);E=1;delay(0);E=0;}/*写数据到LED*/voidwrite_data(unsignedcharDispdata)/*清显示屏*/voidClr_Scr(){unsignedcharj,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++)//清左下半屏//{w

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论