一、设计目的
- 掌握AD转换芯片的基本工作原理;
- 掌握一个完整的C语言程序结构;
- 熟悉AD转换与单片机的使用的编程。
二、设计环境
- Keil开发环境
- Proteus软件。
三、设计及调试
(1) 设计内容
- 将电阻的电压模拟信号通过AD转换芯片转换成数字量;
- 将转换后的数字量通过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)设计结果的分析与总结,有无改进方案?
- 设计结果的分析和总结:进行新芯片使用时应该先仔细观察各个引脚的作用与高低位,之后进行编程仿真时能够少出很多错,减少调试的时间。
- 改进方案:在编程时有多出重复可以使用for循环或者do while语句进行程序的简洁化和可观化。
资源已上传至:基于51单片机的AD转换设计
需要自取