89C51单片机定时器所定时间的计算以及写法

合集下载

89C51单片机时钟程序

89C51单片机时钟程序

89C51单片机时钟程序第一篇:89C51单片机时钟程序SECOND EQU 40H;给内存RAM空间中40H单元起名SECOND MINUTE EQU 41H ;给内存RAM空间中41H单元起名MINUTE HOUR EQU 42H;给内存RAM空间中42H单元起名HOUR SECONDGEWEI EQU 43H;给43H单元起名SECONDGEWEI存秒的个位SECONDSHIWEI EQU 44H;给44H单元起名SECONDSHIWEI存秒的十位MINUTEGEWEI EQU 45H;给45H单元起名MINUTEGEWEI存分的个位MINUTESHIWEI EQU 46H;给46H单元起名MINUTESHIWEI存分的十位HOURGEWEI EQU 47H;给47H单元起名HOURGEWEI存小时的个位HOURSHIWEI EQU 48H;给48H单元起名HOURSHIWEI存小时的十位 ORG 0000H;复位时程序从此开始 SJMP START;跳到START进行初始化 ORG 000BH;定时器 0中断入口 AJMP TIMER0;跳转到TIMER0处ORG 0030H;初始化程序从30H开始;---------------初始化START------------------------------START:MOV SECOND, #0;给秒存储单元SECOND赋初始值0 MOV MINUTE, #0;给分存储单元MINUTE赋初始值0 MOV HOUR , #12;给小时存储单元HOUR赋初始值12 MOV DPTR , #TAB;给数据指针赋值,将DPTR指向TAB数据表头处 MOV 30H, #0 ;给30H单元赋初始值0(用于计20次的50ms中断)MOV TH0,#3CH;给计数容器的高8位TH0赋初始值3CH MOV TL0,#0B0H;给计数容器的低8位TL0赋初始值B0H MOV TMOD,#00000001B;C/T位设置为0,M1M0设置位10,即模式1定时MOV TCON,#00010000B;TR0设置为1,即启动定时器0开始工作 SETB ET0;IE中的ET0位设置为1,开定制器中断0 SETB EA;IE中的EA位设置为1,开总中断;-----------------------主程序MAIN-----------------------------MAIN:CALL KEY;调按键子程序KEY CALL PROCESS;调数据处理子程序PROCESS CALL DISPLAY;调显示子程序DISPLAY SJMP MAIN;跳转到MAIN标号处;------------------------------按键子程序KEY调时-------------------KEY:MOV P1,#0FEH;行扫描 LCALL DELAY;JNB P1.4,HOURJIA;P1.4引脚如果是低电平就跳到HOURJIA处JNB P1.5,HOURJIAN;P1.5引脚如果是低电平就跳到HOURJIAN处JNB P1.6,MINUTEJIA;P1.6引脚如果是低电平就跳到MIMUTEJIA处JNB P1.7,MINUTEJIAN;P1.7引脚如果是低电平就跳到MIMUTEJIAN处 FANHUI:RET;子程序返回(如果没有按键按下)HOURJIA:CALL DELAY;调延时程序目的是跳过按键抖动期(去抖)JB P1.4,FANHUI;P1.4如果是高电平就跳到FANHUI处(没键按)JNB P1.4,$;如果P1.4是低电平就停在当前位置等键释放MOV R4,HOUR CJNE R4,#23,A1;判断时数字是否为23 AJMP A2A1:INC HOUR;把小时位加1 MOV SECOND, #0;小时进位,秒归0RETA2:MOV HOUR,#0;小时数为23时加一为0MOV SECOND, #0;小时进位,秒归0RET;子程序返回HOURJIAN:CALL DELAY;调延时程序目的是跳过按键抖动期(去抖)JB P1.5,FANHUIJNB P1.5,$MOV R5,HOUR CJNE R5,#0,A3AJMP A4 A3:DEC HOURMOV SECOND, #0RET A4:MOV HOUR,#23MOV SECOND, #0 RETMINUTEJIA:CALL DELAYJB P1.6,FANHUIJNB P1.6,$MOV R6,MINUTECJNE R6,#59,A5AJMP A6 A5:INC MINUTEMOV SECOND, #0RET A6:MOV SECOND, #0MOV MINUTE, #0MOV R4,HOUR CJNE R4,#23,A10MOV HOUR,#0RET A10:INC HOURRETMINUTEJIAN:CALL DELAYJB P1.7,FANHUIJNB P1.7,$MOV R7,MINUTE CJNE R7,#0,A7AJMP A8 A7:DEC MINUTE;P1.5如果是高电平就跳到FANHUI处(没键按) ;如果P1.5是低电平就停在当前位置等键释放;判断时数字是否为23;把小时位减1;小时数为0时减一为23;子程序返回;调延时程序目的是跳过按键抖动期(去抖);P1.6如果是高电平就跳到FANHUI处(没键按) ;如果P1.6是低电平就停在当前位置等键释放;判断分钟数是否为59;把分钟位加1;给秒存储单元SECOND赋初始值0;分钟数为59则分钟归0;判断时数字是否为23;23时增1归0;分钟数为59 自增1后小时增1;子程序返回;调延时程序目的是跳过按键抖动期(去抖);P1.7如果是高电平就跳到FANHUI处(没键按) ;如果P1.7是低电平就停在当前位置等键释放;判断分钟数是否为0;分钟不为0把分钟位减1MOV SECOND, #0RETA8:MOV MINUTE, #59;分钟数为0时减一为59 MOV R4,HOUR CJNE R4,#0,A9;判断时钟数是否为0 MOV HOUR,#23;时钟数为0减1为23 MOV SECOND, #0 RETA9:DEC HOUR;时钟数不为0则减1 MOV SECOND, #0RET;子程序返回;-------------------处理子程序PROCESS-----------------------PROCESS:MOV A, SECOND;把SECOND中的秒值拷贝给A MOV B, #10;给寄存器B赋值10 DIV AB;A除以B,结果存入A中,余数存入B中 MOV SECONDSHIWEI , A;结果即秒的十位数拷贝给SECONDSHIWEI MOV SECONDGEWEI , B;余数即秒的个位拷贝给SECONDGEWEI MOV A, MINUTE;把MINUTE中的分值拷贝给A MOV B, #10;给寄存器B赋值10 DIV AB;A除以B,结果存入A中,余数存入B中 MOV MINUTESHIWEI , A;结果即分的十位拷贝给MINUTESHIWEI MOV MINUTEGEWEI , B;余数即分的个位拷贝给MINUTEGEWEI MOV A, HOUR;把HOUR中的小时值拷贝给A MOV B, #10;给寄存器B赋值10 DIV AB;A除以B,结果存入A中,余数存入B中 MOV HOURSHIWEI , A;结果即小时的十位拷贝给HOURSHIWEI MOV HOURGEWEI , B ;余数即小时的个位拷贝给HOURGEWEI RET;子程序结束返回到主程序;-----------------显示子程序DISPLAY--------------DISPLAY:MOV A, HOURSHIWEI;小时的十位拷贝给A MOVC A, @A+DPTR;到A+DPRT这个数对应的地方找显示段码拷贝给A MOV P0, A ;把显示段码(小时的十位)送到P0 CLR P2.0;将P2.0置低电平,对应的三极管导通 CALL DELAY;调延时(让显示小时十位的数码管持续亮一段时间)SETB P2.0 ;将P2.0置高电平,对应三极管截止,对应数码管灭MOV A, HOURGEWEI;小时的个位拷贝给A MOVC A,@A+DPTR;到A+DPRT这个数对应的地方找显示段码拷贝给A MOV P0, A ;把显示段码(小时的个位)送到P0 CLR P2.1;将P2.1置低电平,对应的三极管导通CALL DELAY;调延时(让显示小时个位的数码管持续亮一段时间)SETB P2.1 MOV P0,#7FH CLR P2.1 CALL DELAY SETB P2.1;将P2.1置高电平,对应三极管截止,对应数码管灭MOV A, MINUTESHIWEI;分钟的十位拷贝给A MOVC A,@A+DPTR;到A+DPRT这个数对应的地方找显示段码拷贝给A MOV P0, A ;把显示段码(分钟的十位)送到P0 CLR P2.2;将P2.2置低电平,对应的三极管导通 CALL DELAY;调延时(让显示分钟十位的数码管持续亮一段时间)SETB P2.2 ;将P2.2置高电平,对应三极管截止,对应数码管灭MOV A, MINUTEGEWEI;分钟的个位拷贝给A MOVC A,@A+DPTR;到A+DPRT这个数对应的地方找显示段码拷贝给A MOV P0, A ;把显示段码(分钟的个位)送到P0 CLR P2.3;将P2.3置低电平,对应的三极管导通CALL DELAY;调延时(让显示分钟个位的数码管持续亮一段时间)SETB P2.3 ;将P2.3置高电平,对应三极管截止,对应数码管灭MOV P0,#7FH CLR P2.3 CALL DELAY SETB P2.3MOV A, SECONDSHIWEI;秒的十位拷贝给A MOVC A,@A+DPTR;到A+DPRT这个数对应的地方找显示段码拷贝给A MOV P0, A ;把显示段码(秒钟的十位)送到P0 CLR P2.4;将P2.4置低电平,对应的三极管导通 CALL DELAY;调延时(让显示秒钟十位的数码管持续亮一段时间)SETB P2.4 ;将P2.4置高电平,对应三极管截止,对应数码管灭MOV A, SECONDGEWEI;秒的个位拷贝给A MOVC A,@A+DPTR;到A+DPRT这个数对应的地方找显示段码拷贝给A MOV P0, A ;把显示段码(秒钟的个位)送到P0 CLR P2.5;将P2.5置低电平,对应的三极管导通CALL DELAY;调延时(让显示秒钟个位的数码管持续亮一段时间)SETB P2.5 ;将P2.5置高电平,对应三极管截止,对应数码管灭 RET;显示子程序结束返回主程序;--------------------中断服务子程序----------------------------TIMER0:MOV R3, A;把A中的数据送入R3保护起来 INC 30H;30H单元中的数加1 MOV A, 30H;30H单元中的数据拷贝给A CJNE A,#20,JIXU;A中的数据与20比较不相等就跳转到JIXU处 MOV 30H,#0;(如果30H单元计满20了)给30H赋值0 INC SECOND;把SECOND中的秒钟数加1 MOV A,SECOND;把SECOND中的数据拷贝给A CJNE A, #60, JIXU;A中的数据与60比较不相等就跳转到JIXU处MOV SECOND,#0;给秒SECOND赋值0 INC MINUTE;把MINUTE中的分钟数加1 MOV A, MINUTE;把MINUTE中的数据拷贝给A CJNE A, #60, JIXU;A中的数据与60比较不相等就跳转到JIXU处 MOV MINUTE, #0 ;给分钟MINUTE赋值0 INC HOUR;把HOUR中的小时数据加1 MOV A, HOUR;把HOUR中的数据拷贝给A CJNE A, #24, JIXU;A中的数据与24比较不相等就跳转到JIXU处 MOV HOUR, #0 ;给小时HOUR赋值0 JIXU: MOV A,R3;把刚才送入R3中的数据还给A MOV TH0,#3CH;给计数容器的高8位TH0赋初始值3CH MOV TL0,#0B0H;给计数容器的低8位TL0赋初始值B0H RETI;中断子程序返回主程序;---------------------------延时子程序----------------------------DELAY:MOV R0, #50;给R0赋值50 D2:MOV R1, #10;给R1赋值10 D1:DJNZ R1, D1;R1减1不等于0跳到D1处 DJNZ R0, D2;R0减1不等于0跳到D2处RET;延时子程序结束返回调用该程序的下一条;---------------下面的数据表中存储的是显示段码(共阳)-------------------TAB:DB 0C0H,0F9H,0A4H,0B0H,99H;从TAB处开始存储0、1、2、3、4DB 92H ,82H ,0F8H,80H ,90H;5、6、7、8、9对应的显示段码 END;程序结束第二篇:基于单片机的时钟控制器设计时钟控制器设计任务书1.设计目的与要求设计出一个用于数字时钟的控制器,准确地理解有关要求,独立完成系统设计,要求所设计的电路具有以下功能:(1)显示:可以显示时、分和秒(2)调时功能:时(0-24)、分和秒(0-60)可以连续可调(3)时间日误差< 2秒(4)增加整点报时功能(5)增加闹钟任意设定功能 2.设计内容(1)画出电路原理图,正确使用逻辑关系;(2)确定元器件及元件参数;(3)进行电路模拟仿真;(4)SCH文件生成与打印输出;(5)PCB文件生成与打印输出; 3.编写设计报告写出设计的全过程,附上有关资料和图纸,有心得体会。

毕业回馈-89c51之定时器计数器(TimerCount)

毕业回馈-89c51之定时器计数器(TimerCount)

毕业回馈-89c51之定时器计数器(TimerCount)今天分享的是89c51系列单⽚机的内部资源定时器/计数器,在所有的嵌⼊式系统中都包含这两个内部功能。

⾸先先了解⼏个定时器/计数器相关的概念:•时钟周期:时钟周期 T 是时序中最⼩的时间单位,具体计算的⽅法就是1/时钟源频率,(⼀般单⽚机采⽤的是11.0592mHz)•机器周期:我们的单⽚机完成⼀个操作的最短时间。

标准51单⽚机,⼀个机器周期是 12 个时钟周期,也就是 12/11059200 秒。

•定时器:当T/C⼯作在定时器时,对振荡源12分频的脉冲计数,即每个机器周期计数值加1,计数频率=当前单⽚机⼯作频率/12。

当单⽚机⼯作在12MHz时,计数频率=1MHz,单⽚机每1us计数值加1。

•计数器:计数脉冲来⾃外部脉冲输⼊引脚 T0(P3.4)或T1(P3.5)。

当T0或T1引脚上负跳变时计数值加1。

识别引脚上的负跳变需要2个机器周期,即24个振荡周期。

所以T0或者T1 输⼊的可计数外部脉冲的最⾼频率为当前单⽚机⼯作频率/24。

当单⽚机⼯作在12MHz时,最⾼计数频率为500KHz,⾼于该频率将计数出错。

定时器/计数器所涉及到的寄存器如下:其中TCON为定时器/计数器T0,T1的可控制及窜起,同时也锁存T0,T1溢出中断源和外部请求中断源等。

TCON寄存器可以进⾏位寻址TCON中每⼀位的使⽤如下:注:TF1:定时器/计数器T1溢出标志。

T1被允许计数以后,从初值开始加1计数。

当最⾼位产⽣溢出时由硬件置‘1’TF1,向CPU发送中断请求,⼀直保持到CPU响应中断时,由硬件⾃动清零,当不执⾏中断时,也可以通过查询的⽅式对TF1标志位进⾏软件清零TR1:定时器T1的运⾏控制位。

由软件置位和清零。

当GATE(TMOD.7)=0,TR1=1时就运⾏T1开始计数,TR1=0时禁⽌T1计数。

当GATE(TMOD.7)=1,TR1=1且INTI外部输⼊⾼电平时,才允许T1计数TF0:同TF1拥有两种清零⽅式TMOD寄存器不可位寻址:每⼀位的使⽤如下:THx/TLx(x=0,1)介绍如下:T/C是16位的,计数寄存器由TH⾼8位和TL低8位构成。

单片机89C51精确延时

单片机89C51精确延时

单片机89C51精确延时高手从菜鸟忽略作起之(六)一,晶振与周期:89C51晶振频率约为12MHZ。

在此基础上,计论几个与单片机相关的周期概念:时钟周期,状态周期,机器周期,指令周期。

晶振12MHZ,表示1US振动12次,此基础上计算各周期长度。

时钟周期(W sz):Wsz=1/12=0.083us状态周期(W zt) Wzt=2*Wsz=0.167us机器周期(W jq): Wjq=6*Wzt=1us指令周期(W zl): W zl=n*Wjq(n=1,2,4)二,指令周期汇编指令有单周期指令,双周期指令,四周期指令。

指令时长分别是1US,2US,4US.指令的周期可以查询绘编指令获得,用下面方法进行记忆。

1.四周期指令:MUL,DIV2.双周期指令:与SP,PC相关(见汇编指令周期表)3.单周期指令:其他(见汇编指令周期表)三,单片机时间换算单位1.1秒(S)=1000毫秒(ms)2.1毫秒(ms)=1000微秒(us)3.1微秒(us)=1000纳秒(ns)单片机指令周期是以微秒(US)为基本单位。

四,单片机延时方式1.计时器延时方式:用C/T0,C/T1进行延时。

2.指令消耗延时方式:本篇单片机精确延时主要用第2种方式。

五,纳秒(ns)级延时:由于单片机指令同期是以微秒(US)为基本单位,因此,纳秒级延时,全部不用写延时。

六,微秒(US)级延时:1.单级循环模式:delay_us_1最小值:1+2+2+0+2+1+2+2=12(US),运行此模式最少需12US,因此12US以下,只能在代码中用指定数目的NOP来精确延时。

最大值:256*2+12-2=522(US),256最大循环次数,2是指令周期,12是模式耗时,-2是模式耗时中计1个时钟周期。

延时范围:值域F(X)[12,522],变量取值范围[0,255].函数关系:Y=F(x):y=2x+12,由输入参数得出延时时间。

反函数:Y=F(x):y=1/2x-6:由延时时间,计算输入参数。

89C51定时器和计数器

89C51定时器和计数器

AT89C51定时器/计数器1.定时和计数功能:AT89C51有两个可编程的定时器和计数器:T0和T1。

它们可以工作在定时状态也可以工作在计数状态。

做定时器时不能用作计数,反之亦然。

2.计数器:当定时器/计数器作“计数器”用时,可对接到14引脚(T0/P3.4)或15引脚(T1/P3.5)的脉冲信号数进行计数,每当引脚发生从“1”到“0”的负跳变时,计数器加1.3.定时器:当定时器/计数器作“定时器”用时,定时信号来自内部的时钟发生电路,每个机器周期等于十二个震荡周期,每过一个机器周期,计数器加1.当晶振频率为12MHz时,则机器周期为1微秒;在此情况下,若计数器为100,则所定时的时间为:100x1=100微秒。

4.与定时器/计数器有关的特殊功能寄存器5.定时器/计数器的控制AT89C51单片机定时器/计数器的工作由两个特殊的寄存器TMOD和TCON的相关位来控制,TMOD用于设置它的工作方式,TCON用于控制其启动和中断的请求。

1).TMOD用于设置定时器/计数器的工作方式,其字节地址为89H。

低四位用于T0,高四位用于T1。

虽有位名称,但无位地址,不可进行位操作。

TMOD中的结构和各位名称○1M1,M0:工作方式选择位。

M1、M0为两位二进制数,可表示四种工作方式,见下表:○2C/T:计数/定时方式选择位。

C/T = 1,为计数工作方式,对输入到单片机T0、T1引用的外部信号脉冲计数,负跳变脉冲有效,用作计数器。

C/T = 0,为定时工作方式,对片内机器周期(1个机器周期等于12晶振周期)信号计数,用作定时器。

○3GATE:门控位。

GATE = 0,定时器/计数器的运行只受TCON中的运行控制位TR0/TR1的控制。

GATE = 1,定时器/计数器的运行同时受TR0/TR1和外中断输入信号(INT0和INT1)的双重控制。

GATE对TR0/TR1的制约2).控制寄存器TCONTCON是可位寻址的特殊功能寄存器,其字节地址为88H,位地址由低到高顺序分别为88H~8FH,TCON的低四位只与外中断有关,其高四位与定时器/计数器有关。

89C51定时器和计数器精编版

89C51定时器和计数器精编版

AT89C51定时器/计数器1.定时和计数功能:AT89C51有两个可编程的定时器和计数器:T0和T1。

它们可以工作在定时状态也可以工作在计数状态。

做定时器时不能用作计数,反之亦然。

2.计数器:当定时器/计数器作“计数器”用时,可对接到14引脚(T0/P3.4)或15引脚(T1/P3.5)的脉冲信号数进行计数,每当引脚发生从“1”到“0”的负跳变时,计数器加1.3.定时器:当定时器/计数器作“定时器”用时,定时信号来自内部的时钟发生电路,每个机器周期等于十二个震荡周期,每过一个机器周期,计数器加1.当晶振频率为12MHz时,则机器周期为1微秒;在此情况下,若计数器为100,则所定时的时间为:100 x 1 =100微秒。

14.与定时器/计数器有关的特殊功能寄存器5.定时器/计数器的控制AT89C51单片机定时器/计数器的工作由两个特殊的寄存器TMOD和TCON的相关位来控制,TMOD用于设置它的工作方式,TCON用于控制其启动和中断的请求。

1).TMOD用于设置定时器/计数器的工作方式,其字节地址为89H。

低四位用于T0,高四位用于T1。

虽有位名称,2但无位地址,不可进行位操作。

TMOD中的结构和各位名称○1M1,M0:工作方式选择位。

M1、M0为两位二进制数,可表示四种工作方式,见下表:○2C/T:计数/定时方式选择位。

C/T = 1,为计数工作方式,对输入到单片机T0、T1引用的外部信号脉冲计数,负跳变脉冲有效,用作计数器。

C/T = 0,为定时工作方式,对片内机器周期(1个机器周期等于12晶振周期)信号计数,用作定时器。

3○3GATE:门控位。

GATE = 0,定时器/计数器的运行只受TCON中的运行控制位TR0/TR1的控制。

GATE = 1,定时器/计数器的运行同时受TR0/TR1和外中断输入信号(INT0和INT1)的双重控制。

GATE对TR0/TR1的制约2).控制寄存器TCONTCON是可位寻址的特殊功能寄存器,其字节地址为88H,位地址由低到高顺序分别为88H~8FH,4TCON的低四位只与外中断有关,其高四位与定时器/计数器有关。

第6章 89C51的定时计数器

第6章 89C51的定时计数器
2014-6-17
Date: 2014-6-17
Page: 13
机械工程与自动化学院
13
第6 章
定时计数器及其应用
初始化程序应完成如下工作:
对TMOD赋值,以确定T0和T1的工作方式。 计算初值,并将其写入TH0、TL0或TH1、TL1。 中断方式时,则对IE赋值,开放中断。 使TR0或TR1置位,启动定时/计数器定时或计数。
计数个数与计数初值的关系为: X=216 -N
2014-6-17
Date: 2014-6-17
Page: 10
机械工程与自动化学院
10
第6 章
定时计数器及其应用
三、方式2 方式2为自动重装初值的8位计数方式。
TCON TF1 申请 中断 TR1 TF0 TR0 TH0 8位 D0 D7 溢出 1 TL0 &
T1引脚 T0引脚
机器周 期脉冲
TH1
TL1
TH0
TL0
内部总线
GATE TF1 TR1 TF0 TR0 C/T C/T M1 M0 M1 M0
TCON
GATE
TMOD
外部中断相关位
T1方式
T0方式
2014-6-17
Date:
2014-6-17
Page: 2
机械工程与自动化学院
2
第6 章
定时计数器及其应用
2014-6-17
Date: 2014-6-17
Page: 17
机械工程与自动化学院
17
4. 溢出处理编程格式: 第6 章 定时计数器及其应用
2)中断方式:初始化后执行其它任务,中断服务程序 处理溢出。 ORG 0000H LJMP MAIN ORG 000BH(001BH) ;Tx中断入口 LJMP PTS MAIN: … ;初始化后执行其他程序 PTS: … ;溢出中断服务程序 MOV THx,#XH ;重装时间常数 MOV TLx,#XL RETI

第6章89C51单片机定时器及应用2010

第6章89C51单片机定时器及应用2010

个13位的低5位,TH0占高8位。当TL0的低5位
溢出时,向TH0进位;TH0溢出时,使溢出中断 标志TF0置位(硬件置位TF0),并申请中断。 定时时间为: t=(213-T0初值)×振荡周期×12
三、模式0的应用举例
例6-1:设定时器T0选择工作模式0,定时时间为1ms, fosc=6MHz。试确定T0初值,计算最大定时时间T。 解:当T0处于工作模式0时,加1计数器为13位。 (1)设T0的初值为X。 则:(213-X)×1/6 × 10-6×12=1×10-3 s X=7692D =1 1110 0000 1100B
图6-8
T0(或T1)模式2结构-8位计数器
二、模式 2 工作特点
该模式把TL0(TL1)配置成一个可以自动重装载的8位定时器/ 计数器。 在程序初始化时,TL0和TH0由软件赋予相同的初值。 用于定时工作方式时,定时时间为: t=(28-TH0初值)×振荡周期×12 用于计数工作方式时,计数长度最大为:28=256(个外部脉
X=7193D=11100000 11000B
T0的低5位:11000B=18H即 (TL0)=18H T0的高8位:11100000B=E0H即 (TH0)=E0H
(3)采用查询方式的程序 程序清单: MOV TMOD,#00H MOV TL0,#18H
;设置T0为模式0 ;送初值 ;启动定时 ;查询定时时间到否 ;重装计数初值 ;取反 ;重复循环
§6.3.2
模式 1 及其应用
一、模式 1 的逻辑电路结构 二、模式 1 工作特点 三、模式 1 的应用举例
一、模式 1 的逻辑电路结构
图6-7
T0(或T1)模式1结构-16位计数器
二、模式 1 工作特点

89C51的定时器、计数器解析

89C51的定时器、计数器解析

TH
TL
所以(TH)=FCH,(TL)=18H。
19
【例】已知晶振频率fosc=12MHz,使用定时器0以工作方式1,在P1.0输 出周期为2ms的连续正方波脉冲。试编写相关程序。
解:计算初值:TH0=FC H,TL0=18 H。
ORG 0000H
LJMP MAIN
;跳转到主程序
ORG 000BH
5
定时器/计数器的定时功能。 计数器的加1信号由振荡器的12分频信号产生,即每过一个机器周
期,计数器加1,直至计满溢出。 定时器的定时时间与系统的时钟频率有关。因一个机器周期等于12
个时钟周期,所以计数频率应为系统时钟频率的十二分之一。如果 晶振频率为12MHz,则机器周期为1s。通过改变定时器的定时初 值,并适当选择定时器的长度(8位、13位或16位),可以调整定时 时间。
8
GATE:门控制位,用于控制定时器的启动是否受外 部中断源信号的影响。 GATE=0时,与外部中断无关, 由TCON寄存器中的 TRx位控制启动。
GATE=1时,由控制位TRx和引脚INTx共同控制启动,只
有在没有外部中断请求信号的情况下(即外部中断引
脚 IN=T1x时),才允许定时器启动。
9
2、定时控制寄存器(TCON)
(1)工作方式选择 T0为方式1计数,初值 0FFFFH,即外部计数输入端T0(P3.4)发生 一次负跳变时,T0加1且溢出,溢出标志TF0置“1”,发中断请求。 在进入T0中断程序后,启动T1。 T1定义为方式2定时。在T0脚发生一次负跳变后,启动T1每500s产 生一次中断,在中断服务程序中对P1.0求反,使P1.0产生周期1ms的 方波。
6
定时器/计数器的计数功能。 通过外部计数输入引脚T0(P3.4)和T1(P3.5)对外部信号计数,外
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

89C51单片机定时器时间的计算以及写法
今晚学单片机的时候,有一点儿问题,就去网上看了看,发现了很多人不会单片机定时,也就是具体时间的设定,不知道如何设定,而且有关方面的书籍、资料讲解又太过术语化,所以就写一篇通俗些的语言讲述一下如何定时。

为了便于理解,先讲解一点儿关于单片机内部定时器和计数器的基本知识,如果学过数字电路,就不用管这些,看下边的就好了:
(1)由于单片机内部定时器、计数器均为八位,所以它们从0开始到计数计满,也就是能从0000 0000计数到1111 1111,即
2^0到2^16,转换成十进制,就是0——65536。

(2)外部的晶振电路提供的频率,到单片机内部,经过硬件电路,进行了12分频,不要问为什么,就这么记着就好了。

比如外
部晶振是12MHZ的,那么到了单片机内部,用的频率就是
1MHz的。

89C51单片机常使用的晶振频率为12MHz和11.0592MHz两种,主要讲述这两种频率的,如果用其他的,只需要相应改变即可,下面分别讲述如何定时:
(1)使用12MHz晶振:
单片机工作的频率f:12MHz/12=1MHz,
那么时钟周期T1:T1=1/f=1μs,
比如你要定时T2=50ms=50000μs,
你需要总时间T=T1 x T2=50000,也就是说你需要50000个周期才能走完你所要定的时间,当把数全都计满,是需要65536个周期,也就是说还有65536-50000=15536个周期没有走,那么,我们可以把这个初始值放到计数器里面,让它从15536开始计数,当计够50000个周期,也就计满了,即到达了65536。

就像水往水缸里流,你需要流满半缸水的时间,但是现在水缸是空的,你可以先把水缸灌半缸水,然后让它从半缸水开始流,当流满了的时候,也就到了你需要的那个时间。

然后,15536转成十六进制为:0x3CB0,将3C放到定时器的高8位,B0放到第8位,就完成了定时。

我们在写程序赋初始值的时候一般是这么写的,可以参考一下:TH0=0x3C;
TL0=0xB0;
或者
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
PS:如果你定时是其他的,可以把根据我上边讲解的,把T=50000换成相应的数值即可。

(2)使用11.0592MHz晶振:
单片机工作的频率f:11.0592MHz/12=0.9216MHz,
那么时钟周期T1:T1=(1/0.9216)μs,
比如你要定时T2=50ms=50000μs,那么总时间T= T1 x
T2=46080个周期才能走完,所以,剩下了65536-46080=19456个周期,只要把定时器的初始值设置为19456就可以了。

根据上边的,可以把19456转化成十六进制,为0x4C00,高8位放置4C,第8位放置00即可。

在赋初值的时候可以这么写:
TH0=0x4C;
TL0=0x00;
或者
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
PS:通过两个对比,可以看出,第二个程序会明显好于第一个,因为只需要改动里面的T=50000,即可,不需要进行进制的转换。

介绍完了之后,总结一下定时的步骤:
确定晶振为除以12,进行分频
频率求倒数Y,即为时钟周期所定时间为Z,总时间即为
(把十进制转为十六进制 HHLL )高八位放HH,第八位放LL。

相关文档
最新文档