1、实验目的
掌握51单片机A/D转换原理及使用方法;
掌握51单片机访问外部RAM原理及使用方法。
2、实验原理
(1)基础要求:
基于典型51单片机与ADC0809硬件连接方式,采用ADC0809对IN5通道的模拟电压进行转换,电压值通过四位数码管进行显示。例如:1.234伏。其中,模拟电压可由滑动变阻器提供。
在keilC51中编辑代码,分为几个模块
模块1:毫秒延时,这里主要是应用在数码管显示部分。
模块2:模数转换及数码管显示部分,把输入的电压值*5000.0/255.0;用p2作扫描,P2 = 0xf7, 0xfb,0xfd,0xfe;分别对应一个7段数码管,再将四位数每位存入p0。
模块3:初始化部分,CLK=0;ST=1; EOC=1; OE=0; ADDC=1;ADDB=0;ADDA=1;(101选择通道5)。
模块4:中断函数,用t0,CLK = !CLK。
主函数:设置定时方式2,两级中断。
在while(1)的循环中给st一个正脉冲使其启动,然后调用模块3,模块2。
输出hex文件。
在proteus中设计电路,选择80c51单片机,adc0809,7seg-mpx4数码管,滑动变阻器,连接方式如图1。
图 1 滑动滑动变阻器,数码管上会显示0-5v的电压变化。
- 冲击要求:
在基础要求前提下,通过按键选择ADC0809的某一个通过进行模拟电压转换,电压值通过四位数码管进行显示。同时,将模拟电压转换数值存储在外部RAM中。
在keilC51中编辑代码,分为几个模块
模块1:毫秒延时,这里主要是应用在数码管显示部分。
模块2:模数转换及数码管显示部分,把输入的电压值*5000.0/255.0;用p2作扫描,P2 = 0xf7, 0xfb,0xfd,0xfe;分别对应一个7段数码管,再将四位数每位存入p0。再将各位的电压值存入r1-r4。
模块3:初始化部分,CLK=0;ST=1; EOC=1; OE=0; ADDC=CC;ADDB=BB;ADDA=AA;CC,BB,AA是p2.5-p2.7脚加一个拨码开关来选择通道。
模块4:中断函数,用t0,CLK = !CLK。
主函数:设置定时方式2,两级中断。
在while(1)的循环中给st一个正脉冲使其启动,然后调用模块3,模块2。
然后在用XBYTE[0]=r4;XBYTE[1]=r3; XBYTE[2]=r2;XBYTE[3]=r1;将电压存到外部ram中。
输出hex文件。
在proteus中设计电路,选择80c51单片机,74ls373锁存器,adc0809,6264外部ram,7seg-mpx4数码管,滑动变阻器,连接方式如图2。
图 2
//基础代码,冲击自己改改就好,主要难点是连接的电路图
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code LED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit OE = P1^0; //输出使能
sbit EOC = P1^1;//结束转换信号
sbit ST = P1^2;// 启动信号
sbit CLK = P1^3;// 时钟信号
sbit dp=P0^7; //小数点接p0.7
sbit ADDC=P1^6;
sbit ADDB=P1^5;
sbit ADDA=P1^4;
void DelayMS(uint n)//毫秒延时
{ uchar i,j;
for(i=0;i<n;i++)
for(j=0;j<120;j++);//n毫秒分频
}
void Display(uint d)
{
P2 = 0xf7;
P0 = LED[d%10]; //第四个数码管显示个位
DelayMS(5);
P2 = 0xfb;
P0 = LED[d%100/10]; //第三个数码管显示十位
DelayMS(5);
P2 = 0xfd;
P0 = LED[d/100%10]; // 第二个数码管显示百位
DelayMS(5);
P2 = 0xfe;
P0 = LED[d/1000]; //第一个数码管显示千位
dp=1; //小数点
DelayMS(5);
}
void main()
{
uint v;
TMOD = 0x02;//定时方式2
TH0 = 0x10;
TL0 = 0x10;
EA=1;ET0=1;
TR0 = 1;
ADDC=1;
ADDB=0;
ADDA=1;
CLK=0;
ST=1; //内部寄存器清零
EOC=1; // 转换结束(未开始)
OE=0;
while(1)
{
ST = 0; // A/D转换启动脉冲输入端,输入一个正脉冲使其启动(脉冲上升沿使0808复位,下降沿启动A/D转换)。
ST = 1; //
ST = 0; //
while(EOC == 0);
OE = 1;
v=P3*19.607843;
Display(v);
OE =0;
}
}
void t0() interrupt 1
{
CLK = !CLK;
}
4、实验结果
hex文件在这https://download.csdn.net/download/weixin_62487280/85256761