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

仿真图:/*********************************包含头文件********************************/ #include <reg52.h>#include <intrins.h>/*********************************端口定义**********************************/ sbit CS = P3^5;sbit Clk = P3^3;sbit DATI = P3^4;sbit DATO = P3^4;sbit P20=P2^0 ;/*******************************定义全局变量********************************/ unsigned char dat = 0x00; //AD值unsigned char count = 0x00; //定时器计数unsigned char CH; //通道变量unsigned char dis[] = {0x00, 0x00, 0x00}; //显示数值/*******************************共阳LED段码表*******************************/ unsigned char code tab[]={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位的值,如果不相同舍去。
《单片机》教学课件数字电压表例程(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;
利用除法 提取千百十
基于51单片机的简易数字电压表的设计单片机

基于51单片机的简易数字电压表的设计单片机————————————————————————————————作者:————————————————————————————————日期:2个人收集整理勿做商业用途甘肃畜牧工程职业技术学院毕业设计题目:基于51单片机的简易数字电压表的设计系部:电子信息工程系专业:信息工程技术班级:学生姓名:学号:指导老师:日期:目录毕业设计任务书 (1)开题报告 (3)摘要 (6)关键词 (7)引言 (7)第一章A/D转换器 (9)1.1A/D转换原理 (9)1.2 ADC性能参数 (11)1.2.1 转换精度 (11)1.2.2。
转换时间......................................... 错误!未定义书签。
1.3 常用ADC芯片概述 (13)第二章8OC51单片机引脚 (14)第三章ADC0809 (16)3。
1 ADC0809引脚功能 (16)3。
2 ADC0809内部结构 (18)3.3ADC0809与80C51的接口 (19)3.4 ADC0809的应用指导 (20)3.4。
1 ADC0809应用说明 (20)3.4.2 ADC0809转换结束的判断方法 (20)3。
4.3 ADC0809编程方法 (21)第四章硬件设计分析 (22)4。
1电源设计 (22)4.2 关于74LS02,74LS04 (22)4。
3 74LS373概述 (23)4。
3。
1 引脚图 (23)4。
3。
2工作原理 (23)4.4简易数字电压表的硬件设计 (24)结论 (25)参考文献 (25)附录.......................................................................................... 错误!未定义书签。
致谢 (29)毕业设计任务书学生姓名专业班级信息工程技术08。
2指导教师论文题目基于51单片机的简易数字电压表的设计研究的目标、内容及方法目标:基于MCS—51单片机,对设计硬件电路和软件程序应用的设计,使用发光二极管来显示所要测试模拟电压的数字电压值。
基于51单片机的数字电压表仿真设计(有参考文献)

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

基于51单片机数字电压表本模块采用ADC0832模数转换芯片,LCD1602液晶显示,测量范围0-5V,精度误差0.01V看了很多网上的课程设计或者毕业论文,得出以下几点:1.数字电压表的方案有很多种,有的采用ADC0809,或者ADC0808等,他们都是8温AD,并口传输数据,具有速率高的优点。
但是硬件复杂,与单片机电路繁琐,焊接起来比较麻烦。
所以本设计采用ADC0832,同样8位AD,特点是串口传输数据,硬件接口简单,且精度误差一致,速率也比较快,对于要求不高的系统非常适合。
2.显示电路,网上采用LED显示居多,本设计采用LCD1602液晶显示,具有硬件搭设简单,显示美观等优点3.本设计方便移植,只需将LCD1602三个控制端口,ADC0832 四个控制端口修改即可。
注意LCD1602数据传输接口是单片机的P0口,如下图,需要接上拉电阻4.程序采用C代码编写,亲测直接可以使用,若需仿真文件,请用E-mail联系邮系。
邮箱:gnsywb@5.网上很多设计数据转换程序有误,不够正确。
在转换过程中,中间变量需设置为int 类型,虽然8位AD输出最高位255,但是余数转换过程中会大于255。
若设计char型,会造成显示输出有误。
void convert(uchar a){ uint temp; //特别注意这里需定义int型(余数将大于255)dis[0]=a/51; //取个位temp=a%51;temp=temp*10; dis[1]=temp/51; //取小数点后第一位temp=temp%51;temp=temp*10; dis[2]=temp/51; //取小数点后第二位}具体电路图如下:1.利用电压表与测量显示电压对比附录:C程序/******************************************** 功能:单片机数字电压表ADC0832+LCD16021,测量范围0-5V2,2路输入电压,可自行设定3,测量精度误差0.01V,LCD液晶显示编写者:小子在西藏gnsywb@编写日期:2012-11-5*********************************************/ #include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit lcdrs=P2^4;sbit lcdrw=P2^5;sbit lcden=P2^6; //1602控制端口sbit DI=P3^4;sbit DO=P3^4; //DI和DO与单片机共接口sbit Clk=P3^3;sbit CS=P3^5;//ADC0832控制端口uchar dis[3]={0x00,0x00,0x00}; //显示缓冲区uchar date=0; //AD值uchar CH; //ADC0832通道值/*****************************************AD0832转换程序******************************************/uchar ADC0832(uchar CH){uchar i,dis0,dis1;Clk=0; //拉低时钟DI=1; //初始化_nop_();CS=0; //芯片选定_nop_();Clk=1; //拉高时钟_nop_();if(CH==0) //通道选择{Clk=0; //第一次拉低时钟DI=1; //通道0的第一位_nop_();Clk=1; //拉高时钟_nop_();Clk=0; //第二次拉低时钟,ADC0832 DI接受数据DI=0; //通道0的第二位_nop_();Clk=1;_nop_();}else{Clk=0;DI=1; //通道1的第一位_nop_();Clk=1;_nop_();Clk=0;DI=1; //通道1的第二位_nop_();Clk=1;_nop_();}Clk=0; //第三次拉低时钟,此前DI两次赋值决定通道DI=1; //DI开始失效,拉高电平,便于DO数据传输for(i= 0;i<8;i++) //读取前8位的值{_nop_();dis0<<= 1;Clk=1;_nop_();Clk=0;if (DO)dis0|=0x01;elsedis0|=0x00;}for (i=0;i<8;i++) //读取后8位的值{dis1>>= 1;if (DO)dis1|= 0x80;elsedis1|= 0x00;_nop_();Clk=1;_nop_();Clk=0;}if(dis0==dis1) //两次结束数据比较,若相等date=dis0; //则赋值给dat_nop_();CS=1; //释放ADC0832DO=1; //拉高输出端,方便下次通道选择DI端有效Clk=1; //拉高时钟return date;}/***********************************************数据转换程序功能:将0-255级换算成0.00-5.00的电压数***********************************************/void convert(uchar a){uint temp; //特别注意这里需定义int型(余数将大于255)dis[0]=a/51; //取个位temp=a%51;temp=temp*10;dis[1]=temp/51; //取小数点后第一位temp=temp%51;temp=temp*10;dis[2]=temp/51; //取小数点后第二位}/***************************************** LCD1602驱动程序******************************************/ void delay(uchar z){uint x,y;for(x=z;x>0;x--)for(y=122;y>0;y--);}void write_cmd(uchar cmd)//lcd1602写命令函数{lcdrs=0;lcdrw=0; //选择指令寄存器lcden=1;P0=cmd; //写数据delay(5);lcden=0; //使能拉低lcden=1;}void write_date(uchar date)//lcd1602写数据函数{lcdrs=1;lcdrw=0; //选择数据寄存器lcden=1;P0=date; //写数据delay(5);lcden=0; //使能拉低lcden=1;}void init_lcd1602()//lcd1602初始化{write_cmd(0x01); //清屏write_cmd(0x38); //功能设置write_cmd(0x0c); //显示设置write_cmd(0x06); //输入方式从左到右delay(1);}/***************************************** 显示函数*****************************************/ void display(void){uchar i;write_cmd(0x80);for(i=0;i<3;i++){if(i==1) write_date('.'); //第二位显示小数点write_date (0x30+dis[i]);delay(5);}write_date('V'); //最后一位后显示字符'V'}/************************************************ 主函数***************************************************/ void main(void){CH=0; //选择通道0或1init_lcd1602();//液晶1602显示初始化while(1) //主循环{date=ADC0832(CH);//启动ADC0832转换并接受数据delay(1);convert(date); //数据转换成BCD码display(); //显示数值}}。
基于51单片机的数字电压表的设计与仿真

电压 信号 .系统 结 构框 图如 图 1所示 .
收 稿 日期 : 0 1— 8—1 21 0 0
相 连 ,当执行 写 片外 数据存 储 器 的指令 时 就可 以启
基 金 项 目 :安 徽 省 高 等 学 校 教 学 质 量 与 教 学 改 革 工 程 重 点 项 目 (0 0 3 6 2 1 15 )
对 P . 时取 反 输 出 5 0k z的 C K信号 ,作 为 2 7定 0 H L A C 89所 需 的 时 钟 信 号 .程 序 流 程 图 如 图 3所 D 00
刁 .
3 2 接 口程 序 .
主程序流程 图
图 3 电压 表 程 序 流 程 图
部分 程 序代码 如 下 MA N: V T D, 0 H; 时 器 工作 在方 式 2 I MO MO # 2 定
LCAL DELAY L S ETB P2. 2
图 2 数 字 电压 表 电路 原 理 图
3 系统 程序 设计
3 1 程序 设计 思路 .
定时 中断程 序流程 图
本 系 统 的程 序 设 计 主 要 包 括 初 始 化 、A D 转 / 换、 E L D显示 和定 时器 中断部 分 .定 时 中断部 分 是
片 机设计 的数 字 电压 表 可 以测 量 0—5 的直 流 电 V
A C 89具有 8路 模 拟量输 入 通道 ,通道 的选 D 00
择 由地址 线 C、 A的值 决定 , 口 A E为 地址 锁 B、 端 L 存 允许 控制 端 口 , 当输 人为 高 电平 时 ,对地 址线 C、 B、A输 人 的 地 址 信 号 进 行 锁 存 ,从 而 决 定 对 哪 路 待 测输 人 电压 值 进 行 A D转 换 .SA T为 转 换 启 / TR 动 信号 , 当输 入 1个 2 宽 的高 电平 脉 冲时 ,开 始 s 进 行 A D转 换.E C为 A D 转 换 结 束 信 号 端 口, / O / 当 A D转 换 结束 时 , 端 口输 出一个 正 脉 冲 , 信 / 该 此
基于51单片机的数字电压表设计

内容摘要:进入二十一世纪以来,在现代化检测技术运用过程中,往往需要通过具有高精细度以及科学化的数字电压表完成相应的现场检测工作。
通过将世纪检测得到的数据通过传输功能送入计算机计算中心,从而完成相应的存储、计算以及控制、实时显示等各项功能。
而在本文中,笔者所的数值电压表为51式单片机(AT89c51),而A/D转换装置采用的是TLC2543型号硬件,从而实现整个数值电压表软件以及硬件电路的设计。
在本系统中,具有电路简单,元件使用数量少、设计成本低等优点,并且整个调节过程完全自动化。
除此以外,本数字电压表可以进行八路的转化量(A/D)测量以及测量结果远程传送等多项功能。
本设计数值电压表能够对0V~5V电压的8路电压值进行准确的测量,同时在外部数码管上进行单路或者轮流模式的显示。
关键词:模拟信号数字电压表单片机 A/D转换The design of digital voltage meter based on 51 single chipmicrocomputerAbstract:the twenty-first century, in the process of applying modern detection techniques , often need to complete the appropriate field testing work by having a high finesse and scientific digital voltmeter . Century detected by the data transfer function obtained by computing center into the computer , thus completing the appropriate storage , computing and control , real-time display and other functions . In this article, the author numerical voltmeter 51 type microcontroller (AT89c51), while the A / D converter TLC2543 model is used in hardware , enabling the entire value voltmeter software and hardware design . In this system , with a simple circuit using a small number of components , design and low cost , and the whole adjustment process is fully automated. In addition, the eight digital voltmeter can be converted amount (A / D) measurement and remote transmission of measurement results and many other features . The design values voltmeter capable of 0V ~ 5V voltage 8 accurately measure voltage , single or simultaneous display mode turns on an external digital control .Keywords: Analog signal Digital voltmeter SCM A/D converter;目录前言 (1)1 概述 (1)1.1 选题背景 (1)1.2 研究意义 (1)2 设计方案分析 (2)2.1 A/D转化装置 (2)2.2 电源 (2)3 硬件部分设计分析 (3)3.1 单片机 (3)3.1.1 对单片机芯片进行选择 (3)3.2 外围电路与AT89C51接口设计分析 (6)3.2.1 TLC2543 (7)3.2.2 TLC2543的特点 (7)3.2.3 TLC2453接口时序 (7)3.2.4 TLC2543 A/D芯片与89C51单片机的接口 (7)4 软件部分设计分析 (10)4.1 程序初始化 (11)4.2 A/D转换装置子程序 (12)4.3 显示子程序 (12)5 结论 (13)参考文献: (14)附录: (15)基于51单片机的数字电压表设计前言随着时代的进步,科技不断发展,电压表也在更新换代,由以前的表面指针电压表更替为以数码管或者液晶显示面板显示的电压表。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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()
#include <reg51.h>
#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];
#include<reg51.h>
#include <INTRINS.H>//库函数头文件,代码中引用了_nop_()函数
#define uchar unsigned char
#define uint unsigned int
#define LCD_DB P2//定义LCD的数据端口
sbit LCD_RS=P0^5;
else
address=0xc0+y;
LCD_w_com(address);
}
//=========显示一个字符串==================
void LCD_display(uchar *dat)
{
while(*dat!='\0')
{LCD_w_data(*dat);
dat++;
}
}
sbit LCD_RW=P0^6;
sbit LCD_E =P0^7;
//===========延时子函数========================
void delay(uint x)
{uint i,j;
for(i=x;i>0;i--)
for(j=0;j<2;j++);
}
/****************侧忙函数************************/
{
gotoxy(1,1);
LCD_display("The Output is:");
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;
程序如下:
/**************************************主函数*******************************/
#include <reg51.h>
#include <lcd.c>
#include <ADC0809.c>
#define uchar unsigned char
delay(1);//等待程序执行完毕。。。
}
//===========初始化函数=============
void LCD_init(void)
{LCD_w_com(0x38);//设置8位格式,2行,5*7
LCD_w_com(0x0c);//整体显示,关光标,不闪烁
LCD_w_com(0x06);//设定输入方式,增量不移位
LCD_E=0;
delay(1);//等待执行完毕。。。
}
//===================写数据函数=================
void LCD_w_data(uchar dat)
{LCD_DB=dat;
LCD_RS=1;//数据寄存器
LCD_RW=0;//写入数据
LCD_E=1;
LCD_E=0;
return result;//返回侧忙结果
}
//==================写指令函数=================
void LCD_w_com(uchar com)
{
while(lcd_bz());
LCD_DB=com;
LCD_RS=0;//指令
LCD_RW=0;//写入
LCD_E=1;
unsigned lcd_bz()
{
unsigned result;
LCD_RS = 0;
LCD_RW = 1;
LCD_E = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (unsigned)(LCD_DB & 0x80);//检测P2最高位是否为1
LCD_E = 0;
单片机电压表单片机交流电压表单片机数字电压表数字电压表仿真单片机仿真软件单片机模拟仿真软件单片机仿真avr单片机仿真器
液晶显示,89C51实现简易电压表
用keil C51软件编译,主函数中包含了两个c文件,即lcd.c、ADC0809.c
0809的仿真芯片用的是ADC0808进行代替。注意高低位的接法
c[3]='0'+((ch%51)*10%51)*10/51;
c[4]='V';
c[5]='\0';
}
voidADC_init()
{
TMOD=0x02;
TH0=10;
TL0=10;
EA=1;
ET0=1;
TR0=1;
}
/***********************************液晶(lcd.c)****************************/
LCD_w_com(0x01);//清屏显示
delay(200);
}
//==========光标定位=======================
void gotoxy(uchar x,uchar y) // x表示行,y表示列
{uchar address;
if(x==1)
address=0x80+y;
#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;Fra bibliotek}/***********************0809模数转换(ADC0809.c)***************************/