单片机定时器试验x
实验 实验目的 三单片机内部定时器应用 1、理解单片机内部定时器的工作原理及使用方法 2、了解单片机定时中断程序的编写和调试方法 3、掌握定时器的基本使用方法 实验仪器 单片机开发板、万利仿真机、稳压电源、计算机 实验原理 1、 单片机定时器的工原理 MCS-51 单片机内部有两个16 位可编程的定时器 可用作计数器方式。其中 工作于定时器方式时,通过对机器周期(新型 时器每隔( 1/12MHZ)× 12=1us 加 1。 工作于计数器方式时,对或 管脚的负跳变(1→0)计数。它在每个机器周期的 1/24 。 S5P2 时采样外 部输入,当采样值在这个机器周期为高,在下一个机器周期为低时,计数器加 周期来识别一个有效跳变,故最高计数频率为晶振频率的 如图 4-7 所示。 图 4-7 定时器模式控制字格式 TCON 寄存器用于定时器的计数控制和中断标志。如图 编写程序控制这两个寄存器就可以控制定时器的运行方式。 单片机内部定时器 / 计数器的使用,简而概之: ( 1)如需用中断,则将 EA 和相关中断控制位置 1;( 2) 根据需要设置工作方式,即对 TMOD 设置;(3)然后启动计数,即对 TR0 或 TR1 置 1。(4)如使用中 断,则计数溢出后硬件会自动转入中断入口地址;如使用查询,则必须对溢出中断标志位 进行判断。 2、 用定时器编写一个秒计时器 假设系统使用的晶振频率为12MHZ,即每个机器周期为 1us 。如使用方式 1,则定时时间最长是 216 / 计数器 T0 和 T1。它们即可用作定时器方式,又 T0 由 TH0 和 TL0 计数器构成; T1 由 TH1 和 TL1 计数器构成。 51 单片机可以对振荡周期计数)的计数,即每一个 12MHZ,则定机器周期定时器加1,来实现定时。故系统晶振频率直接影响定时时间。如果晶振频率为 1。因此需要两个机器 特殊功能寄存器TMOD 用于定时器 / 计数器的方式控制。高4 位用于设置 T1,低 4 位用于设置 T0。 4-8 所示。 图 4-8 定时控制寄存器数据格式 TF0 或 TF1 × 1us=65536us=,小于 1s 。故必须设置一个软件计数单元,即假设定时器定时中断时间为 50ms ,则必须定 时中断 20 次才达到 1s 并对秒计时单元加 1, 20 即为软件计数次数。最后再把秒计时单元的值转成显示数码送 显示缓冲区。 主程序 定时器中断服务程序 图 4-9定时器应用程序流程图 实验内容 初始化中断控制器,定 1、单片机定时器秒计时器 保护现场 N LEDCLK BIT ; 时器,软件初值, 显示软件计数 -1=0 ? 缓冲区 Y 秒计时器加 1,转成显 启动定时器示数据并送显示 恢复现场 LEDDIN BIT ; LEDDATA DATA P0; DSEG AT 30H dispbuf: ds 8; timetick: ds 1 second:ds 1 minute:ds 1 hour:ds 1 显示缓冲区 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; 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 P_T01:MOV A,second 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 RET; Delay1ms: push 07 mov R7,#250 R7,D1 延时子程序 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 秒倒计时器( 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 LJMPP_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 为学号后两位) N。倒计时时间到后,重新开始计时。 MOV @R0,A DEC R0 MOV A,B