Proteus8仿真:51单片机A/D转换(ADC0808)

元器件

元器件 名称
排阻 RESPACK-8
51单片机 AT89C51
数码管 7SEG-MPX4-CA-BLUE
ADC芯片 ADC0808
滑动变阻器 POT-HG

原理图部分

在这里插入图片描述
ADC0808引脚作用

项目 Value
ADDA-C 选择IN通道
IN0-7 模拟量输入
VREF+ ADC参考电压
VREF- ADC参考地
CLOCK 时钟
VREF+ ADC参考电压
OUT1-8 数字信号输出
START 起始信号
OE 输出使能
EOC 结束信号

ADC0808初始化函数
在这里插入图片描述
根据时序图,首先是START信号,由低变高再变低,然后看EOC信号,由高到低,然后再到高时,OUTPUT ENABLE(OE)信号变高,然后读取输出信号,然后输出OUTPUT ENABLE(OE)变低关闭输出。

u8 ADC_Init(void)
{
    
    
	u8 ad_result=0;
	//首先是START信号,由低变高再变低
	START=0;
	START=1;
	START=0;
	//然后看EOC信号,由高到低
	while(EOC==0);
	//OUTPUT ENABLE(OE)信号变高,然后读取输出信号
	OE=1;
	ad_result=P1;
	OE=0;
	return ad_result;
}

代码

main.c

代码如下:

#include <reg51.h>//头文件

#define u8 unsigned char //宏定义
#define u16 unsigned int

sbit START=P2^5;
sbit EOC=P2^6;
sbit OE=P2^7;

void SMG_output(void);
void delay_ms(u16 ms);
u8 ADC_Init(void);
u8 tab[]={
    
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; //数码管码值

u8 SMG[8]={
    
    10,10,10,10,10,10,10,10};//存储数码管要显示的码

u8 ad=0;
void main(void)
{
    
    

	while(1)
	{
    
    
		ad=ADC_Init();
		
		SMG[0]=10; 
		SMG[1]=ad/100;
		SMG[2]=ad%100/10;
		SMG[3]=ad%10;

		
		SMG_output();//数码管显示
	}
}


u8 ADC_Init(void)
{
    
    
	u8 ad_result=0;
	START=0;
	START=1;
	START=0;
	while(EOC==0);
	OE=1;
	ad_result=P1;
	OE=0;
	return ad_result;
}


//数码管显示函数
void SMG_output(void)
{
    
    
	u8 i; //定义数码管控制位
	for(i=0;i<=4;i++) //八次循环
	{
    
    
		P2=1<<i; //第一次选第一根数码管,第二次第二根。。。。 1  0000 0001 0000 0010
		P0=tab[SMG[i]];//显示数码管数组对应的值 p0=tab[smg[0]]=tab[2]=2
		delay_ms(1); //延时1ms == 显示1ms
	}
	
	P2=0xff; //数码管消隐
	P0=0xff; //数码管消隐
}

//延时函数
void delay_ms(u16 ms)
{
    
    
	u16 i,j;
	for(i=0;i<ms;i++)
	for(j=71;j>0;j--);
}

工程文件

工程文件

猜你喜欢

转载自blog.csdn.net/darlingqx/article/details/128187018