|
#include <reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code table1[]={
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0x87,
0xff,0xef,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uint adc_finished,n;
float a,c;
uchar shi,ge,bai,num;
int b;
sfr ADC_CONTR=0xBC;//adc控制寄存器,不可位尋址,用或運算來設置
sfr ADC_RES=0xBD;//轉(zhuǎn)換結(jié)果寄存器,高八位
sfr ADC_LOW2=0xBE;//轉(zhuǎn)換結(jié)果寄存器,低兩位
sfr P1ASF=0x9d;//設置p1的那一口為輸入口,不可位尋址.
/*以下都是控制寄存器的各位地址*/
#define ADC_POWER 0x80;//adc電源,第7位
#define ADC_FLAG 0x10;//轉(zhuǎn)換結(jié)束標志位,第4位
#define ADC_START 0x08;//轉(zhuǎn)換開始,第3位
#define ADC_SPEEDLL 0x00;//速度位,第5,6位
#define ADC_SPEEDL 0x20;
#define ADC_SPEEDH 0x40;
#define ADC_SPEEDHH 0x60;
#define ADC_CHS 0x00;//輸入通道為第p1.0,1,2,3三位可設置p10-p17
//位定義完成
void Delay(uint n)
{
uchar x;
while (n--)
{
x = 5000;
while (x--);
}
}
void adcinit() //adc初始化函數(shù)
{
P1ASF=0x01; //設置p10 為ad轉(zhuǎn)換輸入口
ADC_CONTR=0xe0; //打開電源,設最高速度
_nop_();
_nop_(); //設置好ADC控制寄存器之后要加>4us
_nop_(); //的延時才能繼續(xù)正確讀取ADC控制寄存器的值
_nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
ADC_CONTR|=ADC_CHS; //設置頻道
_nop_();
_nop_(); //設置好ADC控制寄存器之后要加>4us
_nop_(); //的延時才能繼續(xù)正確讀取ADC控制寄存器的值
_nop_();_nop_();
}
float huqushuju() //adc轉(zhuǎn)換函數(shù),數(shù)據(jù)得到
{
adcinit();
ADC_RES=0;
ADC_LOW2=0;
ADC_CONTR|=ADC_START;//啟動ad轉(zhuǎn)換,置1為起動,轉(zhuǎn)換結(jié)束后自動置0
_nop_();
_nop_();
_nop_();
_nop_();
adc_finished=0;
while(adc_finished==0)
{
adc_finished=ADC_CONTR&ADC_FLAG;//檢測是否轉(zhuǎn)換結(jié)束,沒結(jié)束一直等
}
_nop_();
_nop_(); //設置好ADC控制寄存器之后要加>4us
_nop_(); //的延時才能繼續(xù)正確讀取ADC控制寄存器的值
_nop_(); _nop_();
a=ADC_RES*4+ADC_LOW2;
a=100-100*a/1023;
a=a*10;
ADC_CONTR=0;
_nop_();
_nop_(); //設置好ADC控制寄存器之后要加>4us
_nop_(); //的延時才能繼續(xù)正確讀取ADC控制寄存器的值
_nop_();
return a;
}
void display(uchar bai,uchar shi,uchar ge)
{
uint i,t;
for(i=0;i<3;i++)
{
switch(i) //位選,選擇點亮的數(shù)碼管,
{
case(0):
LSA=0;LSB=0;LSC=0;P0=table[ge]; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; P0=table1[shi];break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0;P0=table[bai]; break;//顯示第2位
}
t=1000;
while(t--);
}
}
void main()
{
while(1)
{
huqushuju();
b=(int)a;
ge=b%10;
shi=b/10%10;
bai=b/100;
display(bai, shi,ge);
}
}
這是我的程序 然后上電之后發(fā)現(xiàn)顯示的值都大于50,在干燥環(huán)境中為50.09,放到水里之后發(fā)現(xiàn)就增加了十幾
本來干燥環(huán)境下濕度為零的,是不是程序出錯了啊
|
|