📄 08092.c
字号:
/*ADC0809时钟直接使用AT89C51的ALE信号2MHz;P1口段码,P2.0-3位码(P2.0为最右边数码管的位码)
P0口数据输入;通道0输入,ADC0809中ST和ALE---P3.0,EOC---P3.2,CLK---ALE.OE---P3.1*/
#include <reg52.H>
#include <intrins.h>
#define _Nop() _nop_()
unsigned char code seg7code[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; //显示共阴数码管0~9 段码
unsigned data dis[5]={0x00,0x00,0x00,0x00,0x00};//前四个依次存从右到左的显示数据,最后一位存中间结果
unsigned scan_con[4]={0xfe,0xfd,0xfb,0xf7}; //从最右面数码管开始扫描,共四个数码管
sbit ST=P3^0; //ADC0809启动转换
sbit OE=P3^1; //允许ADC0809输出数据
sbit EOC=P3^2; //ADC0809转换结束信号
/*延时*/
void Delay(unsigned int tc)
{while(tc!=0)
{unsigned int i;
for(i=0;i<100;i++);
tc--;
}
}
/*ADC0809转换子程序*/
unsigned char adc0809() //读AD0809子程序
{
unsigned char adda;
ST=0;
OE=0; //读AD0809准备
P0=0xff;
ST=1;_Nop();_Nop(); ST=0; //启动转换
_Nop();_Nop();_Nop();_Nop();
while(EOC==0);
OE=1;
adda=P0;
_Nop();
OE=0;
return(adda);//返回最后读出数据
}
/*ADC0809转换数据处理*/
unsigned int dacl() //AD0809读出数据处理
{unsigned char x;
unsigned int dady=0;
for(x=0;x<10;x++)
{dady=adc0809()+dady;}
dady=dady/10; //求平均值,提高精度
return(dady);//返回处理结果
}
/*显示数码处理*/
void Led()
{ unsigned int date;
unsigned char k;
date=dacl(); //调用最后数据处理结果
dis[3]=date/51; //Vin=D*Vref/255=D/51,四个数码管显示
dis[4]=date%51;
dis[4]=dis[4]*10;
dis[2]=dis[4]/51;
dis[4]=dis[4]%51;
dis[4]=dis[4]*10;
dis[1]=dis[4]/51;
dis[4]=dis[4]%51;
dis[4]=dis[4]*10;
dis[0]=dis[4]/51;
for(k=0;k<4;k++)//从最右边数码管开始扫描
{P1=seg7code[dis[k]];
if(k==3){P1=P1|0x80;} //小数点
P2=scan_con[k];Delay(8);P2=0x0f;//先从最右边扫描,延时,消隐
}
}
void main(void)
{
while(1)
{Led();}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -