logo资料库

单片机定时计数器.doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
实验三、定时器/计数器实验 林立强 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
分享到:
收藏