单片机实训报告简易电压表文档格式.docx
《单片机实训报告简易电压表文档格式.docx》由会员分享,可在线阅读,更多相关《单片机实训报告简易电压表文档格式.docx(15页珍藏版)》请在冰点文库上搜索。
2系统总体方案及硬件设计
2.1课程设计系统环境...........................................3
2.2设计原理...................................................3
2.3设计方框图.................................................4
2.4硬件电路的设计.............................................4
2.5电压显示电路...............................................7
3软件设计
3.1主程序设计..................................................7
3.2ADC0809转换模块设计............................................8
4keil软件仿真
4.1最小系统仿真...............................................9
4.2数模显示电路仿真..............................................9
5课程设计体会.........................................................10
参考文献..............................................................11
附1:
源程序代码
附2:
系统原理图
1.概述
1.1课程设计的目的和意义:
本次课程设计,让我学习和巩固了使用单片机的定时中断、基本的常用的寄存器的使用方法,还有就是学习常用的外围硬件使用、电路原理图设计、PCB设计等等。
使我对已学过的基础知识有了更深入的理解,独立思考、独立工作以及应用所学基本理化分析和解决实际问题的能力有了很大的提高。
1.2课程设计的任务:
数字电压表(DigitalVoltmeter)简称DVM,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。
传统的指针式电压表功能单一、精度低,不能满足数字化时代的需求,采用单片机的数字电压表,由精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC进行实时通信。
目前,由各种单片A/D转换器构成的数字电压表,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,示出强大的生命力。
与此同时,由DVM扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到崭新水平。
2.系统原理及基本框图
2.1课程设计系统环境
(1)proteus仿真软件
(2)Keilc51软件调试环境及调试程序
2.2设计原理
单片机AT89C52和ADC0832设计一个数字电压表,能够测量0-5V之间的直流电压值,两位数码显示。
重点负责单片机AT89C52硬件部分的功能及应用。
AT89S52是一个低功耗,高性能CMOS8位单片机,片内含8kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89S52具有如下特点:
40个引脚,8kBytesFlash片内程序存储器,256bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
单片机
A/D转换器ADC0809
电压显示器
模拟电压输入
量程控制电路
系统总框图
2.3设计方框图
2.4硬件电路的设计
单片机采用MCS-51系列单片机。
由ATMEL公司生产的AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
在单芯片上,拥有灵巧的8位CPU和在线系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
AT89S52单片机
单片机选用的是ATMEL公司新推出的AT89S52,如图3.2.1.1所示。
该芯片具有低功耗、高性能的特点,是采用CMOS工艺的8位单片机,与AT89C51完全兼容。
AT89S52还有以下主要特点:
①采用了ATMEL公司的高密度、非易失性存储器(NV-SRAM)技术;
②其片内具有256字节RAM,8KB的可在线编程(ISP)FLASH存储器;
③有2种低功耗节电工作方式:
空闲模式和掉电模式
AT89S52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发。
单片机管脚说明
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;
当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
2.5电压显示电路
设计中采用的是8段LED数码管来显示电压值。
LED具有耗电低、亮度高、视角大、线路简单、耐震及寿命长等优点,它由8个发光二极管组成,其中7个按‘8’字型排列,另一个发光二极管为圆点形状,位于右下角,常用于显示小数点。
把8个发光二极管连在一起,公共端接高电平,叫共阳极接法,相反,公共端接低电平的叫共阴极接法,我们采用共阳极接法。
当发光二极管导通时,相应的一段笔画或点就发亮,从而形成不同的发光字符。
其8段分别命名为dpgfedcba。
例如,要显示“0”,则dpgfedcba分别为:
11000000B;
要显示“A”,则dpgfedcba分别为:
00010001B(共阳极)。
若要显示多个数字,只要让若干个数码管的位码循环为低电平就可以了。
根据设计要求,显示电路需要至少4位LED数码管来显示电压值,我们再多加一位用来显示电压单位“V”,则有7位LED循环显示。
利用单片机的I/O口驱动LED数码管的亮灭,设计中由P0口驱动LED的段码显示,即显示字符,由P2口选择LED位码,即选择点亮哪位LED来显示。
3.系统的软件设计
3.1主程序设计
ADC0809与单片机连接电路的软件设计系统的程序流程图如图所示。
主程序一开始运行则设置堆栈起始地址为70H,设置中断寄存器,用来对ICL7135的中断进行计数,每5次后清零,完成一次数据采集工作,然后设置ICL7135的STB端的中断的优先级。
紧接着LCDM1601B进行一次清屏,使其各个指令、数据寄存器的值进行清空,屏幕不显示任何字符。
以前面对1601B的介绍,只要将01H送到数据总线,使RS=0,R/W=0,E有个下降沿的脉冲就可以完成清屏工作。
用以下指令实现MOVP2,#01H;
送到数据DB7---DB0,调用子程序ENABLE,由于下降沿时,内部数据要送到RAM区,所以要有一个延时子程序,使这个下降沿持续2.5毫秒。
内部RAM有指令代码后就开始对RAM进行清零,所以屏幕原有的字符将被清除。
接着对1601进行功能的设定。
MOVP2,#01111000B,按表3.4.5来看是设定
图4.1.1主程序流程图
显示器按2行显示,每行8位,5×
7点阵。
调用一次子程序ENABLE程序,写入CPU的指令寄存器中。
每次向LCDM中写入一个指令,就调用一次ENABLE,然后再对显示器进行闪烁、光标等功能进行设定。
显示器的RAM地址按加1方法进行读写。
再设定第一行字符,也就是‘Voltage’的显示地址80H。
字符‘Voltage’的TABLE表地址送到DPTR中,然后调用远程查表命令,依次把数据送到P2口,这时再调用子程序WRITE3,使LCD1601的RS=1,R/W=0使使能端E产生一个下降沿脉冲,将数据送入到数据寄存器中,接下来执行子程序DISPLAY1,它的主要功能是将TABLE表中的字符输出到LCD中去。
调定好显示字符数即远程查表的次数,就开始查表了。
图4.1.2数据地址
例如第一个字符“V”的ASCII码是56H,就将这个码送到P2口,再调用使能数据子程序,使RS=1(数据区使能)写入显示数据区,R/W=0表示写,E=来个下降沿延时2.5毫秒,使数据写入RAM内。
完成
TABLE表输出以后,向指令RAM中写入第2
行的起始地址为OCH,再调用显示采样数据
的子程序。
采样数据存放的数据地址安排如下图所示,首先将60H中的数显示在正负号的位置上,按照ASCII码表,正号不显示(#20H),负号显示“-”(#2DH)。
3.2通讯模块设计设计
89S52单片机内部有一个全双工的串行通信口,即串行接收和发送缓冲器(SBUF),这两个在物理上独立的接收发送器,既可以接收数据也可以发送数据。
但接收缓冲器只能读出不能写入,而发送缓冲器则只能写入不能读出,它们的地址为99H。
这个通信口既可以用于网络通信,亦可实现串行异步通信,还可以构成同步移位寄存器使用。
如果在传行口的输入输出引脚上加上电平转换器,就可方便地构成标准的RS-232接口。
89S52的串行口有4种工作方式,1种同步方式,3种异步方式。
本方式选方式1,一帧数据有10位,包括起始位0、8位数据位和1位停止位1。
串行口电路在发送时能自动加入起始位和停止位。
在接收时,停止位进入SCON中的RB8位。
方式1的波特率是可变的,由定时器1的溢出率决定。
由定时器1最好工作在方式2上(自动重装载模式),这样只需对TH1设置一次即可。
数据通过TXD输出,在8个位输出完毕后,SCON寄存器的TI位被设为1,CPU只要判断TI是1,接着发送下一个字节。
波特率的设定:
定时器T1工作在方式2的初值为:
(1.1)
为了减小误差,时钟振荡频率采用11.0592MHz,选用定时器T1工作在方式2作波特率发生器,波特率为300,设SMOD为0,依公式(1.1)得初值为:
所以TH1=TL1=A0H
MOVSCON,#50H;
URAT工作在方式1上
MOVTMOD,#20H;
TIME1工作在方式2上
MOVTH1,#0A0H;
设置波特率为300
本设计的中断十分重要,为了减少相互间的干扰,保证可靠性,采用查询方式判断是否发送完毕。
A6:
JBCTI,A5;
如果发送完毕跳,清标志位,跳到A5。
AJMPA6;
否则跳到A6,等待
A5:
INCR0
4.keil51软件仿真
4.1单片机最小系统仿真
4.2系统的随机状态:
数码管显示及数模转换电路仿真图
5.课程设计体会
通过一周的课程能够设计,使我深刻的认识到单片机的应用已经在工业、电子等方方面面展示出了它的优越性,利用单片机在设计电路逐渐成了趋势,它与外围的简单电路再加上优化程序就可以构建任意的产品,使得本设计成为现实。
随着单片机的日益发展,它必将在未来显示出更大的活力,为电子设计增加更多精彩。
同时我也学到了很多书本上学习不到的东西,不仅使我加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。
创新,是要我们学会将理论很好地联系实际,并不断地去开动自己的大脑,从为人类造福的意愿出发,做自己力所能及的,别人却没想到的事。
使之不断地战胜别人,超越前人。
同时,更重要的是,我在这一设计过程中,学会了坚持不懈,不轻易言弃。
设计过程,也好比是我们人类成长的历程,常有一些不如意,也许这就是在对我们提出了挑战,勇敢过,也战胜了,胜利的钟声也就一定会为我们而敲响。
这个设计过程中,我遇到过许多次失败的考验,就比如,自己对实际生活中的交通秩序的不了解给整个设计带来的困扰,真想要就此罢休,然而,就在想要放弃的那一刻,我明白了,原来结果并不那么重要,我们更应该注重的是这一整个过程。
于是,我坚持了下来。
最后,终于按要求把作品做出来了,虽然看似很简单,但是对我们的实际动手能力却是很考验的,这也对我们今后的工作敲响了警钟:
要认真的看待每个需要处理的问题,不要认为事情过于简单,不能急于求成,更不要轻易说放弃,要保持你的头脑清醒。
这次单片机课程设计给我的最大的印象就是努力的动手去做,困难在你的勇气和毅力下是抬不了头的。
从做这个设计开始无论遇到什么困难,我都没有一丝的放弃的念头。
出于对知识的渴望,出于对新技术的好奇,出于对一切未知的求知。
希望以后有更多的机会多多参与这样的设计和实习,锻炼我们的动手能力,为今后的工作和学习奠定基础。
参考文献
[1]余发山.单片机原理及应用.徐州:
中国矿业大学出版社,2003
[2]谭浩强.C语言设计(第二版).北京:
清华大学出版社,2006
[3]吴金戌,沈庆阳,郭庭吉.《8051单片机实践与应用》[M].北京:
清华大学出版社,2002.
[4]刘伟,赵俊逸,黄勇,《一种基予C8051F单片机的SOC型数据采录器的设计与实现》[A].天津市计算机学会单片机分会编.《2003年全国单片机及嵌如入式系统学术年会论文集(下册)》[C].北京:
北京航空航天大学出版社,2003.790-794
[5]何立民.单片机应用技术大全.北京:
北京航空航天大学出版社,1994
附1源程序代码——一个发光二极管显示电路
#include<
reg51.h>
sbitP0_1=P0^1;
voiddelay(unsignedchari);
voidmain()
{
while
(1){
P0_1=0;
delay(20);
P0_1=1;
}
}
voiddelay(unsignedchari)
unsignedcharj,k;
for(k=0;
k<
i;
k++)
for(j=0;
j<
255;
j++);
附
(2)最小系统原理图
附(3)数码管显示电路程序
附(5)ADC0809数模转换模块原理图
附(6)简易电压表程序
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodeled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12};
sbitOE=P1^0;
sbitEOC=P1^1;
sbitST=P1^2;
sbitCLK=P1^3;
uchartongdaoshu;
voiddelay(uintt)
{ucharj,k;
for(j=0;
t;
j++)
for(k=0;
100;
k++);
voiddisplay(uchard)
{
uinta=1.96*d;
P2=0xf1;
P0=led[(a/100)+10];
delay(5);
P2=0xf2;
P0=led[(a%100)/10];
P2=0xf4;
P0=led[a/100];
P2=0xf8;
P0=led[tongdaoshu];
ucharad(ucharaddr)
ucharceliangzhi;
P1=addr;
ST=1;
delay
(1);
ST=0;
while(EOC==0);
OE=1;
celiangzhi=P3;
OE=0;
return(celiangzhi);
uchari;
TMOD=0x02;
TH0=0x14;
TL0=0x14;
EA=1;
ET0=1;
TR0=1;
while
(1)
for(i=0;
i<
i++)
{tongdaoshu=3;
display(ad(0x32));
{tongdaoshu=4;
display(ad(0x42));
voidTimer0()interrupt1
CLK=!
CLK;