计算机科学与技术系
实 验 报 告
专业名称 计算机科学与技术 课程名称 单片机原理与应用 项目名称 定时器/中断实验——电子钟
班 级
学 号 姓 名
同组人员 无
实验日期 2016年4月8号
一、实验目的与要求
熟悉MCS51类cpu的定时器、中断系统编程方法、了解定时器的应用、实时程序的设计和调试技巧。
二、实验内容
2.1 实验完成内容
1、编写一个时钟程序,使用单片机定时器1产生一个50ms的定时中断,对定时中断计数,将时、分、秒显示在数码管上。
2、将单片机的P3.5口与独立按键K1相连。要求通过计数器对按键按压次数进行计数,并将计数结果显示在LED上,或者通过外部中断实现按键计数。要求显示范围为0-99。记满后从零开始重新计数。
2.2 芯片选型
ATMEL89C51单片机、LED数码显示管、独立按键
2.3 电路原理图
2.4 关键资源说明(所应用单片机内部资源及外围接口芯片的核心说明) 实验中用到了定时器T0,是由特殊功能寄存器TH0、TL0构成。工作方式寄存器TMOD的低四位用于控制T0的工作方式和启动模式,定时器/计数器控制寄存器TCON的低四位同样用于控制T0的启停和计数溢出标志位。
2.5 程序流程图
三、实验程序
STCP_595 EQU P2.0 SHCP_595 EQU P2.1 DS_595 EQU P2.2
HOUR EQU 30H;存放小时变量 MIN EQU 31H;存放分钟变量 SEC EQU 32H;存放秒钟变量 COUNT EQU 33H;5ms计数加1 ADDR EQU 34H;位选 DAT EQU 35H;段选 KEY EQU 36H;键值 ORG 0000H LJMP MAIN ORG 0003H LJMP X0_INT ORG 000BH LJMP T0_INT ORG 0100H
MAIN:
LCALL UNIT_TIMER
START: ;初始化一次 LCALL DISPLAY LJMP START UNIT_TIMER:
MOV TMOD,#01H;定时器0工作方式1 MOV TH0, #60;赋初值 MOV TL0, #176
SETB TR0;启动定时器0
SETB ET0;打开定时器0开关 SETB EX0 SETB IT0
MOV COUNT,#0 MOV SEC, #0 MOV MIN, #0 MOV HOUR,#0 MOV R1, #0 MOV KEY, #0
SETB EA;打开总开关 RET ;返回
T0_INT: ;中断服务程序 (获取 时 分 秒) PUSH ACC; PUSH PSW
MOV TH0, #60;赋初值 MOV TL0, #176
INC COUNT;每隔50ms加1 POP PSW POP ACC RETI X0_INT:
PUSH ACC PUSH PSW
LCALL DELAY//延时12ms消抖 LCALL DELAY
JB INT0,RECOVER1;MOV C,F2H; ;CJNE C,#0,RECOVER INC KEY MOV A,KEY
CJNE A,#100,RECOVER1 ;CJNE A,#64H,RECOVER MOV KEY,#0 RECOVER1: POP PSW POP ACC
RETI DISPLAY:
MOV A,COUNT
CJNE A,#20,RECOVER MOV COUNT,#0 INC SEC MOV A, SEC
CJNE A, #60,RECOVER MOV SEC,#0 INC MIN MOV A,MIN
CJNE A,#60,RECOVER MOV MIN,#0 INC HOUR MOV A,HOUR
CJNE A,#24,RECOVER
MOV SEC,#0 ;秒钟变量清除为0 MOV MIN,#0 ;分钟变量清除为0 MOV HOUR,#0 ;小时变量清除为0 MOV A,KEY
;CJNE A,#100,RECOVER ;CJNE A,#64H,RECOVER 乱码
MOV KEY,#0
RECOVER: //每时每刻都显示 MOV ADDR,#05H MOV A,SEC ;显示个位的秒 MOV B,#10 ;出错,与10H区别 10H表示16 DIV AB MOV R1,A MOV DAT,B
LCALL SEND_LED
MOV ADDR,#04H ;显示十位的秒 MOV DAT,R1
LCALL SEND_LED
MOV ADDR,#03H ;显示个位的分 MOV A,MIN MOV B,#10 DIV AB MOV R1,A MOV DAT,B
LCALL SEND_LED
MOV ADDR,#02H ;显示十位的分
不能放在这 否则出现