目录标题

  • 51单片机数字电压表仿真设计_LCD显示
    • 仿真图
      • ADC0809
      • 51单片机最小系统
    • 原理图
    • 软件设计
      • main函数
      • LCD1602驱动程序
    • 资料清单

51单片机数字电压表仿真设计_LCD显示

(仿真+程序+原理图+设计报告)

原理图:Altium Designer

仿真版本:proteus 7.8

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:S0006

设计说明:

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

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

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

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

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

仿真图

以AT89C51单片机为核心,起着控制作用。系统包括LCD1602液晶显示电路、复位电路、时钟电路、模数转换电路电路。设计思路分为五个模块:复位电路、晶振电路模块、AT89C51、LCD1602液晶显示电路、模数转换器电路这五个模块。

设计框图

ADC0809

ADC0809是美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式AD转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。

(1)主要特性:

1)8路输入通道,2位A/D转换器,即分辨率为8位。

2)具有转换起停控制端。

3)转换时间为100μs(时钟为640kHz时),130μs(时钟为500kHz时)

4)单个+5V电源供电

5)模拟输入电压范围0~+5V,不需零点和满刻度校准。

6)工作温度范围为-40~+85摄氏度

7)低功耗,约15mW。

51单片机最小系统

单片机最小系统说明:

时钟信号的产生:在MCS-51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。而在芯片的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器,这就是单片机的时钟振荡电路。

时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。

一般地,电容C2和C3取30pF左右,晶体的振荡频率范围是1.2-12MHz。如果晶体振荡频率高,则系统的时钟频率也高,单片机的运行速度也就快。

单片机复位使CPU和系统中的其他功能部件都处在一个确定的初始状态下,并从这个状态开始工作。单片机复位条件:必须使9脚加上持续两个机器周期(即24个振荡周期)的高电平。

原理图

PCB:

软件设计

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

程序代码:

main函数

//<程序名>:数字电压表                                                                       **
//<功能>:使用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;}elseuc_Clock--;TH0=TIME0H;           //恢复定时器0。TL0=TIME0L;
}

LCD1602驱动程序

#include"LCD1602.h"
void vWriteCMD(uchar ucCommand)
{vDelay();              //先延时。LCDE=1;                  //然后把LCD改为写入命令状态。LCDRS=0;    LCDRW=0;LCDPORT=ucCommand;         //再输出命令。LCDE=0;                    //最后执行命令。
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<把1个数据写入LCD>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void vWriteData(uchar ucData)
{vDelay();             //先延时。LCDE=1;                  //然后把LCD改为写入数据状态。LCDRS=1;LCDRW=0;LCDPORT=ucData;            //再输出数据。LCDE=0;                //最后显示数据。
}
void vShowOneChar(uchar ucChar)
{switch(ucChar){case ' ': vWriteData(0x20);break;case '!':  vWriteData(0x21);break;case '"':     vWriteData(0x22);break;case '#':  vWriteData(0x23);break;case '$':  vWriteData(0x24);break;case '%':  vWriteData(0x25);break;case '&':  vWriteData(0x26);break;case '>':   vWriteData(0x27);break;case '(':  vWriteData(0x28);break;case ')':  vWriteData(0x29);break;case '*':  vWriteData(0x20);break;case '+':     vWriteData(0x2A);break;case '-':  vWriteData(0x2D);break;case '/':  vWriteData(0x2F);break;case '=':     vWriteData(0x3D);break;case '<':   vWriteData(0x3E);break;case '?':  vWriteData(0x3F);break;case '.':  vWriteData(0x2E);break;case ':':  vWriteData(0x3A);break;case '0':  vWriteData(0x30);break;case '1':  vWriteData(0x31);break;case '2':  vWriteData(0x32);break;case '3':  vWriteData(0x33);break;case '4':  vWriteData(0x34);break;case '5':  vWriteData(0x35);break;case '6':  vWriteData(0x36);break;case '7':  vWriteData(0x37);break;case '8':  vWriteData(0x38);break;case '9':  vWriteData(0x39);break;case 'A':  vWriteData(0x41);break;case 'B':  vWriteData(0x42);break;case 'C':  vWriteData(0x43);break;case 'D':  vWriteData(0x44);break;case 'E':  vWriteData(0x45);break;case 'F':  vWriteData(0x46);break;case 'G':  vWriteData(0x47);break;case 'H':  vWriteData(0x48);break;case 'I':  vWriteData(0x49);break;case 'J':  vWriteData(0x4A);break;case 'K':  vWriteData(0x4B);break;case 'L':  vWriteData(0x4C);break;case 'M':  vWriteData(0x4D);break;case 'N':  vWriteData(0x4E);break;case 'O':  vWriteData(0x4F);break;case 'P':  vWriteData(0x50);break;case 'Q':  vWriteData(0x51);break;case 'R':  vWriteData(0x52);break;case 'S':  vWriteData(0x53);break;case 'T':  vWriteData(0x54);break;case 'U':  vWriteData(0x55);break;case 'V':  vWriteData(0x56);break;case 'W':  vWriteData(0x57);break;case 'X':  vWriteData(0x58);break;case 'Y':  vWriteData(0x59);break;case 'Z':  vWriteData(0x5A);break;case 'a':  vWriteData(0x61);break;case 'b':  vWriteData(0x62);break;case 'c':  vWriteData(0x63);break;case 'd':  vWriteData(0x64);break;case 'e':  vWriteData(0x65);break;case 'f':  vWriteData(0x66);break;case 'g':  vWriteData(0x67);break;case 'h':  vWriteData(0x68);break;case 'i':  vWriteData(0x69);break;case 'j':  vWriteData(0x6A);break;case 'k':  vWriteData(0x6B);break;case 'l':  vWriteData(0x6C);break;case 'm':  vWriteData(0x6D);break;case 'n':  vWriteData(0x6E);break;case 'o':  vWriteData(0x6F);break;case 'p':  vWriteData(0x70);break;case 'q':  vWriteData(0x71);break;case 'r':  vWriteData(0x72);break;case 's':  vWriteData(0x73);break;case 't':  vWriteData(0x74);break;case 'u':  vWriteData(0x75);break;case 'v':  vWriteData(0x76);break;case 'w':  vWriteData(0x77);break;case 'x':  vWriteData(0x78);break;case 'y':  vWriteData(0x79);break;case 'z':  vWriteData(0x7A);break;default:     break;}
}
void vShowChar(uchar ucaChar[])
{uchar ucCount;for(ucCount=0;;ucCount++){vShowOneChar(ucaChar[ucCount]);if(ucaChar[ucCount+1]=='\0')break;}
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<延时函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void vDelay()
{uint uiCount;for(uiCount=0;uiCount<250;uiCount++);
}

设计报告:

资料清单

设计报告:[外链图片转存中...(img-aKFWFwGA-1662131075048)] ## 资料清单[外链图片转存中...(img-QQcTNJPP-1662131075048)] [资料下载链接](https://docs.qq.com/doc/DS1ZJcG1MSHNGUnRS)

51单片机数字电压表仿真设计_LCD显示相关推荐

  1. 基于51单片机数字电压表的设计 仿真、程序、原理图(转发)

    摘 要 数字电压表简称DVM,数字电压表基本原理是将输入的模拟电压信号转化为数字信号,再进行输出显示.而A/D转换器的作用是将连续变化的模拟信号量转化为离散的数字信号,器基本结构是由采样保持,量化,编 ...

  2. 基于51单片机信号发生器仿真设计

    本设计 基于51单片机信号发生器仿真设计 (仿真+程序源码+设计说明书) 仿真原版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0015 目录标题 ...

  3. 基于51单片机数字频率计仿真设计(proteus仿真+程序+原理图+参考报告+器件清单)

    51单片机数字频率计仿真设计 51单片机数字频率计仿真设计 主要功能 任务书 实物图 仿真图 原理图 信号采集模块 脉冲产生模块 分频模块 程序 设计报告 全部参考资料 资料下载链接 51单片机数字频 ...

  4. 基于51单片机音乐盒仿真设计(音乐播放器)

    基于51单片机音乐盒仿真设计( proteus仿真+程序+原理图+PCB+报告+讲解视频) 仿真图proteus 7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0 ...

  5. 基于51单片机自行车码表设计

    [毕设课设]基于51单片机自行车码表设计 ​效果图 Proteus仿真: 功能简介: 文件内容: 程序框架: 网盘链接: ​效果图 更多内容请关注@WENJIE电子科技 ​ 基于51单片机proteu ...

  6. 51单片机双机串口数码管显示排队叫号仿真设计( proteus仿真+程序+报告+讲解视频)

    51单片机双机串口数码管显示排队叫号仿真设计 1.主要功能: 2.仿真 3.程序 4.设计报告 1.1 设计背景与意义 1.2 设计目的 1.3 设计要求及内容 1.4 本文结构安排 2 总体设计方案 ...

  7. 51单片机的仿真实验——1602显示屏显示万年历与温度

    实验内容: 1:数字钟设计 2:基于DS18B20的温度测量模块设计 问题描述: 之前笔者写过一篇用数码管显示日历与温度的实验记录(51单片机的仿真实验--数码管显示日历与温度).但是数码管在仿真软件 ...

  8. 51单片机综合课程设计多功能电子秤(显示时间、温度、存储、串口、报警装置等)

    51单片机综合课程设计----多功能电子秤 关键词:proteus仿真.51单片机.DS1302时钟芯片.DB18B20温度芯片.AT24C02存储芯片.LCD1602液晶屏.ADC0832芯片等,文 ...

  9. 51单片机数字电子钟设计(数电课设,含时间显示、校准、整点报时、闹钟功能)

    51单片机数字电子钟设计(数电课设,含时间显示.校准.整点报时.闹钟功能) 首先展示硬件设计部分,此处采用proteus仿真演示.其中液晶屏上面一行显示的是实际时间,下面一行显示的是设定闹钟时间.通过 ...

  10. 51单片机蓄电池充电保护设计Proteus仿真

    51单片机蓄电池充电保护设计Proteus仿真 功能描述如下:本设计由STC89C52单片机电路+LCD1602液晶显示电路+ACS712电流检测电路+分压电路+PCF8591 AD检测设计+继电器电 ...

最新文章

  1. C库函数-perror()
  2. 推荐20个很有帮助的 Web 前端开发教程
  3. 还不知道 Redis 分布式锁的背后原理?还不赶快学习一下
  4. 设计买什么笔记本电脑_大一设计专业新生,买什么牌子笔记本电脑合适?
  5. android和flask交互,java - 当我从Android向Flask Web服务发送参数时,如何解决“ SSL库故障”? - 堆栈内存溢出...
  6. tomcat+nginx+redis实现均衡负载、session共享(一)
  7. 大剑无锋之一句话输出表中每一个同学的成绩最高的课程【面试推荐】
  8. jdbcTemplate快速入门
  9. java链表的数据结构_Java数据结构 获取链表(LinkedList)的第一个和最后一个元素
  10. Spark Streaming的工作机制
  11. 服务器维护家电需要电工证吗,物业电工需要电工证吗
  12. 教你轻松构建基于 Serverless 架构的小程序
  13. python的平方运算符_python入门之与用户交互、运算符
  14. python编程软件哪个好-推荐10 款最好的 Python IDE
  15. excel vba批量发送邮件
  16. 网络工程师有什么发展?
  17. 计算机软件 硬件的组成部分,计算机软硬件组成.ppt
  18. 关于PLC控制系统中电动机过载保护方法的探究
  19. 现货黄金宝典——如何做突破行情
  20. 密码锁 Locker

热门文章

  1. 微信小程序-自定义三级联动
  2. 使用node实现向手机发送验证码
  3. t检验比较两种算法的性能
  4. 大数据毕业设计题目50例
  5. tiff与GDAL笔记
  6. EtherNet IP /Modbus 网关ENB-302MI
  7. ehvierwer登录与不登录_微信上不去了怎么办,峰哥教你微信登录不上去的办法
  8. Linux: ubuntu Appium连接手机
  9. 微信小程序全国巡回沙龙杭州站-芋头演讲详细内容及PPT
  10. win10未启动对远程服务器启动,win10系统连接远程提示未启用对服务器的远程访问的操作技巧...