1. 基本要求:
在Wave/Keil中进行软件编程,完成51单片机使用A/D,以及访问外部RAM仿真实验,在Proteus中搭建硬件电路验证编程结果。
(1).实验目的
掌握51单片机A/D转换原理及使用方法;
掌握51单片机访问外部RAM原理及使用方法。
(2).实验要求
基于典型51单片机与ADC0809硬件连接方式,采用ADC0809对IN5通道的模拟电压进行转换,电压值通过四位数码管进行显示。例如:1.234伏。其中,模拟电压可由滑动变阻器提供。
keil:
#include<reg51.h>
#include<stdio.h>
#include<stdlib.h>
#include<intrins.h>
#include<string.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 (输出允许信号)
unsigned char number;
//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=SEG8[AD/1000];delay(5);
P2=0xFD; P0=SEG7[(AD/100)%10]; delay(5);//1111_1101 -> P2^1
P2=0xFB; P0=SEG7[(AD/10)%10]; delay(5);//1111_1011 -> P2^2
P2=0xF7; P0=SEG7[AD%10]; delay(5);//1111_0111 -> P2^3
}
//初始化0809
void init()
{
// ABC=101选择第五通道
ADDC=1;
ADDB=0;
ADDA=1;
CLK=0;
ST=1; //内部寄存器清零
EOC=1; // 转换结束(未开始)
OE=0;
}
void main()
{
init();
//TMOD(定时器方式2)
TMOD=0x02; //0000_0010 8位 0~255
/*
对定时器T0来说是分成两个寄存器:TH0为高八位,TL0为低八位,组成了16位的定时器,
当低位TL0计满就向高位TH0移一个数,然后清零
TH0和TL0决定采样频率(数值越大,频率越高)
*/
TH0=1000;
TL0=1000;
EA=1; // 总中断开关
ET0=1; // T0定时器总中断开关
TR0=1; // 启动T0的开定时器位
while(1)
{
ST=0;_nop_();
ST=1;_nop_(); //上跳变 清零
ST=0; //下跳变 开始
while(EOC==0);//EOC为1时代表结束
OE=1;//结束后开始输出
display(P3); //写出输出内容
OE=0; //高阻 禁止输出
}
}
//定时器T0的中断
void t0() interrupt 1
{
CLK=!CLK;
}
proteus:
调节滑动变阻器,电压值发生变化,电压值范围是0~5V
keil+proteus源文件下载:https://download.csdn.net/download/weixin_52417692/85236576