基于51单片机的AD转换设计

一、设计目的

  1. 掌握AD转换芯片的基本工作原理;
  2. 掌握一个完整的C语言程序结构;
  3. 熟悉AD转换与单片机的使用的编程。

二、设计环境

  1. Keil开发环境
  2. Proteus软件。

三、设计及调试
(1) 设计内容

  1. 将电阻的电压模拟信号通过AD转换芯片转换成数字量;
  2. 将转换后的数字量通过LED数码管显示。

(2) 设计硬件电路
在这里插入图片描述
AT89C51单片机,四位共阳数码管,滑动变阻器,ADC0809

(3) 设计过程及调试关键步骤
首先按要求连接电路,之后将各个引脚在keil中进行命名,在滑动变阻器旁边加个电压表进行对数码管数据的检验。因为使用的外部中断,在中断函数中进行AD转换操作。程序编写完成后运行仿真,发现数据改变过大且不准,经过检查是AD转换器的输出端高低位接反,改正后能正常显示,仿真完成。

四、实验结果与分析
(1)程序

#include<reg51.h> 
#define uchar unsigned char
#define uint unsigned int 
sbit OE=P3^0; //AD转换结果输出允许端
sbit START=P3^1;//AD启动信号输入端与接受C、B、A编码时的锁存控制信号
sbit EOC=P3^2;//转换结束输出信号,AD转换开始时为低电平,转换结束时为高电平
sbit A_data=P3^3;
sbit B_data=P3^4;
sbit C_data=P3^5; 
uint information=0; //转换出的数据
uchar b[4];         //用于存放数码管的数据
uchar a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  
//共阳数码管1-9数字代码
uchar wei[]={0x01,0x02,0x04,0x08};   //共阳数码管位选代码 
void delay1ms(uint digit){	
uint i,j;	
for(i=0;i<digit;i++)		
for(j=0;j<120;j++);}
void show(){	
P2=wei[0];	
P0=b[3];	
delay1ms(1);	
P2=0x00;	
P2=wei[1];	
P0=b[2]+128;	
delay1ms(1);	
P2=0x00;	
P2=wei[2];	
P0=b[1];	
delay1ms(1);	
P2=0x00;	
P2=wei[3];	
P0=b[0];	
delay1ms(1);	
P2=0x00;}
void main(){	
EA=1;            //开总中断	
IT0=1;           //跳变沿方式感知外部中断(触发方式)	
EX0=1;           //开外部中断0	
while(1){	
START=0;	
A_data=0;	
B_data=0;	
C_data=0;	
START=1; 	
START=0;	
delay1ms(5);}}
void InT0(void) interrupt 0{	
uchar i;	
OE=1;	
information=P1;	
information=information*1.96; //将数据转换为十进制(5V/256约等于1.96)	
OE=0;	
b[0]=a[information%10];	
b[1]=a[information/10%10];	
b[2]=a[information/100%10];	
b[3]=a[information/1000];	
for(i=0;i<100;i++){		
show();}	 //显示到数码管上
}

(2)设计结果及现象
将电阻的电压模拟信号通过AD转换芯片转换成数字量,然后将转换后的数字量通过LED数码管显示
在这里插入图片描述
滑动变阻器拉到最上端时显示4.99
在这里插入图片描述
滑动变阻器拉到中端时显示2.48
在这里插入图片描述
滑动变阻器拉到低端时显示0.00

(3)设计结果的分析与总结,有无改进方案?

  1. 设计结果的分析和总结:进行新芯片使用时应该先仔细观察各个引脚的作用与高低位,之后进行编程仿真时能够少出很多错,减少调试的时间。
  2. 改进方案:在编程时有多出重复可以使用for循环或者do while语句进行程序的简洁化和可观化。
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页