基于51单片机的24V数字电压表仿真

仿真图:

在这里插入图片描述

功能简介:

单片机采用AT89C51,最小系统由晶振和复位电路组成
显示部分采用4位数码管用于显示电压信息,每位数码管利用三极管作为驱动,增强电流能力
采用ADC0832将电压模拟信号转换为数字信号再送入单片机处理

芯片/模块的特点:

ADC0832特点:

8位分辨率:ADC0832可以将模拟输入信号转换为8位数字输出。这意味着它可以将模拟信号划分为256个不同的离散电平,提供相对较低的分辨率。

双通道输入:ADC0832具有两个模拟输入通道,使其能够同时转换两个模拟信号。这对于需要同时测量多个信号的应用非常有用。

内部参考电压源:ADC0832提供了一个内部的参考电压源,它可以用作模拟输入信号的参考电压。这样可以简化外部电路设计,并提供更稳定和准确的参考电压。

串行输出:ADC0832通过串行接口(SPI或I2C)输出转换结果。这种串行输出形式使其与微控制器或其他数字设备的通信变得更加简单和方便。

低功耗:ADC0832具有较低的功耗特性,适合在低功耗应用中使用。

可编程时钟频率:ADC0832的转换速度可以通过控制输入时钟频率进行编程。这使得可以根据应用的需求调整转换速度,并平衡转换精度和速度。

内部自校准:ADC0832具有内部自校准电路,可以降低转换误差,并提供更准确的转换结果。

主程序:

#include<reg51.h>
#include<intrins.h>

sbit CS=P2^5;
sbit CLK=P2^6;
sbit DI=P2^7;
sbit DO=P2^7;
sbit dot=P0^5;		//小数点

unsigned char dat=0x00;
unsigned char nums[]={0x00,0x00,0x00,0x00};
unsigned char channel;		//转换通道
unsigned char LEDS[]={0xA0,0xBB,0x62,0x2A,0x39,0x2C,0x24,0xB8,0x20,0x28};		//共阳4位数码管段码,字符显示从'0'到'9'

unsigned char ADC0832(unsigned char channel)		//模数转换
{
	unsigned char i;
	unsigned char x=0x00;
	unsigned char y=0x00;
	
	CLK=0;		//初始化
	DI=1;
	_nop_();
	CS=0;
	_nop_();
	CLK=1;
	_nop_();
	
	if(channel==0x00)		//通道选择
	{		//通道0
		CLK=0;
		DI=1;
		_nop_();
		CLK=1;
		_nop_();
		CLK=0;
		DI=0;
		_nop_();
		CLK=1;
		_nop_();
	}
	else		//通道1
	{
		CLK=0;
		DI=1;
		_nop_();
		CLK=1;
		_nop_();
		CLK=0;
		DI=1;
		_nop_();
		CLK=1;
		_nop_();
	}
	
	CLK=0;
	DI=1;
	for(i=0;i<8;i++)		//读取ADC0832输出的前8位数据
	{
		x<<=1;
		_nop_();
		CLK=1;
		_nop_();
		CLK=0;
		if(DO==1)
		{
			x|=0x01;
		}
		else
		{
			x|=0x00;
		}
	}
	for(i=0;i<8;i++)		//读取ADC0832输出的后8位数据
	{
		y>>=1;
		if(DO==1)
		{
			y|=0x80;
		}
		else
		{
			y|=0x00;
		}
		_nop_();
		CLK=1;
		_nop_();
		CLK=0;
	}
	if(x==y)		//校验,比较前8位与后8位的值
	{
		dat=x;
	}
	_nop_();
	CS=1;		//释放ADC0832
	DO=1;
	return dat;
}

void Convert(unsigned char dat0)		//数据处理
{
	unsigned int x;
	x=dat0*0.0196*100*5;
	nums[0]=x/1000;
	nums[1]=x%1000/100;
	nums[2]=x%1000%100/10;
	nums[3]=x%1000%100%10;
}

void Delay()		//数码管显示
{
	unsigned char i,j;
	for(i=0;i<1;i++)
	{
		for(j=0;j<121;j++);
	}
}

void Display()
{
	P0=LEDS[nums[0]];
	P2=0xFE;
	Delay();
	P2=0xFF;
	
	P0=LEDS[nums[1]];
	dot=0;
	P2=0xFD;
	Delay();
	P2=0xFF;
	
	P0=LEDS[nums[2]];
	P2=0xFB;
	Delay();
	P2=0xFF;
	
	P0=LEDS[nums[3]];
	P2=0xF7;
	Delay();
	P2=0xFF;
}

void main()
{
	while(1)
	{
		dat=ADC0832(channel);
		Convert(dat);
		Display();
	}
}

设计文件:

链接:https://pan.baidu.com/s/1uuI8ueAl-XvvYpHdnAskNw?pwd=sxhz

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值