• 51单片机数字电压表仿真设计_LCD显示(仿真+程序+原理图+PCB+设计报告+讲解)


    基于51单片机数字电压表仿真设计_LCD显示(仿真+程序+原理图+PCB+设计报告+讲解)

    原理图:Altium Designer

    仿真版本:proteus 7.8

    程序编译器:keil 4/keil 5

    编程语言:C语言

    设计编号:S0006

    讲解视频

    基于51单片机数字电压表仿真设计

    1 功能要求:

    芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯片。

    1、利用51单片机作为主控芯片,模拟量输入范围直流0v-5v。模拟量经A/D(ADC0809)模数转换芯片,把模拟量转换为数字量输入到单片机的P0口,再由单片机控制LCD1602液晶显示模拟量输入的电压值。

    2、此次设计的是数字电压表,要求的电压范围是0~5v。

    3、系统设计主要包括四个部分:

    分别是电源模块、AD模数转换部分、51单片机最小系统部分、数码管显示部分。

    首先由单片机初始化ADC0809模数转换芯片和共阴数码管显示,当外接被测电压后,ADC0809将模拟电压信号转换为数字信号输入到单片机的I/O口,通过单片机处理后将电压的大小显示在LCD1602液晶上面。

    仿真51单片机芯片是通用的,AT89C51,AT89C52都是51单片机的具体型号,内核是兼容的。原理图不变的情况下,主控芯片可以替换成STC89C52/STC89C51/AT89C52/AT89C51/8051等51单片机芯片。

    2 仿真图:

    打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。开始仿真后LCD1602显示当前的电压值,通过调整滑动变阻器的阻值大小改变测量的电压值。

    img

    3 原理图:

    AD绘制的。

    img

    元器件清单

    CommentDescriptionDesignatorFootprintQuantity
    10uF电容C1EC-1001
    30pF电容C2, C3CAP-1002
    5V2P排针J1SIP21
    20R电阻R1RES-2001
    22K电阻R2, R3, R4, R5, R6, R7, R8, R9RES-2008
    1K排阻RP1SIP31
    AT89C51单片机U1DIP401
    ADC0809数模转换U2DIP281
    LCD1602液晶U3SIP161
    12M晶振Y1XTAL-2001

    4 PCB:

    img

    Proteus仿真和实物作品的区别:

    1.运行环境:Proteus仿真是在计算机上运行的,而实物则是在硬件电路板上运行。

    2.调试方式:在Proteus仿真中,可以方便地进行单步调试和观察变量值的变化,而在实物中则需要通过调试器或者串口输出等方式进行调试。

    电路连接方式:在Proteus仿真中,可以通过软件设置进行电路连接的修改,而在实物中则需要通过硬件电路板和连接线进行修改。

    3.运行速度:Proteus仿真通常比实物运行速度快,因为仿真是基于计算机运行的,而实物则需要考虑电路板上的物理限制和器件的响应时间等因素。

    4.功能实现:在Proteus仿真中,可以通过软件设置实现不同的功能,而在实物中则需要根据电路设计和器件的性能进行实现。

    5 程序设计:

    可使用Keil4/5打开工程文件,程序有关键注释结合视频理解。

    //<程序名>:数字电压表																 		 **
    //<功能>:使用LCD显示被检测电压,精度为0.05V,范围是0~5V。									 **
    #include"includes.h"
    #define TIME0H 0x3C
    #define TIME0L 0xB0	  
    uchar uc_Clock=0;		//定时器0中断计数
    bit b_DATransform=0;
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<把电压显示在LCD上>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    void vShowVoltage(uint uiNumber)
    {
    	uchar ucaNumber[3],ucCount;
    	if(uiNumber>999)					
    		uiNumber=999;
    	ucaNumber[0]=uiNumber/100;								//把计算数字的每个位存入数组。
    	ucaNumber[1]=(uiNumber-100*(int)ucaNumber[0])/10;							
    	ucaNumber[2]=uiNumber-100*(int)ucaNumber[0]-10*ucaNumber[1];
    	for(ucCount=0;ucCount<3;ucCount++)
    	{
    		vShowOneChar(ucaNumber[ucCount]+48);				//从首位到末位逐一输出。
    		if(ucCount==0)
    			vShowOneChar('.');
    	}
    }
    //*************************************************************************************************
    //*																								  *
    //*			  ********************************主函数******************************				  *
    //*																								  *
    //*************************************************************************************************
    void main()
    {
    	TMOD=0x01;			//定时器0,模式1。
    	TH0=TIME0H;
    	TL0=TIME0L;
    	TR0=1;				//启动定时器。
    	ET0=1;				//开定时器中断。
    	EA=1;				//开总中断
    	vdInitialize();
    	vWriteCMD(0x84);	   //写入显示起始地址(第一行第4个位置)
    	vShowChar("voltage");
    	vWriteCMD(0xC9);     
    	vShowChar("(V)");
    	while(1)
    	{
    		if(b_DATransform==1)
    		{
    			b_DATransform=0;
    			vWriteCMD(0xC4);
    			vShowVoltage(uiADTransform());
    		}
    	}
    }
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器0中断函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    void t0() interrupt 1
    {
    	if(uc_Clock==0)
    	{
    		uc_Clock=5;
    		b_DATransform=1;
    	}
    	else
    		uc_Clock--;
    	TH0=TIME0H;		   //恢复定时器0。
    	TL0=TIME0L;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    6 设计报告:

    该系统由延时子函数、LCD1602液晶忙检测子函数、LCD1602液晶写命令/写数据子函数、汉字显示子函数、LCD1602液晶显示字符串子函数、LCD1602液晶初始化子函数、ADC0809转换子函数、主函数和数据定义这几部分组成。

    img

    7 资料清单 和下载链接:

    0.常见使用问题及解决方法–必读!!!!

    1、源程序

    2、仿真

    3、原理图

    4、PCB图

    5、开题报告

    6、设计报告

    7、元器件清单

    9、硬件框图

    10、讲解视频

    Altium Designer 安装破解

    filename.bat

    KEIL+proteus 单片机仿真设计教程

    KEIL安装破解

    Proteus元器件查找

    Proteus安装

    Proteus简易使用教程

    单片机学习资料

    目录清单.txt

    相关数据手册

    答辩技巧

    设计报告常用描述

    鼠标双击打开查找更多51 STM32单片机课程毕业设计.url

    资料清单

    资料下载链接(可点击):

  • 相关阅读:
    iCloud涨价不用慌!学会使用群晖生态将本地SSD“上云”
    [c语言]小课堂 day6
    【Excel导出】(亲测可用)使用实现Hutool工具类将list对象数组导出的简单实现
    Day2:面试必考题目
    《大数据项目实战之搜索引擎用户行为分析》
    暑期JAVA学习(34)线程同步
    定时播音专家 - 定时播放音视频解决方案
    uniapp v3+ts 使用 u-upload上传图片以及视频
    2023兰州理工大学计算机考研信息汇总
    【c++】向远程服务器传输文件实现
  • 原文地址:https://blog.csdn.net/weixin_52733843/article/details/133418537