单片机秒表实验报告
![单片机秒表实验报告](https://img.360docs.net/img10/0hq70j6vcqse0by1mua-01.webp)
![单片机秒表实验报告](https://img.360docs.net/img10/0hq70j6vcqse0by1mua-62.webp)
安徽科技学院机电与车辆工程学院
《电子电路课程综合实训》
验收材料
题目: 电子秒表
姓名(学号) 胡斌1609110208
李绪1609110214
王增龙1609110227
段鑫鹏
专业: 电气工程及其自动化
班级: 112班
指导教师:叶爱芹
2013 年 12 月 29日
目录
第一章单片机课程设计任务书 (1)
一、目的意义 (1)
二、设计时间、地点和班级 (1)
三、设计内容 (1)
四、参考电路图形 (2)
五、单片机的相关知识 (3)
第二章硬件设计 (5)
一、单片机简介 (5)
二、电源电路 (5)
三、晶振振荡电路 (5)
四、复位电路 (5)
五、显示电路 (6)
六、键盘电路 (6)
七、硬件主电路图设计 (7)
八、元件清单 (7)
第三章软件设计 (8)
一、软件设计概述 (8)
二、主程序流程图 (8)
三、程序中各函数设计 (8)
四、C语言主程序设计 (10)
第四章课程设计体会 (13)
..
五、单片机相关知识
本课题在选取单片机时,充分借鉴了许多成形产品使用单片机的经验,并根据自己的实际情况,选择了AT89C51。
AT89C51单片机采用40引脚的双列直插封装方式。图1.2为引脚排列图,40条引脚说明如下:
主电源引脚Vss和Vcc
①Vss接地
②Vcc正常操作时为+5伏电源
外接晶振引脚XTAL1和XTAL2
①XTAL1内部振荡电路反相放大器的输入端,是外接晶体的一个引脚。当采用外部振荡器时,此引脚接地。
②XTAL2内部振荡电路反相放大器的输出端。是外接晶体的另一端。当采用外部振荡器时,此引脚接外部振荡源。
图1.2 AT89C51单片机引脚图
控制或与其它电源复用引脚RST/VPD,ALE/PROG,PSEN和EA/Vpp
①RST/VPD 当振荡器运行时,在此引脚上出现两个机器周期的高电平(由低到高跳变),将使单片机复位在Vcc掉电期间,此引脚可接上备用电源,由VPD向内部提供备用电源,以保持内部RAM中的数据。
②ALE/PROG正常操作时为ALE功能(允许地址锁存)提供把地址的低
字节锁存到外部锁存器,ALE 引脚以不变的频率(振荡器频率的1/6)周期性地发出正脉冲信号。因此,它可用作对外输出的时钟,或用于定时目的。但要注意,每当访问外部数据存储器时,将跳过一个ALE脉冲,ALE 端可以驱动(吸收或输出电流)八个LSTTL电路。对于EPROM型单片机,在EPROM编程期间,
此引脚接收编程脉冲(PROG功能)
③P S E N外部程序存储器读选通信号输出端,在从外部程序存储取指令
(或数据)期间,PSEN在每个机器周期内两次有效。PSEN同样可以驱动八LSTTL输入。
④EA/Vpp、EA/Vpp为内部程序存储器和外部程序存储器选择端。当
EA/Vpp为高电平时,访问内部程序存储器,当EA/Vpp为低电平时,则访问外
部程序存储器。对于EPROM型单片机,在EPROM编程期间,此引脚上加21伏EPROM编程电源(Vpp)。
输入/输出引脚P0.0 - P0.7,P1.0 - P1.7,P2.0 - P2.7,P3.0 - P3.7。
①P0口(P0.0 - P0.7)是一个8位漏极开路型双向I/O口,在访问外部存储器时,它是分时传送的低字节地址和数据总线,P0口能以吸收电流的方式驱动八个LSTTL负载。
②P1口(P1.0 - P1.7)是一个带有内部提升电阻的8位准双向I/O口。能驱动(吸收或输出电流)四个LSTTL负载。
③P2口(P2.0 - P2.7)是一个带有内部提升电阻的8位准双向I/O口,在访问外部存储器时,它输出高8位地址。P2口可以驱动(吸收或输出电流)四个LSTTL负载。
④P3口(P3.0 - P3.7)是一个带有内部提升电阻的8位准双向I/O口。能驱动(吸收或输出电流)四个LSTTL负载。
AT89C52具有以下标准功能:8k字节Flash,256字节RAM,32 位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89C52可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。CPU是单片机的核心部件。它由运算器和控制器等部件组成。
(1)运算器
运算器的功能是进行算术运算和逻辑运算。可以对半字节(4位)、单字节等数据进行操作。例如能完成加、减、乘、除、加1、减1、BCD码十进制调整、比较等算术运算和与、或、异或、求补、循环等逻辑操作,操作结果的状态信息送至状态寄存器。
89C51运算器还包含有一个布尔处理器,用来处理位操作。它是以进位标志位C为累加器的,可执行置位、复位、取反、等于1转移、等于0转移、等于1转移且清0以及进位标志位与其他可寻址的位之间进行数据传送等位操作,也能使进位标志位与其他可移位寻址的位之间进行逻辑与、或操作。
(2)程序计数器PC
程序计数器PC用来存放即将要执行的指令地址,共16位,可对64K程序存储器直接寻址。执行指令时,PC内容的低8位经P0口输出,高8位经P2口输出。
(3)令寄存器
指令寄存器中存放指令代码。CPU执行指令时,由程序存储器中读取的指
令代码送入指令寄存器,经译码后由定时与控制电路发出相应的控制信号,完成指令功能。
第二章硬件设计
本系统中,硬件电路主要有电源电路,晶振电路,复位电路,显示电路,以及一些按键电路等。
一、单片机简介
本系统设计采用C51系列单片机。
ST89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容(由于在微机原理中学过C-51的具体知识,这里不再详细说明)。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ST89C51是一种高效的微控制器。
二、电源电路
电源电路是系统最基本的部分,任何电路都离不开电源部分,由于三端集成稳压器件所组成的稳压电源线路简单,性能稳定,工作可靠,调整方便,已逐渐取代分立元件,在生产中被广泛采用,由于是小系统,我们采用7809电源提供+5V稳压电压。
三、晶体振荡电路
MCS--51单片机内部的振荡电路是一个高增益反相放大器,引线 XTAL1和XTAL2分别为反向振荡放大器的输入及内部时钟工作电路的输入和来自反向振荡器的输出,该反向放大器可以配置为片内振荡器。
这里,我们选用51单片机12MHZ的内部振荡方式,电路如下:电容器C1,C2起稳定振荡频率,快速起振的作用,C1和C2可在20-100PF之间取,这里取30P
复位电路
五、显示电路
显示电路既可以选用液晶显示器,也可以选用数码管显示。我们采用的是数码管显示电路。用2个共阴极LED显示,LED是七段式显示器,内部有7个条形发光二极管和1个小圆点发光二极管组成,根据各二极管的亮灭组合成字符。在用数码管显示时,我们有静态和动态两种选择,静态显示程序简单,显示温度,但是占用端口比较多;动态显示所使用的端口比较少,可以节省单片机的I/O 口。
在设计中,我们采用LED动态显示,用P0口驱动显示。由于P0口的输出极是开
漏电路,用它驱动时需要外接上拉电阻才能输出高电平。
六、键盘电路
在按键电路中,我们可以在I/O口上直接按键,或者通过I/O口设计一个键
盘,然后通过键盘扫描程序判断是否有按键按下等。键盘扫描电路节省I/O口,
但编程有些复杂,在这里,由于我们所用的按键较少,且系统是一个小系统,有
足够的I/O口可以使用,为了使程序简化,我们采用按键电路,用部分P1口做
开关,P1.0复位,P1.1开始和暂停,用外中断INT1开始,另外用软件法消除抖
动。电路图如下所示:
七、硬件主电路图设计
用Protues画出其硬件主电路图如下:
秒表原理图八、元器件清单
第三章软件设计
一、软件设计概述
在软件设计中,一般采用模块化的程序设计方法,它具有明显的优点。把一个多功能的复杂的程序划分为若干个简单的、功能单一的程序模块,有利于程序的设计和调试,有利于程序的优化和分工,提高了程序的阅读性和可靠性,使程序的结构层次一目了然。
应用系统的程序由包含多个模块的主程序和各种子程序组成。各程序模块都要完成一个明确的任务,实现某个具体的功能,在具体需要时调用相应的模块即可。
功能描述:用2位LED数码显示"秒表",显示时间00——99秒,每秒自动加1;一个"开始""暂停"键,一个"清零"键。
二、主程序流程图
这里采用顺序结构,通过对按键的扫描,判断要实现什么功能。如下所示:
三、程序中各函数设计
(1)初始化函数设计
void init()
{
TMOD=0x10;//定时器1工作方式1
TL1=0xf0;//延时初始化设置
//TR1=1;
EA=1;//开总开关
ET1=1;//开定时器
}
(2)显示函数设计
void writeled(uchar num,uchar addr) {
//关显示
P2=0xff;
//送数据
P0=dulatab[num];
//开显示
P2=welatab[addr];
delay(4);
}
void display(uchar sec)
{
uchar sech,secl;
sech=sec/10;
secl=sec%10;
writeled(sech,0);
writeled(secl,1);
}
(3)按键函数设计
void keyscan()
{if(start==0)
{delay(2);
if(start==0)
{
TR1=~TR1;
while(start==0)
{
display(sec);
}
}
}
if(stop==0&&TR1==0)
{
delay(2);
{
sec=0;
while(stop==0)
{display(sec);
}
}
}
}
(4)延时函数设计
void delay(uchar time)//延时
{
uchar i,j;
for(i=0;i