51单片机外部扩展实验

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的电压变化。

  1. 冲击要求:

在基础要求前提下,通过按键选择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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zyyyyyyyy945

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值