C51数码管动态显示+AD转换

老师让做AD转换的实验,并把转换结果用数码管显示出来。由于疫情的原因,没有C51的小试验箱,就只能用protues进行仿真。

一、AD部分

AD转换我用的是ADC0808芯片。ADC0808的内部结构和外部引脚分别如下图所示,内部各部分的作用和工作原理在内部结构图中一目了然,下面对各引脚定义分述如下:
在这里插入图片描述

(1)IN~IN—8路模拟输入,通过3根地址译码ADDA,ADDB,ADDC。来选通一路。

(2) D7-D0—A/D转换后的数据输出端,为三态可控输出,8位排列顺序是D7为最高位, D0为最低位。

(3) ADDA,ADDB,ADDC—模拟通道选择地址信号,ADDA为低位,ADDC为高位。

(4) VR(+)、VR(-)—正、负参考电压输入端,用于提供片内DAC电阻网络的基准电压。在单极性输入时, VR(+)=5V,VR(-)=0V。

(5) ALE—地址锁存允许信号,高电平有效。当此信号有效时, A、B、C三位地址信号被锁存,译码选通对应模拟通道。在使用时,该信号常和START信号连在一起。

(6) START— A/D转换启动信号,正脉冲有效。加于该端的脉冲的上升沿使逐次逼近寄存器清零,下降沿开始AD转换。如正在进行转换时又接到新的启动脉冲,则原来的转换进程被中止,重新从头开始转换。

(7) EOC—转换结束信号,高电平有效。该信号在A/D转换过程中为低电平,其余时间为高电平。该信号可作为被单片机查询的状态信号,也可作为对单片机的中断请求信号。

(8) OE—输出允许信号,高电平有效。当微处理器将该信号置高时, ADC0B808的输出三态门被打开,使转换结果通过数据总线输出。

二、数码管动态显示

动态显示的特点是将所有位数码管的段选线联在一起,由位选线控制是哪一位数码管亮。所谓动态显示即轮流向各位数码管送出相应段码,并一直循环。利用发光管的余辉和人眼视觉残留作用,使人感觉好像各位数码管同时都在显示。也就是实际上每一时刻只有一个数码管是亮的,但是只要更新频率足够快(>100Hz),肉眼看起来,这些数码管就同时显示我们需要的数字了。
这里我用了四个数码管,将转换的数据用毫伏显示。

三、代码部分

#include <REGX51.H>
typedef unsigned char u8;
typedef unsigned int u16;
#define ALESTART P2_3
#define ADCBUSY  P2_5
#define DATA P0
#define SEG_Port P1  //数码管显示
float Volt=0.0;
u8 channel=0;
u8 SEG_Sel[4]={0x08,0x04,0x02,0x01};   //数码管位选数据
u8 SEG[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //数码管段选数据
/*****函数声明*****/
void ADC_Init(void);
float Get_Vlot(void);
void Delay(u8 time);
void SEG_Show(void);
/*****主函数*****/
void main(void)
{
 ADC_Init();
 channel=4;
 while(1)
 {
   Volt=Get_Vlot();
   SEG_Show();
 }
}
void ADC_Init(void)
{
 DATA=0xff;  //IO口用做输入时,先输出1
 ADCBUSY=1;  //IO口用做输入时,先输出1
 ALESTART=0;
}
float Get_Vlot(void)
{
 u16 num;
 P2&=0xf8;
 P2|=channel;   //ADDA,ADDB,ADDC模拟通道选择地址信号
 ALESTART=1;
 Delay(2);
 ALESTART=0;
 Delay(2);
 while(ADCBUSY==0);  //等待EOC置高
 num=DATA;           //读取数据
 return (num*5000.0/255.0);  //毫伏显示
}
void Delay(u8 time)
{
 unsigned char i, j;
 for (i=0; i<time; i++)
  for (j=0; j<12; j++);
}
void SEG_Show(void) //数码管显示
{
 int temp;
 u8 ord;
 temp=(int)Volt;  
 for(ord=0;ord<4;ord++)  
 {
  P3=SEG_Sel[ord];         
  SEG_Port=SEG[temp%10];   
  Delay(10);
  SEG_Port=0xff;
  temp=temp/10;
 }
}

四、protues部分

ADC0808连接图
在这里插入图片描述
C51部分连接图
在这里插入图片描述
仿真结果(protues如何画图仿真以及如何与keil5联调在这里我就说明了)
在这里插入图片描述
仿真结果还是很满意的。

猜你喜欢

转载自blog.csdn.net/weixin_45849079/article/details/106747693