|
我是用的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(); //显示数值
|
|