完整版 电路图和程序代码 下载地址
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;
}