#include<reg51.H> //头文件
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define t1 50
#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 led0=P1^0;
sbit dula=P2^6; //数码管段选,锁存器控制信号
sbit wela=P2^7; //数码管位选,锁存器控制信号
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};
void delays(void) //延时子程序
{
uchar m,n;
for(m=20;m>0;m--)
for(n=20;n>0;n--);
}
void delayms(uint ms)
{
uchar t;
for(;ms>0;ms--)
for(t=0;t<120;t++);
}
void delay(uchar s)
{
while(--s);
}
/*************************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 结果
}
/*****************AD转换低2位获低取函数*****************/
uchar get_AD_result_L(uchar ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_();
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待转换结束
ADC_CONTR &= ~ADC_FLAG; //关闭 ADC
return ADC_LOW2 ; //返回 ADC低两位 结果
}
/****************数据处理********************/
void datahandle()
{ //数据处理
uint a,b,c;
ADC_RES=ADC_RES & 0xff;
ADC_LOW2=ADC_LOW2 & 0xff;
a=get_AD_result(1);
b=get_AD_result_L(1);
c=a*4+b;
qianwei=c/1000;
baiwei=c%1000/100; //转换结果百位提取
shiwei=c%100/10; //转换结果十位提取
gewei =c%10; //转换结果各位提取
// }
/****************显示子程序******************/
// void display()
// {
P0=0XFF;//关掉数码管的位选信号。阻止数码管受到P0口信号的影响。
delay(1);
wela=1;
delay(1);
wela=0;
dula=0;
P0 =mun_to_char[qianwei]; //显示数字千位
dula=1;
dula=0;
wela=0;
P0=0x7e; //千位数码管位选
wela=1;
wela=0;
delayms(t1);
dula=0;
P0 = mun_to_char[baiwei]; //显示数字百位
dula=1;
dula=0;
wela=0;
P0=0x7d; //百位数码管位选
wela=1;
wela=0;
delayms(t1);
dula=0;
P0 = mun_to_char[shiwei]; //显示数字十位
dula=1;
dula=0;
wela=0;
P0=0x7b; //十位数码管位选
wela=1;
wela=0;
delayms(t1);
dula=0;
P0 = mun_to_char[gewei]; //显示数字 个位
dula=1;
dula=0;
wela=0;
P0=0x77; //个位数码管位选
wela=1;
wela=0;
delayms(t1);
}
void main()
{
P1=0xff;
InitADC();
while(1)
{
datahandle();
// display();
}
}