51单片机ADC0804的使用

文章描述了一个使用51单片机进行模拟数字转换(ADC)的过程,通过ADC0804芯片读取电压并转换成数字量。代码实现了启动转换、读取数据的步骤,并通过串口打印电压值。当滑动变阻器电压变化时,串口会显示实时电压,误差约为3%。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 实际电路接线

 我们需要ad转化的时候 ,分两步走,先启动转化,再读取输出的数字量

阅读手册时序图

 开始编写驱动文件adc0804.c和adc0804.h如下

#include  "ad0804.h"

void adc_start()
{
	CS=1;
	WR=1;
	
	CS=0;
	WR=0;
	delay(1);
	WR=1;
	delay(1);
	CS=1;
}

void adc_read()
{
	RD=1;
	CS=1;
	CS=0;
	_nop_();
	RD=0;
	delay(10);
}

float adc_getVoltage()
{
	float voltage;
	uchar temp;
	adc_start();
	adc_read();
	/*如果v0+v1*x+……会报错,只能分开写了*/
	temp = v0==0?  (v1*2+v2*4+v3*8+v4*16+v5*32+v6*64+v7*128):(v1*2+v2*4+v3*8+v4*16+v5*32+v6*64+v7*128)+1;
	voltage=(float)temp/256*4.84;
	
	return voltage;
}
#include "public.h"
#ifndef AD0804_H
#define AD0804_H

sbit weila=P2^7;
sbit RD=P3^7;
sbit WR=P3^6;
sbit CS=P0^7;

sbit v0=P1^0;
sbit v1=P1^1;
sbit v2=P1^2;
sbit v3=P1^3;
sbit v4=P1^4;
sbit v5=P1^5;
sbit v6=P1^6;
sbit v7=P1^7;

void adc_start();							//启动ad采样
void adc_read();							//ad读取
float adc_getVoltage();						//返回adc电压值

#endif

其中public.h文件内容如下

#ifndef _PUBLIC_H
#define _PUBLIC_H
#include <STC12C5A60S2.H>
#include "intrins.h"
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint 
#define uint unsigned int
#endif

void delay(uint c);

#endif

然后是main.c

#include "public.h"
#include  "ad0804.h"
#include  "uart.h"

uchar buf[100];
void main()
{
	float v;
	UartInit();
	while(1)
	{
		v=adc_getVoltage();
		if(v!=adc_getVoltage())				//若ad采样电压值发生变化,则在串口打印
		{
			sprintf(buf,"检测电压值:%.2f V\r\n",adc_getVoltage());
			printf(buf);
		}
	}
}

效果为转动滑动变阻器,串口打印电压,若不转动,串口不产生输出。经过电压表检测,串口打印电压值与实际值误差约3%

 

 这里用到的串口打印函数,可以看我另一篇关于串口的博客,里面有完整代码

(130条消息) 51单片机串口的使用_犹是春闺梦里人的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值