文档库 最新最全的文档下载
当前位置:文档库 › 单片机定时器实验

单片机定时器实验

单片机定时器实验
单片机定时器实验

实验三单片机内部定时器应用

实验目的

1、理解单片机内部定时器的工作原理及使用方法

2、了解单片机定时中断程序的编写和调试方法

3、掌握定时器的基本使用方法

实验仪器

单片机开发板、万利仿真机、稳压电源、计算机

实验原理

1、单片机定时器的工原理

MCS-51 单片机内部有两个16 位可编程的定时器/计数器T0 和T1。它们即可用作定时器方式,又可用作计数器方式。其中T0 由TH0 和TL0 计数器构成;T1 由TH1 和TL1 计数器构成。

|

工作于定时器方式时,通过对机器周期(新型51单片机可以对振荡周期计数)的计数,即每一个机器周期定时器加1,来实现定时。故系统晶振频率直接影响定时时间。如果晶振频率为12MHZ,则定时器每隔(1/12MHZ)×12=1us 加1。

工作于计数器方式时,对或管脚的负跳变(1→0)计数。它在每个机器周期的S5P2 时采样外部输入,当采样值在这个机器周期为高,在下一个机器周期为低时,计数器加1。因此需要两个机器周期来识别一个有效跳变,故最高计数频率为晶振频率的1/24。

特殊功能寄存器TMOD 用于定时器/计数器的方式控制。高4 位用于设置T1,低4 位用于设置T0。如图4-7所示。

图4-7 定时器模式控制字格式

{

TCON 寄存器用于定时器的计数控制和中断标志。如图4-8所示。

图4-8 定时控制寄存器数据格式

编写程序控制这两个寄存器就可以控制定时器的运行方式。

单片机内部定时器/计数器的使用,简而概之:(1)如需用中断,则将EA和相关中断控制位置1;(2)根据需要设置工作方式,即对TMOD设置;(3)然后启动计数,即对TR0或TR1

置1。(4)如使用中断,则计数溢出后硬件会自动转入中断入口地址;如使用查询,则必须对溢出中断标志位TF0或TF1进行判断。

2、 用定时器编写一个秒计时器

(

假设系统使用的晶振频率为12MH Z ,即每个机器周期为1us 。如使用方式1,则定时时间最长是216×1us=65536us=,小于1s 。故必须设置一个软件计数单元,即假设定时器定时中断时间为50ms ,则必须定时中断20次才达到1s 并对秒计时单元加1,20即为软件计数次数。最后再把秒计时单元的值转成显示数码送显示缓冲区。

^

图4-9 定时器应用程序流程图 |

实验内容

1、单片机定时器秒计时器

LEDCLK BIT ;

LEDDIN BIT ;

LEDDATA DATA P0;

DSEG AT 30H

dispbuf: ds 8;显示缓冲区

timetick: ds 1

second: ds 1

(

minute: ds 1

hour: ds 1

TIMECOUNT EQU 50000

CSEG at 0000H

SJMP MAIN

ORG 000BH

LJMP P_T0

ORG 0030;中断服务程序

P_T0:

PUSH PSW

!

PUSH ACC

PUSH DPH

PUSH DPL

MOV TH0,#(65535-TIMECOUNT)/256

MOV TL0,#(65535-TIMECOUNT)MOD 256

SETB RS0;后面所使用的R0~r7

DJNZ timetick,P_T02

MOV timetick,#20

INC second

; cjne second,#60,P_T01

; MOV SECOND,#0

; inc minute;

P_T01: MOV A,second

MOV B,#100

DIV AB

MOV R0,#dispbuf+2

MOV @R0,A

DEC R0

MOV A,B

MOV B,#10

.

DIV AB

MOV @R0,A

DEC R0

MOV @R0,B

P_T02: CLR RS0

POP DPL

POP DPH

POP ACC

POP PSW

RETI

MAIN:

mov sp,#60h

MOV dispbuf,#0

MOV dispbuf+1,#0

MOV dispbuf+2,#0

MOV dispbuf+3,#0

MOV dispbuf+4,#0

MOV dispbuf+5,#0

MOV dispbuf+6,#0

MOV dispbuf+7,#0

-

MOV TH0,#(65535-TIMECOUNT)/256;3CAF

MOV TL0,#(65535-TIMECOUNT)MOD 256;

MOV TMOD,#01H;设定定时器的工作方式

SETB ET0;允许T0溢出中断

SETB TR0;启动t0

SETB EA;开启总中断

MAIN1:

ACALL DISP

SJMP MAIN1

DISP:

MOV R6,#8

MOV R0,#dispbuf

CLR LEDCLK

CLR LEDDIN

NOP

DISP1: SETB LEDCLK

MOV A,@R0

MOV DPTR,#LEDTAB

MOVC A,@A+DPTR

MOV LEDDATA,A;

MOV R7,#5

ACALL DelayNms

INC R0

SETB LEDDIN

CLR LEDCLK

DJNZ R6,DISP1

RET; 大延时

DelayNms:

D1: ACALL Delay1ms

DJNZ R7,D1

@

RET; 延时子程序

Delay1ms:

push 07

mov R7,#250

delay1:

NOP

NOP

DJNZ R7,delay1

POP 07

RET

$

LEDTAB:DB 03H,9FH,25H,0DH;0,1,2,3

DB 99H,49H,41H,1FH;4,5,6,7

DB 01H,09H,11H,0C1H;8,9,A,B

DB 63H,85H,61H,71H;C,D,E,F

END

2、修改上面的程序,设计一个N秒倒计时器(N为学号后两位)。倒计时时间到后,重新开始计时。

LEDCLK BIT ;

LEDDIN BIT ;

LEDDATA DATA P0;

.

DSEG AT 30H

dispbuf: ds 8;显示缓冲区

timetick: ds 1

second: ds 1

minute: ds 1

hour: ds 1

TIMECOUNT EQU 50000

CSEG at 0000H

SJMP MAIN

ORG 000BH

'

LJMP P_T0

ORG 0030H;中断服务程序

P_T0:

PUSH PSW

PUSH ACC

PUSH DPH

PUSH DPL

MOV TH0,#(65535-TIMECOUNT)/256

MOV TL0,#(65535-TIMECOUNT)MOD 256

SETB RS0;后面所使用的R0~r7

\

DJNZ timetick,P_T01

MOV timetick,#20

dec second

MOV A,second

CJNE A,#00,P_T01

MOV SECOND,#33

P_T01: MOV A,second

MOV B,#100

!

DIV AB

MOV R0,#dispbuf+2

MOV @R0,A

DEC R0

MOV A,B

MOV B,#10

DIV AB

MOV @R0,A

DEC R0

MOV @R0,B

CLR RS0

POP DPL

POP DPH

POP ACC

POP PSW

RETI

MAIN:

mov sp,#60h

MOV dispbuf,#0

MOV dispbuf+1,#0

~

MOV dispbuf+2,#0

MOV dispbuf+3,#0

MOV dispbuf+4,#0

MOV dispbuf+5,#0

MOV dispbuf+6,#0

MOV dispbuf+7,#0

mov timetick,#20

mov second,#33

MOV TH0,#(65535-TIMECOUNT)/256;3CAF

MOV TL0,#(65535-TIMECOUNT)MOD 256;(

MOV TMOD,#01H

SETB ET0;允许T0溢出中断

SETB TR0;启动t0

SETB EA;开启总中断

MAIN1:

ACALL DISP

SJMP MAIN1

DISP:

MOV R6,#8

MOV R0,#dispbuf

·

CLR LEDCLK

CLR LEDDIN

NOP

DISP1: SETB LEDCLK

MOV A,@R0

MOV DPTR,#LEDTAB

MOVC A,@A+DPTR

MOV LEDDATA,A;

MOV R7,#5

ACALL DelayNms

INC R0

SETB LEDDIN

CLR LEDCLK

DJNZ R6,DISP1

RET; 大延时

DelayNms:

D1: ACALL Delay1ms

DJNZ R7,D1

RET; 延时子程序

Delay1ms:

push 07

mov R7,#250

delay1:

NOP

NOP

DJNZ R7,delay1

POP 07

RET

LEDTAB: DB 03H,9FH,25H,0DH;0,1,2,3

DB 99H,49H,41H,1FH;4,5,6,7、

DB 01H,09H,11H,0C1H;8,9,A,B

DB 63H,85H,61H,71H;C,D,E,F END

思考题

1、在实验程序基础上编写一个24小时计时时钟。

LEDCLK BIT ;

LEDDIN BIT ;

LEDDATA DATA P0;

DSEG AT 30H

dispbuf: ds 8;显示缓冲区

|

timetick: ds 1

second: ds 1

minute: ds 1

hour: ds 1

TIMECOUNT EQU 50000

CSEG at 0000H

SJMP MAIN

ORG 000BH

LJMP P_T0

ORG 0030H;中断服务程序

~

P_T0:

PUSH PSW

PUSH ACC

PUSH DPH

PUSH DPL

MOV TH0,#(65535-TIMECOUNT)/256

MOV TL0,#(65535-TIMECOUNT)MOD 256

SETB RS0;后面所使用的R0~r7

DJNZ timetick,P_T02

MOV timetick,#20

~

INC second

MOV A,second

CJNE A,#60,P_T01;秒

MOV SECOND,#0

inc minute;

MOV A,minute;分

CJNE A,#60,P-T01

INC HOUR;时

MOV A,HOUR

CJNE A,#12,P-T01

MOV HOUR,#0

P_T01: MOV A,second

MOV B,#100

DIV AB

MOV R0,#dispbuf+2

MOV @R0,A

DEC R0

MOV A,B

MOV B,#10

DIV AB

!

MOV @R0,A

DEC R0

MOV @R0,B

P_T02: CLR RS0

POP DPL

POP DPH

POP ACC

POP PSW

RETI

MAIN:

&

mov sp,#60h

MOV dispbuf,#0

MOV dispbuf+1,#0

MOV dispbuf+2,#0

MOV dispbuf+3,#0

MOV dispbuf+4,#0

MOV dispbuf+5,#0

MOV dispbuf+6,#0

MOV dispbuf+7,#0

MOV TH0,#(65535-TIMECOUNT)/256;3CAF 《

MOV TL0,#(65535-TIMECOUNT)MOD 256;

MOV TMOD,#01H;设定定时器的工作方式SETB ET0;允许T0溢出中断

SETB TR0;启动t0

SETB EA;开启总中断

MAIN1:

ACALL DISP

SJMP MAIN1

DISP:

MOV R6,#8

;

MOV R0,#dispbuf

CLR LEDCLK

CLR LEDDIN

NOP

DISP1: SETB LEDCLK

MOV A,@R0

MOV DPTR,#LEDTAB

MOVC A,@A+DPTR

MOV LEDDATA,A;

MOV R7,#5

ACALL DelayNms

INC R0

SETB LEDDIN

CLR LEDCLK

DJNZ R6,DISP1

RET; 大延时

DelayNms:

D1: ACALL Delay1ms

DJNZ R7,D1

RET; 延时子程序

Delay1ms:

push 07

mov R7,#250

delay1:

NOP

NOP

DJNZ R7,delay1

POP 07

RET

LEDTAB: DB 03H,9FH,25H,0DH;0,1,2,3

DB 99H,49H,41H,1FH;4,5,6,7

DB 01H,09H,11H,0C1H;8,9,A,B

DB 63H,85H,61H,71H;C,D,E,F

END

2、说说把显示程序放在主程序和定时中断程序的优缺点。

答:显示程序放在主程序时会一直占用空间执行,但执行速度比较快

显示程序放在中断程序是通过中断服务程序中被调用而执行的,每中断一次调用一次,故执行耗时间。

相关文档