301 基于放大电路传感器气体烟雾检测仪【毕设课设】

完整版 电路图和程序代码 下载地址

https://pan.baidu.com/s/1xtaJWXDeY36kbb1Nl1AFiQ?pwd=8888

部分代码展示

#include"includes.h"
#include<intrins.h>
//#include<reg52.h>
#define TIME0H 0x3C
#define TIME0L 0xB0
#define uchar unsigned char
#define uint unsigned int
/*下面是引脚连接关系*/
sbit AD_EOC   =P2^4;   /*转换完成指示*/
sbit AD_IOCLK =P2^3;         /*时 钟*/
sbit AD_DATIN =P2^2;   /*数据入*/
sbit AD_DATOUT=P2^1;   /*数据出*/
sbit AD_CS    =P2^0;   /*片  选*/
uint ad_result;    /*存各模拟通道的数据*/

sbit KEY1=P1^2;
sbit KEY2=P1^3;
sbit KEY3=P1^4;
unsigned int  Voltage_array[15];
uchar uc_Clock=0;		//定时器0中断计数
bit b_DATransform=0;



  void delay(uint z)
 { 
   uint x,y;
    for(x=z;x>0;x--)
    for(y=110;y>0;y--);
 }


  /*启动A/D转换,并读取上次转换结果*/
uint read2543(CHN)
{
uchar i,temp;
uint read_ad_data = 0;
CHN=CHN<<4;
AD_IOCLK=0;
AD_CS=1;
AD_CS=0;
temp=CHN;
for(i=0;i<12;i++)
{
   read_ad_data=read_ad_data<<1;
   if((temp&0x80)!=0){AD_DATIN=1;}
   else{AD_DATIN=0;}
   if(AD_DATOUT){read_ad_data=read_ad_data+1;}
   AD_IOCLK =1;
   _nop_();_nop_();_nop_();_nop_();
   AD_IOCLK =0;
   _nop_();_nop_();_nop_();_nop_();
   temp=temp<<1;
}
AD_CS=1;
read_ad_data=(500/315)*(read_ad_data&0x0fff); 

return(read_ad_data);
}


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<把ppm显示在LCD上>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void vShowppm(uint uiNumber)
{
	uchar ucaNumber[4],ucCount;
	if(uiNumber>9999)					
		uiNumber=9999;
    ucaNumber[0]=uiNumber/1000;	
	ucaNumber[1]=uiNumber/100%10;								//把计算数字的每个位存入数组。
	ucaNumber[2]=uiNumber/10%10;							
	ucaNumber[3]=uiNumber%10;

		vShowOneChar(ucaNumber[0]+48);				//从首位到末位逐一输出。
		vShowOneChar('.');
	    vShowOneChar(ucaNumber[1]+48);				//从首位到末位逐一输出。
	    vShowOneChar(ucaNumber[2]+48);				//从首位到末位逐一输出。
		vShowOneChar(ucaNumber[3]+48);				//从首位到末位逐一输出。
		vWriteCMD(0xCb);     
      	vShowChar("ppm   ");



}

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<把mg/m3显示在LCD上>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void vShowmgm3(uint uiNumber)
{
	uchar ucaNumber[5],ucCount;
	if(uiNumber>9999)					
		uiNumber=9999;
    ucaNumber[0]=uiNumber*22/10000;
    ucaNumber[1]=uiNumber*22/1000%10;	
	ucaNumber[2]=(uchar)(uiNumber*22/100%10);								//把计算数字的每个位存入数组。
	ucaNumber[3]=(uchar)uiNumber*22/10%10;							
	ucaNumber[4]=(uchar)uiNumber*22%10;

		vShowOneChar(ucaNumber[0]+48);				//从首位到末位逐一输出。
	    vShowOneChar(ucaNumber[1]+48);				//从首位到末位逐一输出。
	    vShowOneChar(ucaNumber[2]+48);				//从首位到末位逐一输出。
		vShowOneChar('.');
		vShowOneChar(ucaNumber[3]+48);				//从首位到末位逐一输出。



}
//*************************************************************************************************
//*																								  *
//*			  ********************************主函数******************************				  *
//*																								  *
//*************************************************************************************************
void main()
{
     unsigned int  Voltage=0;

	// static unsigned int  Voltage_show =0;
	 static unsigned int  count;
	 int i,h;
	 uint s;
	 uchar flag_key;

	TMOD=0x01;			//定时器0,模式1。
	TH0=TIME0H;
	TL0=TIME0L;
	TR0=1;				//启动定时器。
	ET0=1;				//开定时器中断。
	EA=1;				//开总中断
	vdInitialize();
	vWriteCMD(0x8b);	   //写入显示起始地址(第一行第4个位置)
	vShowChar("mg/m3");
	vWriteCMD(0xCb);     
	vShowChar("ppm");
	while(1)						    
	{
				
    	if(KEY1==0)			
		{
		flag_key=1;
		
		}
		if(KEY2==0)				
		{ 
	    flag_key=2;
	
		}
		if(KEY3==0)				
		{ 
	    flag_key=3;
		
		}

	if((KEY3==1)&&(flag_key==3))		  //启动测量
	{

	//	if(b_DATransform==1)
//		{
			b_DATransform=0;
			vWriteCMD(0xC4);
	    //	Voltage=read2543(0);
	    	for(h=0;h<15;h++)
		  {
		    ad_result=read2543(0);
		     while(!AD_EOC); 
		      	s+=ad_result;
					
		  }
		   Voltage=s/15*2.44378;
      			s=0;
		   vShowppm(Voltage);
		   vWriteCMD(0x84);
		   vShowmgm3(Voltage);
		 
	//	}
	}



	   	if((KEY1==1)&&(flag_key==1))		  //向上查阅
		{		 
		   	 flag_key=0;
			if(count<11)
			count++;
			else
			 count=0;
			
			Voltage= Voltage_array[count] ;
			vWriteCMD(0xC4);
			vShowppm(Voltage);

		   vShowppm(Voltage);
		   vWriteCMD(0x84);
		   vShowmgm3(Voltage);
		}
		
		
			
		if((KEY2==1)&&(flag_key==2))	   //存储
		{
			count=0;
		   	flag_key=0;
			Voltage_array[1]=Voltage ;
				for(i=9;i>0;i--)
				{
				 Voltage_array[i+1]=Voltage_array[i] ;
				}
		//	  Voltage_show=	Voltage;
		}
			
			
			

	}
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器0中断函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void t0() interrupt 1
{
	if(uc_Clock==0)
	{
		uc_Clock=5;
		b_DATransform=1;
	}
	else
		uc_Clock--;
	TH0=TIME0H;		   //恢复定时器0。
	TL0=TIME0L;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值