单片机秒表实训论文
指导老师:
小组成员:
应用电子09-2班
摘要:近年来随着科技的飞速发展,单片机的应用正在不断的走向深入,同时带动着传统控制检测日新月异更新。在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面的知识是不够的,还要根据具体的硬件结构,以及针对具体的应用对象的软件结合,加以完善。
本次实训采用了AT89C51芯片、LED四位数码管、三极管、电容、开关、晶振及若干电阻实现了秒表。将软、硬件有机地结合起来,使得系统能够实现显示,可谓功能强大。其中软件系统采用汇编语言编写程序,包括显示程序,加减计数程序,快加快减程序,中断,延时程序,按键消抖程序等,硬件系统利用PROTEUS强大的功能来实现,简单切易于观察,在仿真中就可以观察到实际的工作状态。 关键字:单片机、AT89C51芯片、设计。
一、实训目的及要求?????????????2页
二、硬件系统设计??????????????2页
三、试验程序:???????????????4页 四:电路设计????????????????5页
五、实验结果????????????????2页
六、调试?????????????????10页
七、实物电路图??????????????11页
八、实训总结:??????????????12页
一、实训的目的及要求:
1、本次实主要采用AT89C51芯片进行对整个产品的控制,其中包括对数码管的位码和段码的送显控制,以及对送显时间的控制等主要部分功能控制。
2、数码管是采用了四位共阳极的,有独立的电源提供,保证了送显的效果。
3、三极管是用了S9015型号的,PNP型,保证了电流的提供。
4、通过四两位数码管来显示秒表的时间,三个按键对秒表实现启动、停止及复位的功能。
二、硬件系统设计:
1、本系统采用AT89C51芯片,有40个引脚
40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。
1) 电源:
(1) VCC(40脚): 片电源,接+5V;
(2) VSS (20脚): 接地端;
2) 时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。
3) 控制线: RST(Reset)功能:复位信号输入端。
4) I/O线
A、AT89C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。P3口还具有第二功能,用于串行口,中断输入源,计时器,片内RAM选通。
B、本系统有三个按键,包括一个复位键,一个调零键,一个启动(暂停)键。第1次按下SP1后单片机秒表就开始计;第2次按SP1后,计时停止; 第3次按SP1后,计时归零。最小可以计时0.1s,最大可以计时255s,有四位LED数码管动态显示。
C、系统采用12MHZ晶振,方便定时。用的是BT-A5461RB四位显示管,使用前,先用万用表检测出它的各个管脚(a,b,c,d,,e,f,g,dp),将它的各个管教设置成低电平(即“0”)。通过单片机往指定地址写入数据后,就能在屏上对应的地方显示所需显示的数字。 原理图:
ORG 00H
AJMP START 三、试验程序: DISI EQU 34H;分十位 DIER EQU 32H;秒十位 COU EQU 35H;软计数器 DISAN EQU 33H;分个位
ORG 0BH;定时器0中断入口 DIYI EQU 31H;定义秒个位位寄存器
AJMP TIME0;跳转到定时器0的服务程序
ORG 30H
START:MOV DIYI,#0;清0
MOV DIER,#0;清0
MOV DISAN,#0
MOV DISI,#0
MOV COU,#0
MOV TMOD,#01H;设定时器模式为16位定时器 MOV TH0,#3CH;装初值
MOV TL0,#0B0H;装初值
SETB ET0;开定时器0中断允许
SETB TR0;开定时器
CLR EA;关总中断
MAIN: LCALL ANJIAN;调用按键检测子程序 LCALL XIANSHI;调用显示子程序 AJMP MAIN
ANJIAN: MOV A,P3;读入P3口的值
JNB P3.1,KAI;P3.4为0,转到定时开 JNB P3.0,GUAN;P3.1为0转到定时关
RET;子程序返回
KAI: SETB EA;开总中断
RET;返回
GUAN: CLR EA;关总中断
RET;返回
XIANSHI: MOV DPTR,#TABLE;获得表数据 MOV R1,#20
LOOP: MOV A,DIYI
MOVC A,@A+DPTR;获得相应地址 MOV P2,#7FH;开第一位显示
MOV P0,A;送出段码
LCALL DELY1MS;延时1毫秒
MOV P2,#0FFH;关显示,防止鬼影 MOV A,DIER
MOVC A,@A+DPTR
MOV P2,#0BFH
MOV P0,A
LCALL DELY1MS
MOV P2,#0FFH
MOV A,DISAN
MOVC A,@A+DPTR
MOV P2,#0DFH
MOV P0,A
LCALL DELY1MS
MOV P2,#0FFH
MOV A,DISI
MOVC A,@A+DPTR
MOV P2,#0EFH
MOV P0,A
LCALL DELY1MS
MOV P2,#0FFH
DJNZ R1,LOOP
RET
TIME0: INC COU;软计数器加一
MOV A,COU;数据转移
CJNE A,#2,OVER;看COU内的值是否为2,是的话向下执行,不是的话,退出中断。
MOV COU,#0;清0
INC DIYI;毫秒位加一
MOV A,DIYI;数据转移
CJNE A,#10,OVER;比较判断
MOV DIYI,#0;清0
INC DIER
MOV A,DIER
CJNE A,#10,OVER
MOV DIER,#0
INC DISAN
MOV A,DISAN
CJNE A,#10,OVER
MOV DISAN,#0
INC DISI
MOV A,DISI
CJNE A,#10,OVER
MOV DISI,#0
OVER: MOV TH0,#3CH;装初值
MOV TL0,#0B0H;装初值
RETI;中断返回
DELY1MS: MOV R7,#300;赋值50
DL1: NOP;空指令
NOP
DJNZ R7,DL1;减一非0转
RET;返回
TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H END
四、电路设计:
五、实验结果:
流程图:
六、实训实物图:
七、调试:
调试的过程是一个颇为重要的过程,调试所指的是:硬件和软件。而在进行实物调试之前,可以用软件仿真和硬件仿真,来检测出了问题的是程序还是所焊接硬电路板;当软件和硬件都仿真成功的时候,并不能说明,用在实物上时,就一定成功的。我们这组就遇到这方面的问题,硬件的最小系统连接错误,使得接通电源时,电路会不停地复位,而无法正常工作;而在软件调试方面复位发生错误,经老师指
点之后,是因为写错了复位程序,而导致数码管一直显示从9又返回
8。在调试过程中,大体上是,检测电路有没有通,断路、虚焊和断路等;特别要检测最系统,程序与仿真之间的相同点与不同点。进而改进程序。
八、实训总结:
在这次的实训中,
第二篇:实训1:单片机秒表设计
单片机秒表设 计(论文)
题目名称: 单片机秒表设计
专业班级:
学 号:
学生姓名:
指导教师:
20##年6月15日
一、 单片机的功能
单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器 RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
MCS-51系列单片机,其主要功能如下:
·8位CPU·4kbytes 程序存储器(ROM)
·128bytes的数据存储器(RAM)
·32条I/O口线
·111条指令,大部分为单字节指令
·21个专用寄存器
·2个可编程定时/计数器
·5个中断源,2个优先级
·一个全双工串行通信口
·外部数据存储器寻址空间为64kB
·逻辑操作位寻址功能
·双列直插40PinDIP封装
·单一+5V电源供电
40个引脚按引脚功能大致可分为4个种类:电源、时钟、控制和I/O引脚。
⒈ 电源:
⑴ VCC - 芯片电源,接+5V;
⑵ VSS - 接地端;
注:用万用表测试单片机引脚电压一般为0v或者5v,这是标准的TTL电平。但有时候在单片机程序正在工作时候测试结果并不是这个值而是介于0v-5v之间,其实这是万用表的响应速度没这么快而已,在某一个瞬间单片机引脚电压仍保持在0v或者5v。
⒉ 时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。
⒊ 控制线:控制线共有4根,
⑴ ALE/PROG:地址锁存允许/片内EPROM编程脉冲
① ALE功能:用来锁存P0口送出的低8位地址
② PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。
⑵ PSEN:外ROM读选通信号。
⑶ RST/VPD:复位/备用电源。
① RST(Reset)功能:复位信号输入端。
② VPD功能:在Vcc掉电情况下,接备用电源。
⑷ EA/Vpp:内外ROM选择/片内EPROM编程电源。
① EA功能:内外ROM选择端。
② Vpp功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。
⒋ I/O线
80C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。
P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)
5. P3口第二功能
P30 RXD 串行输入口
P31 TXD 串行输出口
P32 INT0 外部中断0(低电平有效)
P33 INT1 外部中断1(低电平有效)
P34 T0 定时计数器0
P35 T1 定时计数器1
P36 WR 外部数据存储器写选通(低电平有效)
P37 RD 外部数据存储器读选通(低电平有效)
二、 设计思路
1、使用单片机,设计秒表,能显示分分秒秒;
2、使用三个按键停止,开始,复位,其中“开始”按键当开关由上向下拨时开始计时,此时若再拨“开始”按键则数码管暂停;“清零”按键当开关由上向下拨时数码管清零,此时若再拨“开始”按键则又可重新开始计时;
3、使用液晶或数码管显示;
4、使用定时器中断;
三、功能实现及描述
使用定时器中断产生50ms的时间;
每次中断,使用全局变量,记录当时的时间;
主函数检查按键,显示时间;
秒表设计导向图
四、 电路图及解释
解释:P3^4,P3^5,P3^6三个引脚分别接清零开关,停止开关和复位开关,P0口和p2口跟七段数码管相连,用来向七段数码管来发送数据。
五、 流程图及解释
解释:程序从主函数开始,初始化端口,定时器赋初值TH0=56,TL0=56,设置成允许定时器中断,开始定时,若定时时间到50ms,定时器溢出,执行中断函数;计数值timecount0加1,若timecount0加到100,timecount0就清为0之后,timecount加1,若timecount0等于50,说明1s到了,timecount清空,秒计数器加1;把当前的时间送到P0,P2口在数码管上显示。判断TR0的值是否为0,若为0,这当前按键是开始,暂停或继续,若不为0,都要判断P3_4是否等于0,若等于0,计数值0,不等于0,退出中断,返回主函数,继续计数。
六、代码设计
#include <AT89X52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint timecount=0, count=0,timecount0=0; // timecount 为50ms计数器,count为1s计数器,均为全局变量
uchar code table[ ] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80};//0~9的段码表,0xff为熄灭符
uchar a1,a2,a3,a4;
sbit dula=P2^6;
sbit wela=P2^7;
sbit a=P3^4;
sbit b=P3^5;
sbit c=P3^6;
/********延时函数********/
void delay(uint xms) //延时程序,xms是形式参数
{
uint i, j;
for(i=xms;i>0;i--) // i=xms,即延时xms, xms由实际参数传入一个值
for(j=10;j>0;j--); //此处分号不可少
}
/********显示函数********/
display(uchar q_c,uchar b_c,uchar sh_c,uchar g_c)
{
dula=1; //控制显示代码锁存器,禁止输出
P0=table[q_c]; //0~9的显示代码
dula=0; //控制锁存器,送出显示代码
P0=0xff; //4位管,电源全关(余晖)
wela=1; //控制锁存器,不允许输出 供电
P0=0xfb; //第一位管 供电 一轮
wela=0; //控制锁存器,允许输出,送出4位管 供电
delay(1); //保持一定时间,防止闪烁
dula=1;
P0=table[b_c]|0x80;
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(1);
dula=1;
P0=table[sh_c];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delay(1);
dula=1;
P0=table[g_c];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delay(1);
}
void key()
{
if(a==0) //复位
{
delay(10);
if(a==0)
{
count=0;
TR0=0;
while(a!=0);
}
}
if(b==0) //停止
{
delay(10);
if(b==0)
{
TR0=0;
while(b!=0);
}
}
if(c==0) //开始
{
delay(10);
if(c==0)
{
TR0=1;
while(c!=0);
}
}
}
/********主函数********/
main()
{
P0=0xff;
P2=0xff;
TMOD=0x02; //定时器T0方式1
TH0=56; TL0=56; //50ms定时初值
EA=1;
ET0=1; //开总中断,开定时器T0中断,启动定时器T0
while(1)
{
key();
a1=(count/60)/10; //取出记数分数的十位
a2=(count/60)%10; //取出记数分数的个位
a3=(count%60)/10; //取出记数秒数的十位
a4=(count%60)%10; //取出计数值的个位
display(a1,a2,a3,a4); //调显示函数
}
}
/********定时器T0中断函数********/
void timer0() interrupt 1 using 0
{
timecount0++; //计数值加1
if(timecount0==100) //若timecount0为100,(100*0.2ms=20ms)
{
timecount0=0; // timecount0清0
timecount++;
}
if(timecount==50) //若timecount为50,说明1s到(50*20ms=1000ms)
{
timecount=0; //当timecount=50时,timecount清0
count++; //秒计数器加1
}
}
七、实训总结
通过这次的课程设计,使我对单片机程序设计的方法、要求有了初步的了解并且积累了一些实践经验,对软件的应用有了更进一步的了解,相信对以后进一步学习单片机知识,这对自己无论是在感性上还是理性上都会有一定的帮助,而且通过这次的设计,激发了我对单片机课程浓厚的兴趣,增强了我对书本理论的运用。虽然现在对所涉及的知识和要求的综合分析能力较为复杂,可这其中体现了创新思想和知识的结合应用,今后我将更广泛地涉及这方面的知识,希望能在这一领域有所成就
实验利用单片机的定时器/计数器定时和记数的原理,结合实验箱上的集成电路芯片LED数码管以及实验箱上的按键来设计计时器。将软、硬件有机地结合起来,使得系统能够正确地进行计时,数码管能够正确地显示时间。其中本实验设计了三个开关按键:其中一个按键按下一开始计时,即秒表开始键,另一个按键按下去时暂停计时,使秒表停留在原先的计时,第三个按键按下去时清0(复位键),本实验中开始时都要使各按键回到各初始位置,最终结果成功实现。