【51单片机】通过按键选择ADC0809的某一个通过进行模拟电压转换,电压值通过四位数码管进行显示。模拟电压转换数值存储在外部RAM中。

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

  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

H_learn

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

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

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

打赏作者

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

抵扣说明:

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

余额充值