数字电压表报告
基于单片机的数字电压表设计报告
单片机原理及系统课程设计专业:电气工程及其自动化班级:姓名:学号:指导教师:兰州交通大学自动化与电气工程学院2010 年 3 月 7 日基于单片机的数字电压表设计摘要显示电路输入电路图2.2系统组成框图3.硬件设计3.1系统硬件设计原理通过变量设置选择八路通道中的第三路,将该路模拟电压送入ADC0808相应通道,单片机软件设置ADC0808开始A/D转换,转换结束ADC0808的EOC 端口产生高电平,同时将ADC0808的OE端口置为高电平,单片机将ADC0809转换后的数字量存到片内RAM。
系统调出数据处理子程序,将测量结果转化为0.00~5.00V,最后通过查表将每一位数据输出到LED显示电路,将相应电压显示出来,程序进入下一个循环。
单片机的P0.0~P0.7作为4位动态数码显示管的段显示控制。
P2.1~P2.3作为4位动态显示管的位显示控制。
3.2硬件设计原理图在Proteus仿真环境下所搭建的系统硬件电路图如图3.2所示。
图3.2系统原理图图4.2 程序流程图(a)主程序流程图(b)AD转换流程图5.系统调试及仿真结果6.总结两周的课程设计结束了,在这过程中,我学到了很多东西。
首先,我学会了单片机设计的基本过程有哪些,每一过程有哪些基本的步骤,怎样通过查资料去完成这每一步。
其次我巩固了上学期所学的一些单片机知识,从而加深了对ADC0809芯片的功能的了解。
在编程过程中,遇到了许多困难,通过与同学之间的交流和咨询,最后解决了这些困难。
所谓实践出真知,学到的东西只有运用到实践当中,才能真正体会到知识的力量。
最后,通过这次课程设计,让我明白了想法和实践还是有差距的,当你真正去做一件事的时候,你会发现你的想法可能不适用,随时都需要调整,另外扎实的理论知识也是完成设计任何设计必不可少的要素,一切想法离开了理论知识都是空想。
参考文献[1]彭为,黄科,雷道仲.单片机典型系统设计实例精讲[M].电子工业出版社.2009:22-54.[2] 谭浩强.C程序设计(第三版)[M].清华大学出版社.2009:32-46.[3] 王思明,张金敏,张鑫等.单片机原理及应用系统设计(第一版)[M].科学出版社.2012:70-292.附录A源程序代码#include<reg52.h>#include<intrins.h>#define uchar unsigned charsbit p21=P2^1;sbit p22=P2^2;sbit p23=P2^3;sbit EOC=P3^1;sbit OE=P3^0;sbit ST=P3^2;sbit p34=P3^4;sbit p35=P3^5;sbit p36=P3^6;uchar code tab[]={0x40,0x79,0x24,0x30,0x19,0x12};uchar code led[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; uchar code led_[]={0xC0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; void delay(uchar n){uchar i,j;for(i=0;i<n;i++)for(j=0;j<125;j++);}void convert(uchar volt_data){unsigned int temp;temp=100*volt_data/51;P0=led[temp/100]; //个位上的数字显示p21=1; //选通个位delay(3); //延时p21=0; //不选通个位P0=led_[temp%100/10]; // 十分位的数字显示p22=1; //选通十分位delay(3); //延时p22=0; //不选通十分位P0=led_[temp%10]; //百分位的数字显示p23=1; //选通百分位delay(3); //延时p23=0; //不选通百分位}void main(){uchar volt_data;p34=1;p35=1;p36=0; //选通ADC0808的IN3通道while(1){ST=0;_nop_();ST=1;_nop_();ST=0; //开始转换if(EOC==0) //如果EOC为0,则继续转换delay(100);while(EOC==0); //当EOC为1时,转换完毕OE=1; //数据允许输出标志volt_data=P1; //讲P1口的数据送volt_dataOE=0;convert(volt_data);}}。
数字电压表实验报告
简易数字电压表设计报告姓名:***班级:自动化1202学号:****************:***2014年11月26日一.设计题目采用C8051F360单片机最小系统设计一个简易数字电压表,实现对0~3.3V 直流电压的测量。
二.设计原理模拟输入电压通过实验板PR3电位器产生,A/D转换器将模拟电压转换成数字量,并用十进制的形式在LCD上显示。
用一根杜邦实验线将J8口的0~3.3V输出插针与J7口的P2.0插针相连。
注意A/D转换器模拟输入电压的范围取决于其所选择的参考电压,如果A/D 转换器选择内部参考电压源,其模拟电压的范围0~2.4V,如果选择外部电源作为参考电压,则其模拟输入电压范围为0~3.3V。
原理框图如图1所示。
图1 简易数字电压表实验原理框图三.设计方案1.设计流程图如图2所示。
图2 简易数字电压表设计A/D转换和计时流程图2.实验板连接图如图3所示。
图3 简易数字电压表设计实验板接线图3.设计步骤(1)编写C8051F360和LCD初始化程序。
(2)AD转换方式选用逐次逼近型,A/D转换完成后得到10位数据的高低字节分别存放在寄存器ADCOH和ADC0L中,此处选择右对齐,转换时针为2MH Z。
(3)选择内部参考电压2.4V为基准电压(在实际单片机调试中改为3.311V),正端接P2.0,负端接地。
四、测试结果在0V~3.3V中取10组测试数据,每组间隔约为0.3V左右,实验数据如表1所示:显示电压(V)0.206 0.504 0.805 1.054 1.406实际电压(v)0.210 0.510 0.812 1.061 1.414相对误差(%) 1.905 1.176 0.862 0.659 0.565显示电压(V) 2.050 2.383 2.652 2.935 3.246实际电压(v) 2.061 2.391 2.660 2.943 3.253相对误差(%)0.421 0.334 0.301 0.272 0.215表1 简易数字电压表设计实验数据(注:其中显示电压指LCD显示值,实际电压指高精度电压表测量值)五.设计结论1.LCD显示模块的CPLD部分由FPGA充当,芯片本身自带程序,所以这个部分不用再通过quartus软件进行编程。
数字电压表实验报告模板
《单片机课程设计》设计报告设计题目:数字电压表的设计班级学号:50809xx姓名:xxx设计时间:2010-12-28备注:目录1.引言 (2)2.概述··22.1实验要求 (2)2.2实验目的 (2)2.3 实验器材 (2)3.总体设计方案 (3)3.1系统的总体结构及实验原理 (3)3.2芯片的选择 (4)3.3 ADC0809 的主要性能指标 (4)4.硬件电路设计 (6)4.1 AT89S52 单片机最小系统 (6)4.1.1 AT89S52各引脚及其引脚功能的实现 (6)4.2 ADC0809 与AT89S52 单片机接口电路设计 (7)4.2.1ADC0809和AT89S52单片机接口电路的引脚说明 (8)4.2.2ADC0809与AT89S52单片机的连接与控制的实现 (9)4.3显示电路与AT89S52 单片机接口电路设计 (10)4.3.1显示电路的组成 (11)4.3.2显示电路和AT89S52接口电路的引脚说明 (12)4.3.3显示电路与AT89S52的连接与控制的实现 (12)5.软件设计 (13)5.1主程序流程图 (14)5.1.1 主程序说明 (15)5.2 ADC0809 电压采集程序框图 (16)5.2.1ADC0809电压采集程序说明 (17)5.3显示程序框图 (18)5.3.1显示程序说明 (19)6.调试与测量结果分析 (20)6.1调试和仿真环境 (20)6.2程序调试 (20)6.3 仿真结果 (22)6.4 实验结果分析 (23)7.实验总结和实验收获 (24)8.程序清单和系统原理图(附录) (25)8.1(附录一)程序清单 (25)8.2 (附录二)系统原理图 (26)1.引言本次课程设计要求完成是数字电压表的设计,随着电子科学技术的发展,电子测量成为广大电子工作者必须掌握的手段,对测量的精度和功能的要求也越来越高,而电压的测量甚为突出,因为电压的测量最为普遍。
单片机数字电压实训报告
一、实训目的1. 掌握单片机的基本原理和操作方法。
2. 学会使用单片机进行数字电压的测量。
3. 熟悉数字电压表的硬件电路设计和软件编程。
4. 提高动手实践能力和问题解决能力。
二、实训内容1. 数字电压表概述数字电压表(Digital Voltmeter,简称DVM)是一种将模拟电压信号转换为数字信号的测量仪器。
它具有测量精度高、读数直观、易于操作等优点,广泛应用于电子测量、工业自动化、科学研究等领域。
2. 硬件电路设计(1)单片机选型:选用AT89C51单片机作为核心控制器,具有丰富的片上资源,满足数字电压表设计需求。
(2)模数转换器(ADC)选型:选用ADC0809模数转换器,具有8路模拟输入端口,可实现8路电压信号的采集。
(3)电压输入电路设计:设计多路电压输入电路,包括电压分压、滤波等,确保输入电压信号稳定、准确。
(4)显示模块选择:选用LCD1602液晶显示屏,可实时显示采集到的电压值。
3. 软件设计(1)初始化程序:设置单片机工作模式、波特率、中断等参数,初始化ADC0809和LCD1602。
(2)ADC采集程序:通过单片机控制ADC0809进行电压信号的采集,将模拟电压信号转换为数字信号。
(3)数据处理程序:对采集到的数字电压信号进行处理,计算实际电压值。
(4)显示程序:将计算得到的电压值显示在LCD1602上。
4. 调试与测试(1)硬件调试:检查电路连接是否正确,元器件是否损坏,确保电路正常工作。
(2)软件调试:使用Keil软件进行程序编译、仿真和调试,确保程序运行正确。
(3)功能测试:通过实际测量,验证数字电压表的功能是否满足设计要求。
三、实训结果与分析1. 测量精度通过实际测量,数字电压表在0~5V范围内具有较高的测量精度,最小分辨率为0.019V,误差约为±0.02V。
2. 测量速度数字电压表具有较快的测量速度,可在短时间内完成电压信号的采集、处理和显示。
3. 稳定性和可靠性数字电压表电路设计合理,元器件选用合格,具有较强的稳定性和可靠性。
简易数字电压表设计报告
摘要--------------------------------------------------------2 1.数字电压表的简介------------------------------------------31.1数字电压表的发展--------------------------------------31.2数字电压表的分类--------------------------------------42.设计的目的------------------------------------------------53.设计的内容及要求------------------------------------------54.数字电压表的基本原理--------------------------------------54.1数字电压表各模块的工作原理----------------------------54.2数字电压表各模块的功能--------------------------------54.3数字电压表的工作过程----------------------------------65.实验器材--------------------------------------------------76.电路设计实施方案------------------------------------------76.1.实验步骤---------------------------------------------76.2各个模块设计------------------------------------------86.2.1 基准电压模块-----------------------------------86.2.2 3 1/2位A/D电路模块---------------------------106.2.3 字形译码驱动电路模块--------------------------126.2.4 显示电路模块----------------------------------136.2.5 字位驱动电路模块------------------------------167.总结-----------------------------------------------------17 参考文件---------------------------------------------------18 附录-------------------------------------------------------19本文介绍了一种简易数字电压表的设计。
数字电压表的综合设计报告
数字电压表的综合设计一、设计任务1、使用状态机实现对模数转换芯片TLC549的采样控制,实现一个简易的电压表。
并将硬件验证结果与测量电压值进行比较。
二、整体设计1、本次设计是利用FPGA控制 TLC549,将 AD转换后的电压值读出,并显示在数码管。
模块一为TLC549主控制模块,模块二为bcd1即一位BCD码加减模块,模块三为lookup即A/D转换BCD码模块,模块四为scan_led数码显示模块。
然后将模块生成为相应器件,按照原理图连接,得出相应波形及数据。
由FPGA构成的ASIC的三部分电路(如结构示意图所示):(1)用有限状态机设计的A/D转换控制电路;(2)将8位数字量DB0-DB7转换成3位BCD码电压值的转换路;(3)3位LED显示器的译码显示电路;结构示意图2、原理框图3、模数转换-TLC549 ADC的介绍(1)TLC549各引脚功能如下:●ANALOG IN,模拟量输入端;●sclk,串行时钟输入端;●cs,芯片选择,低有效;●DATA OUT,数字量输出端;●GND,模拟接地;●REF+,基准电压输入端;●REF-,基准电压负端;●VCC,正电源电压端。
(2)TCL549的工作时序图当片选 CS为低电平时,串行输人数据才能被移入移位寄存器。
当 CS为低电平时,在每一个SCLK时钟的上升沿将DIN的一位数据移入移寄存器。
注意,二进制最高有效位被导前移入。
接着, CS的上升沿才将移位寄存器的数据锁存,供DAC电路进行转换;当片选CS为高电平时,串行输人数据不能被移入移位寄存器。
注意.CS的上升和下降都必须发生在SCLK为低电平期间。
三、模块设计模块一module tcl549c(clk,cs,sdata,clk_ad,reset,dataout);input clk,reset,sdata;output cs,clk_ad;output[7:0]dataout;reg cs,clk_ad_r,clk_r;reg[7:0]dataout,dataout_r;reg[7:0]count;reg[2:0]temp;reg[3:0]cnt;reg mark;reg flag;parameter [2:0]s0=0,s1=1,s2=2;reg[2:0]c_st;always@(posedge clk)begin if(count<119)count<=count+1;else begin clk_r<=~clk_r;count=0;endendalways@(posedge clk)begin clk_ad_r<=~clk_r;endassign clk_ad=clk_ad_r;always@(posedge clk_r or negedge reset)begin if(!reset) c_st<=s0;else case(c_st)s0:begin cs<=1;mark<=0;if(temp==3)begin temp<=0;c_st<=s1;endelse begin temp<=temp+1;c_st<=s0;endends1:begin cs<=0;mark<=1;c_st=s2;ends2:begin cs<=0;mark<=1;if(flag==1)c_st<=s0;else c_st<=s2;enddefault:c_st<=s0;endcaseendalways@(posedge clk_ad_r)beginif(mark==1)if(cnt==8)begin cnt<=0;flag<=1;endelse begin cnt<=cnt+1;flag<=0;endendalways@(posedge clk_ad_r)beginif(mark==1)if(flag==1)dataout<=dataout_r;else dataout_r={dataout_r[6:0],sdata};//串转并endendmodule模块二/*功能:一位BCD码加减法模块输入参数:标准时钟clk,被减数/加数dataa,减数/加数datab,低位来的借位/进位cin输出参数:向高位的借位/进位cout,差/和result*/module bcd1(dataa, datab,cin, cout, result);input [3:0] dataa;input [3:0] datab;input cin;output reg cout;output [3:0]result;reg [4:0]result_r;assign result=result_r;always @(*)beginresult_r = dataa + datab + cin; // 二进制加法if((result_r > 4'd9 )) //||((result_r == 4'd0)&&(dataa != 0))||((result == 4'd1)&&(dataa != 0)&&(result_ab == 4'd0))/*当结果大于9时,补6,当结果由不同时为0的加数相加得0时,补6*/ beginresult_r = result_r + 4'd6;cout = 1;endelsebeginresult_r = result_r;cout =0;endendendmodule模块三module lookup(V,q);input [7:0]V;output [11:0]q;reg [11:0]q;reg [11:0]HB,LB;wire d1,d2,d3;always@(V)begin case(V[7:4]) //--A/D值的高4位转换成3位BCD码4'b1111: HB<=12'b001001000000; //--2.404'b1110: HB<=12'b001000100100; //--2.244'b1101: HB<=12'b001000001000; //--2.084'b1100: HB<=12'b000110010010; //--1.924'b1011: HB<=12'b000101110110; //--1.764'b1010: HB<=12'b000101100000; //--1.604'b1001: HB<=12'b000101000100; //--1.444'b1000: HB<=12'b000100101000; //--1.284'b0111: HB<=12'b000100010010; //--1.124'b0110: HB<=12'b000010010110; // --0.964'b0101: HB<=12'b000010000000; // --0.804'b0100: HB<=12'b000001100100; //--0.644'b0011: HB<=12'b000001001000; //--0.484'b0010: HB<=12'b000000110010; //--0.324'b0001: HB<=12'b000000010110; //--0.164'b0000: HB<=12'b000000000000; // --0.00default: HB<=12'b111111111111;endcasecase(V[3:0]) //--A/D值低4位变为3位BCD码4'b1111: LB<=12'b000000010101; // --0.154'b1110: LB<=12'b000000010100; // --0.144'b1101: LB<=12'b000000010011; // --0.134'b1100: LB<=12'b000000010010; // --0.124'b1011: LB<=12'b000000010001; // --0.114'b1010: LB<=12'b000000010000; // --0.104'b1001: LB<=12'b000000001001; // --0.094'b1000: LB<=12'b000000001000; // --0.084'b0111: LB<=12'b000000000111; // --0.074'b0110: LB<=12'b000000000110; // --0.064'b0101: LB<=12'b000000000101; // --0.054'b0100: LB<=12'b000000000100; // --0.044'b0011: LB<=12'b000000000011; // --0.034'b0010: LB<=12'b000000000010; // --0.024'b0001: LB<=12'b000000000001; // --0.014'b0000: LB<=12'b000000000000; // --0.00default: LB<=12'b111111111111;endcaseendbcd1u1(.dataa(LB[3:0]),.datab(HB[3:0]),.result(q[3:0]),.cin(1'b0),.cout(d 1));bcd1u2(.dataa(LB[7:4]),.datab(HB[7:4]),.result(q[7:4]),.cin(d1),.cout(d2) );bcd1u3(.dataa(LB[11:8]),.datab(HB[11:8]),.result(q[11:8]),.cin(d2),.cout( d3));endmodule模块四module scan_led(clk_1k,d,dig,seg); //模块名scan_ledinput clk_1k; //输入时钟input[11:0] d; //输入要显示的数据output[7:0] dig; //数码管选择输出引脚output[7:0] seg; //数码管段输出引脚reg[7:0] seg_r; //定义数码管输出寄存器reg[7:0] dig_r; //定义数码管选择输出寄存器reg[3:0] disp_dat; //定义显示数据寄存器reg[2:0]count; //定义计数寄存器assign dig = dig_r; //输出数码管选择assign seg = seg_r; //输出数码管译码结果always @(posedge clk_1k) //定义上升沿触发进程beginif(count<2)count <= count + 1'b1;else count<=0;endalways @(posedge clk_1k)begincase(count) //选择扫描显示数据3'd0:disp_dat = d[11:8]; //第一个数码管3'd1:disp_dat = d[7:4]; //第二个数码管3'd2:disp_dat = d[3:0]; //第三个数码管endcasecase(count) //选择数码管显示位3'd0:dig_r = 8'b01111111; //选择第一个数码管显示3'd1:dig_r = 8'b10111111; //选择第二个数码管显示3'd2:dig_r = 8'b11011111; //选择第三个数码管显示endcasecase(count)3'd0:seg_r[7]=0;3'd1:seg_r[7]=1;3'd2:seg_r[7]=1;endcaseendalways @(disp_dat)begincase(disp_dat) //七段译码4'h0:seg_r[6:0] = 7'b1000000; //显示04'h1:seg_r[6:0] = 7'b1111001; //显示14'h2:seg_r[6:0] = 7'b0100100; //显示24'h3:seg_r[6:0] = 7'b0110000; //显示34'h4:seg_r[6:0] = 7'b0011001; //显示44'h5:seg_r[6:0] = 7'b0010010; //显示54'h6:seg_r[6:0] = 7'b0000010; //显示64'h7:seg_r[6:0] = 7'b1111000; //显示74'h8:seg_r[6:0] = 7'b0000000; //显示84'h9:seg_r[6:0] = 7'b0010000; //显示9 default:seg_r[6:0] = 7'b1111111;endcaseendendmodule仿真波形如下:四、结论调节SPOC实验平台上的相应按钮,使显示管出现不同的电压数值,同时使用万用表测出对应的电压数值。
数字电压表实验报告
数字电压表实验报告数字电压表实验报告引言:数字电压表是一种用于测量电压的电子仪器,它通过将电压信号转换为数字形式来显示测量结果。
本实验旨在通过使用数字电压表来测量不同电压信号,并探究其测量原理和使用方法。
实验目的:1. 理解数字电压表的工作原理;2. 学习使用数字电压表测量直流电压和交流电压;3. 掌握数字电压表的使用技巧。
实验器材:1. 数字电压表;2. 直流电源;3. 交流电源。
实验步骤:1. 将数字电压表与直流电源连接,调整电源输出电压为5V;2. 打开数字电压表,选择直流电压测量模式;3. 将数字电压表的测量引线分别与电源的正负极连接;4. 观察数字电压表的显示结果,并记录测量数值;5. 重复步骤1-4,将电源输出电压调整为不同数值,如10V、15V等,记录测量结果。
实验结果:在实验过程中,我们使用数字电压表测量了不同电压信号,并记录了测量结果。
通过分析实验数据,我们发现数字电压表能够准确地测量直流电压,并显示出相应的数值。
在测量过程中,我们注意到数字电压表的显示屏幕上有一个小数点,用于表示小数位数。
当电压信号较小时,小数点会显示更多的位数,以提高测量精度。
此外,我们还发现数字电压表的测量结果具有一定的误差,这可能是由于仪器本身的精度限制或测量过程中的误差引起的。
讨论与分析:通过本次实验,我们深入了解了数字电压表的工作原理和使用方法。
数字电压表通过将电压信号转换为数字形式,并通过显示屏幕上的数字来表示测量结果。
在测量直流电压时,数字电压表能够提供较高的测量精度,并且可以根据电压信号的大小自动调整小数位数。
然而,在测量交流电压时,由于交流电压的波动性,数字电压表的测量结果可能会有一定的误差。
结论:本次实验通过使用数字电压表测量不同电压信号,深入了解了数字电压表的工作原理和使用方法。
我们发现数字电压表能够准确地测量直流电压,并提供较高的测量精度。
然而,在测量交流电压时,由于交流电压的波动性,数字电压表的测量结果可能会有一定的误差。
EDA课程设计 数字电压表 代码及 报告
第一部分项目名称、内容与要求项目名称:数字电压表设计1.1 设计内容利用FPGA与模数转换器ADC0809设计一个数字电压表,能够测量0~5V之间的直流电压,用四个数码管显示被测电压,要求精确到小数点后三位数字。
了解数字电压表的工作原理,掌握可编程逻辑器件与模数转换器之间的接口电路设计及调试方法。
下载并测试电路功能,分析芯片资源的占用情况。
1.2 具体要求1)、能正确测量0-5∨模拟电压,误差<1%,数字电压值分别由四个数码管显示。
(2)、FPGA芯片产生ADC0809控制信号和七段显示器断码和位码等。
(3)、ADC0809芯片实现8位模数转换,输入0-5∨,输出00H-FFH。
(4)、ADC0809输出00H-FFH送FPGA芯片处理为十进制数百十个等位,并产生动态显示位码和断码。
(5)、FPGA芯片产生ADC0809芯片需要写、读和片选信号等,注意时序。
(6)、了解掌握A/D(模数)转换器芯片ADC0809的转换原理、管脚定义以及实际用法。
第二部分:系统整体架构(Architecture Description)2.1 设计思路数字电压表(Digital V oltmeter)简称DVM,是一种用数字显示的电压测量仪表。
由于数字电压表具有读数准确方便、精度高、误差小、灵明度高和分辨率高、测量速度快等特点而备受青睐。
其基本理是采用数字化测量技术,对直流电压进行模数转换,转换成不连续、离散的数字形式并加以显示。
由此可知数字电压表的设计应包括三个主要部分:作为电压采样端口的模数转换单元、数据处理单元及电压值显示单元。
设计要求利用ADC0809模数转换器,FPGA 作为数据处理的核心器件,用LED和数码管进行电压值的显示。
系统结构框图如下图所示。
2.2 系统原理(包含:框图等阐述)与设计说明等内容1、模数转换器工作原理A/D转换器芯片ADC0809简介8路模拟信号的分时采集,片内有8路模拟选通开关,以及相应的通道抵制锁存用译码电路,其转换时间为100μs左右。
ICL7107数字电压表报告
电子技术课程设计课题:音响放大器的设计与制作专业班级:自动化10-1BF****: **学号: ***********指导老师: 邓己媛杨宣兵日期: 2011年12月目录一.设计任务书(设计课题、功能要求) (3)二.实验仪器 (3)三.设计框图及整机概述 (4)四.各单元电路的设计方案及原理说明 (4)1.电源滤波电路 (5)2.测试电源接入端电路 (6)3.测试端口输入保护电路 (7)4.ICL7107外接显示电路及其输出电路 (8)5.数码管的显示电路 (9)6.小数点驱动电路 (11)五.调试过程、参数测试及结果分析 (11)1.调试过程: (11)2.参数测试: (12)3.结果及其分析: (12)六.设计、安装及调试中的体会 (13)七.对本次课程设计的意见及建议 (13)八.参考文献 (13)九.附录 (14)附录A音响放大器原理图 (15)附录B PCB板图 (16)附录C 音响放大器实物图 (17)附录D 元器件清单 (17)一.设计任务书(设计课题、功能要求)该课程设计的主要任务是要求我们自己利用ICL7107及电阻电容去设计一个三位半的数字电压表,能够实现200mv、2v、20v、200v、1000v五个不同档位的电压测量。
整个过程以下环节:画原理图,PCB布局,电路版的打印及制作,打孔,焊锡元器件,调试,误差分析等。
整个过程要求我们先学会Altium Designer Release 10或者Altium Designer Release 6.9或者protel 99se等软件将原理图画出来及PCB的布局连线;其次制作PCB板时时要求我们掌握如何去打印PCB图,让我们知道了电路板上的铜线是怎么布上去的;然后在锡焊元器件的时候从很大一部分考验了我们锡焊的功底,同时又锻炼了我们的锡焊能力,提高了我们对锡焊能力培养的重视;最后在调试和误差分析的时候,让我知道在做电子类的产品的时候,并不是所有的理论在实践中都管用,让我们知道了理论和实践之间还是有很大的距离,提醒我们实践出真知,只有通过实践我们才可以更好的掌握和理解书本上理论。
数字电压表实验报告
数字电压表的综合设计一、设计题目:基于FPGA的数字电压表设计二、设计任务:1、具有0—2.5v的电压量程;2、通过LED灯显示2进制数字量;3、用FPGA设计制作成数字电压表的专用集成芯片,结合LED数码管构成一个能够实时显示的电压表。
三、总体设计框图:1、总体框图22、分模块设计框图:LED数码管显示模块TL549A/D处理模块3、程序代码:查找表程序代码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity chazhaobiao isport(V:in std_logic_vector(7 downto 0);q:out std_logic_vector(11 downto 0));end entity chazhaobiao;architecture behav of chazhaobiao issignal c30,c74,c117,d0,d1:std_logic;signal HB,LB:std_logic_vector(11 downto 0);begin --A/D值的高4位转换成3位BCD码HB<="001001000000" WHEN V(7 DOWNTO 4)="1111" ELSE --2.40 "001000100100" WHEN V(7 DOWNTO 4)="1110" ELSE --2.24"001000001000" WHEN V(7 DOWNTO 4)="1101" ELSE --2.08"000110010010" WHEN V(7 DOWNTO 4)="1100" ELSE --1.92"000101110110" WHEN V(7 DOWNTO 4)="1011" ELSE --1.76"000101100000" WHEN V(7 DOWNTO 4)="1010" ELSE --1.60"000101000100" WHEN V(7 DOWNTO 4)="1001" ELSE --1.44"000100101000" WHEN V(7 DOWNTO 4)="1000" ELSE --1.28"000100010010" WHEN V(7 DOWNTO 4)="0111" ELSE --1.12"000010010110" WHEN V(7 DOWNTO 4)="0110" ELSE --0.96"000010000000" WHEN V(7 DOWNTO 4)="0101" ELSE --0.80"000001100100" WHEN V(7 DOWNTO 4)="0100" ELSE --0.64"000001001000" WHEN V(7 DOWNTO 4)="0011" ELSE --0.48"000000110010" WHEN V(7 DOWNTO 4)="0010" ELSE --0.32"000000010110" WHEN V(7 DOWNTO 4)="0001" ELSE --0.16"000000000000"; --0.00--A/D值低4位变为3位BCD码LB<="000000010101" WHEN V(3 DOWNTO 0)="1111" ELSE --0.15 "000000010100" WHEN V(3 DOWNTO 0)="1110" ELSE --0.14 "000000010011" WHEN V(3 DOWNTO 0)="1101" ELSE --0.13"000000010010" WHEN V(3 DOWNTO 0)="1100" ELSE --0.12"000000010001" WHEN V(3 DOWNTO 0)="1011" ELSE --0.11"000000010000" WHEN V(3 DOWNTO 0)="1010" ELSE --0.10"000000001001" WHEN V(3 DOWNTO 0)="1001" ELSE --0.09"000000001000" WHEN V(3 DOWNTO 0)="1000" ELSE --0.08"000000000111" WHEN V(3 DOWNTO 0)="0111" ELSE --0.07"000000000110" WHEN V(3 DOWNTO 0)="0110" ELSE --0.06"000000000101" WHEN V(3 DOWNTO 0)="0101" ELSE --0.05"000000000100" WHEN V(3 DOWNTO 0)="0100" ELSE --0.04"000000000011" WHEN V(3 DOWNTO 0)="0011" ELSE --0.03"000000000010" WHEN V(3 DOWNTO 0)="0010" ELSE --0.02"000000000001" WHEN V(3 DOWNTO 0)="0001" ELSE --0.01"000000000000" ; --0.00c30<='1' when HB(3 downto 0)+LB(3 downto 0)>"01001" else'0';d1<='1' when HB(3 downto 0)>="1000" and LB(3 downto 0)>="1000" else '0';c74<='1' when HB(7 downto 4)+LB(7 downto 4)>"01001" else'0';d0<='1' when HB(7 downto 4) + LB(7 downto 4) ="01001" else'0';c117<='1' when HB(11 downto 8)+LB(11 downto 8)>"01001" else '0';q(3 downto 0)<=HB(3 downto 0)+LB(3 downto 0)+"0110" whenc30='1' elseHB(3 downto 0)+LB(3 downto 0)+"0110" whend1='1' elseHB(3 downto 0)+LB(3 downto 0);q(7 downto 4)<=HB(7 downto 4)+LB(7 downto 4)+"0111" whenc74='1' and c30='1' elseHB(7 downto 4)+LB(7 downto 4)+"0110" whenc74='1' and c30='0' elseHB(7 downto 4)+LB(7 downto 4)+"0110" whenc74='0' and c30='1' and d0='1' elseHB(7 downto 4)+LB(7 downto 4)+"0001" whenc74='0' and (c30='1'or d1='1') and d0='0' elseHB(7 downto 4)+LB(7 downto 4);q(11 downto 8)<=HB(11 downto 8)+LB(11 downto 8)+"0111" whenc117='1' and c74='1' elseHB(11 downto 8)+LB(11 downto 8)+"0110" whenc117='1' and c74='0' elseHB(11 downto 8)+LB(11 downto 8)+"0001" whenc117='0' and c74='1' elseHB(11 downto 8)+LB(11 downto 8)+"0001" whenc117='0' and c74='0' and (c30='1'or d1='1') and d0='1' elseHB(11 downto 8)+LB(11 downto 8);end ;译码器程序代码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity yima isport(clk:in std_logic;d:in std_logic_vector(11 downto 0);seg: out std_logic_vector(7 downto 0);sel: out std_logic_vector(2 downto 0));end entity yima;architecture behav of yima issignal wei:std_logic_vector(2 downto 0);signal num:std_logic_vector(3 downto 0);signal a:std_logic_vector(2 downto 0);beginnum<=d(3 downto 0) when a="000" elsed(7 downto 4) when a="001" elsed(11 downto 8) ;seg(7)<='0' when wei="011" else'1';wei<="110" when a="000" else"101" when a="001" else"011";sel<=wei;COM1: process(clk)beginif clk'event and clk='1' thena<=a+1;if a="010" then a<="000";end if;end if;end process COM1;COM2: process(num)begincase num iswhen "0000"=>seg(6 downto 0)<="1000000";--0when "0001"=>seg(6 downto 0)<="1111001";--1when "0010"=>seg(6 downto 0)<="0100100";--2when "0011"=>seg(6 downto 0)<="0110000";--3when "0100"=>seg(6 downto 0)<="0011001";--4when "0101"=>seg(6 downto 0)<="0010010";--5when "0110"=>seg(6 downto 0)<="0000010";--6when "0111"=>seg(6 downto 0)<="1111000";--7when "1000"=>seg(6 downto 0)<="0000000";--8when "1001"=>seg(6 downto 0)<="0010000";--9--when "1010"=>seg(6 downto 0)<="1110111";--when "1011"=>seg(6 downto 0)<="1111100";--when "1100"=>seg(6 downto 0)<="0111001";--when "1101"=>seg(6 downto 0)<="1011110";--when "1110"=>seg(6 downto 0)<="1111001";--when "1111"=>seg(6 downto 0)<="1110001";--when others=>seg(6 downto 0)<="0111111";when others=>seg(6 downto 0)<="1000000";end case;end process COM2;end;电压表顶层程序代码:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity dianyabiao isPort (clk : in std_logic; --50m系统时钟din : in std_logic; --(tlc549)串行数据输出端clk_tlc549 : out std_logic;cs_tlc549 : out std_logic; --tlc549的片选信号输入端shift : out std_logic_vector(3 downto 0);--动态扫描时的位选信号cs_led : out std_logic_vector(1 downto 0);--发光二极管及数码管的片选信号输入端dout_led : out std_logic_vector(7 downto 0));--惧的发光器件的信号输出端end dianyabiao;architecture Behavioral of dianyabiao istype state is (st1,st2);signal current_state : state;type state1 is (st0,st1,st2);signal current_state1 : state1;type state2 is (st0,st1,st2,st3,st4);signal current_state2 : state2;signal reg_datain : std_logic_vector(7 downto 0);signal reg_dout : std_logic_vector(15 downto 0);signal dout : std_logic_vector(4 downto 0);signal reg_din : integer range 0 to 80000;signal clk1m,clk1k,clk100 : std_logic;begin--分频部分process(clk) --产生1MHz的频率variable cnt : integer range 0 to 50;beginif clk'event and clk='1' then cnt:=cnt+1;if cnt<50 thenif cnt<25 then clk1m<='0';else clk1m<='1';end if;else cnt:=0;end if;end if;end process;process(clk1m) --产生1KHz的频率variable cnt : integer range 0 to 1000;beginif clk1m'event and clk1m='1' then cnt:=cnt+1;if cnt<1000 thenif cnt<500 then clk1k<='0';else clk1k<='1';end if;else cnt:=0;end if;end if;end process;process(clk1k) --产生100Hz的频率variable cnt : integer range 0 to 10;beginif clk1k'event and clk1k='1' then cnt:=cnt+1;if cnt<10 thenif cnt<5 then clk100<='0';else clk100<='1';end if;else cnt:=0;end if;end if;end process;--tlc549的控制部分process(clk1k)variable cnt : integer range 0 to 7;variable datain : std_logic_vector(7 downto 0);beginif clk1k'event and clk1k='1' thencase current_state iswhen st1=> --将数据进行串并转换cs_tlc549<='0';datain:=datain(6 downto 0)&din; --将读取的数据向高位移位clk_tlc549<='1';current_state<=st2;when st2=>cs_tlc549<='0';clk_tlc549<='0';current_state<=st1;if cnt<7 then cnt:=cnt+1; --读取8位数据else cnt:=0;reg_din<=conv_integer(datain)*195; --每单位数字量乘以系数=当前电压值;reg_datain<=not(datain);end if;when others=>current_state<=st1;end case;end if;end process;--十进制-BCD码转换;process(clk100)variable reg : integer range 0 to 80000;variable d1,d2,d3,d4 : std_logic_vector(3 downto 0);beginif clk100'event and clk100='1' thencase current_state1 iswhen st0=>reg:=reg_din;d1:="0000";d2:="0000";d3:="0000";d4:="0000";current_state1<=st1;when st1=>if reg>9999 then reg:=reg-10000;d1:=d1+1;elsif reg>999 then reg:=reg-1000;d2:=d2+1;elsif reg>99 then reg:=reg-100;d3:=d3+1;elsif reg>9 then reg:=reg-10;d4:=d4+1;else current_state1<=st2;end if;when st2=>reg_dout<=d1&d2&d3&d4;current_state1<=st0;when others=>current_state1<=st0;end case;end if;end process;--动态扫描控制;process(clk1k)beginif clk1k'event and clk1k='1' thencase current_state2 iswhen st0=> --在发光二极管上显示模数转换后的数字量cs_led<="01"; --熄灭数码管shift<="1111";dout<="11111";current_state2<=st1;when st1=> --在数码管的最高位显示数据cs_led<="10"; --熄灭发光二极管shift<="0111"; --最高位数码管显示dout<='0'®_dout(15 downto 12); --小数点显示,并且将最高位的数据送给译码器current_state2<=st2;when st2=> --在数码管的次高位显示数据cs_led<="10"; --熄灭发光二极管shift<="1011"; --次高位数码管显示dout<='1'®_dout(11 downto 8); --小数点不显示,将次高位的数据送给译码器current_state2<=st3;when st3=> --在数码管的次低位显示数据cs_led<="10"; --熄灭发光二极管shift<="1101"; --次低位数码管显示dout<='1'®_dout(7 downto 4); --小数点不显示,将次低位的数据送给译码器current_state2<=st4;when st4=> --在数码管的最低位显示数据cs_led<="10"; --熄灭发光二极管shift<="1110"; --最低位数码管显示dout<='1'®_dout(3 downto 0); --小数点不显示,将最低位的数据送给译码器current_state2<=st0;when others=>current_state2<=st0;end case;end if;end process;--**将BCD码进行8段译码(包括小数点)**----**dout(4)代表小数点,低电平点亮**--code1: process (dout,reg_datain)begincase dout(3 downto 0) iswhen "0000"=>dout_led<=dout(4)&"0000001";when "0001"=>dout_led<=dout(4)&"1001111";when "0010"=>dout_led<=dout(4)&"0010010";when "0011"=>dout_led<=dout(4)&"0000110";when "0100"=>dout_led<=dout(4)&"1001100";when "0101"=>dout_led<=dout(4)&"0100100";when "0110"=>dout_led<=dout(4)&"0100000";when "0111"=>dout_led<=dout(4)&"0001111";when "1000"=>dout_led<=dout(4)&"0000000";when "1001"=>dout_led<=dout(4)&"0000100";--"DOUT_LED"送给数码管;whenothers=>dout_led<=reg_datain(7)®_datain(0)®_datain(1)®_datain(2)&re g_datain(3)®_datain(4)®_datain(5)®_datain(6);--"DOUT_LED"送给发光二极管;end case;end process;end Behavioral;四、波形仿真图:五、结论:本次实验达到了实验的基本要求,能够通过调节高精密变阻器实现0—2.5v的电压测量及显示。
数字电压表课程设计实验报告
自动化与电气工程学院电子技术课程设计报告题目数字电压表的制作专业班级学号学生指导教师二○一三年七月一、课程设计的目的与意义1.课程设计的主要目的,是通过电子技术综合设计,熟悉一般电子电路综合设计过程、设计要求、完成的工作容和具体的设计方法。
2.同时了解双积分式A/D转换器ICL7107的性能及其引脚功能,熟悉集成电路ICL7107构成直流数字电压表的使用方法,并掌握其在电路中的工作原理。
3.通过设计也有助于复习和巩固以往的模电、数电容,达到灵活应用的目的。
在完成设计后还要将设计的电路进行安、调试以加强学生的动手能力。
在此过过程中培养从事设计工作的整体观念。
4.利用双积分式A/D转换器ICL7107设计一数字电压表,量程为-1.99—+1.99,通过七段数码管显示。
二、电路原理图数字电压表原理图三、课程设计的元器件1.课程设计所使用的元器件清单:2.主要元器件介绍(1)芯片ICL7107:ICL7107的工作原理双积分型A/D转换器ICL7107是一种间接A/D转换器。
它通过对输入模拟电压和参考电压分别进行两次积分,将输入电压平均值变换成与之成正比的时间间隔,然后利用脉冲时间间隔,进而得出相应的数字性输出。
它的原理性框图如图所示,它包括积分器、比较器、计数器,控制逻辑和时钟信号源。
积分器是A/D转换器的心脏,在一个测量周期,积分器先后对输入信号电压和基准电压进行两次积分。
比较器将积分器的输出信号与零电平进行比较,比较的结果作为数字电路的控制信一号。
时钟信号源的标准周期Tc 作为测量时间间隔的标准时间。
它是由部的两个反向器以及外部的RC组成的。
其振荡周期Tc=2RCIn1.5=2.2RC 。
ICL7106A/D转换器原理图计数器对反向积分过程的时钟脉冲进行计数。
控制逻辑包括分频器、译码器、相位驱动器、控制器和锁存器。
分频器用来对时钟脉冲逐渐分频,得到所需的计数脉冲fc和共阳极LED数码管公共电极所需的方波信号fc。
数字电压表实验报告
实验五电压表实验1.设计过程:按照“建立项目文件”--“新建VHDL源文件”--“配置管脚”--“编译下载”--“芯片测试”的顺序。
原理图:1.FPGA的系统时钟来自于小脚丫FPGA开发板配置的24MHz时钟晶振,连接FPGA的C1引脚。
2.实验借助FPGA底板自带的ADC模块,具体信息如下:ADC模块的功能时实现模拟信号转换数字信号,主要包含P1(测试点)、Radj1(10K的可调电位器)和U3(8位串行模数转换器ADC081S)。
在不外接其他信号的情况下,旋转电位计,ADC081S的输入电压在0到3.3V之间变化,通过模数转换实现ADC的采样,原理图连接如图所示:3.实验思路如下:1.根据ADC模块的时序图,完成将ADC模块和FPGA引脚连接起来。
时序图如下:2. 根据程序的框图把完整的程序写出来,显示模块和译码模块利用以前写过的进行例化使用。
以下是程序的框图:VHDL 汇编语言如下: 2.总代码: library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;entity dianyabiao is port( clk: in std_logic;--定义输入和输出 sda: in std_logic; sclk: buffer std_logic; cs: out std_logic; sdata: out std_logic; sck: out std_logic; rck: out std_logic );end dianyabiao;architecture one of dianyabiao is component led_573 --例化port( rst: in std_logic; clk_t_in : in std_logic; sdata: out std_logic; H: in std_logic; ledcode1,ledcode2,ledcode3,ledcode4: in std_logic_vector(6 downto 0); dot: in std_logic_vector(3 downto 0);sda sck cssck: out std_logic;rck: out std_logic);end component;component seg7coderport(data_in: in integer range 0 to 15;seg7_out: out std_logic_vector(6 downto 0));end component;signal ad_phase: integer range 0 to 19;signal clk_t_in: std_logic;signal ad_clk: std_logic;signal ad_out:std_logic_vector(7 downto 0);signal ad:std_logic_vector(7 downto 0);signal data_in1:integer range 0 to 15;signal data_in2:integer range 0 to 15;signal seg1,seg2: std_logic_vector(6 downto 0); --七段码beginu1:seg7coderport map(data_in => data_in1,seg7_out => seg1);u2:seg7coderport map(data_in => data_in2,seg7_out => seg2);u3:led_573port map(rst=>'1',clk_t_in => clk,H => '1',dot => "0000",ledcode1 => seg1,ledcode2 => seg2,ledcode3 =>"1111110",ledcode4 =>"1111110",sdata => sdata,sck => sck,rck => rck);--得到分频时钟,50-20000khz的分频process(clk)variable divcnt: integer range 0 to 1000;beginif clk'event and clk='1' thenif divcnt=1000 thendivcnt:=0;clk_t_in<=not clk_t_in;elsedivcnt:=divcnt+1;clk_t_in<=clk_t_in;end if;end if;end process;--ad模快process(clk_t_in)-- ad_clk<=clk_t_in;beginif clk_t_in'event and clk_t_in = '1' thensclk<=not sclk;if sclk='1' thenif ad_phase = 19 thenad_phase<=0;elsead_phase<=ad_phase+1;end if;end if;if sclk='0' and ad_phase>16 then --保证cs的值cs<='1';elsecs<='0';end if;if ad_phase=3 and sclk='0' then --值的输出ad(7)<=sda;end if;if ad_phase=4 and sclk='0' thenad(6)<=sda;end if;if ad_phase=5 and sclk='0' thenad(5)<=sda;end if;if ad_phase=6 and sclk='0' thenad(4)<=sda;end if;if ad_phase=7 and sclk='0' thenad(3)<=sda;end if;if ad_phase=8 and sclk='0' thenad(2)<=sda;end if;if ad_phase=9 and sclk='0' thenad(1)<=sda;end if;if ad_phase=10 and sclk='0' thenad(0)<=sda;end if;if ad_phase=11 and sclk='0' thenad_out<=ad;end if;end if;end process;process(ad_out) --完成将ad_out的八位输出转化成两位16进制的数begincase ad_out(3 downto 0) is--when "0000"=>data_in1<=0;when "0001"=>data_in1<=1;when "0010"=>data_in1<=2;when "0011"=>data_in1<=3;when "0100"=>data_in1<=4;when "0101"=>data_in1<=5;when "0110"=>data_in1<=6;when "0111"=>data_in1<=7; when "1000"=>data_in1<=8; when "1001"=>data_in1<=9; when "1010"=>data_in1<=10; when "1011"=>data_in1<=11; when "1100"=>data_in1<=12; when "1101"=>data_in1<=13; when "1110"=>data_in1<=14; when "1111"=>data_in1<=15; end case;case ad_out(7 downto 4) is when "0000"=>data_in2<=0; when "0001"=>data_in2<=1; when "0010"=>data_in2<=2; when "0011"=>data_in2<=3; when "0100"=>data_in2<=4; when "0101"=>data_in2<=5; when "0110"=>data_in2<=6; when "0111"=>data_in2<=7; when "1000"=>data_in2<=8; when "1001"=>data_in2<=9; when "1010"=>data_in2<=10; when "1011"=>data_in2<=11; when "1100"=>data_in2<=12; when "1101"=>data_in2<=13; when "1110"=>data_in2<=14; when "1111"=>data_in2<=15; end case;end process;end architecture;3.管脚分配:4.实验现象:旋转电压旋钮,电压从00变化到FF,现象如下面所示:。
数字电压表课程设计报告
数字电压表课程设计报告一、实验目的本实验旨在使学生掌握数字电压表的基本原理、构成和使用方法,通过实践锻炼学生的动手操作能力和实际问题解决能力。
二、实验器材数字电压表、直流稳压电源、电阻箱、待测电路板等。
三、实验内容1.数字电压表的基本原理、构成和使用方法的介绍;2.根据实验要求搭建待测电路;3.调节直流稳压电源输出电压为所需值;4.连接数字电压表到待测电路上并测量电压值;5.对测得的电压值进行分析、处理和讨论。
四、实验流程及步骤1.实验器材准备:数字电压表、直流稳压电源、电阻箱、待测电路板等器材;2.理解数字电压表的基本原理与构成,并熟练掌握使用方法;3.根据实验所需,找到相应的电路板,搭建待测电路,并连接好直流稳压电源;4.调节直流稳压电源的输出电压为所需值,并连接数字电压表到待测电路上;5.测量待测电路的电压值,并在数字电压表上进行记录;6.对测得的电压值进行分析、处理和讨论,并得出实验结论。
五、实验注意事项1.在操作实验器材时,务必严格按照使用说明书和教师的要求进行操作;2.实验器材保持完好无损,任何破损的器材均不能使用;3.实验前需仔细了解实验内容,规划实验流程;4.在操作实验时,要认真记录实验数据,并进行及时分析处理;5.实验结束后,将实验器材妥善归位,保持实验室整洁干净。
六、实验结果及结论通过实验,我们得到了待测电路的电压值,并对其进行了分析、处理和讨论。
根据实验结果和所给数据,我们得出了结论:数字电压表可准确测量待测电路的电压值,为后续研究和实践提供重要依据。
七、实验心得体会通过本次实验,我对数字电压表的原理及其使用方法有了更深入的了解,并通过实践掌握了一定的动手操作能力和实际问题解决能力。
同时,我认识到在实验中必须注重细节和注意安全,仔细完成每一个实验步骤,及时记录和分析实验数据,才能使实验结果更加准确和可靠。
单片机数字电压表设计报告
《单片机原理与接口技术》课程设计报告姓名梁家余学号 0314院系自机学院班级电气三班指导教师黄钺冯维杰王玮2012 年 06月目录4) LED显示器与单片机接口设计 (9)9.程序设计 (11)1)程序设计总方案 (11)2)系统子程序设计 (11)(1)初始化程序 (11)10.仿真 (12)1)软件调试 (12)11.显示结果及误差分析 (13)二、总结 (14)三、参考文献 (15)四、附录 (15)一、单片机数字电压表设计1.设计任务基于MCS-51系列单片机AT89C51,设计一个能测量0~5V直流电压的数字电压表 2.设计要求1)选用A/D转换器ADC0808,测定0——+5V范围内的直流电压值。
2)采集的数据送四位数码管实时显示。
3)@实现多路电压循环测量和循环显示。
4)@实现0——500mA电流的测量和显示。
5)实现功率的测量。
3. 设计思路1)根据设计要求,选择AT89C51单片机为核心控制器件。
2)A/D转换采用ADC0808实现,与单片机的接口为P1口和P2口的高四位引脚。
3)电压显示采用4位一体的LED数码管。
4)LED数码的段码输入,由并行端口P0产生:位码输入,用并行端口P2低四位4) LED显示器与单片机接口设计 (9)9.程序设计 (11)1)程序设计总方案 (11)2)系统子程序设计 (11)(1)初始化程序 (11)10.仿真 (12)1)软件调试 (12)11.显示结果及误差分析 (13)二、总结 (14)三、参考文献 (15)四、附录 (15)产生。
4.硬件电路设计1)转换过程如下:开始时,寄存器各位清零,转换时,先将最高位置1,把数据送入A/D转换器转换,转换结果与输入的模拟量比较,如果转换的模拟量比输入的模拟量小,则1保留,如果转换的模拟量比输入的模拟量大,则1不保留,然后从第二位依次重复上述过程直至最低位,最后寄存器中的内容就是输入模拟量对应的二进制数字量[5]。
单片机研究报告——数字电压表
数字电压表单片机课程设计报告姓名:刘俊草班级:10级电气一班学号:2010061189指导教师:杨志帮成绩:日期:2012年6月14日数字电压表电路设计报告一、题目及设计要求采用51系列单片机和ADC 设计一个数字电压表,输入为0~5V 线性模拟信号,输出通过LED 显示,要求显示两位小数.b5E2R 。
二、主要技术指标1、数字芯片A/D 转换技术2、单片机控制地数码管显示技术3、单片机地数据处理技术三、方案论证及选择主要设计方框图如下:1、主控芯片方案1:选用专用转化芯片INC7107实现电压地测量和实现,用四位数码管显示出最后地转换电压结果.缺点是京都比较低,内部电压转换和控制部分不可控制.优点是价格低廉.p1Ean 。
方案2:选用单片机AT89C51和A/D 转换芯片ADC0809实现电压地转换和控制,用四位数码管显示出最后地转换电压结果.缺点是价格稍贵;优点是转换京都高,且转换地过程和控制、显示部分可以控制.DXDiT 。
基于课程设计地要求和实验室能提供地芯片,我选用了:方案2. 2、显示部分方案1:选用4个单体地共阴极数码管.优点是价格比较便宜;缺点是焊接时比较麻烦,容易出错.方案2:选用一个四联地共阴极数码管,外加四个三极管驱动.这个电路几乎没有缺点;优点是便于控制,价格低廉,焊接简单.RTCrp 。
基于课程设计地要求和实验室所能提供地仪器,我选用了:方案2.四、电路设计原理电压采集模数转换单片机处理数码管显示模拟电压经过档位切换到不同地分压电路筛减后,经隔离干扰送到A/D 转换器进行A/D 转换.然后送到单片机中进行数据处理.处理后地数据送到LED 中显示.同时通过串行通讯与上位通信.硬件电路及软件程序.而硬件电路又大体可分为A/D 转换电路、LED 显示电路,各部分电路地设计及原理将会在硬件电路设计部分详细介绍;程序地设计使用汇编语言编程,利用Keil 和PROTEUS 软件对其编译和仿真.5PCzV 。
数字电压表实验报告
数字电压表实验报告《数字电压表实验报告》实验目的:通过使用数字电压表,掌握其基本使用方法并了解电压测量的原理。
实验仪器:数字电压表、直流电源、导线等。
实验原理:数字电压表是一种用于测量电压的仪器,它通过将待测电压转换为数字信号并显示在屏幕上,从而实现对电压的测量。
其测量原理是利用电压测量电路将待测电压转换为相应的电流信号,再通过内部的模数转换器将电流信号转换为数字信号,最后通过显示装置显示出来。
实验步骤:1. 连接实验仪器:首先将数字电压表的正负极与待测电路的正负极相连,并确保连接正确无误。
2. 调整量程:根据待测电压的大小,选择合适的量程,并将数字电压表的旋钮调整到相应的量程档位。
3. 测量电压:打开待测电路的电源,观察数字电压表的显示数值,并记录下来。
4. 关闭电源:待测电压测量完成后,关闭待测电路的电源,并拔掉连接线。
实验结果:根据实验结果,我们可以得出待测电路的电压为多少,并且通过对比不同量程下的测量结果,了解数字电压表的量程选择原则。
实验结论:通过本次实验,我们掌握了数字电压表的基本使用方法,并了解了电压测量的原理。
同时,我们也了解了数字电压表的量程选择原则,并且通过实验结果验证了其准确性。
实验中的注意事项:在进行实验时,要注意连接线路的正确性,避免接错极性导致仪器损坏。
同时,在选择量程时要根据待测电压的大小进行合理选择,避免选择错误导致测量不准确。
总结:通过本次实验,我们对数字电压表的使用方法和原理有了更深入的了解,这对我们今后的实验操作和电路调试都有着重要的指导意义。
希望通过不断的实践和学习,我们能够更加熟练地掌握数字电压表的使用技巧,并且在工程实践中能够准确地测量电压并进行相应的调试。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《单片机课程设计》设计报告设计题目:数字电压表班级学号: 5081016姓名:刘正设计时间: 2010-12-30备注:目录第1章绪论 (3)第2章设计任务与要求设计任务 (4)设计要求 (4)第3章方案设计方法选择 (5)方案设计 (5)第4章硬件设计模块设计电路 (6)4.1.1 电路时钟 (6)4.1.2 控制电路 (7)逐次逼近式A/D转换模块设计 (7)4.2.1 ADC0808简介 (7)4.2.2 ADC0808内部结构图 (8)4.2.3 A/D转换电路设计 (9)8255端口扩展模块 (9)LED显示模块 (10)Protues仿真电路设计4.5.1 电路仿真图 (10)4.5.2 电路工作原理 (11)第5章系统软件设计系统主程序设计 (12)系统源程序说明 (13)第6章调试与测试结果分析 (15)第7章结论 (16)附录1 源程序代码 (17)附录2 设计原理图 (18)第1章绪论数字电压表的基本工作原理是利用A/D转换电路将待测的模拟信号转换成数字信号,通过相应换算后将测试结果以数字形式显示出来的一种电压表。
较之于一般的模拟电压表,数字电压表具有精度高、测量准确、读数直观、使用方便等优点。
电压表的数字化测量,关键在于如何把随时连续变化的模拟量转化成数字量,完成这种转换的电路叫模数转换器(A/D)。
数字电压表的核心部件就是A/D 转换器,由于各种不同的A/D转换原理构成了各种不同类型的数字电压表。
一般说来,A/D转换的方式可分为两类:积分式和逐次逼近式。
积分式A/D转换器是先用积分器将输入的模拟电压转换成时间或频率,再将其数字化。
根据转化的中间量不同,它又分为U-T(电压-时间)式和U-F(电压-频率)式两种。
逐次逼近式A/D转换器分为比较式和斜坡电压式,根据不同的工作原理,比较式又分为逐次比较式及零平衡式等。
斜坡电压式又分为线性斜坡式和阶梯斜坡式两种。
在高精度数字电压表中,常采用由积分式和比较式相结合起来的复合式A/D 转换器。
本设计以AT89C52单片机为核心,以逐次比较型A/D转换器ADC0809、数码管显示器为主体,构造了一款简易的数字电压表,能够测量1路0~5V直流电压,最小分辨率。
第2章设计任务与要求设计任务利用ADC0809, AT89C52单片机及显示电路,设计一个数字电压表,能够测量0—5V之间的直流电压值,能够实时检测显示。
设计要求测量最小分辨率为,能够实时检测显示。
3.1方法设计设计方法主要采用ADC0809+AT89C52+8255+液晶显示实现电路,通过程序设计,将被测信号由ADC0809模拟输入1端口输入,经过转换将数据采集到单片机,经过数据转换,将转换数据经8255扩展口PA,PB口送出,其中PA口输出位选码,PB口输出相应的字形码,在5个共阳数码管扫描显示。
方案设计①经过以上方法设计,采用如图3-1所示方案逻辑图。
图3-1方案逻辑图图3-2设计方案原理框图②设计模块说明:本设计方案主要有四大模块:1、AT89C52单片机控制模块2、ADC0808数模转换模块3、8255端口扩展模块4、LED显示模块由上可知数字电压表主要分为四个模块:AT89C52单片机控制模块,ADC0808数模转换模块、8255端口扩展模块、LED显示模块单片机控制模块设计单片机控制模块的作用是为控制各单元电路的运行并完成数据的换算或处理,主要由单片机、时钟电路组成。
4.1.1 时钟电路单片机工作的时间基准是由时钟电路提供的,在单片机的XTAL1和XYAL2两个管脚接一只晶振及两只电容就构成了单片机的时钟电路,电路中电容器和对振荡频率有微调作用,通常取(30±10)pF石英晶体选择6MHz或12MHz 都可以。
时钟电路如所示。
图4-1时钟晶振4.1.2 单片机控制模块电路图图4-2 单片机控制电路逐次逼近式A/D转换模块设计4.2.1 ADC0808简介1.ADC0808引脚功能IN0~IN7:8路模拟量输入。
A、B、C:3位地址输入,2个地址输入端的不同组合选择八路模拟量输入。
ALE:地址锁存启动信号,在ALE的上升沿,将A、B、C上的通道地址锁存到内部的地址锁存器。
D0~D7:八位数据输出线,A/D转换结果由这8根线传送给单片机。
OE:允许输出信号。
当OE=1时,即为高电平,允许输出锁存器输出数据。
START:启动信号输入端,START为正脉冲,其上升沿清除ADC0808的内部的各寄存器,其下降沿启动A/D开始转换。
A/D转换已完成。
图4.2.2 ADC0808内部结构逐次逼近型A/D转换器ADC0808由八路模拟开关、地址锁存与译码器、比较器、D/A转换器、寄存器、控制电路和三态输出锁存器等组成。
4.2.3 A/D转换电路设计图4.2.3ADC0808转换电路设计4.38255端口扩展模块8255芯片主要用于I/O端口的扩展,在此主要将PA、PB口用做输出端口,接数码管的位选和段选。
电路设计图如下:图4.3.1 8255扩展端口电路4.4LED显示模块主要用于显示数据,为共阴数码管,与8255的接线图如下:图4.3.1 显示电路Protues仿真电路设计4.5.1 电路仿真图图 Protues仿真电路原理图4.5.2 电路工作原理Dj-52EHA/D转换由集成电路0808完成,0808具有8路模拟输入端口,地址线(23~25脚)可决定对哪一路模拟输入作A/D转换。
22脚为地址锁存控制,当输入为高电平时,对地址信号进行锁存。
6脚为测试控制,当输入一个2μS宽高电平脉冲时,就开始A/D转换。
7脚为A/D转换结束标志,当A/D转换结束时,7脚输出高电平。
9脚为A/D转换数据输出允许控制,当OE脚为高电平时,A/D转换数据从端口输出,10脚为0808的时钟输入端,利用393分频芯片将8MHZ脉冲进行分频得到1MHz时钟。
8255的PA、PB端口作为五位LED数码管显示控制。
第5章系统软件设计系统主程序设计①初始化程序初始化程序,主要为对8255写控制字,启动A/D转换芯片。
②主程序初始化之后,系统等待A/D转换结束,结束之后,将一通道的A/D转换值送入单片机,之后进行相应的数据处理,调用显示子程序在数码管上显示,主程序在调用显示子程序和测试子程序之间循环,程序流程图见图5-1图5-1 程序流程图③显示子程序显示子程序采用动态扫描法实现五位数码管的数值显示(四位有效值,一位小数点)。
测量所得的A/D转换数据赋值给data1变量,经过相应的运算处理,分离出个位十分位,百分位,千分位的有效值,通过查询显示表,显示相应的值,通过调节频率,实现动态扫描。
④模/数转换测量子程序模/数转换测量子程序,主要为控制通道1来采集电压值,启动转换,并将对应的数值送入单片机。
5.2 系统源程序编写a.程序的相关头文件及变量定义#include<>#include<>#define uchar unsigned char#define uint unsigned intuchar ge,shifen,baifen,qianfen;double sum; 时子程序void delayms(unsigned char ms){uchar i;while(--ms!=0)for(i = 0; i < 50; i++);}c.显示子程序void changs(){sum=data1*256); 据采集子程序void getdata(){data1=abc;}f.主函数void main(){sys();while(1){ getdata();changs();abc=0;}}第6章调试与测试结果分析(1)实验系统连线图8MHz激励源经393分频器接到ADC0809的CLOCK端;ADC0809的0通道IN0接到模拟信号输出端;I/O接口FF80H通过或非门单元74LS02控制ADC0809的启动。
(2)程序调试采用程序编译软件KEIL VESION 2和DJ-52EH 单片机综合开发实验仪联机在线调试。
(3)实验结果与分析实验结果:试验仪上的5个数码管显示当前电压值,并能实现动态显示;分析:第一个数码管显示电压值的整数部分;第二个数码管显示小数点;第三到五数码管显示电压值得小数部分。
仿真测试表明,系统性能良好。
实际调试时,测量读数稳定易读、更新速度合理,随着调节电位器数字电压表能随时显示测量电压。
直流电压测量范围为0~,最小分辨率为(5/255),满足任务书指标要求。
但是,该系统也存在一定程度的不足,相关分析如下:(1)输入电压易发生干扰不稳定,且驱动能力可能存在不足,需在被测信号的输入端加上一部分驱动电路,比如将量程转换电路改成带放大能力的自动量程转换电路,将幅值较小的信号经适当放大后再测量,可显著提高精度;(2)输出量可用平均值算法来改善,使测量准确度更高。
(3)若能将测量的电压值实时保存,使用时将更方便。
(4)ADC0809可实现对8个通道的输入信号轮流转换,本设计仅仅使用了其中一个通道,造成了较大的资源浪费。
若能对电路稍加改进,实现对多路信号的轮流测量并自动保存相应结果,其应用价值将会更大。
(5)由于ADC0809为8位处理器,当输入电压为时,输出数据值为255(FFH),因此单片机最大的数值分辨率为(5/255)。
这就决定了该电压表的最大分辨率(精度)只能达到。
测试时电压数值的变化一般以的电压幅度变化,如要获得更高的精度要求,应采用12位、13位的A/D转换器。
(6)简易电压表测得的值基本上均比标准值偏大~。
这可以通过校正0809的基准电压来解决,因为该电压表设计时直接用7805的供电电源作为基准电压,电压可能有偏差。
另外可以用软件编程来校正测量值。
第7章结论附录1源程序程序:#include<>#include<>#define uchar unsigned char#define uint unsigned intuchar ge,shifen,baifen,qianfen;double sum; //定义相关变量uchar zhengshu;uint xiaoshu;uchar xdata wei _at_ 0xff20; //Pa port on 8255 //定义8255端口指针uchar xdata duan _at_ 0xff21;//Pb port on 8255uchar xdata ctrl _at_ 0xff23; //control port on 8255uchar xdata abc _at_ 0xff80; //定义A/D端口指针unsigned char data1;uchar code table[]={0xc0,/*0*/0xf9,/*1*/0xa4,/*2*/0xb0,/*3*/0x99,/*4*/0x92,/*5*/0x82,/*6*/0xf8,/*7*/0x80,/*8*/0x90,/*9*/0x7f,/*小数点*/}; //定义数码管显示数值void delayms(unsigned char ms){uchar i;while(--ms!=0)for(i = 0; i < 50; i++);}void changs(){sum=data1*256); //将二进制数转换为电压值zhengshu=(unsigned int)sum; //分离整数变量xiaoshu=(sum-zhengshu)*1000; //提取小数部分的3位有效值ge=zhengshu;shifen=xiaoshu/100; //分离十分位的小数值baifen=xiaoshu/10%10; //分离百分位的小数值qianfen=xiaoshu%10; //千分位wei=0xdf; //打开位选,选第一位数码管duan=table[ge]; //打开段选,显示整数部分的电压值 delayms(10);wei=0xef;duan=table[10];delayms(10);wei=0xf7;// 1111 1101duan=table[shifen];delayms(10);wei=0xfb; //1111 1011duan=table[baifen] ;delayms(10);wei=0xfd;duan=table[qianfen];}void sys(){abc=0;ctrl=0x80;delayms(3);}void getdata(){data1=abc;}void main(){sys();while(1){ getdata();changs();abc=0;}}附录2。