课程设计的全部内容打包下载:
课程设计—数字电压表.rar
(528.24 KB, 下载次数: 151)
一、设计任务及要求: 设计任务: 设计一个数字电压表。 要 求: 1.0-5V输入; 2.用4个数码管显示;有小数点的显示;显示小数后三位数,如0.001;只显示最后结果,不要显示中间结果。 3. 要求精度达到1%,超出量程警告提示。 4. 可以多档切换。
指导教师签名:
2017年1月3日
| 二、指导教师评语:
指导教师签名:
2017年1月 3 日
| |
目录
1 设计目的 2 设计思路 3 设计过程 3.1方案论证 3.2电路设计 3.2.1 硬件部分 (1)单片机控制模块设计 (2)AD转换模块设计 (3)量程自动转换模块 (4)LED显示模块 (5)报警模块 3.2.2 软件部分 (1)主程序设计 (2)A/D转换程序设计 4电路仿真与结果分析 4.1电路仿真 4.2结果分析 5设计体会 参考文献 附件 完整电路 源代码
数字电压表的设计 1 设计目的(1)熟悉数字电压表的基本工作原理和与一般的模拟电压表相比,数字电压表具有的优点。 (2)掌握A/D 的使用和单片机整个开发过程。 (3)了解积分式和逐次逼近式AD转换器各自的特点。 2 设计思路利用AD转换器对输入电压进行采集并传输给单片机,让其进行数据的处理。通过单片机与数码管的连接,最终显示在数码管上。并用软件编程的方式检测输入信号的大小来实现数字电压表的量程自动转换功能。 3 设计过程第一部分:单片机控制模块。控制中心微控制器采用的是AT89C52 单片机,其对于多量程电路的测量有着不可比拟的性价比,而且操作简单,特别是与ADC0808 构成的电压采集电路,反映时间短,能够有效地将模拟电压数据在LED 上显示出来。 第二部分:AD转换模块。A/D 转换电路用来将量程转换电路输入的直流电压信号转成数字电压信号,以供主控制器进行数据处理。采用一片ADC0808,它是采样分辨率为8 位的、以逐次逼近原理进行模—数转换的器件。 第三部分:量程自动转换模块。通过对输入电压的测量,利用软件编程的方式来实现量程的自动转换。 第四部分;LED显示模块。数码管显示电路以显示4位的方式来显示数字电压表测量的直流电压值。 第五部分:报警模块。当输入的直流电压超过最大量程时,数字电压表报警以示警告。 3.1方案论证利用AD转换器对输入电压进行采集并传输给单片机,让其进行数据的处理。通过单片机与数码管的连接,将输入的直流电压显示在数码管上。利用软件编程的方式检测输入信号的大小来实现数字电压表的量程自动转换功能。在允许的误差范围内实现了数字电压表的设计要求,完成了数字电压表的全部设计。 3.2电路设计3.2.1 硬件部分 (1) 单片机控制模块设计 单片机控制模块的作用是为控制各单元电路的运行并完成数据的换算或处理,主要由单片机、时钟电路、复位电路组成。 ① 时钟电路 单片机工作的时间基准是由时钟电路提供的,在单片机的XTAL1和XYAL2两个管脚接一只晶振及两只电容就构成了单片机的时钟电路,电路中电容器C1和C2对振荡频率有微调作用,通常取(30±10pF)石英晶体选择11.0592MHz。时钟电路如图1所示。 图1 时钟电路 ② 复位电路 单片机的RST管脚为主机提供了一个外部复位信号输入口。复位信号是高电平有效,高电平有效的持续时间为2个机器周期以上。单片机的复位方式为上电复位方式。复位电路如图2所示。 图2 复位电路 (2)AD转换模块设计 逐次逼近型A/D转换器ADC0808属于直接型A/D转换器,它能把输入的模拟电压直接转换为输出的数字代码,而不需要经过中间变量。 ① ADC0808简介 ADC0808精度为8位,CMOS器件,不仅包括一个8位的逐次逼近型的ADC部分,而且还提供一个8通道的模拟多路开关和通道寻址逻辑,因而有理由把它作为简单的“数据采集系统”。利用它可直接输入8个单端的模拟信号分时进行A/D转换,在多点巡回检测和过程控制、运动控制中应用十分广泛。 ②外部引脚图及引脚功能 ADC0808的外部引脚如图3所示。
图3 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开始转换。 EOC:转换完成信号,当EOC上升为高电平时,表明内部A/D转换已完成。 ③AD转换模块设计 集成摸数转换芯片ADC0808实现的A/D转换电路如图4所示,被测信号由ADC0808模拟输入端输入,完成A/D转换后送入单片机,经相应处理后送出显示。 图4 AD转换电路 (3)量程自动转换模块 利用软件编程的方式,通过对输入电压判断其大小来确定电压表的当前量程,进而实现电压表的量程自动切换。量程自动转换模块如图5所示。量程分为3个档:当s1亮时为1V-5V;当s2亮时为0.1—1V;当s3亮时为0—0.1V。 图5 量程自动转换模块 (4)LED显示模块 LED显示模块用来显示数字电压表测量的直流电压值。LED显示模块如图6所示。 图6 LED显示模块 (5) 报警模块 利用一个电压比较器和一个蜂鸣器的连接来实现报警模块的设计。当输入的直流电压大于最大量程(5V)时,蜂鸣器响起即报警。报警模块如图7所示。 图7 报警模块 3.2.2 软件部分 (1)主程序设计
主程序主要负责初始化工作:设置定时器、寄存器的初值,启动A/D转换,读取转换结果,处理量程转换响应,控制液晶实时显示等,主流程图如图8所示。 图8 主程序流程图 (2)A/D转换程序设计 A/D转换程序的功能是采集数据,在整个系统设计中占有很高的地位。当系统设置好后,单片机扫描转换结束管脚P3^2的输入电平状态,当输入为高电平则转换完成,将转换的数值转换并显示输出。若输入为低电平,则继续扫描。AD转换程序流程图如图9所示。
图9 A/D转换程序流程图 程序如下: OE=0; ST=0; ST=1; ST=0;//启动转换 while(EOC==0); //等待转换结果 OE=1; //允许输出 sum=data; 4电路仿真与结果分析电路的仿真和结果分析 4.1电路仿真输入电压为0.8V时的仿真电路如图10所示 图10 输入电压为0.8V时的仿真电路 4.2结果分析(1)当输入直流电压(input)大于5V时,电压表只能显示5.000V的电压,此时s1亮。电压大于5V时数码管显示如图11所示。 图11 电压大于5V时数码管显示
(2)当输入直流电压(input)在1V~5V时,s1亮。在误差允许的范围内输出相对精确的电压值。电压在1V~5V时数码管显示如图12所示。 图12电压在1V~5V时数码管显示 (3) 当输入直流电压(input)在0.1V~1V时,s2亮。在误差允许的范围内输出相对精确的电压值。电压在0.1V~1V时数码管显示如图13所示。 图13 电压在0.1V~1V时数码管显示 (4) 当输入直流电压(input)在0V~0.1V时,s3亮。在误差允许的范围内输出相对精确的电压值。电压在0V~0.1V时数码管显示如图14所示。
图14 电压在0V~0.1V时数码管显示
5设计体会通过这次对数字电压表的设计与制作,我们了解了单片机整个开发过程,熟知和掌握了AT89C51,ADC0809,CD4066,运放等芯片的作用及其使用。虽然在制作过程中出现了问题,但是通过不断实践和查找资料,积极地思考问题、发现问题,最终解决了。无论从硬件还是软件方面,都提高了我们的动手和动脑能力。整个过程中,不但扩展了我们的知识面,而且也不断在挖掘我们的潜力,为我们今后的学习奠定扎实的基础。也许在这几天的制作中,我学的知识比课本上的还多、还难。在这次制作中,我更加看到了我对课本知识不熟,思想不够开阔等不足的地方,希望在以后的学习与实践中多看课本,多思考来弥补自己的不足。 参考文献(至少5篇)[1] 徐爱钧.智能化测量控制仪表原理 [M].北京航空航天大学出版社.2004 [2] 吴金戌,沈庆阳,郭庭吉.8051单片机实践与应用[M].北京清华大学出版社.2002 [3] 张毅刚,彭喜元,彭宇.《单片机原理及应用》第二版[M].北京高等教育出版社.2010.5 [4] 汪德彪.MCS-51单片机原理及接口技术[M]. 第1版.北京电子工业出版社.2003 [5] 沙占友.新型数字电压表原理与应用[M].北京机械工业出版社.2006 附件完整电路
源代码:
- #include
- #define uchar unsigned char
- #define uint unsigned int
- #define data P1
- sbit ST=P3^0;
- sbit OE=P3^1;
- sbit EOC=P3^2;
- sbit CLK=P3^3;
- sbit S1=P3^4;
- sbit S2=P3^5;
- sbit S3=P3^6;
- ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- ucharcodetable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xdf} ;
- uint sum;
- uchar getdata;
- uchar num[4];
- void delay(uint ms)
- {
- uchar i;
- while(ms--)
- for(i=0;i<120;i++);
- }
-
- void Display_Result()
- {
- P2=0xfe;//千位
- P0=table1[num[3]];
- delay(5);
- P2=0xfd;//百位
- P0=table[num[2]];
- delay(5);
- P2=0xfb;//十位
- P0=table[num[1]];
- delay(5);
- P2=0xf7;//个位
- P0=table[num[0]];
- delay(5);
- }
- void init()
- {
- EA=1;
- TMOD=0x01;
- TH0=(65536-150)/256;
- TL0=(65536-150)%256;
- ET0=1;
- TR0=1;
- S1=0;
- S2=0;
- S3=1;
- }
-
- void main()
- {
- init();
- while(1)
- {
- OE=0;
- ST=0;
- ST=1;
- ST=0;//启动转换
- while(EOC==0); //等待转换结果
- OE=1; //允许输出
- sum=data;
- if(data<5)
- {
- S1=0;
- S2=0;
- S3=1;
- sum=sum*1.0/255*5000;
- num[0]=sum%10;
- num[1]=sum/10;
- num[2]=sum/100;
- num[3]=sum/1000;
- Display_Result();//显示A/D转换结果
- }
- else if (data<51)
- {
- S1=0;
- S2=1;
- S3=0;
- sum=sum*1.0/255*5000;
- num[0]=sum%10;
- num[1]=sum/10%10;
- num[2]=sum/100;
- num[3]=sum/1000;
- Display_Result();//显示A/D转换结果
- }
- else if (data<256)
- {
- S1=1;
- S2=0;
- S3=0;
- sum=sum*1.0/255*5000;
- num[0]=sum%10;
- num[1]=sum/10%10;
- num[2]=sum/100%10;
- num[3]=sum/1000;
- Display_Result();//显示A/D转换结果
- }
- }
- }
- void Timer0() interrupt 1
- {
- TH0=(65536-150)/256;
- TL0=(65536-150)%256;
- CLK=~CLK;//ADC0809时钟信号
- }
复制代码
|