51单片机制作简易数字电压表

这篇具有很好参考价值的文章主要介绍了51单片机制作简易数字电压表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先打开proteus软件导入各个元器件,并连线。

51单片机制作简易数字电压表

 接下来介绍下adc0808的导入方法

51单片机制作简易数字电压表

 频率发生器的导入方法:

51单片机制作简易数字电压表

 接下来就要编写c程序了,代码都是经过测试的,可以方型复制使用。

#include"reg52.h"               // 引入头文件
#define uint unsigned int       // 把无符号整型简写成 uint
sbit START = P3^0;              //  START接到P3.0口
sbit EOC = P3^1;                //  EOC接到P3.1口
sbit OE = P3^2;                 // OE接到P3.2口
sbit RS = P3^3;                  // RS接到P3.3口
sbit RW = P3^4;                  // RW接到P3.4口
sbit E = P3^5;                   // E接到P3.5口
uint dianya=0;                   //  定义 电压=0
unsigned char str[]={"0123456789.V"};  // 定义lcd显示需要的字符

// 延时函数(不精确的延时)
void delay(uint t){
	uint i=0, j=0;
	for(i=0; i<t; i++){
		for(j=0; j<120; j++);
	}
}

//   模拟转数字 ADC函数  根据时序表来写
void adc(){
	START=0;         
	START=1;
	delay(5);
	START=0;
	while(EOC != 1);
	OE = 1;
	dianya =P2;
	OE = 0;
}

//  lcd写数据函数 写dat首字母
void xdat(unsigned char dat){
	RS = 1;
	RW = 0;
	E = 0;
	P1 = dat;
	delay(5);
	E = 1;
	E = 0;
}

//  lcd写命令函数  写命令首字母xml
void xml(unsigned char ml){
	RS = 0;
	RW = 0;
	E = 0;
	P1 = ml;
	delay(5);
	E = 1;
	E = 0;
}


//  lcd初始化函数
void lcdinit(){
	xml(0x38);
	xml(0x0c);
	xml(0x06);
	xml(0x01);
}

//  更新显示函数
void gengxin(){
	uint v1=0, v2=0, v3=0;    // 定义电压的个位,十分位,百分位变量
	dianya=dianya*100/51;      // 根据电压显示和实际的比例做出先扩大100倍在缩小51倍
	v1 = dianya/100;           // 个位是电压值÷100的整数部分
	v2 = (dianya%100)/10;      // 十分位是电压值÷100的余数在÷10的整数部分
	v3 = dianya%10;            // 百分位是电压值÷10的余数
	
	xml(0x80+0x04);           // 写lcd从第一行第5个字符开始写
	delay(5);                  //  延时5毫秒
	xdat(str[v1]);             // 写字符串str的第v1位
	delay(5);                  //  延时5毫秒
	xdat(str[10]);             // 写字符串str的第10位(.)
	delay(5);                  //  延时5毫秒
	xdat(str[v2]);              // 写字符串str的第v2位
	delay(5);                  //  延时5毫秒
	xdat(str[v3]);             // 写字符串str的第v3位
	delay(5);                  //  延时5毫秒
	xdat(str[11]);              // 写字符串str的第11位(V)
	delay(5);                 //  延时5毫秒
}

// 主函数
void main(){
	lcdinit();        // lcd初始化
	while(1){
		adc();           // 读电压值
		gengxin();        // 更新显示电压值
	}
}

最后就是编译成hex文件并导入proteus中仿真了,然后调节滑动变阻器,就可以发现电压表的值和lcd的值是一样的了,肯定会有误差,而且这个误差没有办法消除。

51单片机制作简易数字电压表

经过了一段时间的学习,回来又复习一下原来学习的东西,从新写了一遍,大家看看是不是有所进步呢?今天发现proteus也会卡顿,弄得1602没有任何反应,最后我的解决办法是把89c51删除了,从新导入了一个89c52,从新连线,问题解决了。更新一下下面的写法,并使用了c语言的指针语法,证明51中可以使用指针。

51单片机制作简易数字电压表

下面是程序把1602的显示初始化等函数分成了另外一个文件

下面是主程序adc.c文件的内容,他来调用1602文件中的函数

#include"1602_lcd.h"
sbit start = P3^5;
sbit eoc = P3^6;
sbit oe = P3^7;


void adc(uint * pd)
{
	start = 0;
	start =1;
	delay(2);
	start=0;
	while(eoc != 1);
	oe=1;
	*pd=P2;
	oe=0;
}


void display(uc*sp,uint * pd)
{
	uint dianya,v1,v2,v3;
	dianya=*pd*100/51;
	v1=dianya/100;
	v2=dianya/10%10;
	v3=dianya%10;
	
	writecom(0x80);
	writedat(*(sp+v1));
	writedat('.');
	writedat(*(sp+v2));
	writedat(*(sp+v3));
	writedat('V');
}

int main()
{
	uc str[]="0123456789";
	uint dianya=0;
	uc *sp=str;
	uint * pd = &dianya;
	
	lcd_init();
	
	while(1)
	{
		adc(pd);
		display(sp,pd);
	}
	return 0;
}

下面是1602的头文件

#include<reg52.h>
#define uint unsigned int
#define uc unsigned char
	
sbit RS = P3^0;
sbit RW = P3^1;
sbit E = P3^2;
	
//初始化1602
void lcd_init();


// 写命令函数
void writecom(uc com);


// 写数据函数
void writedat(uc dat);


// 延时函数
void delay(uc t);

下面是1602头文件所对应的.c文件

#include"1602_lcd.h"

// 延时函数
void delay(uc t)
{
	uc i=0, j=0;
	for(i=0;i<t;i++)
	{
		for(j=0;j<120;j++);
	}
}

// 写数据函数
void writedat(uc dat)
{
	RS = 1;
	RW = 0;
	E = 0;
	P1 = dat;
	delay(5);
	E = 1;
	E = 0;
}


// 写命令函数
void writecom(uc com)
{
	RS = 0;
	RW = 0;
	E = 0;
	P1 = com;
	delay(5);
	E = 1;
	E = 0;
}	


//初始化1602
void lcd_init()
{
	writecom(0x38);
	writecom(0x0c);
	writecom(0x06);
	writecom(0x01);
}

上面这种写法是把1602单独写成了一个库文件的方式,以后需要用到1602的时候只需要把库文件1602.c和1602.h导入项目后,就能调用里面写好的函数了,不用从头在想一遍过程了。可以节省一些时间。文章来源地址https://www.toymoban.com/news/detail-510585.html

到了这里,关于51单片机制作简易数字电压表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机_电压采集器&电压表

    实物演示效果: https://www.bilibili.com/video/BV1My4y1F7xY/?vd_source=6ff7cd03af95cd504b60511ef9373a1d         利用51单片机作为主控芯片,3段式电压采集。模拟量经A/D(ADC0809)模数转换芯片,把模拟量转换为数字量输入到单片机的P0口,再由单片机控制LCD1602液晶显示模拟量输入的电压值。

    2024年01月19日
    浏览(46)
  • 基于单片机的数字电压表设计

    基于51单片机的数字电压表(ADC0809) 资料包括有原理图、0809芯片使用资料、89C52单片机、毕业设计开题报告、参考论文、原理图等​。 具体组成如下图所示: 该图为Proteus仿真图,采集的电压由滑动变阻器模拟,其原理就是利用ADC0908AD转换芯片对采集的模拟量进行转换为数字

    2024年02月08日
    浏览(31)
  • 51单片机制作简易密码锁

    51单片机期末考试设计题目 设计要求: 设计具有16个按键和1个数码管显示的密码锁,具体要求: 输入一位密码(为0~9,A~F之间的数字),密码输入正确显示“F”并将锁打开;否则显示“E”,继续保持锁定状态。 基本要求: 密码锁的基本功能如下:16个按键,分别代表数

    2024年02月11日
    浏览(38)
  • 51单片机入门——(新)简易数字时钟

    实现正确稳定地显示小时(两位数)、分钟(两位数)、秒钟(两位数),同时数码管应无闪烁问题。 通过按键分别实现时、分信息的调整,方便用户对时间的校准。 加入闹铃功能在(本设计中用LED代替)。 key1 用于切换时分秒的加减。例:第一次按下后,按key2key3时“秒”加减,

    2024年02月11日
    浏览(37)
  • 基于STM32的简易数字电压表仿真设计

    本设计 基于STM32的数字电压表仿真设计(仿真+程序+设计报告+讲解) 仿真图proteus 8.9 程序编译器:keil 5 编程语言:C语言 设计编号:C0080 结合实际情况,基于STM32F103单片机设计一个数字电压表仿真设计。该设计应满足的功能要求为: 1、以STM32单片机为控制核心设计数字电压表

    2024年02月07日
    浏览(31)
  • 基于51单片机的电压采集(ADC0804)

    1.ADC0804简介 工作电压:+5V,即VCC=+5V。 模拟转换电压范围:0~+5V,即0≤Vin≤+5V。 分辨率:8位,即分辨率为1/(2^8)=1/256,转换值介于0~255之间。 转换时间:100us(fCK=640KHz时)。 转换误差:±1LSB。 参考电压:2.5V,即Vref/2=2.5V。 Vin(+)、Vin(-):两个模拟信号输入端,可以接

    2023年04月08日
    浏览(30)
  • 基于51单片机的电压采集(ADC0809)

    1.ADC0809简介 IN0~IN7 : 8路模拟量输入端; D0~D7:8位数字量输出端; ADDA、ADDC、ADDC:3位地址输入线,用于选择8路模拟通道中的一路; ALE:地址锁存允许信号,输入,高电平有效; START:A/D转换启动信号,输入,高电平有效; EOC:A/D转换结束信号,输出。当启动转换时,高引脚为低电

    2023年04月18日
    浏览(32)
  • 51单片机简易电子密码锁

    由于作业需求,在昨天天晚上写了一个通过lcd1602,i2c,eeprom,按键,实现的可以设置密码的简易电子锁,    首先点击k15(回车键)进入  进入后可以点击0-9按键输入6位密码,错误则显示error,5s后重新显示密码输入页面,密码正确则进入。    进入后可以点击Esc键设置密码,进入设

    2024年02月02日
    浏览(37)
  • 24小时切换简易时钟-51单片机

    1、本设计主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机STC89C51单片机和LED数码管为核心,辅以必要的电路,构成了一个单片机电子时钟。 2、本设计拟实现的性能指标如下: (1)键盘用于校正、调节数码管上显示的时间。 (2)单片机通过输出

    2024年02月11日
    浏览(33)
  • 51单片机-定时器(简易时钟的实现)

    最近在学习51单片机,学到了 定时器 这块,由于自己的基础不太扎实,在这方面花了很多时间,这里通过对定时器和中断的介绍,用 简易时钟 这个例子来对学习的内容进行加深巩固,把自己的经验分享给大家,希望对大家能够有帮助。 其实就是单片机的内部,通过系统时钟

    2024年02月03日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包