您好,欢迎来到飒榕旅游知识分享网。
搜索
您的当前位置:首页简易数字电压表

简易数字电压表

来源:飒榕旅游知识分享网


信息与电气工程学院

单片机系统设计项目(三级项目)

设计说明书

(2011/2012学年第二学期)

题 目 : _简易数字电压表的设计

专业班级 : 通信工程09级2班 学生姓名 : 赵尚森 学 号: 090310213 指导教师 :吴开兴、李晓东、 贾少锐、马小进 设计周数 : 2周

设计成绩 :

2012年7月6日

1 设计要求与任务

本次课程设计中我们小组的设计任务是简易数字电压表。其中主要任务和技术要求如下:

主要任务:1、查阅相关资料,进行功能分析;2、给出设计方案;3、熟悉所用器件的功能特性;4、设计电路原理图;5、进行硬件制作; 6、熟悉编程语言和仿真软件,编程实现相应功能;7、系统调试;8、编写设计报告。

技术要求:选用51系列单片机,在单片机的作用下;能监测两路的输入电压值,测量范围为0~5伏的输入电压值;用8位串行A/D转换器,8位分辨率,逐次逼近型,基准电压为 5V;能用两位LED进行轮流显示或单路选择显示,显示精度0.1伏,并通过串口通信在PC机上进行显示。

2 设计正文 2.1 设计思路

⑴针对本次CDIO项目中的各个设计要求,我们小组通过讨论研究,决定不进行特别细致的任务分工,齐头并进共同处理小组设计中出现的各种问题。

⑵在拿到任务书后,首先了解要用数字电压表来实现的具体功能。设计中用到的模数转换芯片为ADC0832,其为双通道芯片,可以选择不同的通道进行转换。我们小组选择其中一路。在老师给的单片机上有LED数码管,所以直接显示在单片机上。最后也要通过串口来将显示的数据送到PC机上,也就是上位机。这时可以用C#来实现Windows窗体显示。

⑶接下来是确定设计方案。首先用签字笔在纸张上简单描绘出各种器件的摆放,然后在proteus仿真软件上放置实际器件。在设计大体可以的时候,进行程序代码的书写。其中最为重要的就是AD转换部分,采集到数据之后进行算法的处理就可以送LED数码管显示。数码管显示了,之后要把数据利用串口送到上位机。上位机接收后显示出来。

⑷proteus仿真中的结果是非常理想的。下面的就是要对照单片机电路图进行稍微的改写,单片机电路图中需要学习的就是数码管显示部分的内容。设计中提供的单片机数码管的位选是低电平有效,而段选是共阳极的。所以这个很困扰我们。

⑸在仿真结果出现后,我们小组就进行了电路板的焊接。这个工作也是共同完成。有主要动手焊接的,也有分析摆放的,也有监督正确与否的。

⑹在Keil中编程来实现单片机的功能。小组讨论各种函数的编写,比较困难的就是利用串口发送数据给上位机那块,因为要用到数据的变换。显示数码管的时候,也参考了网上的一些程序,学习了其中的算法。

⑺最后的检查调试,就是大致分析整体布局,进行美工设计。

2.2 原理技术 2.2.1 8051单片机

8051单片机是把那些作为控制应用所必需的基本内容都集成在一个尺寸有限的集成电路芯片上。如果按功能划分,它由如下功能部件组成,即处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口、中断系统和时种电路,其基本结构依旧是CPU加上外围芯片的传统结构模式。但对各种功能部件的控制是采用特殊功能寄存器的集中控制方式。

处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。

8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。

8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。 8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。

8051共有4组8位I/O口(P0、 P1、P2或P3),用于对外部数据的传输。 8051内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。

8051具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。

8051内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序但8051单片机需外置振荡电容。

由上可见,8051单片机的硬件结构具有功能部件种类全,功能强等特点。特别值得一提的是该单片机CPU中的位处理器,它实际上是一个完整的1位微计

算机,这个一位微计算机有自己的CPU、位寄存器、I/O口和指令集。1位机在开关决策、逻辑电路仿真、过程控制方面非常有效;而8位机在数据采集,运算处理方面有明显的长处。MCS-51单片机中8位机和1位机的硬件资源复合在一起,二者相辅相承,它是单片机技术上的一个突破,这也是MCS-51单片机在设计的精美之处。

2.2.2ADC0832

ADC0832具有以下特点:

⑴8位分辨率; ⑵双通道A/D转换;

⑶输入输出电平与TTL/CMOS相兼容; ⑷5V电源供电时输入电压在0~5V之间; ⑸工作频率为250KHZ,转换时间为32μS; ⑹一般功耗仅为15mW;

⑺8P、14P—DIP(双列直插)、PICC多种封装;

⑻商用级芯片温宽为0°C to +70°C?,工业级芯片温宽为40℃ to +85℃。 ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI数据输入端,可以轻易的实现通道功能的选择。

正常情况下ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI并联在一根数据线上使用。我们看看在实验板上它是怎么连接的。

2.3 软件设计

⑴ 初始化程序

系统上电时,初始化程序将70H~77H内存单元清0,P2口置0。 ⑵ 主程序

在刚上电时,系统默认为循环显示8个通道的电压值状态。当进行一次测量后,将显示每一通道的A/D转换值,每个通道的数据显示时间为1s左右。主程

序在调用显示子程序和测试子程序之间循环,主程序流程图见图1

图1 主程序流程图

⑶显示子程序

显示子程序采用动态扫描法实现四位数码管的数值显示。测量所得的A/D转换数据放在70H~77H内存单元中,测量数据在显示时需转换成为十进制BCD码放在78H~7BH内存单元中,其中7BH存放通道标志数。寄存器R3用作8路循环控制,R0用作显示数据地址指针。 ⑷模/数转换测量子程序

模/数转换测量子程序用来控制对0808八路模拟输入电压的A/D转换,并将对应的数值移入70H~77H内存单元。

程序源主要代码如下:

/*******************************共阳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; else

adval |= 0x00; }

for (i = 0; i < 8; i++) //读取后8位的值 {

test >>= 1; if (DATO)

test |= 0x80; else

test |= 0x00; _nop_(); Clk = 1; _nop_(); Clk = 0; }

if (adval == test) //比较前8位与后8位的值,如果不相同舍去 dat = test; _nop_();

CS = 1; //释放ADC0832 DATO = 1; Clk = 1; return dat; }

void delay(void) {

int k;

for(k=10;k<500;k++); }

void convdata(unsigned char i) { shuju=i;

dis[0] = i/51; //个位

dis[1] = i%51*2/10; //小数点后第一位 }

/******************函数功能:数码管显示子程序*************************/ void display(void)

{ P2=0xdf; //仿真为0x10 板子0xdf P0=tab[dis[0]] & 0x7f; delay(); P2=0xef; //仿真为0x20 板子0xef P0=tab[dis[1]]; delay(); }

void main(void) {

P2=0xff; //端口初始化 P0=0xff; delay();

CH = 0x00; //在这里选择通道 0x00

TMOD = 0x21; TH1 = 0xFD; //baud*2 /* 波特率9600、数据位8、停止位1。效验位无 (12M) TL1 = 0xFD; TR1 = 1; SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1 EA=1; //开中断 ES=1; ET0=1; TR0=1;

TH0=(65536-50000)/256;//定时器1初值定时50ms TL0=(65536-50000)%256; while(1) //主循环 { dat = adc0832(CH);

convdata(dat); //数据转换 display(); //显示数值 data1=dat/51; //串口数据发送 data2=dat%51*2/10; dat2=data1*10+data2; SBUF=dat2; TI=1; while(TI==0); TI=0; delay(); } }

void timer0(void) interrupt 1 {

TMOD = 0x01;

TH0=(65536-50000)/256; //定时器1初值定时50ms TL0=(65536-50000)%256; IE = 0x82; TR0 = 1; count++;

if (count == 0x01) {

count = 0x00;

dat = adc0832(CH); } }

2.4 上位机设计

任务设计要求有上位机显示出变化的电压值,所以我们用C#来实现Windows窗体进而显示出来测到的数据。这里主要调用的是ReceiveData函数,将获取到的数据进行变形送显。单击button出发click事件,来开始接收。布局图如下:

图2 上位机显示

2.5 硬件设计 2.5.1 模块设计电路

单片机控制模块的作用是为控制各单元电路的运行并完成数据的换算或处理,主要由单片机、时钟电路、复位电路组成。

单片机工作的时间基准是由时钟电路提供的,在单片机的XTAL1和XYAL2两个管脚接一只晶振及两只电容就构成了单片机的时钟电路,电路中电容器C1和C2对振荡频率有微调作用,通常取(30±10)pF石英晶体选择6MHz或12MHz都可以。时钟电路如图2所示。

图2系统时钟电路 单片机的RST管脚为主机提供了一个外部复位信号输入口。复位信号是高电平有效,高电平有效的持续时间为2个机器周期以上。单片机的复位方式可由手动复位方式完成。

2.5.2 Protues仿真电路 ⑴电路仿真图

图2 Protues仿真电路原理图

⑵电路工作原理

图3所示。A/D转换由集成电路0832完成,0832具有2路模拟输入端口,地址线可决定对哪一路模拟输入作A/D转换。

图3 ADC0832管脚图

正常情况下ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI并联在一根数据线上使用。我们看看在实验板上它是怎么连接的。ADC0832的控制引脚CS、CLK、DO、DI占用了P20、P36、P37三个个IO口。其中,DO和DI共用一条数据线。

当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK和DO/DI的电平可任意。当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第1个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。在第2、3个脉冲下沉之前DI端应输入2位数据(SGL、Odd)用于选择通道功能,当此2位数据为“1”、“0”时,只对CH0进行单通道转换。当2位数据为“1”、“1”时,只对CH1进行单通道转换。当2位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。当2位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1作为正输入端IN+进行输入。

AD转换电路如下图:

图4 ADC0832与单片机连接

3 系统仿真

简易数字电压表与“标准”数字电压表测得的绝对误差应在0.1V以内。 在进行电路的局部调试之后,我们又进行了系统整机调试。首先为ADC0832接上+5V的工作电压。另外还要输入待测的模拟电压,该电压从0V电压开始输起,依次增大,直到达到待测电压的上限5V为止,记录测量数据并分析系统性能。

3.1 仿真记录

调好程序后将目标程序导入Proteus进行软硬件调试,基于单片机实现的数字电压表测试值见表1所示。

表1 测试值与真实值

电压表测得值/V 绝对误差/V 0.0 0.0 0.5 0.0 1.0 0.0 2.0 0.0 3.5 0.0 4.5 0.0 5 0.0 从表中可以看出,电压表测得值误差均在0V,这与采用8位A/D转换器所能达到的理论误差精度相比较接近,因此在一般的应用场合都可以满足要求。

3.2 性能分析

由于单片机为8位处理器,当输入电压为5.00V时,输出数据值为255(FFH),因此单片机最大的数值分辨率为0.0196V(5/255)。这就决定了该电压表的最大分辨率(精度)只能达到0.0196V。如要获得更高的精度要求,应采用12位、13位的A/D转换器。

4 总结

在课程设计中,我们小组共同进步,一起解决出现的问题。主要麻烦的问题有如下:

⑴数码管显示乱码。普通单片机的数码管,其段选与位选一般都是共阴或者都是共阳,我们小组在学习单片机电路图时了解到所给单片机为共阳数码管,所以仿真也是用的共阳数码管。在后续的程序烧写中,出现了问题:程序在仿真中可以,但是单片机却不行。后来认真分析才发现,所给的单片机数码管位选是低电平有效,而段选是高电平有效。

⑵处理获取到的AD转换的数据。在获取到0832的数据之后,如何将数据显示出来,先获取到个位,再得到小数点后数据。

⑶利用串口向上位机发送数据。由于我们这次设计只需要单片机向PC机发送数据,所以系统是单工系统。设置串口工作模式后开中断,程序中设置的为50ms。

课程设计完成了,我们小组顺利实现了任务要求。在这个过程中,我们的焊接电路、模拟仿真、调试运行等能力都得到了很大的提高。同时,我们也明白了团结协作的重要性。为后面的学习生活打下了基础。

参考文献:

[1] 张毅刚.单片机原理及应用[M].高等教育出版社,2009,11(17). [2] 邱锦伦.Visual C#.NET程序设计教程[M].清华大学出版社,2007,8(3).

评 语 指导教师 成 绩 (签字) 年 月 日

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sarr.cn 版权所有 赣ICP备2024042794号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务