单片机实现土壤湿度检测程序

#include<reg51.h>
#include<math.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit keydown = P3^2;
sbit keyup = P3^3;
sbit set = P3^4;
sbit BELL=P3^6;
int zuida=70;
int zuixiao=12;

#define ADC_POWER 0x80 //ADC 使能控制位
#define ADC_FLAG 0x10 //ADC 清除位
#define ADC_START 0x08 //ADC 开始转换控制为
#define ADC_SPEEDLL 0x00 //420 clocks
#define ADC_SPEEDL 0x20 //280 clocks
#define ADC_SPEEDH 0x40 //140 clocks
#define ADC_SPEEDHH 0x60 //70 clocks


sfr ADC_CONTR =0xBC; //ADC控制寄存器
sfr ADC_RES =0xBD; //ADC转换结果寄存器
sfr ADC_LOW2 =0xBE; //ADC转换结果低八位结果寄存器
sfr P1ASF =0x9D; //P1口模拟控制寄存器

sbit ADRJ = 0xA5; //ADC结果寄存器位数控制

sbit P20=P2^0; //数码管位选,锁存器控制信号
sbit P21=P2^1; //数码管位选,锁存器控制信号
sbit P22=P2^2; //数码管位选,锁存器控制信号


uchar j,k;
uchar baiwei,shiwei,gewei,qianwei;
uchar code mun_to_char[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, //数码管显示编码(1-F)
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delays(void) //延时子程序
{
uchar m,n;
for(m=20;m>0;m--)
for(n=20;n>0;n--);
}
void delayms(int ms)
{
uchar t;
for(;ms>0;ms--)
for(t=0;t<120;t++);
}
void delay(uchar s)
{
while(--s);
}





void time(long t)
{
int i;
while (t--)
{
i=830;
while (i--) ;
}
}

/*************************ADC初始化*******************/
void InitADC()
{
ADRJ=0;
P1ASF = 0xff; //1111,1111,P1^0-p1^7 设置为 A/D 转换输入脚
ADC_RES = 0; //清除结果
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
delayms(2); //ADC 开和延时
}
/****************AD转换高八位获取函数*******************/
uchar get_AD_result(uchar ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //Must wait before inquiry
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待转换结束
ADC_CONTR &= ~ADC_FLAG; //关闭 ADC

return ADC_RES; //返回 ADC 结果
}



/****************数据处理********************/
void datahandle()
{
int c,d,e,i;

d=get_AD_result(0);

e=260-d;
c=e/2;
if(c<zuixiao)
{
for(i = 0; i < 250; i++)
{
BELL = 0;
delayms(3); //延时10毫秒
BELL = 1;
delayms(3); //延时10毫秒
}
}
if(c>zuida)
{
for(i = 0; i < 250; i++)
{
BELL = 0;
delayms(3); //延时10毫秒
BELL
= 1;
delayms(3); //延时10毫秒
}


}
qianwei=c/1000;
baiwei=c%1000/100; //转换结果百位提取
shiwei=c%100/10; //转换结果十位提取
gewei =c%10; //转换结果各位提取
}

/****************显示子程序******************/
void display()
{
uint y=24;
while(y--)
{
P0=0x00;
P20=0;
P21=0;
P22=0;

P0=mun_to_char[shiwei];
P20 = 1;
P21 = 0;
P22 = 0;
delayms(50);

P0=mun_to_char[baiwei];
P20 = 0;
P21 = 0;
P22 = 0;
delayms(50);

P0=mun_to_char[gewei];
P20 = 0;
P21 = 1;
P22 = 0;
delayms(50);
}
}


void main()
{
P1=0xff;
InitADC();



while(1)
{
void qwe();
void asd();
datahandle();
display();

if(set==0)
{
time(611);
if(set==0)
{
asd();
}
}

if(set==0)
{
time(611);
if(set==0)
{
qwe();
}
}
}
}



/****************************************************/
void qwe()
{
while(1)
{

unsigned char n[3];
n[0]=zuida%1000/100;
n[1]=zuida%100/10;
n[2]=zuida%10;
P0=table[n[0]];
P2=5;
delayms(11);
P0=table[n[1]];
P2=6;
delayms(11);
P0=table[n[2]];
P2=7;
delayms(11);

if(keydown==0)
{
time(111);
if(keydown==0)
{
zuida=zuida-1;
}
}

if(keyup==0)
{
time(111);
if(keyup==0)
{
zuida=zuida+1;
}
}

if(set==0)
{
time(611);
if(set==0)
{

break;
}
}
}
}
/*****************************************************/
void asd()
{
while(1)
{

unsigned char n[3];
n[0]=zuixiao%1000/100;
n[1]=zuixiao%100/10;
n[2]=zuixiao%10;
P0=table[n[0]];
P2=3;
delayms(11);
P0=table[n[1]];
P2=4;
delayms(11);
P0=table[n[2]];
P2=5;
delayms(11);


if(keyup==0)
{
time(111);
if(keyup==0)
{
zuixiao=zuixiao+1;
}
}
if(keydown==0)
{
time(111) ;
if(keydown==0)
{
zuixiao=zuixiao-1;
}
}

if(set==0)
{
time(611);
if(set==0)
{
break;
}
}

}
}



相关文档
最新文档