单片机定时器实验.docx

上传人:b****5 文档编号:5595476 上传时间:2022-12-28 格式:DOCX 页数:13 大小:39.78KB
下载 相关 举报
单片机定时器实验.docx_第1页
第1页 / 共13页
单片机定时器实验.docx_第2页
第2页 / 共13页
单片机定时器实验.docx_第3页
第3页 / 共13页
单片机定时器实验.docx_第4页
第4页 / 共13页
单片机定时器实验.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

单片机定时器实验.docx

《单片机定时器实验.docx》由会员分享,可在线阅读,更多相关《单片机定时器实验.docx(13页珍藏版)》请在冰豆网上搜索。

单片机定时器实验.docx

单片机定时器实验

CompanyDocumentnumber:

WUUT-WUUY-WBBGB-BWYTT-1982GT

 

单片机定时器实验

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

实验目的

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、用定时器编写一个秒计时器

假设系统使用的晶振频率为12MHZ,即每个机器周期为1us。

如使用方式1,则定时时间最长是216×1us=65536us=,小于1s。

故必须设置一个软件计数单元,即假设定时器定时中断时间为50ms,则必须定时中断20次才达到1s并对秒计时单元加1,20即为软件计数次数。

最后再把秒计时单元的值转成显示数码送显示缓冲区。

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

实验内容

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

LEDCLKBIT;

LEDDINBIT;

LEDDATADATAP0;

DSEGAT30H

dispbuf:

ds8;显示缓冲区

timetick:

ds1

second:

ds1

minute:

ds1

hour:

ds1

TIMECOUNTEQU50000

CSEGat0000H

SJMPMAIN

ORG000BH

LJMPP_T0

ORG0030;中断服务程序

P_T0:

PUSHPSW

PUSHACC

PUSHDPH

PUSHDPL

MOVTH0,#(65535-TIMECOUNT)/256

MOVTL0,#(65535-TIMECOUNT)MOD256

SETBRS0;后面所使用的R0~r7

DJNZtimetick,P_T02

MOVtimetick,#20

INCsecond

;cjnesecond,#60,P_T01

;MOVSECOND,#0

;incminute;

P_T01:

MOVA,second

MOVB,#100

DIVAB

MOVR0,#dispbuf+2

MOV@R0,A

DECR0

MOVA,B

MOVB,#10

DIVAB

MOV@R0,A

DECR0

MOV@R0,B

P_T02:

CLRRS0

POPDPL

POPDPH

POPACC

POPPSW

RETI

MAIN:

movsp,#60h

MOVdispbuf,#0

MOVdispbuf+1,#0

MOVdispbuf+2,#0

MOVdispbuf+3,#0

MOVdispbuf+4,#0

MOVdispbuf+5,#0

MOVdispbuf+6,#0

MOVdispbuf+7,#0

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

MOVTL0,#(65535-TIMECOUNT)MOD256;

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

SETBET0;允许T0溢出中断

SETBTR0;启动t0

SETBEA;开启总中断

MAIN1:

ACALLDISP

SJMPMAIN1

DISP:

MOVR6,#8

MOVR0,#dispbuf

CLRLEDCLK

CLRLEDDIN

NOP

DISP1:

SETBLEDCLK

MOVA,@R0

MOVDPTR,#LEDTAB

MOVCA,@A+DPTR

MOVLEDDATA,A;

MOVR7,#5

ACALLDelayNms

INCR0

SETBLEDDIN

CLRLEDCLK

DJNZR6,DISP1

RET;大延时

DelayNms:

D1:

ACALLDelay1ms

DJNZR7,D1

RET;延时子程序

Delay1ms:

push07

movR7,#250

delay1:

NOP

NOP

DJNZR7,delay1

POP07

RET

LEDTAB:

DB03H,9FH,25H,0DH;0,1,2,3

DB99H,49H,41H,1FH;4,5,6,7

DB01H,09H,11H,0C1H;8,9,A,B

DB63H,85H,61H,71H;C,D,E,F

END

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

倒计时时间到后,重新开始计时。

LEDCLKBIT;

LEDDINBIT;

LEDDATADATAP0;

DSEGAT30H

dispbuf:

ds8;显示缓冲区

timetick:

ds1

second:

ds1

minute:

ds1

hour:

ds1

TIMECOUNTEQU50000

CSEGat0000H

SJMPMAIN

ORG000BH

LJMPP_T0

ORG0030H;中断服务程序

P_T0:

PUSHPSW

PUSHACC

PUSHDPH

PUSHDPL

MOVTH0,#(65535-TIMECOUNT)/256

MOVTL0,#(65535-TIMECOUNT)MOD256

SETBRS0;后面所使用的R0~r7

DJNZtimetick,P_T01

MOVtimetick,#20

decsecond

MOVA,second

CJNEA,#00,P_T01

MOVSECOND,#33

P_T01:

MOVA,second

MOVB,#100

DIVAB

MOVR0,#dispbuf+2

MOV@R0,A

DECR0

MOVA,B

MOVB,#10

DIVAB

MOV@R0,A

DECR0

MOV@R0,B

CLRRS0

POPDPL

POPDPH

POPACC

POPPSW

RETI

MAIN:

movsp,#60h

MOVdispbuf,#0

MOVdispbuf+1,#0

MOVdispbuf+2,#0

MOVdispbuf+3,#0

MOVdispbuf+4,#0

MOVdispbuf+5,#0

MOVdispbuf+6,#0

MOVdispbuf+7,#0

movtimetick,#20

movsecond,#33

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

MOVTL0,#(65535-TIMECOUNT)MOD256;

MOVTMOD,#01H

SETBET0;允许T0溢出中断

SETBTR0;启动t0

SETBEA;开启总中断

MAIN1:

ACALLDISP

SJMPMAIN1

DISP:

MOVR6,#8

MOVR0,#dispbuf

CLRLEDCLK

CLRLEDDIN

NOP

DISP1:

SETBLEDCLK

MOVA,@R0

MOVDPTR,#LEDTAB

MOVCA,@A+DPTR

MOVLEDDATA,A;

MOVR7,#5

ACALLDelayNms

INCR0

SETBLEDDIN

CLRLEDCLK

DJNZR6,DISP1

RET;大延时

DelayNms:

D1:

ACALLDelay1ms

DJNZR7,D1

RET;延时子程序

Delay1ms:

push07

movR7,#250

delay1:

NOP

NOP

DJNZR7,delay1

POP07

RET

LEDTAB:

DB03H,9FH,25H,0DH;0,1,2,3

DB99H,49H,41H,1FH;4,5,6,7

DB01H,09H,11H,0C1H;8,9,A,B

DB63H,85H,61H,71H;C,D,E,F

END

思考题

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

LEDCLKBIT;

LEDDINBIT;

LEDDATADATAP0;

DSEGAT30H

dispbuf:

ds8;显示缓冲区

timetick:

ds1

second:

ds1

minute:

ds1

hour:

ds1

TIMECOUNTEQU50000

CSEGat0000H

SJMPMAIN

ORG000BH

LJMPP_T0

ORG0030H;中断服务程序

P_T0:

PUSHPSW

PUSHACC

PUSHDPH

PUSHDPL

MOVTH0,#(65535-TIMECOUNT)/256

MOVTL0,#(65535-TIMECOUNT)MOD256

SETBRS0;后面所使用的R0~r7

DJNZtimetick,P_T02

MOVtimetick,#20

INCsecond

MOVA,second

CJNEA,#60,P_T01;秒

MOVSECOND,#0

incminute;

MOVA,minute;分

CJNEA,#60,P-T01

INCHOUR;时

MOVA,HOUR

CJNEA,#12,P-T01

MOVHOUR,#0

P_T01:

MOVA,second

MOVB,#100

DIVAB

MOVR0,#dispbuf+2

MOV@R0,A

DECR0

MOVA,B

MOVB,#10

DIVAB

MOV@R0,A

DECR0

MOV@R0,B

P_T02:

CLRRS0

POPDPL

POPDPH

POPACC

POPPSW

RETI

MAIN:

movsp,#60h

MOVdispbuf,#0

MOVdispbuf+1,#0

MOVdispbuf+2,#0

MOVdispbuf+3,#0

MOVdispbuf+4,#0

MOVdispbuf+5,#0

MOVdispbuf+6,#0

MOVdispbuf+7,#0

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

MOVTL0,#(65535-TIMECOUNT)MOD256;

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

SETBET0;允许T0溢出中断

SETBTR0;启动t0

SETBEA;开启总中断

MAIN1:

ACALLDISP

SJMPMAIN1

DISP:

MOVR6,#8

MOVR0,#dispbuf

CLRLEDCLK

CLRLEDDIN

NOP

DISP1:

SETBLEDCLK

MOVA,@R0

MOVDPTR,#LEDTAB

MOVCA,@A+DPTR

MOVLEDDATA,A;

MOVR7,#5

ACALLDelayNms

INCR0

SETBLEDDIN

CLRLEDCLK

DJNZR6,DISP1

RET;大延时

DelayNms:

D1:

ACALLDelay1ms

DJNZR7,D1

RET;延时子程序

Delay1ms:

push07

movR7,#250

delay1:

NOP

NOP

DJNZR7,delay1

POP07

RET

LEDTAB:

DB03H,9FH,25H,0DH;0,1,2,3

DB99H,49H,41H,1FH;4,5,6,7

DB01H,09H,11H,0C1H;8,9,A,B

DB63H,85H,61H,71H;C,D,E,F

END

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

答:

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

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1