//程序名:ADC0804 模/数转换
#include <reg51.h>
#include <intrins.h> //包含头文件
sbit adc_rd=P3^7; //RD
sbit adc_wr=P3^6; //WR
sbit s1=P2^0;
sbit s2=P2^1;
sbit s3=P2^2;
sbit s4=P2^3; //四个数码管位选端
unsigned char Disbuf[]={0,0,0}; //显示暂存空数组
unsigned char code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数字显示编码
void display(); //声明函数
void dsxms() //延时
{
unsigned char i;
for(i=0;i<250;i++);
}
void delay(unsigned int x)//延时函数
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<110;j++);
}
void display() //显示函数
{
unsigned char i;
for(i=0;i<10;i++) //每次循环10次
{
P1=0xc1; //显示字母'V'
s4=0; //打开位
dsxms(); //延时
s4=1; //关闭位
P1=tab[Disbuf[2]]; //显示个位
s3=0; //打开位
dsxms(); //延时
s3=1; //关闭位
P1=tab[Disbuf[1]] & 0x7f;//显示十位,&0x7f是显示小数点
s2=0; //打开位
dsxms(); //延时
s2=1; //关闭位
if(Disbuf[0]==0) //如果百位是0时
P1=0xff; //该位不显示
else //百位不为0时
P1=tab[Disbuf[0]]; //显示百位数据
s1=0; //打开位
dsxms(); //延时
s1=1; //关闭位
}
}
void adc() //adc的初始化函数
{
adc_wr=0;
_nop_();
adc_wr=1;
}
unsigned char read() //读AD转换值
{
unsigned char r;
P0=0xff; //P0口复位
_nop_(); //延时
adc_rd=0; //rd拉低
_nop_(); //延时
r=P0; //读取P0口数据
_nop_(); //延时
adc_rd=1; //rd拉高
return(r); //返回读到的数据
}
void fw(unsigned char dat) //将读到的数据处理
{
unsigned int i;
i=dat*7.84; //数据最低位代表0.0196V,量程设定为20V,采用分压方式,将读到的电压值*4,然后再乘以100将小数位移到整数位.5*4=20.0V
//i=dat*0.0196*100*4
Disbuf[0]=i/1000; //将电压数据/1000得到千位(显示的百位)
Disbuf[1]=(i%1000)/100;//将电压数据/100得到百位(显示的十位)
Disbuf[2]=((i%1000)%100)/10;//将电压数据/10得到十位(显示的个位)
}
main() //主函数
{
unsigned char p;
while(1) //循环
{
adc(); //ad初始化
display(); //显示函数
fw(read()); //读到电压值处理数据
for(p=0;p<20;p++) display();//显示函数循环20次,防止电压值跳动
}
}