单片机设计报告.docx
《单片机设计报告.docx》由会员分享,可在线阅读,更多相关《单片机设计报告.docx(18页珍藏版)》请在冰豆网上搜索。
单片机设计报告
摘要
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。
由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。
尽管目前市场上已有现成的数字钟集成电路芯片出售,价格便宜、使用也方便,但鉴于数字钟电路的基本组成包含了数字电路的主要组成部分,因此进行数字钟的设计是必要的,研究数字钟及扩大其应用,有着非常现实的意义。
单片机数字时钟就是其中的一款设计。
它具有编程灵活,便于电子钟功能的扩充,即可用该电子钟发出各种控制信号,精确度高等特点,同时可以用该电子钟发出各种控制信号。
单片机数字钟是单片机为核心。
时钟,本设计是以单片机AT89S52配备LED数码显示管,数字钟采用24小时制方式显示时间,带有年月日、秒表和闹钟功能。
本设计打算采用蜂鸣器做提醒,因没有蜂鸣器所以采用闪灯来提醒。
使人不仅仅是通过视觉来感受单片机数字钟带来的方便。
而51系列单片机是各单片机中最为典型和最有代表性的一种,通过本次课程设计进一步对单片机学习和应用,从而更熟悉单片机的原理和相关设计并提高了开发软、硬件的能力。
本设计主要设计一个基于80C51单片机的电子时钟,并在LED上显示相应的时间,通过两个控制键和4×4键盘来实现时间的调节功能。
应用Proteus软件实现单片机数字时钟系统的设计与仿真。
关键词:
单片机80C51数字时钟汇编语言C语言
第一章设计要求
课程设计是工科学生十分重要的实践教学环节,通过课程设计,培养学生综合运用先修课程的理论知识和专业技能,解决工程领域某一方面实际问题的能力。
课程设计报告是科学论文写作的基础,不仅可以培养和训练学生的逻辑归纳能力、综合分析能力和文字表达能力,也是规X课程设计教学要求、反映课程设计教学水平的重要依据。
为了加强课程设计教学管理,提高课程设计教学质量,特拟定如下基本要求。
1.课程设计教学一般可分为设计项目的选题、项目设计方案论证、项目设计结果分析、答辩等4个环节,每个环节都应有一定的考核要求和考核成绩。
2.课程设计项目的选题要符合本课程设计教学大纲的要求,该项目应能突出学生实践能力、设计能力和创新能力的培养;该项目有一定的实用性,且学生通过努力在规定的时间内是可以完成的。
3.项目设计方案论证主要包括可行性设计方案论证、从可行性方案中确定最佳方案,实施最佳方案的软件程序、硬件电路原理图和PCB图。
项目设计方案论证内容记录于课程设计报告书第三项中,项目设计方案论证主要考核设计方案的正确性、可行性和创新性,考核成绩占30%左右。
4.项目设计结果分析主要包括项目设计与制作结果的工艺水平,项目测试性能指标的正确性和完整性,项目测试中出现故障或错误原因的分析和处理方法。
5.学生在课程设计过程中应认真阅读与本课程设计项目相关的文献,培养自己的阅读兴趣和习惯,借以启发自己的思维,提高综合分和理解能力。
6.答辩是课程设计中十分重要的环节,由课程设计指导教师向答辩学生提出2~3个问题,通过答辩可进一步了解学生对课程设计中理论知识和实际技能掌握的程度,以及对问题的理解、分析和判断能力。
7.学生应在课程设计周内认真参加项目设计的各个环节,按时完成课程设计报告书交给课程设计指导教师评阅。
8.课程设计报告书是实践教学水平评估的重要资料,应按课程、班级集成存档交实验室统一管理。
1.1课程设计项目名称
实时时钟显示电路设计
1.2项目设计目的及技术要求
1.最小单片机系统:
其作用是和外围的时钟芯片通信,并控制数据传输过程,采集时间信息并予以处理;
2.8255可编程并行I/O口接口芯片:
它是本设计的核心模块,由它提供实时的日历时钟信息;
3.LED数码管显示模块:
此模块用于实时时钟信息显示;
程序部分包括单片机和8255A芯片的接口程序(实现单片机和8255A之间的数据传输过程)以及液晶显示程序。
第二章总体方案
2.1方案开发的基本要求
采用LED数码管动态扫描,LED数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。
这些段分别由字母a,b,c,d,e,f,g,dp来表示。
当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼精看到字样了。
LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少。
LED数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数位,因此根据LED数码管的驱动方式的不同,可以分为静态式和动态式两类,最佳方案是采用LED数码管动态扫描显示。
2.2硬件电路设计
按照系统设计功能的要求,电路系统构成框图如图1所示。
主控芯片使用52系列AT89S52单片机。
图1实时时钟电路系统构成框图
2.2.1单片机最小系统电路
单片机最小系统是最小的单片机系统,没有市场上买的有那么多功能。
通过自己喜欢的作用来扩展电路板。
电路简单,这个电路通过扩展时钟电路,数码管显示电路来实现实时时钟电路显示。
单片机最小系统电路图
图3AT89C52芯片引脚
89C52是INTEL公司MCS-51系列单片机中基本的产品,它采用ATMEL公司可靠的CMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。
它结合了CMOS的高速和高密度技术及CMOS的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于89C51增强型单片机版本,集成了时钟输出和向上或向下计数器等更多的功能,适合于类似马达控制等应用场合。
89C52内置8位中央处理单元、256字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。
此外,89C52还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。
在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。
掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能。
89C52有PDIP(40pin)和PLCC(44pin)两种封装形式。
管脚说明:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8个TTL门电流。
当P0口的管脚第一次写“1”时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4个TTL门电流。
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口作为AT89C51的一些特殊功能口,管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(计时器0外部输入)
P3.5T1(计时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
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.2.2复位电路
RST复位输入端。
当振荡器运行时,在该引脚上出现两个机器周期的高电平将使单片机复位。
89C52单片机的最小系统,包括晶振电路,复位电路,确保系统的控制部分。
P0端口用作地址/数据复用总线AD[0~7],和日历时钟芯片相连。
P1端口用作数码管的段码接口,由于本设计的显示不会出现小数点,因此只使用了a、b、c、d、e、f、g,而没有使用dp(小数点)段。
P2端口的P2.1~P2.4作为数码管的位码接口,它们需要通过4-16译码电路以及驱动电路来控制13位数码管的位码选择。
P2端口的P2.0在反相之后为日历时钟芯片提供片选信号,需要反相是因为该片选信号为低电平有效。
单片机的P3.7(/RD)、P3.6(/WR)引脚和日历时钟芯片的读、写引脚直接相连,它们均为低电平有效。
高低电位复位电路
2.2.38255可编程并行I/O口接口芯片
8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。
具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。
其各口功能可由软件选择,使用灵活,通用性强。
8255可作为单片机与多种外设连接时的中间接口电路。
8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。
同时必须具有与外设连接的接口A、B、C口。
由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:
与CPU连接部分、与外设连接部分、控制部分。
特性
1.一个并行输入/输出的LSI芯片,多功能的I/O器件,可作为CPU总线与外围的接口。
2.具有24个可编程设置的I/O口,即3组8位的I/O口,分别为PA口、PB口和PC口。
它们又可分为两组12位的I/O口:
A组包括A口及C口(高4位,PC4~PC7),B组包括B口及C口(低4位,PC0~PC3)。
A组可设置为基本的I/O口,闪控(STROBE)的I/O闪控式,双向I/O三种模式;B组只能设置为基本I/O或闪控式I/O两种模式,而这些操作模式完全由控制寄存器的控制字决定.
引脚说明
RESET:
复位输入线,当该输入端处于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。
CS:
芯片选择信号线,当这个输入引脚为低电平时,即CS=0时,表示芯片被选中,允许8255与CPU进行通讯;CS=1时,8255无法与CPU做数据传输。
RD:
读信号线,当这个输入引脚为低电平时,即RD=0且CS=0时,允许8255通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。
WR:
写入信号,当这个输入引脚为低电平时,即WR=0且CS=0时,允许CPU将数据或控制字写入8255。
D0~D7:
三态双向数据总线,8255与CPU数据传送的通道,当CPU执行输入输出指令时,通过它实现8位数据的读/写操作,控制字和状态信息也通过数据总线传送。
PA0~PA7:
端口A输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入锁存器。
PB0~PB7:
端口B输入输出线,一个8位的I/O锁存器,一个8位的输入输出缓冲器。
PC0~PC7:
端口C输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入缓冲器。
端口C可以通过工作方式设定而分成2个4位的端口,每个4位的端口包含一个4位的锁存器,分别与端口A和端口B配合使用,可作为控制信号输出或状态信号输入端口。
A1,A0:
地址选择线,用来选择8255的PA口,PB口,PC口和控制寄存器。
当A1=0,A0=0时,PA口被选择;
当A1=0,A0=1时,PB口被选择;
当A1=1,A0=0时,PC口被选择;
当A1=1.A0=1时,控制寄存器被选择。
2.2.4蜂鸣器的工作原理
如图所示,蜂鸣器的正极接到VCC(+5V)电源上面,蜂鸣器的负极接到三极管的发射极E,三极管的基级B经过限流电阻R1后由单片机的P3.7引脚控制,当P3.7输出高电平时,三极管T1截止,没有电流流过线圈,蜂鸣器不发声;当P3.7输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。
因此,我们可以通过程序控制P3.7脚的电平来使蜂鸣器发出声音和关闭。
2.3软件设计
2.3.1时间调节原理框图
2.3.2主程序流程图
第三章总结
硬件设计单片机AT89C52,它是一种带4K字节闪存可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器。
单片机是很容易受干扰的控制器,当采用外部晶振时,应尽量让其靠近单片机减少对其干扰,防止程序乱飞现象。
软件设计中要完成键值处理,定时中断,延时,键盘扫描,显示等功能。
合理利用可以减少CPU利用资源,具有执行效率高等优点。
我想这是一次意志的磨练,是对我实际能力的一次提升,也会对我未来的学习和工作有很大的帮助。
在设计的过程中遇到困难我就及时和我的指导老师联系,在老师的帮助下,困难一个一个解决掉,设计也慢慢成型。
这次设计的过程是一次再学习,再提高的过程。
本次让我们体味到设计电路、连接电路、调测电路过程中的乐苦与甜。
设计是我们将来必需的技能,这次实习恰恰给我们提供了一个应用自己所学知识的机会,从到图书馆查找资料到对电路的设计对电路的调试再到最后电路的成型,都对我所学的知识进行了检验。
同时在设计的过程中,遇到了一些以前没有见到过的元件,但是通过查找资料来学习这些元件的功能和使用。
制作过程是一个考验人耐心的过程,不能有丝毫的急躁,马虎,对电路的调试要一步一步来,不能急躁,因为是在电脑上调试,比较慢,又要求我们有一个比较正确的调试方法,像把频率调准等等。
这又要我们要灵活处理,在不影响试验的前提下可以加快进度。
合理的分配时间。
在设计控制电路的时候,我们可以连接显示和时钟电路,这样就加快了完成的进度。
最重要的是要熟练地掌握课本上的知识,这样才能对试验中出现的问题进行分析解决。
第四章参考文献
【1】单片机原理与嵌入式系统设计:
原理、应用、proteus仿真、实验设计/X齐,X宁西,毕盛编著。
:
电子工业,2011
【2】李希文.电子测量技术XX电子科技大学2008
【3】X善君等.单片机接口技术与应用。
:
清华大学,2005
【4】马忠梅等.单片机的C语言应用设计。
:
航空航天大学,1999
【5】周润景等.PROTEUS入门实用教程。
:
机械工业,2007
【6】X清慧等.Proteus教程----电子线路设计、制版与仿真。
:
清华大学,2008
【7】X齐.单片机应用系统设计技术----基于C51的proteus仿真。
:
电子工业,2009
【8】谭浩强.C++程序设计.:
清华大学.2011.
【9】邱关源.电路(第五版).:
高等教育.2006.
附录
一、仿真图:
二、程序清单:
#include
#include
#definePAXBYTE[0x0000]
#definePBXBYTE[0x2000]
#definePCXBYTE[0x4000]
#defineCMDXBYTE[0x6000]
sbitup=P1^0;
sbitdown=P1^1;
sbitFMQ=P1^3;
bitflag_TR=0;
unsignedcharflag_SET=0,shi=0,fen=0,miao=0,temp=0,i;
unsignedcharshu[10]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
};
voidinit()
{
IE=0x87;
TMOD=0x01;
TH0=0x4c;
TL0=0X00;
TCON=0x05;
CMD=0x80;
}
voiddelay(unsignedintm)
{
unsignedcharcount;
while(m!
=0)
{
for(count=0;count<239;count++){}
m--;
}
}
voiddisplay(unsignedcharshi,unsignedcharfen,unsignedcharmiao)
{
unsignedcharshi0,shi1,fen0,fen1,miao0,miao1;
shi0=shi/10;shi1=shi%10;
fen0=fen/10;fen1=fen%10;
miao0=miao/10;miao1=miao%10;
PA=0x80;
PB=shu[shi0];
delay(5);
PA=0x40;
if(flag_SET==3&&!
flag_TR)
PB=shu[shi1]&0x7f;
else
PB=shu[shi1];
delay(5);
PA=0x20;
PB=shu[fen0];
delay(5);
PA=0x10;
if(flag_SET==2&&!
flag_TR)
PB=shu[fen1]&0x7f;
else
PB=shu[fen1];
delay(5);
PA=0x08;
PB=shu[miao0];
delay(5);
PA=0x04;
if(flag_SET==1&&!
flag_TR)
PB=shu[miao1]&0x7f;
else
PB=shu[miao1];
delay(5);
}
voidmain()
{
init();
while
(1)
{
display(shi,fen,miao);
if(flag_TR==0)
{
TR0=0;
if(flag_SET==1&&up==0)
{
while(up==0);
miao++;
if(miao==60)miao=0;
}
if(flag_SET==1&&down==0)
{
while(down==0);
miao--;
if(miao>60)miao=59;
}
if(flag_SET==2&&up==0)
{
while(up==0);
fen++;
if(fen==60)fen=0;
}
if(flag_SET==2&&down==0)
{
while(down==0);
fen--;
if(fen>60)fen=59;
}
if(flag_SET==3&&up==0)
{
while(up==0);
shi++;
if(shi==24)shi=0;
}
if(flag_SET==3&&down==0)
{
while(down==0);
shi--;
if(shi>24)shi=23;
}
}
if(flag_TR==1)
{
TR0=1;
}
if(flag_TR==1&&fen==0&&miao==0)
{
for(i=0;i{
FMQ=0;
delay(300);
FMQ=1;
delay(300);
}
while(miao==0);
}
}
}
voidtimer0()interrupt1
{
EA=0;
TH0=0x4c;
TL0=0x00;
flag_SET=0;
temp++;
if(temp==20)
{
temp=0;
miao++;
}
if(miao==60)
{
miao=0;
fen++;
}
if(fen==60)
{
fen=0;
shi++;
}
if(shi==24)
{
shi=0;
}
EA=1;
}
voidint_0()interrupt0
{
EA=0;
flag_TR=!
flag_TR;
EA=1;
}
voidint_1()interrupt2
{
EA=0;
if(!
flag_TR)
flag_SET++;
flag_SET%=4;
EA=1;
}