电子项目作业 电子秒表.docx
《电子项目作业 电子秒表.docx》由会员分享,可在线阅读,更多相关《电子项目作业 电子秒表.docx(19页珍藏版)》请在冰点文库上搜索。
电子项目作业电子秒表
单片机项目作业
项目题目:
电子秒表
指导教师:
姬红旭
班级:
计科123班
学生姓名:
马超
学号:
2012090137
1、电子秒表的功能介绍
电子秒表是一种较先进的电子计时器,目前国产的电子秒表一般都是利用石英振荡器的振荡频率作为时间基准,采用6位液晶数字显示时间。
电子秒表的使用功能比机械秒表要多,它不仅能显示分、秒,还能显示时、日、月及星期,并且有1/l00s的功能。
一般的电子秒表连续累计时间为59min59.99s,可读到1/l00s,平均日差±0.5s。
电子秒表配有三个按钮,如图所示。
图中为秒表按钮,为功能变换按钮,为调整按钮,基本显示的计时状态为“时”、“分”、“秒”。
电子秒表是重要的记时工具,广泛运用于各行各业中。
它可广泛应用于对运动物体的速度、加速度的测量实验,还可用来验证牛顿第二定律、机械能守恒等物理实验,同时也适用于对时间测量精度要求较高的场合.测定短时间间隔的仪表。
作为一种测量工具,电子秒表相对其它一般的记时工具具有便捷、准确、可比性高等优点,不仅可以提高精确度,而且可以大大减轻操作人员的负担,降低错误率。
2、电子秒表的硬件电路设计
(一)方案设计
数字电子秒表具有显示直观、读取方便、精度高等优点,在计时中广泛使用。
本设计用单片机组成数字电子秒表,力求结构简单、精度高为目标。
本系统采用C51系列单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合硬件电路如电源电路,晶振电路,复位电路,显示电路,以及一些按键电路等来设计计时器,将软、硬件有机地结合起来。
其中软件系统采用汇编语言编写程序,硬件系统利用PROTEUS强大的功能来实现,简单切易于观察,在仿真中就可以观察到实际的工作状态。
本设计利用STC89C51单片机的定时器/计数器定时和计数的原理,使其能精确计时。
利用中断系统使其能实现开始暂停的功能。
根据要求知道秒表设计主要实现的功能是计时和显示。
因此设置了两个按键和LCD显示时间,两个按键分别是开始、停止和复位按键。
利用这两个建来实现秒表的全部功能,而LCD则能显示最多4.59.99秒的计时。
电路原理图设计最基本的要求是正确性,其次是布局合理,最后在正确性和布局合理的前提下力求美观。
硬件电路图按照图1.1进行设计。
图1.1数字秒表硬件电路基本原理图
(二)硬件设计
本系统中,硬件电路主要有电源电路,晶振电路,复位电路,显示电路,以及一些按键电路等。
1.单片机简介
本系统设计采用C51系列单片机。
ST89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容(由于在微机原理中学过C-51的具体知识,这里不再详细说明)。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ST89C51是一种高效的微控制器。
2.电源电路
电源电路是系统最基本的部分,任何电路都离不开电源部分,由于三端集成稳压器件所组成的稳压电源线路简单,性能稳定,工作可靠,调整方便,已逐渐取代分立元件,在生产中被广泛采用,由于是小系统,我们采用7809电源提供+5V稳压电压。
3.晶体振荡电路
MCS--51单片机内部的振荡电路是一个高增益反相放大器,引线XTAL1和XTAL2分别为反向振荡放大器的输入及内部时钟工作电路的输入和来自反向振荡器的输出,该反向放大器可以配置为片内振荡器。
这里,我们选用51单片机12MHZ的内部振荡方式,电路如下:
电容器C1,C2起稳定振荡频率,快速起振的作用,C1和C2可在20-100PF之间取,这里取30P,接线时要使晶体振荡器X1尽可能接近单片机。
图2晶体振荡电路
4.复位电路
采用上电+按键复位电路,上电后,由于电容充电,使RST持续一段高电平时间。
当单片机已在运行之中时,按下复位键也能使用使RST持续一段时间的高电平,从而实现上电加开关复位的操作。
这不仅能使单片机复位,而且还能使
单片机的外围芯片也同时复位。
当程序出现错误时,可以随时使电路复位。
电路图如下:
图3复位电路
5.显示电路
显示电路既可以选用液晶显示器,也可以选用数码管显示。
我们采用的是数码管显示电路。
用2个共阳极LED显示,LED是七段式显示器,内部有7个条形发光二极管和1个小圆点发光二极管组成,根据各管的亮暗组合成字符。
在用数码管显示时,我们有静态和动态两种选择,静态显示程序简单,显示稳定,但是占用端口比较多;动态显示所使用的端口比较少,可以节省单片机的I/O口。
在设计中,我们采用LED动态显示,用P0口驱动显示。
由于P0口的输出级是开漏电路,用它驱动时需要外接上拉电阻才能输出高电平。
电路图如下所示:
图4显示电路
6.键盘电路
在按键电路中,我们可以在I/O口上直接接按键,或者通过I/O口设计一个键盘,然后通过键盘扫描程序判断是否有键按下等。
键盘扫描电路节省I/O口,但编程有些复杂,在这里,由于我们所用的按键较少,且系统是一个小系统,有足够的I/O口可以使用,为了使程序简化,我们采用按键电路,用部分P3口做开关,P3.3为开始停止,P3.4为清零,用外部中断INT1开始,另外用软件法消除抖动。
电路图如下所示:
图5键盘电路
硬件主电路图设计
用pretues画出其硬件主电路图如下:
3、电子秒表的软件程序设计
1、软件设计概述
在软件设计中,一般采用模块化的程序设计方法,它具有明显的优点。
把一个多功能的复杂的程序划分为若干个简单的、功能单一的程序模块,有利于程序的设计和调试,有利于程序的优化和分工,提高了程序的阅读性和可靠性,使程序的结构层次一目了然。
应用系统的程序由包含多个模块的主程序和各种子程序组成。
各程序模块都要完成一个明确的任务,实现某个具体的功能,在具体需要时调用相应的模块即可。
功能描述:
用LCD1602液晶显示"秒表",显示时间为0.00.00—4.59.99秒,每秒自动加1;一个"开始""暂停"键,一个"清零"键。
2、主程序流程图
这里采用顺序结构,通过对按键的扫描,判断要实现什么功能。
如下所示:
(程序)
;定义计时单元地址
MINEQU31H;存放分钟变量
SECEQU32H;存放秒钟变量
DEDAEQU33H;存放10ms计数值
;按键端口状况值
K1_NEQU34H;存放按键当前端口状况值
K1_PEQU35H;存放按键上次端口状况值
K1_CEQU37H;存放按键计数单元
XEQU36H;LCD地址变量
;按键引脚定义
K1EQUP3.3;按键1引脚定义
K2EQUP3.4;按键2引脚定义
;LCD引脚定义
RSEQUP3.5;LCDRS引脚定义
RWEQUP3.6;LCDRW引脚定义
EEQUP3.7;LCDRS引脚定义
ORG0000H;程序由地址0开始执行
JMPMAIN
ORG0BH;定时器0中断地址设置
JMPT0_INT
;―――――――――――――主程序――――――――――――――
MAIN:
;开始
MOVSP,#60H;堆栈指针指向60H
CLRE;E=0,禁止读/写LCD
ACALLSET_LCD;调LCD控制子程序
ACALLINIT;初始化变量
MOVK1_P,#01H;按键上次端口设置1
ACALLINIT_TIMER;调用初始化定时器
ACALLMEU;调用工作菜单子程序
LOOP:
ACALLCONV;时间计数处理
ACALLLOOP1;调用清零键子程序
ACALLKEY;判断是否有键按下
JZLOOP;无键按下转LOOP
MOVK1_P,K1_N;交换数据
ACALLKEY0;调用按键功能子程序
JMPLOOP;跳LOOP处循环
;初始变量清零子程序
INIT:
;初始变量清零
CLRA;A清为零
MOVK1_C,A;K1_C初始为0
MOVDEDA,A;百分秒DEDA初始为0
MOVSEC,A;秒SEC初始为0
MOVMIN,A;分MIN初始为0
MOVK1_N,A;K1_N初始为0
MOVK1_P,A;K1_P初始为0
CLRTR0;启动中断
RET
;―――――――――――――――――――――
;定时器初始化设置子程序
INIT_TIMER:
;定时器初始化
MOVTMOD,#00000001B;定时器0模式1
MOVIE,#10000010B;开通中断
MOVTL0,#LOW(65536-10000);定时初值装入低位
MOVTH0,#HIGH(65536-10000);定时初值装入高位
RET
;中断服务程序
T0_INT:
;定时器T0中断程序
PUSHACC;入栈保护
MOVTL0,#LOW(65536-10000);重加载
MOVTH0,#HIGH(65536-10000)
INCDEDA
MOVA,DEDA;10ms计数值加1
CJNEA,#100,TT
MOVDEDA,#0
INCSEC;秒加1
MOVA,SEC
CJNEA,#60,TT
INCMIN;分加1
MOVSEC,#0
MOVA,MIN
CJNEA,#05,TT
MOVDEDA,#0;百、分、秒单元清0
MOVSEC,#0
MOVMIN,#0
TT:
POPACC;出栈
RETI;中断程序返回
;―――――――――――――――――――――
;判断键是否按下子程序
LOOP1:
JBK2,LOOP2;判清零键是否按下
JMPMAIN;跳转主程序处
LOOP2:
RET
;判断K1键是否按下
KEY:
CLRA;A清零
MOVK1_N,A;A值送入K1_N
MOVC,K1;K1值送入C
RLCA;同进位标志左移一位
ORLK1_N,A;两个位作逻辑OR运算
MOVA,K1_N;K1_N值送入A
XRLA,K1_P;有键按下,A中内容不为零
RET
;功能键子程序
;K1键第一次按功能子程序
KEY0:
MOVA,K1_P;K1_P值送入A
JBACC.0,KEY3;A的0位是1,转KEY3
INCK1_C;K1_C加1
MOVA,K1_C;K1_C值送入A
CJNEA,#01H,KEY1;K1键是否第一次按?
MOVDPTR,#MENU1;是,存入MENU1信息
MOVA,#1;设置第一行显示
CALLLCD_PRINT;调用显示字符子程序
SETBTR0;启动中断
RET
;K1键第二次按功能子程序
KEY1:
MOVA,K1_C;K1_C值送入A
CJNEA,#02H,KEY2;K1键是否第二次按?
MOVDPTR,#MENU2;是,存入MENU2信息
MOVA,#1;设置第一行显示
CALLLCD_PRINT;调用显示字符子程序
CLRTR0;停止中断
RET;
;K1键第三次按功能子程序
KEY2:
MOVA,K1_C;K1_C值送入A
CJNEA,#03H,KEY3;K1键是否第三次按?
MOVDPTR,#MENU3;是,存入MENU3信息
MOVA,#1;设置第一行显示
CALLLCD_PRINT;调用显示字符子程序
SETBTR0;启动中断
RET
;K1键第四按功能子程序
KEY3:
MOVA,K1_C;K1_C值送入A
CJNEA,#04H,KEY4;K1键是否第四次按?
MOVDPTR,#MENU4;是,存入MENU4信息
MOVA,#1;设置第一行显示
CALLLCD_PRINT;调用显示字符子程序
CLRTR0;启动中断
KEY4:
RET;子程序返回
;―――――――――――――LCD显示――――――――――――――
;LCD控制子程序
SET_LCD:
;
CLRE
ACALLINIT_LCD;初始化LCD
MOVR5,#10
ACALLDELAY
MOVDPTR,#LMESS1;指针指到显示消息1
MOVA,#1;显示在第一行
ACALLLCD_PRINT;调用显示字符子程序
MOVDPTR,#LMESS2;指针指到显示消息2
MOVA,#2;显示在第二行
ACALLLCD_PRINT;调用显示字符子程序
RET
LMESS1:
DB"",0;LCD第一行显示消息
LMESS2:
DB"TIME",0;LCD第二行显示消息
;LCD初始化子程序
INIT_LCD:
MOVA,#38H;设置8位、2行、5x7点阵
ACALLWR_COMM;调用写指令子程序
ACALLDELAY1;调用延时子程序
MOVA,#0CH;开显示,光标不闪烁
ACALLWR_COMM;调用写指令子程序;
ACALLDELAY1;调用延时子程序
MOVA,#01H;清除LCD显示屏
ACALLWR_COMM;调用写指令子程序;
ACALLDELAY1;调用延时子程序
RET
;写指令子程序
WR_COMM:
MOVP1,A
CLRRS;RS=0,选择指令寄存器
CLRRW;RW=0,选择写模式
SETBE;E=1,允许读/写LCM
ACALLDELAY1;调用延时子程序
CLRE;E=0,禁止读/写LCM
RET
;写数据子程序
WR_DATA:
MOVP1,A
SETBRS;RS=1,选择数据寄存器
CLRRW;RW=0,选择写模式
SETBE;E=1,允许读/写LCD
ACALLDE;调用延时子程序
CLRE;E=0,禁止读/写LCD
ACALLDE;调用延时子程序
RET
;清除该行LCD的字符
CLR_LINE:
MOVR0,#24
CL1:
MOVA,#''
ACALLWR_DATA
DJNZR0,CL1
RET
;LCD存入工作菜单
MEU:
MOVDPTR,#MENU0;存入工作菜单
MOVA,#1;第一行
CALLLCD_PRINT
RET
;工作菜单
MENU0:
DB"SECOND-CLOCK0",0
MENU1:
DB"BEGINCOUNT1",0
MENU2:
DB"PAUSTCOUNT2",0
MENU3:
DB"BEGINCOUNT3",0
MENU4:
DB"PAUSTCOUNT4",0
;菜单显示子程序
;一行、二行显示字符
LCD_PRINT:
CJNEA,#1,LINE2;判断是否为第一行
LINE1:
ACALLCLR_LINE;清除该行字符数据
MOVA,#80H;设置LCD的第一行地址
ACALLWR_COMM;写入命令
JMPFILL
LINE2:
ACALLCLR_LINE;清除该行字符数据
MOVA,#0C0H;设置LCD的第二行地址
ACALLWR_COMM
FILL:
CLRA;填入字符
MOVCA,@A+DPTR;由消息区取出字符
CJNEA,#0,LC1;判断是否为结束码
RET
;写入数据
LC1:
ACALLWR_DATA
INCDPTR;指针加1
JMPFILL;继续填入字符
RET
;转换数据子程
CONV:
;转换为ASCII码并显示
MOVX,#5;设置位置
ACALLSKOW_LINE2;显示数据
INCX;
MOVA,#':
';
MOVB,X;
ACALLLCDP2;
MOVA,MIN;加载分钟数据
INCX;设置位置
ACALLSKOW_LINE2;显示数据
INCX;
MOVA,#':
';
MOVB,X;
ACALLLCDP2;
MOVA,SEC;加载秒数数据
INCX;设置位置
ACALLSKOW_LINE2;显示数据
INCX;
MOVA,#':
';
MOVB,X;
CALLLCDP2;
MOVA,DEDA;加载秒数数据
INCX;设置位置
ACALLSKOW_LINE2;显示数据
RET;
;在LCD的第二行显示数字
SKOW_LINE2:
MOVB,#10;设置被除数
DIVAB;结果A存商数,B存余数
ADDA,#30H;A为十位数,转换为字符
PUSHB;B放入堆栈暂存
MOVB,X;设置LCD显示的位置
ACALLLCDP2;由LCD显示出来
POPB;出栈
MOVA,B;B为个位数
ADDA,#30H;转换为字符
INCX;LCD显示位置加1
MOVB,X;设置LCD显示的位置
ACALLLCDP2;由LCD显示出来
RET
;在LCD的第二行显示字符
LCDP2:
PUSHACC;
MOVA,B;设置显示地址
ADDA,#0C0H;设置LCD的第二行地址
CALLWR_COMM;写入命令
POPACC;由堆栈取出A
CALLWR_DATA;写入数据
RET
;延时10MS
DELAY:
MOVR6,#50
D1:
MOVR7,#100
DJNZR7,$
DJNZR6,D1
DJNZR5,DELAY
RET
;延时5MS子程序
DELAY1:
MOVR6,#25
DEY:
MOVR7,#100
DJNZR7,$
DJNZR6,DEY
RET
;延时500微秒
DE:
DJNZR7,$
RET
END;程序结束
4、心得体会
先在网上查阅了一些有关电子秒表设计的材料,熟悉了设计思想与工作原理,并且具体的分析了单片机、数码管显示器的工作过程,从理论上分析了该工作过程。
在理解了该系统的工作原理并完成电路图的设计,由于我们没有设计经验,通过查阅一些资料,我们的设计渐渐有了头绪,基本确立设计方案和流程图。
通过这次设计,我学到了很多知识,将学习的理论知识通过实验融会贯通,让我对它的理解更加深刻。
由于这次课程设计不仅设计编程方面的知识,还涉及了其它学科的知识,例如PROTEUS等的基本知识。
总之,通过这次课程设计,不仅加深了我对单片机理论方面的理解,将理论更好的运用的实践方面,而且锻炼了我们各方面的能力,培养了坚强的毅力和做事的耐心和细心,我想这会为今后自己踏上工作岗位、打下良好的基础。