1. 基本要求:
在Wave/Keil中进行软件编程,完成51单片机使用A/D,以及访问外部RAM仿真实验,在Proteus中搭建硬件电路验证编程结果。
(1).实验目的
掌握51单片机A/D转换原理及使用方法;
掌握51单片机访问外部RAM原理及使用方法。
(2).实验要求
基于典型51单片机与ADC0809硬件连接方式,采用ADC0809对IN5通道的模拟电压进行转换,电压值通过四位数码管进行显示。例如:1.234伏。其中,模拟电压可由滑动变阻器提供。
2. 冲击要求:
在基础要求前提下,通过按键选择ADC0809的某一个通过进行模拟电压转换,电压值通过四位数码管进行显示。同时,将模拟电压转换数值存储在外部RAM中。
keil:
#include<reg51.h>
#include<stdio.h>
#include<stdlib.h>
#include<intrins.h>
#include<string.h>
#include<absacc.h>
sbit ADDC=P1^6;
sbit ADDB=P1^5;
sbit ADDA=P1^4;
sbit CLK=P1^3; //clock
sbit ST=P1^2; //start (转换启动信号)
sbit EOC=P1^1; //end of conversion (转换结束信号)
sbit OE=P1^0; //output enable (输出允许信号)
sbit key=P2^4;
sbit LED=P2^5;
sbit go=P2^6;
sbit pp=P2^7;
unsigned char number;
unsigned char a;
unsigned char b;
unsigned char c;
unsigned char m1,m2,m3,m4;
//0~9
unsigned char code SEG7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阴
unsigned char code SEG8[]={0xBf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x80};//有小数点的
void delay(int i)
{
int j=0;
while(i--)
{
for(j=0;j<120;j++);
}
}
void display(unsigned char ADx)
{
int AD = ADx*5000.0/255.0;
P2=0xFE; P0=m1=SEG8[AD/1000];delay(5);
P2=0xFD; P0=m2=SEG7[(AD/100)%10]; delay(5);
P2=0xFB; P0=m3=SEG7[(AD/10)%10]; delay(5);
P2=0xF7; P0=m4=SEG7[AD%10]; delay(5);
}
//初始化0809
void init()
{
ADDC=c;
ADDB=b;
ADDA=a;
CLK=0;
ST=1; //内部寄存器清零
EOC=1; // 转换结束(未开始)
OE=0;
}
void main()
{
unsigned char p;
p=0;
number=0;
while(1)
{
switch(number)
{
case 0:a=0;b=0;c=0;break;//5
case 1:a=1;b=0;c=0;break;//5
case 2:a=0;b=1;c=0;break;//6
case 3:a=1;b=1;c=0;break;//5
case 4:a=0;b=0;c=1;break;//5
case 5:a=1;b=0;c=1;break;//5
case 6:a=0;b=1;c=1;break;//5
case 7:a=1;b=1;c=1;break;//5
}
if(go==0)//总开关按下 开始显示
{
init();
TMOD=0x02; //0000_0010 8位 0~255
TH0=1000;
TL0=1000;
EA=1; // 总中断开关
ET0=1; // T0定时器总中断开关
TR0=1; // 启动T0的开定时器位
ST=0;_nop_();
ST=1;_nop_(); //上跳变 清零
ST=0; //下跳变 开始
while(EOC==0);//EOC为1时代表结束
OE=1;//结束后开始输出
display(P3); //写出输出内容
OE=0; //高阻 禁止输出
XBYTE[0]=m1;
XBYTE[1]=m2;
XBYTE[2]=m3;
XBYTE[3]=m4;
}
else//总开关断开 不显示 选择通道
{
if(key == 0) //选择通道
{
delay(3); //延时消除按键抖动,大约20毫秒
while(key == 0);//如果按键真的按下,等待按键抬起
number++;
LED=!LED;
if(number==8)number=0;
}
}
};
}
//定时器T0的中断
void t0() interrupt 1
{
CLK=!CLK;
}
proteus:
解释:
8个通道,每按一次上面的开关,灯亮暗交替一次(作为提示),通道数+1,选择通道完成后,点击下面的开关,即可显示对应通道的模拟电压值。例如想选择1通道,就先按一下上面的开关,然后按下面的开关。8个通道分别连接了一个电压表,运行成功的话,电压表的值跟数码管显示的值相等。
对于存入外部RAM部分,如图是选择 了通道1,电压值为3.748,电压值的七段码会自动存到外部RAM中,按下暂停键,在软件上方选择“调试”---“Memory contents”,就会跳出外部RAM空间(如图),经过对比,CF 07 66 6D即对应着“3.”“7”“4”“8”的七段码,证明写入成功
keil+proteus源文件下载:https://download.csdn.net/download/weixin_52417692/85236565