1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 51单片机数字电压表仿真设计_LCD显示

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

时间:2022-02-01 16:33:31

相关推荐

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

目录标题

51单片机数字电压表仿真设计_LCD显示仿真图ADC080951单片机最小系统原理图软件设计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)] [资料下载链接](/doc/DS1ZJcG1MSHNGUnRS)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。