|
我是用的at89s52單片機,一個水位傳感器,范圍0~5mm和ADC0832數模轉換芯片,進行液位測量時,測出的數據偏大而且大于3 的時候,結果保持在3.0.鍵盤是對預設值加減,有超限報警。實物圖如下:
C語言程序如下,求大神矯正:
/**************************包含頭文件*****************/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
/******************端口定義****************************/
sbit CS=P3^5; //使能
sbit Clk=P2^1;//時鐘
sbit DATO=P3^7; // 數據輸出
sbit DATI=P3^6;//數據輸入
sbit Buzzer=P2^0;
sbit SW1=P1^0;
sbit SW2=P1^1;
/******************定義全局變量****************************/
unsigned char dat=0x00; //AD值
unsigned char count=0x00; //定時器計數
unsigned char CH; //通道變量
unsigned char dis[]={0x00,0x00,0x00}; //顯示數值
unsigned Hmax;
bit Bjj(unsigned Hmax);
/*************************共陽LED段碼表*****************************/
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //段碼0-9
char code tablewe[]={0xdf,0xef,0xf7,0xfb}; // 位碼P25-P22
/*******************************************************************
函數功能:AD轉換子程序
入口參數:CH
出口參數:dat
*****************************************************/
unsigned char adc0832(uchar CH)
{
uchar i,test,adval;
adval=0x00;
test=0x00;
Clk=0;
DATI=1;
_nop_();
CS=0;
_nop_();
Clk=1;
_nop_();
if(CH==0x00) //通道選擇
{
Clk=0;//1個下降沿DI=1
DATI=1; //通道0的第一位
_nop_();
Clk=1;
_nop_();
Clk=0;
DATI=0; //通道0的第二位
_nop_();
Clk=1;
_nop_();
}
else
{
Clk=0;
DATI=1; //通道1的第一位
_nop_();
Clk=1;
_nop_();
Clk=0;
DATI=1; //通道1的第二位
_nop_();
Clk=1;
_nop_();
}
Clk=0;
DATI=1;
for(i=0;i<8;i++) //讀取前8位的值
{
_nop_();
adval<<=1;
Clk=1;
_nop_();
Clk=0;
if(DATO)
adval|=0x01;
else
adval|=0x00;
}
for(i=0;i<8;i++) //讀取后8位的值
{
test>>=1;
if(DATO)
test|=0x80;
else
test|=0x00;
_nop_();
Clk=1;
_nop_();
Clk=0;
}
if(adval==test) //比較前后8位的值,不同則舍去,若一直顯示為0,請將改行去掉
dat=test;
_nop_();
CS=1; //釋放ADC0832
DATO=1;
Clk=1;
return dat;
}
/*********************************************************
函數功能:延時子程序
入口參數:
出口參數:
*********************************************************/
void delay(void)
{
int k;
for(k=10;k<500;k++);
}
/*********************************************************
函數功能:將0-255級換算成0.00-5.00的電壓數值
入口參數:i
出口參數:
*********************************************************/
void convdata(uchar i)
{
dis[0]=i/51; //gewei
dis[1]=(i%51)*10/51; //小數點后1位
dis[2]=((i%51)*10%51)*10%51; //小數點后2位
}
/*********************************************************
函數功能:數碼管顯示子程序
入口參數:
出口參數:
*********************************************************/
void display(void)
{
P2=0xff;
P0=tab[dis[0]]&0x7f;; //顯示個位和小數點
P2=0xef;
delay();
P0=tab[dis[1]]; //顯示小數點后1位
P2=0xf7;
delay();
P0=tab[dis[2]]; //顯示小數點后2位
P2=0xfb;
delay();
P0=tab[Hmax];
P2=0x7f;
delay();
}
/*********************************************************
函數功能:主函數
入口參數:
出口參數:
*********************************************************/
void main(void)
{
P2=0xff; //端口初始化
P0=0xff;
delay();
CH=0x00; //選擇通道0或1
Hmax=3; //上限值
TMOD=0x01; //設置中斷
TH0=(65536-50000)/256; //定時器1初值定時50ms
TL0=(65536-50000)%256;
IE=0x82;
TR0=1;
while(1) //主循環
{
dat=adc0832(CH);
convdata(dat); //數據轉換
display(); //顯示數值
|
|