定时器中断实验 - 电子钟 - 图文

更新时间:2024-01-26 04:07:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

计算机科学与技术系

实 验 报 告

专业名称 计算机科学与技术 课程名称 单片机原理与应用 项目名称 定时器/中断实验——电子钟

班 级

学 号 姓 名

同组人员 无

实验日期 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 ;显示十位的分

不能放在这 否则出现

MOV DAT,R1

LCALL SEND_LED

MOV ADDR,#01H MOV A,HOUR MOV B,#10 ;有误 DIV AB MOV R1,A MOV DAT,B

LCALL SEND_LED

MOV ADDR,#00H MOV DAT,R1

LCALL SEND_LED

MOV ADDR,#07H MOV A,KEY MOV B,#10 DIV AB MOV DAT,B MOV R1,A

LCALL SEND_LED

MOV ADDR,#06H MOV DAT,R1

LCALL SEND_LED RET SEND_LED:

MOV DPTR, #SEG_ADDR MOV A,ADDR

MOVC A,@A+DPTR LCALL WR_595

MOV DPTR, #SEG_DAT MOV A,DAT

MOVC A,@A+DPTR LCALL WR_595 LCALL OUT_595 RET OUT_595:

CLR STCP_595 //; NOP NOP

SETB STCP_595 RET WR_595:

;显示个位的时 ;显示十位的时 ;显示个位的按键数 ;显示十位的按键数存储寄存器输入

MOV R5,#8H ;数码管的8位 LOOP1: RLC A ;带进位位左移 MOV DS_595,C //;送数据进595 //;移位寄存器时钟,根据DATASHEET,送数据进去要一个SCK时钟周期。 CLR SHCP_595 NOP NOP

SETB SHCP_595

DJNZ R5,LOOP1 //;8位数据是否送完 DJNZ只能处理寄存器和地址 RET DELAY:;12MS: MOV R5,#48 DEL:

MOV R6,#250 DJNZ R6,$ DJNZ R5,DEL RET

/*CLR_595:

MOV A,#0FFH LCALL WR_595 MOV A,#0FFH LCALL WR_595 LCALL OUT_595 RET*/

SEG_DAT : DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H SEG_ADDR: DB 01H,02H,04H,08H,10H,20H,40H,80H END

四、实验运行效果及说

五、实验分析与小结

实验时,要注意线路的正确连接,要注意定时器T0的工作方式寄存器TMOD和控制寄存器TCON的使用方法,有效的启动T0的工作,要明白中断的意义,何时执行中断子程序,并且执行时,要注意堆栈的保护断点和恢复断点的功能,计数时,达到99时,要重新置零;显示定时和计数时,要实时通过SEND_LED子程

序向LED数码显示管输送数据,并显示出来。通过本次实验,让我对中断和定时器T0的使用有了进一步的认识,并在以后的单片机实验中,要学会正确的使用中断程序和T0定时器,加深对它们的理解。

六、其它

得分(百分制)

本文来源:https://www.bwwdw.com/article/34zw.html

Top