【51单片机】采用ADC0809对IN5通道的模拟电压进行转换,电压值通过四位数码管进行显示。例如:1.234伏。其中,模拟电压可由滑动变阻器提供。

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

  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我了解了你的问题。下面是一个C51单片机通过ADC0809八路采集温度并在四位数码管上循环显示的简单代码: ``` #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit CS=P1^0; //ADC0809片选控制端 sbit CLK=P1^1; //ADC0809时钟控制端 sbit INTR=P1^2; //ADC0809转换完成中断输出端 sbit DOUT=P1^3; //ADC0809数据输出端 sbit DIG1=P2^4; //第一位数码管 sbit DIG2=P2^5; //第二位数码管 sbit DIG3=P2^6; //第三位数码管 sbit DIG4=P2^7; //第四位数码管 uchar code seg[]={ //数码管段码表 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x00 }; void delay(uint i){ //延时函数 while(i--); } void display(uchar dat){ //数码管显示函数 uchar i; DIG1=0;DIG2=0;DIG3=0;DIG4=0; //清除所有数码管 for(i=0;i<4;i++){ switch(i){ //选择要显示数码管 case 0:DIG1=1;break; case 1:DIG2=1;break; case 2:DIG3=1;break; case 3:DIG4=1;break; } P0=seg[dat%10]; //选择要显示的数字 dat/=10; delay(10); //延时10ms } } void ADC0809(){ //ADC0809采集函数 uchar i,adval; for(i=0;i<8;i++){ CS=0; //片选ADC0809 CLK=0; //清零时钟线 _nop_(); //空操作 _nop_(); _nop_(); CLK=1; //置高时钟线 adval<<=1; //左移一位 if(DOUT==1)adval|=0x01; //读取数据 CS=1; //取消片选ADC0809 } display(adval); //显示采集的温度 } void main(){ while(1){ ADC0809(); //采集温度并显示 } } ``` 这个代码中,我们通过C51单片机控制ADC0809芯片进行八路采集,然后将采集到的温度通过四位数码管循环显示。其中,采集函数使用了8个时钟周期来完成一次采集,每个时钟周期为12us,因此采集频率为1.25kHz。数码管显示函数每次延时10ms,因此数码管的刷新频率为100Hz,可以保证显示的稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

H_learn

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

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

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

打赏作者

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

抵扣说明:

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

余额充值