实验三、定时器/计数器实验
林立强 1000850116
一、实验目的
1、了解MCS-51单片机定时/计数器的基本结构、工作原理和工作方式。
2、掌握定时/计数器工作在定时器和计数器两种方式下的编程方法。
3、掌握数码管显示电路的驱动原理及编程方法。
二、实验内容
1、编写单片机程序,用 T0 作定时器产生周期为 1 秒的方波(用查询方式
编程),从 P3.6,P3.7 口输出,将 P3.7 接到示波器显示该方波波形;用 T1 作计
数器对从 P3.6 输出的方波进行计数,计数结果通过 P1口输出到发光二极管显
示。(计算机仿真)
2、编写单片机程序,用 T0 作定时器产生周期为 1 秒的方波(用查询方式编
程),从 P3.6,P3.7 口输出,将 P3.6 输出的方波接到 P3.5 口通过 T1 作计数器
对该方波进行计数,计数值由 LED 显示,用存储示波器显示 P3.7 输出的方波。(实
验台验证)
3、设计一个 60 秒计时器,秒计时结果用两位 LED 数码管显示。(计算机仿
真)
4、选做:设置按键控制计时器的启、停及清零功能。
三、实验原理
电路原理图如下,所需元件为:AT89C52、LED-YELLOW、7SEG-COM-CAT-GRN
当晶振为 12.000Mhz 时,一个机器周期为 1 微秒,要实现 500 毫秒的定时,
需要 500000 个机器周期,对于 51 单片机内部定时器来说,最大只能定时 65536
个机器周期,定时 65.536 毫秒,不能满足要求,为此必须借助软件循环进行扩
展。实现的方法是:用定时器中断定时 10 毫秒,再用软件扩展 50 倍即可得到
500 毫秒的定时。当到达 500 毫秒时,对 P3.7 输出取反,可得到周期为 1 秒的方
波。
选择模式 1,每个 10ms 中断一次,设初值为 X,根据下面公式,可求得 X
的值。
(216-计数初值)*机器周期=定时时间
16
2(
X
)
12
1184
.22
6
10
10
10
3
有关定时计数器的特殊功能寄存器,请参考课本。
选择模式 1,每个 10ms 中断一次,设初值为 X,根据下面公式,可求得 X
的值。
(216-计数初值)*机器周期=定时时间
16
2(
X
)
12
000.12
6
10
10
10
3
有关定时计数器的特殊功能寄存器,请参考课本。
秒计时器的显示器件为七段 LED 共阴数码管,电路如图所示:
七段LED共阴数码管的段码表如表:
数字
段码
0
1
2
3
4
5
6
7
8
9
3FH
06H
5BH
4FH
66H
6DH
7DH
07H
7FH
6FH
四、实验步骤:
1、用 KEIL 软件编写、汇编、调试给定内容的有关程序,并生成 HEX 文件;
2、用 Proteus 对单片机硬件电路图进行仿真;
3、下载到单片机实验板上验证有关程序。
五、实验接线
1、从 J2 插座将单片机芯片的 P3.7 引出接示波器的信号输入端,示波器的
接地端接 POW 插针的 GND(注意不要接到 5V),或者将 P3.7 引出接 J7 插座的
任意一个插针(用二极管显示方波)。
2、将单片机芯片的 P3.6 和 P3. 5 相连(J2 插座),
仿真图:
源程序:
ORG 0000H
START: MOV TMOD,#01010001
//TR0 定时 TR1 计数
MOV TL0,#0B0H //定时 50ms 初值 3CB0
MOV TH0,#3CH
MOV DPTR,#TAB
MOV R0,#10
SETB TR1
SETB TR0
SETB P3.4
SETB P3.3
//调用显示函数
//检测 P3.4:1 启动,0 停止计数
//检测 P3.3:0 清零
LOOP1: JBC TF0,PTFO
ACALL PLAY1
ACALL PLAY2
JB P3.4,QID
CLR TR0
JB P3.3,LOOP1
ACALL QINGL
AJMP LOOP1
SETB TR0
AJMP PDQL
PDQL:
QID:
PTFO: MOV TL0,#0B0H //定时 50ms 初值 3CB0
MOV TH0,#3CH
//没到 10 次继续
//计数 10 次结束,R0 重新赋值
DJNZ R0,LOOP1
MOV R0,#10
CPL P3.7
CPL P3.6
AJMP LOOP1
PLAY1: ACALL READ //显示 1,点亮 P1 口的二极管
MOV P1,R7
RET
PLAY2: ACALL READ //显示 2,数码管显示
ACALL TURN
CLR A
MOV P2,#00H //P2 输入前要清零,否则会显示乱码
MOV A,R6
MOVC A,@A+DPTR
MOV P2,A
SETB P0.1
CLR P0.0
//ACALL DELAY
CLR A
MOV P2,#00H //P2 输入前要清零,否则会显示乱码
MOV A,R5
MOVC A,@A+DPTR
MOV P2,A
SETB P0.0
CLR P0.1
//ACALL DELAY
RET
//1000
TURN: MOV A,R7
MOV B,#10
DIV AB
MOV R6,A
MOV R5,B
RET
READ: MOV A,TL1
//读取计数次数存于 R1
MOV R7,A
CJNE A,#60,TC //计时六十秒
ACALL QINGL
RET
TC:
QINGL: MOV TH1,#00H
MOV TL1,#00H
MOV R7,#00H //清零
//清零
CLR A
//清零
//清零
RET
DELAY: MOV R1,#2
LOOP: MOV R2,#250
DJNZ R2,$
DJNZ R1,LOOP
RET
// 2uS
// 2uS
// 4uS
// 4uS
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
// 0
1
2
3
4
5
6
7
8
9
END