数字电压表的单片机设计C语言编程.docx

上传人:b****5 文档编号:28343834 上传时间:2023-07-10 格式:DOCX 页数:23 大小:284.99KB
下载 相关 举报
数字电压表的单片机设计C语言编程.docx_第1页
第1页 / 共23页
数字电压表的单片机设计C语言编程.docx_第2页
第2页 / 共23页
数字电压表的单片机设计C语言编程.docx_第3页
第3页 / 共23页
数字电压表的单片机设计C语言编程.docx_第4页
第4页 / 共23页
数字电压表的单片机设计C语言编程.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

数字电压表的单片机设计C语言编程.docx

《数字电压表的单片机设计C语言编程.docx》由会员分享,可在线阅读,更多相关《数字电压表的单片机设计C语言编程.docx(23页珍藏版)》请在冰豆网上搜索。

数字电压表的单片机设计C语言编程.docx

数字电压表的单片机设计C语言编程

目录

一设计总体方案1

1.1设计要求1

1.2设计思路1

1.3设计方案1

二硬件电路元件分析与设计2

2.1单片机系统2

2.1.1AT89C51性能2

2.1.2AT89C51各引脚功能2

2.2A/D转换模块3

2.2.1ADC0808主要特性3

2.2.2ADC0808工作流程4

2.3LED显示系统设计5

2.3.1LED显示器的选择5

2.3.2LED译码方式5

2.4双D正沿触发器6

2.5总体电路设计7

三程序设计9

3.1程序设计总方案9

3.2系统子程序设计9

3.2.1初始化程序9

3.2.2A/D转换子程序9

3.2.3显示子程序10

四仿真调试12

4.1软件调试12

4.2显示结果及误差分析12

4.2.1显示结果12

4.2.2误差分析13

结束15

参考文献16

附录17

一设计总体方案

1.1设计要求

⑴以AT89C51单片机为核心器件,组成一个简单的直流数字电压表。

⑵能够测量0-5V之间的直流电压值。

⑶电压显示用4位一体的LED数码管显示,尽量使用较少的元器件。

1.2设计思路

⑴根据设计要求,选择AT89C51单片机为核心控制器件。

⑵A/D转换采用ADC0808实现,与单片机接口为P0口和P3口的高四位引脚。

电压显示采用4位一体的LED数码管。

LED数码的段码输入,由并行端口P1产生:

位码输入,用并行端口P2高四位产生。

1.3设计方案

硬件电路设计由5个部分组成;A/D转换电路,AT89C51单片机系统,LED显示系统、时钟电路、测量电压输入电路。

硬件电路设计框图如图1-1

 

图1-1数字电压表系统硬件设计框图

 

二硬件电路元件分析与设计

2.1单片机系统

2.1.1AT89C51性能

AT89C51功能性能:

与MCS-51成品指令系统完全兼容;4KB可编程闪速存储器;全静态工作:

0-24MHz;128*8B内部RAM;4个位可编程I/O口线;2个16位定时/计数器;5个中断源;2个串行通道;片内振荡器和掉电模式。

2.1.2AT89C51各引脚功能

引脚配置如图2-1所示。

图2-1AT89C51的引脚图

AT89C51芯片的各引脚功能为:

P0口:

这组引脚共有8条,P0.0为最低位。

这8个引脚有两种不同的功能,分别适用于不同的情况,第一种情况是89C51不带外存储器,P0口可以为通用I/O口使用,P0.0-P0.7用于传送CPU的输入/输出数据,这时输出数据可以得到锁存,不需要外接专用锁存器,输入数据可以得到缓冲,增加了数据输入的可靠性;第二种情况是89C51带片外存储器,P0.0-P0.7在CPU访问片外存储器时先传送片外存储器的低8位地址,然后传送CPU对片外存储器的读/写数据。

P0口为开漏输出,在作为通用I/O使用时,需要在外部用电阻上拉。

P1口:

这8个引脚和P0口的8个引脚类似,P1.7为最高位,P1.0为最低位,当P1口作为通用I/O口使用时,P1.0-P1.7的功能和P0口的第一功能相同,也用于传送用户的输入和输出数据。

P2口:

这组引脚的第一功能与上述两组引脚的第一功能相同即它可以作为通用I/O口使用,它的第一功能和P0口引脚的第二功能相配合,用于输出片外存储器的高8位地址,共同选中片外存储器单元,但并不是像P0口那样传送存储器的读/写数据。

P3口:

这组引脚的第一功能和其余三个端口的第一功能相同,第二功能为控制功能,每个引脚并不完全相同,如下表1所示:

表1P3口各位的第二功能

P3口各位

第二功能

P3.0

RXT(串行口输入)

P3.1

TXD(串行口输出)

P3.2

INT0(外部中断0输入)

P3.3

INT1(外部中断1输入)

P3.4

T0(定时器/计数器0的外部输入)

P3.5

T1(定时器/计数器1的外部输入)

P3.6

WR(片外数据存储器写允许)

P3.7

RD(片外数据存储器读允许)

Vcc为+5V电源线,Vss接地。

ALE:

地址锁存允许线,配合P0口的第二功能使用,在访问外部存储器时,89C51的CPU在P0.0-P0.7引脚线去传送随后而来的片外存储器读/写数据。

在不访问片外存储器时,89C51自动在ALE线上输出频率为1/6振荡器频率的脉冲序列。

该脉冲序列可以作为外部时钟源或定时脉冲使用。

EA:

片外存储器访问选择线,可以控制89C51使用片内ROM或使用片外ROM,

若EA=0,则允许使用片内ROM,若EA=1,则只使用片外ROM。

PSEN:

片外ROM的选通线,在访问片外ROM时,89C51自动在/PSEN线上产生一个负脉冲,作为片外ROM芯片的读选通信号。

RST:

复位线,可以使89C51处于复位(即初始化)工作状态。

通常89C51复位有自动上电复位和人工按键复位两种。

XTAL1和XTAL2:

片内振荡电路输入线,这两个端子用来外接石英晶体和微调电容,即用来连接89C51片内OSC(振荡器)的定时反馈回路。

2.2A/D转换模块

2.2.1ADC0808主要特性

ADC0808主要特性:

8路8位A/D转换器,即分辨率8位;具有锁存控制的8路模拟开关;易与各种微控制器接口;可锁存三态输出,输出与TTL兼容;转换时间:

100μs;转换精度:

0.2%;单个+5V电源供电;模拟输入电压范围0-+5V,无需外部零点和满度调整;低功耗,约15mW。

ADC0808芯片有28条引脚,采用双列直插式封装,其引脚图如图2-2所示。

图2-2ADC0808引脚图

下面说明各个引脚功能:

IN0-IN7(8条):

8路模拟量输入线,用于输入和控制被转换的模拟电压。

地址输入控制(4条):

ALE:

地址锁存允许输入线,高电平有效,当ALE为高电平时,为地址输入线,用于选择IN0-IN7上那一条模拟电压送给比较器进行A/D转换。

ADDA,ADDB,ADDC:

3位地址输入线,用于选择8路模拟输入中的一路。

START:

START为“启动脉冲”输入法,该线上正脉冲由CPU送来,宽度应大于100ns,上升沿清零SAR,下降沿启动ADC工作。

EOC:

EOC为转换结束输出线,该线上高电平表示A/D转换已结束,数字量已锁入三态输出锁存器。

OUT1-OUT8:

数字量输出端,OUT8为高位。

OE:

OE为输出允许端,高电平能使D1-D8引脚上输出转换后的数字量。

VREF+、VREF-:

参考电压输入量,给电阻阶梯网络供给标准电压。

CLOCK:

时钟输入端

2.2.2ADC0808工作流程

ADC0808的工作流程为:

(1)输入3位地址,并使ALE=1,将地址存入地址锁存器中,经地址译码器从8路模拟通道中选通1路模拟量送给比较器。

(2)送START一高脉冲,START的上升沿使逐次寄存器复位,下降沿启动A/D转换,并使EOC信号为低电平。

(3)当转换结束时,转换的结果送入到输出三态锁存器中,并使EOC信号回到高电平,通知CPU已转换结束。

(4)当CPU执行一读数据指令时,使OE为高电平,则从输出端OUT1-OUT8读出数据。

2.3LED显示系统设计

2.3.1LED显示器的选择

在应用系统中,设计要求不同,使用的LED显示器的位数也不同,因此就生产了位数,尺寸,型号不同的LED显示器供选择,在本设计中,选择4位一体的数码型LED显示器,即7SEG-MPX4-CC-BLUE。

本系统中前一位显示电压的整数位,即个位,后两位显示电压的小数位。

7SEG-MPX4-CC-BLUE显示器引脚如图2-3所示,是一个共阴极接法的4位LED数码显示管,其中a,b,c,e,f,g为4位LED各段的公共输出端,1、2、3、4分别是每一位的位数选端,dp是小数点引出端。

本电路中P1口控制段选信号,P2.4-P2.7控制位选信号。

图2-37SEG-MPX4-CC-BLUE引脚

2.3.2LED译码方式

译码方式是指由显示字符转换得到对应的字段码的方式,对于LED数码管显示器,通常的译码方式有硬件译码和软件译码方式两种。

硬件译码是指利用专门的硬件电路来实现显示字符码的转换。

软件译码就是编写软件译码程序,通过译码程序来得到要显示的字符的字段码,译码程序通常为查表程序。

本设计系统中为了简化硬件线路设计,LED译码采用软件编程来实现。

由于本设计采用的是共阴极LED,其对应的字符和字段码如下表2所示。

 

表2共阴极字段码表

显示字符

共阴极字段码

0

3FH

1

06H

2

5BH

3

4FH

4

66H

5

6DH

6

7DH

7

07H

8

7FH

9

6FH

2.4双D正沿触发器

74LS74这个集成块是一个双D触发器,其功能比较的多,可用作寄存器,移位寄存器,振荡器,单稳态,分频计数器等功能。

74LS74是个双D触发器,把其中的一个D触发器的Q非输出端接到D输入端,时钟信号输入端CLOCK接时钟输入信号,这样每来一次CLOCK脉冲,D触发器的状态就会翻转一次,每两次CLOCK脉冲就会使D触发器输出一个完整的正方波,这就实现了2分频。

把同一片74LS74上的两路D触发器串联起来,其中一个D触发器的输出作为另一个D触发器的时钟信号,还可以实现4分频。

74LS74引脚如图2-4所示

图2-474LS74引脚

2.5总体电路设计

经过以上的设计过程,可设计出基于单片机的简易数字直流电压表硬件电路原理图如图2-5所示

图2-5简易数字电压表电路图

此电路的工作原理是:

+5V模拟电压信号通过变阻器VR1分压后由ADC08008的IN0通道进入(由于使用的IN0通道,所以ADDA,ADDB,ADDC均接低电平),经过模/数转换后,产生相应的数字量经过其输出通道D0-D7传送给AT89C51芯片的P0口,AT89C51负责把接收到的数字量经过数据处理,产生正确的7段数码管的显示段码传送给四位LED,同时它还通过其四位I/O口P2.4、P2.5、P2.6、P2.7产生位选信号控制数码管的亮灭。

此外,AT89C51还控制ADC0808的工作。

其中,单片机AT89C51通过定时器中断从P3.3输出方波,接到ADC0808的CLOCK,P3.2发正脉冲启动A/D转换,P3.0检测A/D转换是否完成,转换完成后,P3.1置高从P1口读取转换结果送给LED显示出来。

简易数字直流电压表的硬件电路已经设计完成,就可以选取相应的芯片和元器件,利用Proteus软件绘制出硬件的原理,并仔细地检查修改,直至形成完善的硬件原理图。

但要真正实现电路对电压的测量和显示的功能,还需要有相应的软件配合,才能达到设计要求。

 

三程序设计

3.1程序设计总方案

根据模块的划分原则,将该程序划分初始化模块,A/D转换子程序和显示子程序。

初始化中主要对AT89C51,ADC0808的管脚和数码管的位选级所用的内存单元进行初始化设置。

准备工作做好后启动ADC0808对INO脚输入进的0-5V电压模拟进行数据采集并转化成相对应的0-255十进制数字量。

在数据处理子程序中,编写算法将0-255十进制数字量转化成0-5V的数据,输出到显示子程序进行显示。

三个程序模块构成了整个系统软件的主程序,如图3-1所示。

图3-1数字式直流电压表主程序框图

3.2系统子程序设计

3.2.1初始化程序

所谓初始化,是对将要用到的MCS_51系列单片机内部部件或扩展芯片进行初始工作状态设定,初始化子程序的主要工作是设置定时器的工作模式,初值预置,开中断和打开定时器等。

3.2.2A/D转换子程序

启动ADC0808对模拟量输入信号进行转换,通过判断EOC(P3.2引脚)来确定转换是否完成若EOC为0,则继续等待;若EOC为1,则把OE置位,将转换完成的数据储存到dispbuf数组中,其转换流程图如图3-2所示。

图3-2A/D转换流程图

3.2.3显示子程序

显示子程序采用动态扫描法实现四位数码管的数值显示,在定时器中断里实现。

测量所得A/D转换数据放在dispbuf数组中,测量数据在显示时需转换成10进制BCD码。

电路中P1口控制段选信号,P2.4-P2.7控制位选信号。

程序流程图如图3-3所示。

图3-3显示子程序流程图

 

四仿真调试

4.1软件调试

软件调试的主要任务是排查错误,错误主要包括逻辑和功能错误,这些错误有些是显性的,而有些是隐形的,可以通过仿真开发系统发现逐步改正。

Proteus软件可以对基于微控制器的设计连同所有的周围电子器件一起仿真,用户甚至可以实时采用诸如LED/LCD、键盘、RS232终端等动态外设模型来对设计进行交互仿真。

Proteus支持的微处理芯片包括8051系列、AVR系列、PIC系列、HC11系列及Z80等等。

Proteus可以完成单片机系统原理图电路绘制、PCB设计,更为显著点的特点是可以与Visions4工具软件结合进行编程仿真调试。

本系统的调试主要以软件为主,其中,系统电路图的绘制和仿真我采用的是Proteus软件,而程序方面,采用的是C语言,用Keil软件将程序写入单片机。

4.2显示结果及误差分析

4.2.1显示结果

1.当IN0口输入电压值为4.99V时,显示结果如图4-1所示,测量误差为0V。

图4-1输入电压为4.99V时,LED的显示结果

2.当IN0输入电压值为2.50V时,显示结果如图4-2所示。

测量误差为0.02V。

图4-2输入电压为2.50V时,LED的显示结果

4.2.2误差分析

通过以上仿真测量结果可得到简易数字电压表与“标准”数字电压表对比测试表,如下表3所示:

表3简易数字电压表与“标准”数字电压表对比测试表

标准电压值/V

简易电压表测量值/V

绝对误差/V

0.00

0.00

0.00

0.50

0.50

0.00

1.00

0.99

0.01

1.50

1.50

0.00

2.00

1.99

0.01

2.50

2.48

0.02

3.00

2.99

0.01

3.50

3.48

0.02

4.00

3.99

0.01

4.50

4.48

0.02

4.99

4.99

0.00

由于单片机AT89C51为8位处理器,当输入电压为5.00V时,ADC0808输出数据值为255(FFH),因此单片机最高的数值分辨率为0.0196V(5/255)。

这就决定了电压表的最高分辨率只能到0.0196V,从上表可看到,测试电压一般以0.00-0.02V的幅度变化。

从上表可以看出,简易数字电压表测得的值基本上比标准电压值偏小0-0.02V,这可以通过校正ADC0808的基准电压来解决。

因为该电压表设计时直接用5V的供电电源作为电压,所以电压可能有偏差。

 

结束

经过一段时间的努力,毕业论文-基于单片机的简易数字电压表基本完成。

但设计中的不足之处仍然存在。

这次设计是我第一次设计电路,并用Proteus实现了仿真。

在这过程中,我对电路设计,单片机的使用等都有了新的认识。

通过这次设计学会了Proteus和Keil软件的使用方法,掌握了从系统的需要、方案的设计、功能模块的划分、原理图的设计和电路图的仿真的设计流程,积累了不少经验。

基于单片机的数字电压表使用性强、结构简单、成本低、外接元件少。

在实际应用工作应能好,测量电压准确,精度高。

系统功能、指标达到了课题的预期要求、系统在硬件设计上充分考虑了可扩展性,经过一定的改造,可以增加功能。

本文设计主要实现了简易数字电压表测量一路电压的功能,详细说明了从原理图的设计、电路图的仿真再到软件的调试。

总之这次电路的设计和仿真,基本上达到了设计的功能要求。

在以后的实践中,我将继续努力学习电路设计方面的理论知识,并理论联系实际,争取在电路设计方面能有所提升。

 

参考文献

[1]《单片机原理与应用》.徐爱钧.北京:

机械工业出版社,2013年8月

[2]《基于Protues的单片机可视化软硬件仿真》.林芝琦,郎建军等著.北京:

北京航空航天大学出版社.2006年9月

[3]《单片机原理与程序设计实验教程》.于殿泓、王新年.西安电子科技大学出版社,2007年5月

[4]《单片机原理与应用及C51程序设计实例》.谢维成、杨加国.电子工业出版社,2006年3月

[5]《北京航空航天大学出版社》.李广弟.单片机基础.2007年5月

[6]《Protues在MCS-51&ARM7系统中的应用百例》.周润景.第一版.北京:

电子工业出版社,2006年

 

附录

#include

unsignedcharcodedispbitcode[]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f};

unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f,0x00};

unsignedchardispbuf[8]={10,10,10,10,0,0,0,0};

unsignedchardispcount;

unsignedchargetdata;

unsignedchartemp;

longinti,a;

sbitST=P3^0;

sbitOE=P3^1;

sbitEOC=P3^2;

sbitCLK=P3^3;

voidmain(void)

{

ST=0;

OE=0;

ET0=1;

ET1=1;

EA=1;

TMOD=0x12;

TH0=216;

TL0=216;

TH1=(65536-6565)/256;

TL1=(65536-6565)%256;

TR1=1;

TR0=1;

ST=1;

ST=0;

while

(1)

{

if(EOC==1)

{

OE=1;

getdata=P0;

OE=0;

i=getdata*196;

dispbuf[5]=i/10000;

i=i%10000;

dispbuf[6]=i/1000;

i=i%1000;

dispbuf[7]=i/100;

i=i%100;

ST=1;

ST=0;

}

}

}

voidt0(void)interrupt1using0

{

CLK=~CLK;

}

voidt1(void)interrupt3using0

{

TH1=(65536-6565)/256;

TL1=(65536-6565)%256;

P2=dispbitcode[dispcount];

P1=dispcode[dispbuf[dispcount]];

if(dispcount==5)

{

P1=P1|0x80;

}

dispcount++;

if(dispcount==8)

{

dispcount=0;

}

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1