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

合集下载

基于51单片机的ADC0832数字电压表(仿真+程序)

基于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)

《单片机》教学课件数字电压表例程(C51)
{ result=XBYTE[0x0000]; //读AD转换结果 }
读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单片机的简易数字电压表的设计单片机

基于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单片机的数字电压表仿真设计(有参考文献)

基于51单片机的数字电压表仿真设计一、引言随着电子科学技术的发展,电子测量成为广大电子工作者必须掌握的手段,对测量的精度和功能的要求也越来越高,而电压的测量甚为突出,因为电压的测量最为普遍。

数字电压表是采用数字化测量技术设计的电压表。

数字电压表与模拟电压表相比,具有读数直观、准确、显示范围宽、分辨力高、输入阻抗大、集成度高、功耗小、抗干扰能力强,可扩展能力强等特点,因此在电压测量、电压校准中有着广泛的应用。

而单片机也越来越广泛的应用与家用电器领域、办公自动化领域、商业营销领域、工业自动化领域、智能仪表与集成智能传感器传统的控制电路、汽车电子与航空航天电子系统。

单片机是现代计算机技术、电子技术的新兴领域。

本文采用ADC0808对输入模拟信号进行转换,控制核心C51单片机对转换的结果进行运算和处理,最后驱动输出装置显示数字电压信号,通过Proteus仿真软件实现接口电路设计,并进行实时仿真。

Proteus软件是一种电路分析和实物模拟仿真软件。

它运行于Windows 操作系统上,可以进行仿真、分析(SPICE)各种模拟器件和集成电路,是集单片机和SPICE分析于一身的仿真软件,功能强大,具有系统资源丰富、硬件投入少、形象直观等优点,近年来受到广大用户的青睐。

二、数字电压表概述1、数字电压表的发展与应用电压表指固定安装在电力、电信、电子设备面板上使用的仪表,用来测量交、直流电路中的电压。

传统的指针式电压表功能单一、精度低,不能满足数字化时代的需求,并且传统的电压表在测量电压时需要手动切换量程,不仅不方便,而且要求不能超过该量程。

目前,由各种单片A/D转换器构成的数字电压表,已被广泛用于电子及电工测量领域,并且由DVM扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到崭新水平。

2、本次设计数字电压表的组成部分本设计是由单片机AT89C51作为整个系统控制的核心,整个系统由衰减输入电路、量程自动转换电路、交直流转换电路、模数转换及控制电路以及接口电路五大部分构成。

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

51单片机实现简易数字电压表(液晶显示)仿真图+程序
#include <reg51.h>
#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程序)

单片机数字电压表(带仿真图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单片机的数字电压表的设计与仿真

基于51单片机的数字电压表的设计与仿真
脚 连接 到一 点 ,通 过 非 门与 单 片 机 的 P . / 3 6 WR 脚
电压 信号 .系统 结 构框 图如 图 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单片机的数字电压表设计

内容摘要:进入二十一世纪以来,在现代化检测技术运用过程中,往往需要通过具有高精细度以及科学化的数字电压表完成相应的现场检测工作。

通过将世纪检测得到的数据通过传输功能送入计算机计算中心,从而完成相应的存储、计算以及控制、实时显示等各项功能。

而在本文中,笔者所的数值电压表为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单片机的数字电压表设计前言随着时代的进步,科技不断发展,电压表也在更新换代,由以前的表面指针电压表更替为以数码管或者液晶显示面板显示的电压表。

电子测量大作业(基于C51单片机的简单数字电压表)

电子测量大作业(基于C51单片机的简单数字电压表)

电⼦测量⼤作业(基于C51单⽚机的简单数字电压表)基于单⽚机的简易数字电压表的设计⼀、概述本课题设计是⼀种基于单⽚机的简易数字电压表的设计。

该设计主要由三个模块组成:A/D转换模块,数据处理模块及显⽰模块。

A/D转换主要由芯⽚ADC0808来完成,它负责把采集到的模拟量转换为相应的数字量在传送到数据处理模块。

数据处理则由芯⽚AT89C51来完成,其负责把ADC0808传送来的数字量经过⼀定的数据处理,产⽣相应的显⽰码送到显⽰模块进⾏显⽰;此外,它还控制着ADC0808芯⽚⼯作。

⼆、主要芯⽚1、ADC0808 主要特性ADC0808是CMOS单⽚型逐次逼近式A/D转换器,带有使能控制端,与微机直接接⼝,⽚内带有锁存功能的8路模拟多路开关,可以对8路0-5V输⼊模拟电压信号分时进⾏转换,由于ADC0808设计时考虑到若⼲种模/数变换技术的长处,所以该芯⽚⾮常适应于过程控制,微控制器输⼊通道的接⼝电路,智能仪器和机床控制等领域。

ADC0808主要特性:8路8位A/D转换器,即分辨率8位;具有锁存控制的8路模拟开关;易与各种微控制器接⼝;可锁存三态输出,输出与TTL兼容;转换时间:128µs;转换精度:0.2%;单个+5V电源供电;模拟输⼊电压范围0- +5V,⽆需外部零点和满度调整;低功耗,约15mW。

ADC0808芯⽚有28条引脚,采⽤双列直插式封装,其引脚图如图3所⽰。

图1 ADC0808引脚图下⾯说明各个引脚功能:IN0-IN7(8条):8路模拟量输⼊线,⽤于输⼊和控制被转换的模拟电压。

地址输⼊控制(4条):ALE: 地址锁存允许输⼊线,⾼电平有效,当ALE为⾼电平时,为地址输⼊线,⽤于选择IN0-IN7上那⼀条模拟电压送给⽐较器进⾏A/D转换。

ADDA,ADDB,ADDC: 3位地址输⼊线,⽤于选择8路模拟输⼊中的⼀路,其对应关系如表1所⽰:表1 ADC0808通道选择表START:START为“启动脉冲”输⼊法,该线上正脉冲由CPU送来,宽度应⼤于100ns,上升沿清零SAR,下降沿启动ADC⼯作。

基于51单片机的简易数字电压表的方案设计书

基于51单片机的简易数字电压表的方案设计书

班级:智能电网111学生:喻卫湖南铁道职业技术学院电气工程系目录1控制要求2设计目的意义3 系统原理框图4 89C52单片机5 ADC0809 的工作原理6 系统原理图和PCB图7程序流程图8 C语言程序9数字电压表工作原理10设计体会1控制要求利用STC89C52单片机和ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码管显示,使用的元器件数目较少。

外界电压模拟量输入到A/D转换部分的输入端,通过ADC0809转换变为数字信号,输送给单片机。

然后由单片机给数码管数字信号,控制其发光,从而显示数字。

2设计目的意义1.通过亲身的设计应用电路,将所用的理论知识应用到实践中,增强实践动手能力,进而促进理论知识的强化。

2.通过数字电压表的设计系统掌握51单片机的应用。

掌握A/D转换的原理及软件编程及硬件设计的方法,掌握根据课题的要求,提出选择设计方案,查找所需元器,设计并搭建硬件电路,编程写入STC89C52单片机并进行调试等。

3 系统原理框图4 89C52引脚资料STC89C52P1 P0P3 P2AD0809D0~D7IN0~IN7VREF+VREF-CLKOEST、ALE四位数码管位选段选控制线数据待测电压系统原理框图89C51引脚图总线型DIP40引脚封装电源引脚(2个)VCC:接+5V电源。

GND:接地端。

外接晶体引脚(2个)XTAL1:外接晶振输入端(采用外部振荡器时,此引脚接地)。

XTAL2:外接晶振输入端(采用外部振荡器时,此引脚作为外部振荡信号输入端)。

并行输入/输出引脚(32个)P0.0~P0.7:通用I/O引脚。

P1.0~P1.7:通用I/O引脚。

P2.0~P2.7:通用I/O引脚或数据低8位地址总线复用引脚。

P3.0~P3.7:通用I/O引脚或第二功能引脚(RXD、TXD、INT0、INT1、T0、T1、WR 、RD)。

控制引脚(4个)RST/VPD:复位信号输入引脚/备用电源输入引脚。

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

基于51单片机的数字电压表仿真设计
1 2 MHzLJ 4。
本 电路 E A接 高 电平 , 有 扩 展 片外 R M。 没 O
1 系统概 述
1 1 设 计 任 务 .
22 A D转 换 电路 的接 口设 计 . /
A D转换器采 用集成 电路 A C 88 D 0 0 / D 0 0 。A C 88具有 8 路模拟量输入信 号 I0一I7 1 N N ( ~5脚 、6—2 2 8脚 ) 地址线 , C B、 ( 3~ 5脚 ) 定哪 一路模拟 输人 信号进 行 A D转 、 A2 2 决 / 换 , 电路将地址线 C B A均接地 , 本 、、 即选择 0号通道输入模
2 数 字 电压 表 的 P o u r  ̄ s软件 仿真 电路设计
待测电压输入信号在 A C 88芯片承受的最大工作 电 D 00
压范围内 , 经过模/ 数转 换 电路 实现 A D转换 , / 通过单 片机
控制电路进行程序数 据处理 , 然后 通过七 段译码/ 驱动显示 电路实现数码管显示输入电压。
21 年第2 01 期
文 章 编 号 :64 47 (0 10 .0 60 17 -5 8 2 1 )20 4 —2
山西 电子技 术
应 用 实践
基于5 片机 的数 字 电压表 仿 真设 计 1单
刘敏娜 ,潘宏侠 ,王 乔
( 中北大 学 机械 工程 与 自动化 学院 , 山西 太原 00 5 ) 30 1
A 8 C 1 片机 、 D 0 0 、4 S4 L D数 码 管 等 J T9 . 单 5 A C 88 7 L7 、 E 。
O 引言
随着 电子科学技术的发展 , 电子测量成为广大 电子工作 者必须掌握 的手段 , 测量 的精度 和功能 的要 求也越 来越 对 高, 而电压的测量甚为突 出, 因为 电压的测 量最为普遍 。数

利用51单片机与ADC0809和数码管设计数字电压表

利用51单片机与ADC0809和数码管设计数字电压表

利用51单片机与ADC0809和数码管设计数字电压表一、课题功能描述:利用单片机AT89C51 芯片与ADC0809 芯片设计一个数字电压表,能够测量0―5V 之间的直流电压,三位数码显示。

二、程序设计本实验采用AT89C51 单片机芯片配合 ADC0809 模/数转换芯片构成一个简易的数字电压表,原理电路如图1-1 所示。

该电路通过 ADC0809 芯片采样输入口AI0 输入的0~5V 的模拟量电压,经过模/数转换后,产生相应的数字量经过其输出通道D0~D7 传送给 AT89C51 芯片的F0口。

AT89C51负责把接收到的数字量经过数据处理,产生正确的7段数码管的显示段码,并通过P1 口传送给数码管。

同时它还通过其三位 I/O 口 P3.0、P3.1、P3.2 产生位片选信号,控制数码管的亮灭。

另外,AT89C51 还控制着 ADC0809 的工作。

其ALE管脚为 ADC0809提供了 1MHZ 工作的时钟脉冲;P2.3 控制 ADC0809 的地址锁存端(ALE); P2.4 控制 ADC0809 的启动端(START); P2.5 控制 ADC0809 的输出允许端(OE); P3.7 控制 ADC0809 的转换结束信号(EOC)。

电路原理图如下:三、器件清单:1 . AT89S51 芯片 1块2 . ADC0809 芯片 1块3 . 74HC245 芯片 1块4 . 数码管 1个5 . 6MHZ 晶振 1个6 . 30pF 电容 2个7 . 10uF 电解电容 1个8 . 复位电容 1个9 . 510Ω电阻 8个10. 10KΩ电阻 1个11. 导线若干四、程序设计1、主程序设计由于ADC0809 在进行A/D转换时需要有CKL 信号,而此时的 ADC0809 的CLK 是连接在 AT89C51 单片机的30管脚,也就是要求从30管脚输出CLK 信号供图1-2主程序流程图ADC0809 使用。

基于51单片机的数字电压表

基于51单片机的数字电压表

课程设计题目数字电压表学生姓名张玉龙学号20081341056学院信息与控制学院专业测控技术与仪器指导教师葛化敏二O一一年六月三十日基于51单片机的数字电压表一、设计内容:先在proteus 上进行软件仿真设计,在仿真实现的基础上,要求完成部分硬件模块的制作和系统联调,实验内容为设计一个数字电压表,实现从模拟信号输入到数字信号输出的基本功能。

二、设计要求:采用51系列单片机和ADC 设计一个数字电压表电路,通过调节滑动变阻器改变电压,在LCD 液晶屏上显示其相应的电压值,要求电压精确到小数点后第四位,显示格式为,LCD 第一行前一段为“20081341056”(班级同学张玉龙的学号),后一段则为“V :”(电压单位);第二行的前一段为“Class 2”(班级2班),后一段则显示电压值,单位为“V ”。

三、设计原理:通过在Keil 软件对单片机AT89C52进行编程,硬件电路中单片机与ADC0804及LCD 显示屏连接。

P0与ADC0804相连接,P1与LCD 连接。

通过start()子程序启动ADC0804,通过init ()子程序初始化LCD 。

模拟信号通过ADC0804的VIN+引脚输入到ADC0804中转换为数字信号,P0获得此数字量后,经过处理得到每位的数据后,通过P1口写数据到LCD上图为基本的原理图 四、实验电路图及仿真结果:51系列 单片机电压输入五、程序代码:#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit lcdrs=P3^0;sbit lcden=P3^1;sbit wrad=P3^6;sbit rdad=P3^7;uint temp,a1,a2,a3,a4,a5,num;uchar code table[]="0123456789.";//显示数字uchar code table1[]="20081341056 V:"; uchar code table2[]="Class 2";void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--);}void start()//启动AD{wrad=1;wrad=0;wrad=1;}void write_command(uchar com)//写命令{lcdrs=0;P1=com;delay(2);lcden=1;delay(2);lcden=0;}void write_data(uchar date)//写数据{lcdrs=1;P1=date;delay(5);lcden=1;delay(5);lcden=0;}void init()//lcd初始化{lcden=0;write_command(0x38);//设置16x2显示write_command(0x0c);//设置光标write_command(0x06);//写字符指针加1,光标加1write_command(0x01);//清屏}void main(){init();//LCD初始化write_command(0x80);//LCD写地址for(num=0;num<15;num++){write_data(table1[num]);delay(5);}while(1){start();//启动ADdelay(50);rdad=0; //rd低脉冲读数据delay(50);temp=P0;a1=(temp*50000/255)/10000;//区分位数,最高位 255*50000/255/10000=5.0000V a2=(temp*50000/255)%10000/1000;a3=(temp*50000/255)%1000/100;a4=(temp*50000/255)%100/10;a5=(temp*50000/255)%10;write_command(0x80+0x40);for(num=0;num<7;num++){write_data(table2[num]);delay(5);}write_command(0x80+0x49);//LCD写地址write_data(table[a1]);delay(1);write_data(table[10]);delay(1);write_data(table[a2]);delay(1);write_data(table[a3]);delay(1);write_data(table[a4]);delay(1);write_data(table[a5]);delay(1);write_data('V');delay(1);}}六、心得体会:课程设计中不得不遇到一些问题,但只要自己有恒心有毅力,终究会克服一切困难;在设计中我们要学会运用keil软件及protues软件对我们设计的电路不断地进行仿真、调试和修正,遇到程序问题时我们应该学会一段一段地去排查,最终解决所有问题;另外,还应熟练掌握每个芯片及器件如51单片机及ADC0804和LM016L每个引脚的作用和接法及各种状态的判断。

基于51单片机的电压表的设计

基于51单片机的电压表的设计

引言在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。

而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。

数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。

由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用[1]。

传统的指针式刻度电压表功能单一,进度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。

采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。

数字电压表是诸多数字化仪表的核心与基础[2]。

以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。

目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。

最近的几十年来,随着半导体技术、集成电路(IC)和微处理器技术的发展,数字电路和数字化测量技术也有了巨大的进步,从而促使了数字电压表的快速发展,并不断出现新的类型[3]。

数字电压表从1952年问世以来,经历了不断改进的过程,从最早采用继电器、电子管和形式发展到了现在的全固态化、集成化(IC化),另一方面,精度也从0.01%-0.005%。

目前,数字电压表的内部核心部件是A/D转换器,转换的精度很大程度上影响着数字电压表的准确度,因而,以后数字电压表的发展就着眼在高精度和低成本这两个方面[4]。

本文是以简易数字直流电压表的设计为研究内容,本系统主要包括三大模块:转换模块、数据处理模块及显示模块。

其中,A/D转换采用ADC0808对输入的模拟信号进行转换,控制核心AT89C51再对转换的结果进行运算处理,最后驱动输出装置LED显示数字电压信号[5]。

1 设计总体方案1.1设计要求:完成系统的硬件电路设计与软件设计; 采用汇编或C 语言编程;采用Proteus 、KeilC 等软件实现系统的仿真调试。

基于8051单片机的简易电压表设计

基于8051单片机的简易电压表设计

基于8051单片机的简易电压表设计————————————————————————————————作者:————————————————————————————————日期:单片机课程设计—简易直流电压表班级:电信四班姓名:彭飞宇学号:2220081336摘要电压表应用十分广泛,但大部分是模拟电压表,而由于其特性,反应速度慢,读数麻烦并且误差较大,所以为适应不断快速发展的高速信号领域,已经广泛使用数字电压表。

本实验设计是基于51单片机开发平台实现的一种数字电压表系统。

该设计采用8051单片机作为控制核心,以ADC0809为模数转换数据采样,实现被测电压的数据采样;通过外围分压电路实现5V和50V的换档;同时使用5V稳压管作为超范围的保护电路;用8255驱动控制四块数码管显示被测电压。

1。

设计任务和要求1.1 设计任务设计制作一个简易直流电压表,该直流电压表能测量直流电压输入电压AD转换器控制器显示测量值1.2 设计要求基本要求1. 能测量电压档0--5V0-—50V 两档,输入阻抗〉200K2. 数码显示共3位,其中一位小数3. 要有输入信号超范围的保护电路 发挥部分1. 能够测量交流电压(0-500V ) 2. 能够测量电阻二 设计方案和部分仿真2.1 硬件:上图为硬件的总体框图,可分为四个模块。

模数转换使用ADC0809芯片,它将输入的模拟电压量转换为一个8位的二进制数字,然后进入到单片机80C51控制单元,经过8255驱动处理用数码管显示出电压值.外围电路是一种分压电路,由于ADC0809芯片输入电压不可大于5V,所以当测量50V 档位的时候要通过分压电路来实现。

同时还有控制单片机显示程序,使其显示为50V 档位数值。

(1)以下介绍MCS —51单片机的内部结构,主要部分为电压模拟量输入外电路模 数 转 换 模 块微 控 制 器 模 块数 码 管 显 示模数控制程图1 硬件框图1. 一个8位的CPU2。

数字电压表程序及仿真图

数字电压表程序及仿真图

//************************************************//**用adc0809进行电压测量,lcd1602显示,精度0.001v**//************************************************#include "reg51.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intuchar code table []="ID: " ; //欢迎显示,包括空格在内<=16 uchar code table1 []="Name: " ;//欢迎显示,包括空格在内<=16//************管脚定义************************sbit ADC_OE = P3^0; //ADC输入允许信号端口sbit ADC_EOC = P3^1; //ADC转换结束信号输出端sbit ADC_START= P3^2; //ADC启动转换信号输入端sbit ADC_CLK = P3^3; //ADC时钟输入端sbit lcd_rs = P3^4; //液晶数据命令选择端sbit lcd_en = P3^5; //液晶使能//************参数定义************************uchar num; //LCD1602开机显示数组数uchar AD_data; //AD转换原始数据uchar dis1[] = " Current Voltage";uchar dis2[] = {' ',' ',' ',' ','V','=','0','.','0','0','0','v',' ',' ',' ',' ',}; //初始化数组,用来保存电压显示//************子函数定义************************void delay(uchar z); //delay延时子程序void init_lcd(); //LCD1602初始化函数void InitTimer0(); //定时器0初始化函数void write_com(uchar com); //LCD1602写指令函数void write_data(uchar date); //LCD1602写数据函数void write_welcome(); //LCD1602开启显示欢迎函数void init_ADC(); //ADC初始化函数void AD_covert(); //AD转换子程序void ADC_change(); //ADC转换函数void write_adc(); //ADC显示函数//************主函数************************void main(){init_lcd(); //LCD1602初始化write_welcome(); //LCD1602开启显示欢迎InitTimer0(); //定时器0初始化init_lcd(); //LCD1602初始化init_ADC(); //ADC初始化while(1){AD_covert(); //AD转换ADC_change(); //ADC转换函数write_adc(); //ADC显示}}//************delay延时子程序************************void delay(uchar z){uchar x,y;for(x=0;x<z;x++)for(y=0;y<114;y++);}//************LCD1602初始化函数************************void init_lcd(){lcd_en = 0; // 将使能端置0write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口write_com(0x08); //写一个字符后地址指针加1write_com(0x01); //显示清零,数据指针清零write_com(0x06); //写一个字符后地址指针加1write_com(0x0c); //关显示,光标不显示不闪烁}//************定时器0初始化函数************************void InitTimer0(){TMOD = 0x02; //定时器0工作方式2TH0 = 0x14; //初值位20TL0 = 0x14;EA = 1; //开总中断ET0 = 1; //允许T0中断TR0 = 1; //启动T0}//************LCD1602写指令函数************************void write_com(uchar com){lcd_rs = 0; // 选择写指令P2 = com; // 将要写的命令送到数据总线上delay(5); // 延时5ms,待数据稳定lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5); // 延时5ms,待数据稳定lcd_en = 0; // 将使能端置0以完成脉冲}//************LCD1602写数据函数************************void write_data(uchar date){lcd_rs = 1; // 选择写数据P2 = date; // 将要写的数据送到数据总线上delay(5); // 延时5ms,待数据稳定lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5); // 延时5ms,待数据稳定lcd_en = 0; // 将使能端置0以完成脉冲}//************LCD1602开启显示欢迎函数******************void write_welcome(){write_com(0x80); // 现将数据指针定位到第一行第一个字处for(num=0;num<16;num++) //做简短延时{write_data(table[num]);delay(5);}write_com(0x80+0x40); // 现将数据指针定位到第二行第一个字处for(num=0;num<16;num++) //做简短延时{write_data(table1[num]);delay(20);}delay(50000);}//************中断函数************************void Timer0()interrupt 1{ADC_CLK = ~ADC_CLK; //时钟不断取反}//***********ADC初始化函数************************void init_ADC(){ADC_OE = 0; //ADC输入允许信号端口置1ADC_EOC = 1; //ADC转换结束信号输出端置1ADC_START= 1; //ADC启动转换信号输入端置1ADC_CLK = 1; //ADC时钟输入端置1}//***********AD转换子程序***********************void AD_covert(){ADC_START= 0;ADC_CLK = 0;_nop_(); //延时空循环,一个机器指令的时间ADC_START= 1;ADC_CLK = 1;_nop_(); //延时空循环,一个机器指令的时间ADC_START= 0;ADC_CLK = 0; //在START上产生一个正脉冲while(ADC_EOC); //等待上次转换完成_nop_();delay(100);while(ADC_EOC == 0){ADC_CLK = 1;delay(1);ADC_CLK = 0;delay(1);}P1 = 0xff;_nop_();ADC_OE = 1;_nop_();AD_data = P1;ADC_OE = 0;}//***********ADC转换函数************************void ADC_change(){double v;uchar val_integer;uint val_decimal;v = AD_data*0.0196078; //5v时输出的数字量是2.55,为使5v时输出5.00 val_integer = (uchar)v; //电压整数部分val_decimal = (uint)((v-val_integer)*1000);//将电压小数点后三位转换为整数(dis2[6]) = val_integer+0x30; //电压整数转换为ASSII(dis2[8]) = val_decimal/100+0x30; //电压小数第一位转换为ASSII(dis2[9]) = val_decimal/10%10+0x30; //电压小数第二位转换为ASSII(dis2[10]) = val_decimal/10%10+0x30; //电压小数第三位转换为ASSII}//************LCD1602显示adc函数******************void write_adc(){write_com(0x80); // 现将数据指针定位到第一行第一个字处for(num=0;num<16;num++)//做简短延时{write_data(dis1[num]);delay(1);}write_com(0x80+0x40); // 现将数据指针定位到第二行第一个字处for(num=0;num<16;num++)//做简短延时{write_data(dis2[num]);delay(1);}}。

51单片机数字电压表设计

51单片机数字电压表设计

51单片机数字电压表设计51单片机数字电压表设计题目要求:1. 设计要求以单片机为核心,设计一个数字电压表。

采用中断方式,对2路0~5V的模拟电压进行循环采集,采集的数据送LED显示,并存入内存。

超过界限时指示灯闪烁。

2. 实验原理本题目本质上是以单片机为控制器,ADC0809为ADC器件的AD转换电路,设计要求的电压显示,是对ADC采集所得信号的进一步处理。

为得到可读的电压值,需根据ADC的原理,对采集所得的信号进行计算,并显示在LED上。

本项目中ADC0809的参考电压为+5V,根据定义,采集所得的二进制信号addata所指代的电压值为:而若将其显示到小数点后两位,不考虑小数点的存在(将其乘以100),其计算的数值为:。

将小数点显示在第二位数码管上,即为实际的电压。

本示例程序将1.25 V和2.5 V作为两路输入的报警值,反映在二进制数字上,分别为0x40和0x80。

当AD结果超过这一数值时,将会出现二极管闪烁和蜂鸣器发声。

运行截图:程序代码:#include <reg51.h>#include <absacc.h> //定义绝对访问#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit RS=P1^7; //定义LCD1602端口线sbit RW=P1^6;sbit EN=P1^5;sbit ST=P3^7; //定义0808控制线sbit OE=P3^6;sbit EOC=P1^3;sbit CLK=P1^4;sbit buzzer = P1^1; //喇叭sbit alarm = P1^2; //leduchar data chnumber; //存放当前通道号uchar disbuffer[4]={0,'.',0,0}; //定义显示缓冲区uchar data ad_data[8]={0,0,0,0,0,0,0,0};//0808的8个通道转换数据缓冲区uint temp;//检查忙函数void fbusy(){P0 = 0xff;RS = 0;RW = 1;EN = 1;EN = 0;while((P0 & 0x80)){EN = 0;EN = 1;}}//写命令函数void wc51r(uchar j) {fbusy();EN = 0;RS = 0;RW = 0;EN = 1;P0 = j;EN = 0;}//写数据函数void wc51ddr(uchar j){fbusy(); //读状态;EN = 0;RS = 1;RW = 0;EN = 1;P0 = j;EN = 0;}void init(){wc51r(0x01); //清屏wc51r(0x38); //使用8位数据,显示两行,使用5*7的字型wc51r(0x0c); //显示器开,光标开,字符不闪烁wc51r(0x06); //字符不动,光标自动右移一格}/********0808转换子函数********/void test(){uchar m;for (m=0;m<8;m++){P3=m; //送通道ST=0;_nop_();_nop_();ST=1;_nop_();_nop_ ();ST=0;//锁存通道启动转换_nop_();_nop_();_nop_();_nop_();while (EOC==0); //等待转换结束OE=1;ad_data[m]=P2;OE=0; //读取当前通道转换数据}}//************延时函数************void delay(uint i) //延时函数{uint y,j;for (j=0;j<i;j++){for (y=0;y<0xff;y++){;}}}//定时器/计数器T0产生0808的时钟void T0X(void)interrupt 1 using 0{CLK=~CLK;}void main(void){uchar i;uint temp1;SP=0X50;TMOD=0x02;TH0=246;TL0=246;ET0=1;EA=1;TR0=1;delay(10);init(); //lcd显示器初始化wc51r(0x80); //写入显示缓冲区起始为第1行第1列wc51ddr('V'); //第1行第1列显示字母V字母 Awc51ddr('L'); //第1行第3列显示字母 Lwc51ddr('U'); //第1行第4列显示字母 Uwc51ddr('E'); //第1行第5列显示字母 Ewc51ddr('0'); //第1行第6列显示数字 0wc51ddr(':'); //第1行第7列显示字母 :wc51r(0xC0); //写入显示缓冲区起始为第2行第1列wc51ddr('V'); //第2行第1列显示字母Vwc51ddr('A'); //第2行第2列显示字母 Awc51ddr('L'); //第2行第3列显示字母 Lwc51ddr('U'); //第2行第4列显示字母 U字母 Ewc51ddr('1'); //第2行第6列显示数字 1wc51ddr(':'); //第2行第7列显示字母 :alarm = 0; //关闭led和报警buzzer = 0;while(1){test(); //调用ADC0808转换程序8个通道转换一次alarm = 0;//chnumber = ~chnumber;temp=ad_data[chnumber]; //取出当前通道值,转换成电压值所对应的字符temp=(temp*100)/51;temp1 = temp;disbuffer[0]=temp/100+0x30;temp=temp%100;disbuffer[2]=temp/10+0x30;disbuffer[3]=temp%10+0x30;if(chnumber == 0) //采集的第零个电压{wc51r(0x89);if(temp1 >= 125) //电压达到了1.25{alarm = 1; //开启led和报警buzzer = 1;}else{alarm = 0; //关闭led和报警buzzer = 0;}chnumber = 1; //下次采集第一个电压}else{ //采集的第一个电压wc51r(0xc9); //显示当前通道if(temp1 >= 250 || alarm == 1) //电压达到了2.5v{alarm = 1; //开启led和报警buzzer = 1;}else{alarm = 0; //关闭led和报警buzzer = 0;}chnumber = 0; //下次采集第零个电压}for (i=0;i<4;i++) //显示三个电压数字{wc51ddr(disbuffer[i]);}wc51ddr('v'); //最后显示出电压符号}}Proteus仿真图:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void sepr(uchar i);
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)***************************/
相关文档
最新文档