元器件
元器件 |
名称 |
排阻 |
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--);
}
工程文件
工程文件