51单片机实现简易数字电压表(液晶显示)仿真图+程序
51单片机简单数字电压表

毕业论文声明本人郑重声明:1.此毕业论文是本人在指导教师指导下独立进行研究取得的成果。
除了特别加以标注地方外,本文不包含他人或其它机构已经发表或撰写过的研究成果。
对本文研究做出重要贡献的个人与集体均已在文中作了明确标明。
本人完全意识到本声明的法律结果由本人承担。
2.本人完全了解学校、学院有关保留、使用学位论文的规定,同意学校与学院保留并向国家有关部门或机构送交此论文的复印件和电子版,允许此文被查阅和借阅。
本人授权大学学院可以将此文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本文。
3.若在大学学院毕业论文审查小组复审中,发现本文有抄袭,一切后果均由本人承担,与毕业论文指导老师无关。
4.本人所呈交的毕业论文,是在指导老师的指导下独立进行研究所取得的成果。
论文中凡引用他人已经发布或未发表的成果、数据、观点等,均已明确注明出处。
论文中已经注明引用的内容外,不包含任何其他个人或集体已经发表或撰写过的研究成果。
对本文的研究成果做出重要贡献的个人和集体,均已在论文中已明确的方式标明。
学位论文作者(签名):年月关于毕业论文使用授权的声明本人在指导老师的指导下所完成的论文及相关的资料(包括图纸、实验记录、原始数据、实物照片、图片、录音带、设计手稿等),知识产权归属华北电力大学。
本人完全了解大学有关保存,使用毕业论文的规定。
同意学校保存或向国家有关部门或机构送交论文的纸质版或电子版,允许论文被查阅或借阅。
本人授权大学可以将本毕业论文的全部或部分内容编入有关数据库进行检索,可以采用任何复制手段保存或编汇本毕业论文。
如果发表相关成果,一定征得指导教师同意,且第一署名单位为大学。
本人毕业后使用毕业论文或与该论文直接相关的学术论文或成果时,第一署名单位仍然为大学。
本人完全了解大学关于收集、保存、使用学位论文的规定,同意如下各项内容:按照学校要求提交学位论文的印刷本和电子版本;学校有权保存学位论文的印刷本和电子版,并采用影印、缩印、扫描、数字化或其它手段保存或汇编本学位论文;学校有权提供目录检索以及提供本学位论文全文或者部分的阅览服务;学校有权按有关规定向国家有关部门或者机构送交论文的复印件和电子版,允许论文被查阅和借阅。
《单片机》教学课件数字电压表例程(C51)

读0809数据
delaynms(2); qianwei=0;
baiwei=1;
P1=table[bai]; delaynms(2); shiwei=1;
baiwei=0;
输出位码 输出段吗
P1=table[shi];
delaynms(2); sable[ge];
delaynms(2); gewei=0;
数字电压表例程
1
程序内容
一 二 三 四
初始化 0809转换 数据处理 七段动态显示
2
0809与单片机接口电路
3
源程序
#include <reg51.h>
#include <absacc.h> #include <intrins.h> #define uchar unsigned char
定义表数据 带小数点/不
while(j--) {for(i=0;i<250;i++) {_nop_(); _nop_(); _nop_(); _nop_(); } }
}
5
/**********显示函数************/
void display(uchar x)
{ unsigned int temp;
uchar ge,shi,bai,qian;
temp=x*196;
//提取电压千位百位十位个位
qian=temp/10000;
bai=temp%10000/1000; shi=temp%10000%1000/100; ge=temp/100%10;
利用除法 提取千百十
基于8051单片机的简易数字电压表设计

基于8051单片机的简易数字电压表设计姓名:吴建亮班级:电信1202 学号:201203090224摘要电压表应用十分广泛,但大部分是模拟电压表,而由于其特性,反应速度慢,读数麻烦并且误差较大,所以为适应不断快速发展的高速信号领域,已经广泛使用数字电压表。
本实验设计是基于51单片机开发板ESDM-3A实现的一种数字电压表系统。
该设计采用8051单片机作为控制核心,以ADC0为模数转换数据采样,实现被测电压的数据采样,外部采用LCD12864液晶显示电压表的电压值。
1.设计任务和要求1.1 设计任务设计制作一个简易直流电压表,该直流电压表能测量直流电压。
各硬件模块如图1.1所示。
输入电压AD转换器8051单片机LCD12864图1.1硬件框图1.2 设计要求(1)ADC0的工作方式设置如下:采用单端输入,模拟输入电压从P2.0输入;选择DDV作为参考电压源;转换时钟频率设置为2MHz;采用写“AD0BUSY”启动A/D转换。
(2)采用定时器中断每隔0.5s启动一次A/D转换;通过ADC0中断服务程序读取转换值。
2.设计方案2.1 硬件电路硬件模块如上图1.1所示。
输入电压由开发板上J8接口的第2脚0~5.0V接跳线至单片机扩展接口J7的第4脚P2.0,调节电位器RP3实现不同电压的输入。
AD转换器、单片机、液晶屏在开发板已经连接好。
下面简单介绍所用的器件。
C8051F360单片机主要模拟和数字资源包括:(1)高速8051微控制器内核。
(2)10位逐次逼近型A/D转换器。
(3)10位电流输出D/A转换器。
(4)两个模拟电压比较器CP1和CP0。
(5)片内锁相环PLL。
(6)扩充中断处理系统。
(7)存储器,256字节内部RAM;1024字节XRAML;32字节闪存存储器。
(8)数字资源,多达39个I/O引脚,全部为三态双向口,允许与5V系统接口。
(9)时钟源,2个内部振荡器;80kHz低频低功耗振荡器。
基于AT89C51单片机的数字电压表的Proteus仿真设计与应用

基于AT89C51单片机的数字电压表的Proteus仿真设计与应用一、本文概述本文旨在深入探讨基于AT89C51单片机的数字电压表的Proteus 仿真设计与应用。
我们将从AT89C51单片机的特点出发,分析其在数字电压表设计中的优势,并详细阐述如何利用Proteus仿真软件进行电路设计与仿真的全过程。
通过本文的阐述,读者将能够对基于AT89C51单片机的数字电压表的设计原理、电路构建、仿真测试等方面有全面的了解,并能在实践中应用所学知识,实现数字电压表的开发与优化。
本文将首先介绍AT89C51单片机的基本特性,包括其内部结构、功能特点以及适用场景。
接着,我们将详细解析数字电压表的设计原理,包括电压信号的采集、处理与转换等关键步骤。
在此基础上,我们将深入探讨如何利用Proteus仿真软件进行电路设计与仿真,包括电路元件的选择、电路连接、仿真参数设置等具体操作。
通过Proteus仿真软件的应用,我们能够在虚拟环境中对数字电压表进行仿真测试,从而验证电路设计的正确性,预测实际运行效果,优化电路设计。
Proteus仿真软件还具有操作简便、可视化程度高、仿真速度快等优点,使得电路设计与调试过程更加高效便捷。
本文将总结基于AT89C51单片机的数字电压表的Proteus仿真设计与应用过程中的经验教训,为读者在实际开发中提供参考与借鉴。
通过本文的学习与实践,读者将能够掌握数字电压表的设计与开发技能,为未来的电子工程设计与实践奠定坚实的基础。
二、AT89C51单片机概述AT89C51是Atmel公司生产的一款8位低功耗、高性能的CMOS微控制器,它属于AT89系列单片机。
AT89C51单片机内部集成了4KB 的可反复擦写的Flash只读程序存储器,这使得它具备了程序存储空间的持久性和可修改性,大大简化了程序的更新和维护过程。
它还拥有128字节的内部RAM,用于程序执行过程中的数据存储和临时变量存储。
AT89C51单片机采用了32个可编程的I/O口线,满足了大多数基本外设的接口需求。
基于51单片机的数字电压表仿真设计(有参考文献)

基于51单片机的数字电压表仿真设计一、引言随着电子科学技术的发展,电子测量成为广大电子工作者必须掌握的手段,对测量的精度和功能的要求也越来越高,而电压的测量甚为突出,因为电压的测量最为普遍。
数字电压表是采用数字化测量技术设计的电压表。
数字电压表与模拟电压表相比,具有读数直观、准确、显示范围宽、分辨力高、输入阻抗大、集成度高、功耗小、抗干扰能力强,可扩展能力强等特点,因此在电压测量、电压校准中有着广泛的应用。
而单片机也越来越广泛的应用与家用电器领域、办公自动化领域、商业营销领域、工业自动化领域、智能仪表与集成智能传感器传统的控制电路、汽车电子与航空航天电子系统。
单片机是现代计算机技术、电子技术的新兴领域。
本文采用ADC0808对输入模拟信号进行转换,控制核心C51单片机对转换的结果进行运算和处理,最后驱动输出装置显示数字电压信号,通过Proteus仿真软件实现接口电路设计,并进行实时仿真。
Proteus软件是一种电路分析和实物模拟仿真软件。
它运行于Windows 操作系统上,可以进行仿真、分析(SPICE)各种模拟器件和集成电路,是集单片机和SPICE分析于一身的仿真软件,功能强大,具有系统资源丰富、硬件投入少、形象直观等优点,近年来受到广大用户的青睐。
二、数字电压表概述1、数字电压表的发展与应用电压表指固定安装在电力、电信、电子设备面板上使用的仪表,用来测量交、直流电路中的电压。
传统的指针式电压表功能单一、精度低,不能满足数字化时代的需求,并且传统的电压表在测量电压时需要手动切换量程,不仅不方便,而且要求不能超过该量程。
目前,由各种单片A/D转换器构成的数字电压表,已被广泛用于电子及电工测量领域,并且由DVM扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到崭新水平。
2、本次设计数字电压表的组成部分本设计是由单片机AT89C51作为整个系统控制的核心,整个系统由衰减输入电路、量程自动转换电路、交直流转换电路、模数转换及控制电路以及接口电路五大部分构成。
单片机简易电子表方案与仿真

智能仪器及应用实验报告项目名称:基于51单片机的简易电子表设计与仿真专业名称:测控技术与仪器班级:测控0901班学生姓名:指导教师:一、任务要求使用Keil uVision编程软件以及ISIS 7 Professional仿真软件制作一个简易电子表,要求具备电子表基本功能<时间显示、时间调整等)。
二、总体设计方案利用AT89C51作为控制以及1602LCD作为显示,通过6个按键实现出入时间设置状态、出入闹铃设置状态、小时位调整、分钟位调整、开关闹铃等功能。
系统的流程图如下:图1-1 系统仿真流程图三、系统硬件1、AT89C51引脚功能说明:AT89C51芯片如图1-2所示图1-2AT89C51VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏极开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是因为内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是因为内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
51单片机实现简易数字电压表(液晶显示)仿真图+程序

#define uchar unsigned char
#define uint unsigned int
#defin2;
sbit EOC= P0^3;
sbit OE= P0^4;
sbit CLK= P0^1;
uchar c[6];
LCD_w_com(0x01);//清屏显示
delay(200);
}
//==========光标定位=======================
void gotoxy(uchar x,uchar y) // x表示行,y表示列
{uchar address;
if(x==1)
address=0x80+y;
return result;//返回侧忙结果
}
//==================写指令函数=================
void LCD_w_com(uchar com)
{
while(lcd_bz());
LCD_DB=com;
LCD_RS=0;//指令
LCD_RW=0;//写入
LCD_E=1;
#define uint unsigned int
void main()
{
uchar i;
ADC_init();
LCD_init();
while(1)
{
i=ADC_change();
sepr(i);
disp();
}
}
void clock(void) interrupt 1
{
CLK=~CLK;
}
/***********************0809模数转换(ADC0809.c)***************************/
基于51单片机的ADC0832数字电压表(仿真+程序)

仿真图:#in elude <reg52.h>#in elude vintrin s.h>sbit CS = P3A 5;sbit Clk =卩3人3;sbit DATI = P3A4;sbit DATO = P3A4;sbit P20=P2A0 ;un sig ned char dat = 0x00;un sig ned char count = 0x00;/******************************* ^定义全局变^量 ******************************/** 斗 XT C £J_1XTW2 R^T Pd KI W KUW?PQ pa.&^oo KMW POTrorip?rw P2/WPG£H芒酒r P2.4m;fcA. 旳腳威*2 ma5 P3.IM 沁Pi 1 pg.vwt F3.Z/IOOFts PH M.:州和 P2-4TD P1 6 P16 •"■S.aUtfk P3 &■ 14■和PV1******************************* 包含头文^件 ******************************/********************************* ^端■口定^义 ********************************//AD 值 //定时器计数U2xinjjbn■TBMK ■ & EK ■曲 ■詡 'RP1■ 12 4 'unsigned char CH; // 通道变量unsigned char dis[] = {0x00, 0x00, 0x00}; // 显示数值/*************************共阳 LED 段码表unsigned char codetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};char code tablewe[]={ 0xfd,0xfb,0xf7,0xef,0xdf,0xfe };/*************************************************************************** * 函数功能 :AD 转换子程序入口参数 :CH 出口参数 :dat**************************************************************************unsigned char adc0832(unsigned char CH) {unsigned char i,test,adval;adval = 0x00;test = 0x00;Clk = 0; // 初始化DATI = 1;_nop_();CS = 0;_nop_();Clk = 1;_nop_();if ( CH == 0x00 ) // 通道选择{Clk = 0;DATI = 1; // 通道 0 的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 0; // 通道 0 的第二位_nop_();Clk = 1;_nop_();}else{Clk = 0;DATI = 1; // 通道 1 的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 1; // 通道 1 的第二位_nop_();Clk = 1;_nop_();}Clk = 0;DATI = 1;for( i = 0;i < 8;i++ ) // 读取前 8 位的值{_nop_();adval <<= 1;Clk = 1;_nop_();Clk = 0;if (DATO)adval |= 0x01;elseadval |= 0x00;}for (i = 0; i < 8; i++) // 读取后 8 位的值{test >>= 1;if (DATO)test |= 0x80;elsetest |= 0x00;_nop_();Clk = 1;_nop_();Clk = 0;}if (adval == test) // 比较前 8 位与后 8 位的值,如果不相同舍去。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{uchar address;
if(x==1)
address=0x80+y;
else
address=0xc0+y;
LCD_w_com(address);
}
//=========显示一个字符串==================
液晶显示,89C51实现简易电压表
用keil C51软件编译,主函数中包含了两个c文件,即lcd.c、ADC0809.c
0809的仿真芯片用的是ADC0808进行代替。注意高低位的接法
程序如下:
/**************************************主函数*******************************/
void delay(uint x)
{uint i,j;
for(i=x;i>0;i--)
for(j=0;j<2;j++);
}
/****************侧忙函数************************/
unsigned lcd_bz()
{
unsigned result;
LCD_RS = 0;
#include <reg51.h>
#include <lcd.c>
#include <ADC0809.c>
#define uchar unsigned char
#define uint unsigned int
void main()
{
uchar i;
ADC_init();
LCD_init();
while(1)
#define uchar unsigned char
#define uint unsigned int
#define LCD_DB P2//定义LCD的数据端口
sbit LCD_RS=P0^5;
sbit LCD_RW=P0^6;
sbit LCD_E =P0^7;
//===========延时子函数========================
#define uchar unsigned char
#define uint unsigned int
#define ADC_DB P1
sbit ST= P0^2;
sbit EOC= P0^3;
sbit OE= P0^4;
sbit CLK= P0^1;
uchar c[6];
void sepr(uchar i);
gotoxy(2,5);
LCD_display(c);
}
void sepr(uchar i)
{
uint ch;ቤተ መጻሕፍቲ ባይዱ
ch=i;
c[0]='0'+ch/51;
c[1]='.';
c[2]='0'+(ch%51)*10/51;
c[3]='0'+((ch%51)*10%51)*10/51;
c[4]='V';
c[5]='\0';
void disp();
voidADC_init();
ucharADC_change();
ucharADC_change()
{
ST=0;
ST=1;
ST=0;
while(EOC==0);
ADC_DB=0xff;
OE=1;
return(ADC_DB);
}
void disp()
{
gotoxy(1,1);
LCD_display("The Output is:");
}
voidADC_init()
{
TMOD=0x02;
TH0=10;
TL0=10;
EA=1;
ET0=1;
TR0=1;
}
/***********************************液晶(lcd.c)****************************/
#include<reg51.h>
#include <INTRINS.H>//库函数头文件,代码中引用了_nop_()函数
void LCD_display(uchar *dat)
{
while(*dat!='\0')
{LCD_w_data(*dat);
dat++;
}
}
{LCD_w_com(0x38);//设置8位格式,2行,5*7
LCD_w_com(0x0c);//整体显示,关光标,不闪烁
LCD_w_com(0x06);//设定输入方式,增量不移位
LCD_w_com(0x01);//清屏显示
delay(200);
}
//==========光标定位=======================
void LCD_w_data(uchar dat)
{LCD_DB=dat;
LCD_RS=1;//数据寄存器
LCD_RW=0;//写入数据
LCD_E=1;
LCD_E=0;
delay(1);//等待程序执行完毕。。。
}
//===========初始化函数=============
void LCD_init(void)
LCD_RW = 1;
LCD_E = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (unsigned)(LCD_DB & 0x80);//检测P2最高位是否为1
LCD_E = 0;
return result;//返回侧忙结果
}
//==================写指令函数=================
{
i=ADC_change();
sepr(i);
disp();
}
}
void clock(void) interrupt 1
{
CLK=~CLK;
}
/***********************0809模数转换(ADC0809.c)***************************/
#include <reg51.h>
void LCD_w_com(uchar com)
{
while(lcd_bz());
LCD_DB=com;
LCD_RS=0;//指令
LCD_RW=0;//写入
LCD_E=1;
LCD_E=0;
delay(1);//等待执行完毕。。。
}
//===================写数据函数=================