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系列单⽚机的内部资源定时器/计数器,在所有的嵌⼊式系统中都包含这两个内部功能。
⾸先先了解⼏个定时器/计数器相关的概念:•时钟周期:时钟周期 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晶振频率约为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定时器和计数器
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定时器和计数器精编版
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的定时计数器
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
个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的定时器、计数器解析
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)对外部信号计数,外
89c51单片机数码管时钟例程
//data: 2010-07-06//writer: wu xian dian//fame: wan nian li//function:a时分秒的精确显示及设定;b定时的精确显示及设定;c定时时刻不影响时钟精确走时;// d当输入数值有误将蜂鸣报警且数值归1或0;e可以进行定时时间的查看;// f可进行星期的设定及查看g可进行年月日的设定及查看// h可进行平、闰年的分辨;i拥有定时时间到报时1分及整点提示,显示不会闪烁;// j定时、调时为移位显示,设定万年历为单显;星期、定时、调时、年、月日分屏显示;// k可进行数码管和蜂鸣器的检验;L当闹钟响起可随时关闭;#include<at89x51.h>void control(void);//判断是否进行键盘操作;void display(char,char);//显示,位控和段控;void delayms(unsigned int x);//延时;void common(void);//定时、调时显示控制;void fixed_times(void);//定时,进行时分秒输入。
先按11号键,再按六位数字键,自动返回运行;void swap_times(void);//调时,进行时分秒输入。
先按12号键,再按六位数字键,自动返回运行;void fixed_show(void);//全显示,检查数码管和蜂鸣器好坏,按零号键;void week(void);//星期设定8返回7;void week_show(void);//星期显示6返回5;void calendar_show(void);//日历显示4显示年,3显示月日,2返回;void calendar(void);//日历设定2显示年,3显示月日,4返回;char key(void);//键盘;void initial(void);//初始化;定时中断char hour1=1,hour0=2,min1=0,min0=0,sec1=0,sec0=0,n=0,w=1,v=1,//主显示全局变量;n循环次数w星期显示v闹铃判断位;fhour1=0,fhour0=0,fmin1=0,fmin0=0,fsec1=0,fsec0=0,//定时、调时共用全局变量;t6=0,t5=6,t4=0,t3=0,t2=0,t1=0,//定时显示全局变量;year3=2,year2=0,year1=1,year0=0,mouts1=0,mouts0=7,day1=0,day0=7;//年月日全局变量;int a1[12]={31,28,31,30,31,30,31,31,30,31,30,31};//平年;int a0[12]={31,29,31,30,31,30,31,31,30,31,30,31};//闰年;int *p;//为a1.a0设置指针;//********************************************************************定义和声明;void main(void){initial();//初始化while(1){P1=0x0f;if(P1!=0x0f)//判位进入调控程序;control();P1=0xff;display(5,hour1);///主显示程序;delayms(150);display(4,hour0);delayms(150);display(3,min1);delayms(150);display(2,min0);delayms(150);display(1,sec1);delayms(150);display(0,sec0);delayms(150);}}//*************************************************判位操作显示;void control(void){P1=0xbf;if(P1==0xbe)// 1显示数码管和蜂鸣器,自动返回;{P2=0x00;P0=0xff;delayms(2000);}else if(P1==0xb7)//4显示某年,3显示某月日,2返回;calendar_show();else if(P1==0xbb)// 3定时年,2定时月日,1返回;calendar();P1=0xef;if(P1==0xeb)// 11定时,自动返回;fixed_times();else if(P1==0xe7)// 12调时,自动返回;swap_times();else if(P1==0xed)// 10显示定时9返回;fixed_show();P1=0xdf;if(P1==0xd7)// 8星期设置7返回;week();else if(P1==0xdd)// 6星期显示5返回;week_show();else if(P1==0xde)//关闭闹铃;v=1;}//******************************************************中断入口;void time0(void) interrupt 1//定时中断0;{ unsigned int q;if(v==0)//盘闹铃是否工作;P2_7=0;elseP2_7=1;q=year3*1000+year2*100+year1*10+year0;//平、闰年判别;if((q%4==0&&q%100!=0)||(q%400==0))p=a0;//闰年指针指向;else p=a1;//平年指针指向;TH0=0xb8;//20ms定时;TL0=0x00;n==50? n=0:++n;//循环次数;if(n==0)//时分秒的进位;{++sec0;if(sec0==10){sec0=0;++sec1;if(sec1==6){sec1=0;++min0;if(hour1==t6&&hour0==t5&&min1==t4&&min0==t3)//判蜂鸣器响,v=0;//闹铃标志位;else//判蜂鸣器,虽然雍杂,但蜂鸣时数码管不闪烁;v=1;if(min0==10){min0=0;++min1;if(min1==6){min1=0;++hour0;P2_7=0;delayms(8000);if(hour0==10){hour0=0;++hour1;}}}}}}if((hour1==2)&&(hour0==4))//判是否大于24点{hour1=0;hour0=0;++w;if(w>7||w<1)//星期控制1-7天;w=1;if(++day0==10)//日的判断进位;{day0=0;++day1;}if(day1*10+day0>*(p+(mouts1*10+mouts0-1))){day0=1;day1=0;++mouts0;}if(mouts0==10)//月的判断进位;{mouts0=0;++mouts1;}if(mouts1*10+mouts0>12){mouts0=1;mouts1=0;++year0;}if(year0==10)//年的判断进位;{year0=0;++year1;if(year1==10){year1=0;++year2;if(year2==10){year2=0;++year3;if(year3==10){year3=0;}}}}}}////*****************************************************************显示程序;void display(char m,char n){unsigned char y[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char z[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};P2=z[m];P0=y[n];}///*********************************************************************延时程序;void delayms(unsigned int x){unsigned int y;for(y=0;y<x;++y);}////****************************************************************键盘程序;char key(void){P1=0x0f;loop: if(P1==0x0f)goto loop;delayms(3350);if(P1==0x0f)goto loop;while(1){ P1=0xbf;if(P1_0==0) {while(P1!=0xbf); return 0;}if(P1_1==0) {while(P1!=0xbf); return 1;}if(P1_2==0) {while(P1!=0xbf); return 2;}if(P1_3==0) {while(P1!=0xbf); return 3;}P1=0xdf;if(P1_0==0) {while(P1!=0xdf); return 4; }if(P1_1==0) {while(P1!=0xdf); return 5;}if(P1_2==0) {while(P1!=0xdf); return 6;}if(P1_3==0) {while(P1!=0xdf); return 7;}P1=0xef;if(P1_0==0) {while(P1!=0xef); return 8;}if(P1_1==0) {while(P1!=0xef); return 9;}}}//*************************************************************定时时间程序;void fixed_times(void){P2=0xfe;P0=0x71;common();t6=fhour1;t5=fhour0;t4=fmin1;t3=fmin0;t2=fsec1;t1=fsec0;}///************************************************************调时程序;void swap_times(void){P2=0xfe;P0=0x6d;common();hour1=fhour1;hour0=fhour0;min1=fmin1;min0=fmin0;sec1=fsec1;sec0=fsec0;}//************************************************************初始化程序;void initial(void){TH0=0xb8;TL0=0x00;IE=0x82;TMOD=0x01;TR0=1;}//*******************************************调时、定时共用设定和显示程序;void common(void){char f=0,j=0,k;for(k=0;k<6;++k){switch(++f){case 1:{for(fsec0=key();fsec0>2;fsec0=0){P2_7=0;delayms(3000);}P2_7=1;break;}case 2:{fsec1=fsec0;for(fsec0=key();fsec1>=2&&fsec0>=4;fsec0=0){P2_7=0;delayms(3000);}P2_7=1;break;}case 3:{fmin0=fsec1;fsec1=fsec0;for(fsec0=key();fsec0>5;fsec0=0){P2_7=0;delayms(3000);}P2_7=1;break;}case 4:{fmin1=fmin0;fmin0=fsec1;fsec1=fsec0;fsec0=key();break;}case 5:{fhour0=fmin1;fmin1=fmin0;fmin0=fsec1;fsec1=fsec0;for(fsec0=key();fsec0>5;fsec0=0){P2_7=0;delayms(3000);}P2_7=1;break;}case 6:{fhour1=fhour0;fhour0=fmin1;fmin1=fmin0;fmin0=fsec1;fsec1=fsec0;fsec0=key();break;}}for(P1=0x0f;(P1==0x0f)&&(f<=6);j=0){if(++j<=f){display(0,fsec0);delayms(200);if(++j<=f){display(1,fsec1);delayms(200);if(++j<=f){display(2,fmin0);delayms(200);if(++j<=f){display(3,fmin1);delayms(200);if(++j<=f){display(4,fhour0);delayms(200);if(++j<=f){display(5,fhour1);delayms(200);}}}}}}}}}///********************************************************定时显示程序;void fixed_show(void){do{P1=0xef;display(5,t6);delayms(150);display(4,t5);delayms(150);display(3,t4);delayms(150);display(2,t3);delayms(150);display(1,t2);delayms(150);display(0,t1);delayms(150);}while(P1!=0xee);}//*****************************************星期设定程序;void week(void){delayms(5000);for(w=key();w>7||w<1;w=1);P1=0xdf;dodisplay(5,w);while(P1!=0xdb);P1=0xff;}//******************************************星期显示程序;void week_show(void){P1=0xdf;dodisplay(5,w);while(P1!=0xde);P1=0xff;}///*****************************************万年历显示程序;void calendar_show(void){do{display(4,year3);//年显示;delayms(150);display(3,year2);delayms(150);display(1,year1);delayms(150);display(0,year0);delayms(150);}while(P1!=0xbb);do{display(4,mouts1);//月日显示;delayms(150);display(3,mouts0);delayms(150);display(1,day1);delayms(150);display(0,day0);delayms(150);}while(P1!=0xbd);P1=0xff;}//*******************************************万年历设定程序;void calendar(void){P2=0xfe;P0=0x6e;do{}while(P1==0xbb);display(4,year3=key());//年设定;display(3,year2=key());display(1,year1=key());display(0,year0=key());do{P1=0xbf;}while(P1!=0xbd);P2=0xfe;P0=0x63;do{}while(P1==0xbd);//月日设定;display(4,mouts1=key());display(3,mouts0=key());if(mouts1*10+mouts0>12||mouts1*10+mouts0<1) {mouts1=0;mouts0=1;P2_7=0;delayms(1200);}P2_7=1;display(1,day1=key());display(0,day0=key());if(day1*10+day0>*p||day1*10+day0<1){day1=0;day0=1;P2_7=0;delayms(1200);}P2_7=1;do{P1=0xbf;}while(P1!=0xbe);P1=0xff;}。
第6章 89C51的定时器计数器
查询方式的参考程序: MOV TMOD,#01H LOOP: SETB TR0 MOV TH0,#0FEH MOV TL0,# 0CH LOOP1:JNB TF0,LOOP1 CLR TR0 CPL P1.0 SJMP LOOP
;设置T0为方式1 ;接通T0 ;T0置初值 ;查询TF0标志 ;T0溢出,关闭T0 ;P1.0的状态求反
⒋ 工作方式3 方式3仅适用于T0,T1无方式3。 ⑴ T0方式3 在方式3情况下,T0被拆成二个独立的8位计数器TH0、TL0。 TL0可以为定时/计数器; TH0只能作为8位定时器。 ① TL0使用T0原有的控制寄存器资 源:TF0,TR0,GATE,C/T,INT0,组成一个8位的定时/计数器; ② TH0借用T1的中断溢出标志TF1,运行控制开关TR1,只能 对片内机周脉冲计数,组成另一个8位定时器(不能用作计数 器)。 ⑵ T0方式3情况下的T1 T1由于其TF1、TR1被T0的TH0占用,计数器溢出时,只能 将输出信号送至串行口,即用作串行口波特率发生器。
6.4.2 方式2的应用 方式2是一个可以自动重新装载初值的8位计数器/定时器。 这种工作方式可省去程序中重装初值的指令,并可产生相 当精确的定时时间。 例6-3 当T0(P3.4)引脚上发生负跳变时,从P1.0引脚上 输出一个周期为1ms的方波,如图6-13所示。(系统时钟为 6MHz)
TCON
位名称
T1 T1 T0 T0 INT1 INT1 INT0 INT0 中断 运行 中断 运行 中断 触发 中断 触发 标志 标志 标志 标志 标志 方式 标志 方式 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
位地址
8FH
8EH
8DH
8CH
89C51单片机定时器所定时间的计算以及写法
89C51单片机定时器所定时间的计算以及写法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位,就完成了定时。
广州周立功单片机 P89C51 89C52 89C54 89C58 说明书
指针低字节
82H
AF
AE
AD
AC
AB
IE*
中断使能
A8H
EA
ET2
ES
ET1
BF
BE
BD
BC
BBB
IP*
中断优先级
B8H
PT2H
PSH
PT1H
B7
B6
B5
B4
B3
IPH#
中断优先级高字节 B7H
PT2H
PSH
PT1H
87
86
85
84
83
P0*
P0 口
80H
AD7
AD6
AD5
AD4
AD3
97
96
95
94
特性
y 80C51 核心处理单元 y 片内 FLASH 程序存储器 y 速度可达 33MHz y 全静态操作 y RAM 可扩展到 64K 字节 y 4 个中断优先级 y 6 个中断源 y 4 个 8 位 I/O 口 y 全双工增强型 UART
―帧数据错误检测 ―自动地址识别 y 电源控制模式 ―时钟可停止和恢复 ―空闲模式 ―掉电模式 y 可编程时钟输出 y 异步端口复位 y 双 DPTR 寄存器 y 低 EMI (禁止 ALE) y 3 个 16 位定时器 y 掉电模式可通过外部中断唤醒
复位值
E0
00H
AO xxxxxxx0B1
DPS
02H1
F0
00H
00H
00H
A8
EX0 0x000000B
B8
PX0H xx000000B
B0
PX0H xx000000B
80
AD0
89C51实验三定时计数器实验
成绩实验报告实验名称定时计数器实验实验班级电子08-2姓名何达清学号12(后两位)指导教师实验日期2010年11月12日实验三定时/计数器实验一、实验目的1、掌握数码管的静态和动态扫描显示法。
2、掌握单片机定时计数器的初始化编程。
3、学会运用定时计数器进行单片机控制程序设计。
二、实验内容1、见图一,利用静态扫描显示法,让数码管显示数字6 。
(数码管元件7SEG-MPX1-CA,共阳极数码管)0RG 0000HMOV P0,#82HEND2、见图一,利用静态扫描显示法,让数码管显示数字0。
间隔时间1秒后,显示数字1。
间隔时间1秒后,显示数字2。
………间隔时间1秒后,显示数字F。
间隔时间1秒后,显示数字0 。
周而复始,循环不息。
图一程序如下:ORG 0000HLJMP MAINMAIN:MOV R0,#0FFHLOOP:INC R0CJNE R0,#16,SHOWMOV R0,#0SHOW:MOV A,R0MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,AACALL DELAY1SAJMP LOOPDELAY1S: ;误差0usMOV R7,#0A7HDL1:MOV R6,#0ABHDL0:MOV R5,#10HDJNZ R5,$DJNZ R6,DL0DJNZ R7,DL1NOPRETTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH END3、见图二,利用动态扫描显示法,,让数码管显示数字01234567 。
(数码管元件7SEG-MPX8-CA-BLUE,共阳极数码管)图二程序如下:ORG 0000HAJMP MAINORG 000BHAJMP TEFORG 33HMAIN:MOV SP,#60HMOV R4,#0MOV R3,#80HMOV TMOD,#02HMOV TH0,#06HMOV TL0,#06HSETB ET0SETB EASETB TR0LP:CJNE R4,#8,NEXTMOV R4,#0NEXT:MOV A,R4MOV DPTR,#TABMOVC A,@A+DPTRMOV R5,AAJMP LPTEF:PUSH ACCMOV A,R3RL AMOV P1,AMOV P2,R5INC R4MOV R3,APOP ACCRETITAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH END4、见图二,利用动态扫描显示法,,让数码管显示数字12.34.56,每隔一秒,数字变化相当于时间计时器。
中职教育-《89C51单片机实用教程》课件:第7章 89C51单片机中断系统和定时器(4).ppt
SJMP LOOP
END
例7.9 工作模式1的应用 利用定时器 T1 工作模式1, 在引脚 P1.1 上输出
7.4 89C51单片机中定时器/计数器的应用
在定时器/计数器应用时,进行如下工作: 1. 设定TMOD来选择定时器T0,T1的工作方式:
按照实际需要,选择定时方式还是计数方式; 按照定时长短,选择工作模式0、1、2或 3 ; 按照具体要求,选择是否受INT0 (INT1) 控制。 2.根据定时时间长短和工作模式计算计数初值: 根据工作模式,计算出定时时间的计数初值 ;
将计数初值送入定时器中(TH1,TL1,TH0、TL0) 3. 对TCON的设定来启动定时器/计数器工作。 4. 正确选择用程序查询方法或程序中断方式来进
行定时时间到(计数溢出)后的处理操作。
7.4.1 定时器工作方式的设置和计数初值计算
对定时器的工作模式寄存器TMOD进行设定:
l. 定时方式和计数方式选择。
解: ⑴ 如图在引脚 P1.0 上输出周期为 2ms 连续方波,
需要定时器 T0 产生 1ms 的定时。 每隔1ms时间 P1.0 引脚的输出取反即可。
解:
⑵. T0工作于模式0,计数器为13位的加1计数器, fosc=6MHz,则1个振荡周期为1/6μs 定时时间为1ms,根据公式: t =(213-T0初值)×振荡周期×12 1×10-3=(213-T0初值) ×( 1/6×10-6 ) ×12 T0初值= 7692 = 1111000001100B
多为:213=8192个。
例7.5 定时器T0工作在模式0, CPU主频 fosc=6MHz 定时1ms, T0的初值为多少?计算最长定时时间?
解:T0工作于模式0时, 为13位的加1计数器 ①. 定时1ms,根据公式:
单片机课程设计89C51数字时钟
单片机课程设计报告课题:基于89C51的数字时钟学院:理学院专业:光信息科学与技术**:***学号:*************:**淮海工学院2010年12月23日摘要单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。
而51单片机是各单片机中最为典型和最有代表性的一种。
本实验是基于MCS51系列单片机所设计的,可以实现键盘按键与数字动态显示并可以用音乐倒数的计数器。
本设计基于单片机技术原理,以单片机芯片AT89C51作为核心控制器,通过硬件电路的制作以及软件程序的编制,设计制作出一个计数器,包括以下功能:输出时间。
一、设计目的1、学会掌握KeilC51汇编语言程序的设计和调试。
2、学会将所学的单片机原理的有关知识应用于实践,提高单片机应用于技术的实践操作技能,掌握单片机应用系统设计、研制的方法,培养理论联系实际的学习作风,提高动手能力、分析并解决实际问题的能力。
3、使我们进一步了解掌握所学的专业知识,巩固和深化对单片机的结构、指令系统、中断系统、键盘/显示系统、接口技术、系统扩展、定时/控制、程序设计、应用开发、等基本理论知识的理解。
4、通过设计、分析、调试,培养我们工程意识,激发大家对产品开发的兴趣,及培养对科技革新、开发和创新的基本能力。
二、设计要求1.开机时,显示12:00:00的时间开始计时;2.P3.0/ AD0控制”秒”的调整,每按一次加1秒;3.P3.1/ AD0控制”分”的调整,每按一次加1分;4.P3.2/ AD0控制”时”的调整,每按一次加1小时;5.用protues画出原理图并仿真实现,写出源程序;6.在万用板上焊接元件调试;7.写出详细的实验报告。
三、所需电子元器件单片机89C51. 1个非门74LS04. 1个缓冲器74 LS373. 1个LG3611AH数码管. 6个电阻1(1KΩ). 8个电阻2(10KΩ). 1个电阻3(510Ω). 3个电容.(33pf) 2个电解电容. 1个四设计原理及其框图1.数字钟的构成数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路.由于计数的起始时间不可能与标准时间一致,故需要在电路上加一个校时电路,同时标准的1HZ时间信号必须做到准确稳定.通常使用石英晶体振荡器电路构成数字钟.⑴晶体振荡器电路晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定.不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器电路.⑵分频器电路分频器电路将32768Hz的高频方波信号经32768()次分频后得到1Hz的方波信号供秒计数器进行计数.分频器实际上也就是计数器.⑶时间计数器电路时间计数电路由秒个位和秒十位计数器,分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器,分个位和分十位计数器为60进制计数器,而根据设计要求,时个位和时十位计数器为24进制计数器.⑷译码驱动电路译码驱动电路将计数器输出的8421BCD码转换为数码管需要的逻辑状态,并且为保证数码管正常工作提供足够的工作电流.⑸数码管数码管通常有发光二极管(LED)数码管和液晶(LCD)数码管,本设计提供的为LED数码管.2.数字钟的工作原理设计原理主要利用AT89C51单片机,由单片机的p2口控制数码管的位显示,p1口控制数码管的段显示,p3.0——p3.2与按键相接用于时间校正。
第6章89C51的定时器计数器
LJMP TH0INT
;跳TH0中断服务程序
ORG 0100H
MAIN: MOV TMOD,#27H MOV TL0,#0FFH
;T0中断服务程序,停止T0计数
SETB F0 ;建立产生中断标志
RETI
IT1P:
CPL P1.0 ;T1中断服务,P1.0位取反
RETI
在T1定时中断服务程序IT1P中,省去了T1中断服务程序中重新 装入初值06H的指令。
例6-4 利用T1的方式2对外部信号计数,要求每计满100个数, 将P1.0取反。
图6-3 低4位与外部中断有关,已介绍。高4位的功能如下:
(1) TF1、TF0——计数溢出标志位 (2) TR1、TR0——计数运行控制位
1:启动定时器/计数器工作 0:停止定时器/计数器工作
6.2 定时器/计数器的4种工作方式 6.2.1 方式0 M1、M0为00 ,定时器/计数器的框图:
图6-4
T1工作在方式2,作波特率发生器用。现要求增加一个外部中 断源,并控制P1.0引脚输出一个5kHz的方波。设系统时钟为 6MHz。
图6-15
(1)选择工作方式 TL0为方式3计数,把T0引脚(P3.4)作附加的外中断输入端,
TL0初值设为0FFH,当检测到T0引脚电平出现负跳变时,TL0 溢出,申请中断,这相当于跳沿触发的外部中断源。 TH0为8位方式3定时,控制P1.0输出5kHz的方波信号。如图6-15 所示。 (2)初值计算 TL0的初值设为0FFH。 5kHz的方波的周期为200s,TH0的定时时间为
100s。TH0初值X计算如下: (28-X)×2×10-6=1×10-4
X=28-100=156=9CH
(3)程序设计
【毕业设计】基于AT89C51单片机的电子时钟
昆明工业职业技术学院系统软件设计内容提要单片计算机即单片微型计算机。
由RAM ,ROM,CPU构成,定时,计数和多种接口于一体的微控制器。
它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。
而51系列单片机是各单片机中最为典型和最有代表性的一种。
这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。
本设计主要设计了一个基于AT89C51单片机的电子时钟。
应用定时器实现秒定时,在此基础上实现时钟的计时功能,并通过数码管输出时分秒信息,并设计按键调时功能。
关键字:单片机;电子时钟;键盘控制目录1绪论单片机在多功能数字钟中的应用已是非常普遍的,人们对电子时钟的功能及工作顺序都非常熟悉。
但是却很少知道它的内部结构以及工作原理。
由单片机作为电子时钟的核心控制器,可以通过它的时钟信号进行实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。
通过键盘可以进行校时、定时等功能。
输出设备显示器可以用液晶显示技术或数码管来显示技术。
本系统利用单片机实现具有计时、校时等功能的数字时钟,是以单片机AT89S51为核心元件同时采用LED数码管显示器动态显示“时”,“分”,“秒”的现代计时装置。
与传统机械表相比,它具有走时精确,显示直观等特点。
另外具有校时功能,秒表功能,和定时器功能,利用单片机实现的数字时钟具有编程灵活,便于功能的扩充等优点。
1.1所做题目的意义:数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。
由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。
尽管目前市场上已有现成的数字钟集成电路芯片出售,价格便宜、使用也方便,但鉴于单片机的定时器功能也可以完成数字钟电路的设计,因此进行数字钟的设计是必要的。
在这里我们将已学过的比较零散的数字电路的知识有机的、系统的联系起来用于实际,来培养我们的综合分析和设计电路,写程序、调试电路的能力。
89C51的定时
(256 − TH 0初值) 时钟周期 ×12 ×
5.1 89C51的定时与计数 的定时与计数
4.方式3 4.方式3 方式 方式3时 定时器 仍可设置为方式 仍可设置为方式0、方式1或方 方式 时,定时器1仍可设置为方式 、方式 或方 的中断源已被定时器0占 式2。但由于 。但由于TR1、TF1及T1的中断源已被定时器 占 、 及 的中断源已被定时器 此时,定时器1仅由控制位切换其定时或计数功 用,此时,定时器 仅由控制位切换其定时或计数功 当计数器计满溢出时,只能将输出送往串行口。 能,当计数器计满溢出时,只能将输出送往串行口。 在这种情况下,定时器1一般用作串行口波特率发生 在这种情况下,定时器 一般用作串行口波特率发生 器或不需要中断的场合。 器或不需要中断的场合。 因定时器1的 被占用, 因定时器 的TR1被占用,因此其启动和关闭较 被占用 为特殊,当设置好工作方式时,定时器1即自动开始 为特殊,当设置好工作方式时,定时器 即自动开始 运行。若要停止操作,只需送入一个设置定时器1为 运行。若要停止操作,只需送入一个设置定时器 为 方式3的方式字即可 的方式字即可。 方式 的方式字即可。
4.方式3 4.方式3 方式 T0分成 分成2 位定时器:TL0定时 计数器和TH0 定时/ TH0定时器 T0分成2个8位定时器:TL0定时/计数器和TH0定时器 TL0占用T0控制位 C/T,TR0,GATE;TH0占用T1控制位 TR1。 占用T0控制位: 占用T1控制位: TL0占用T0控制位:C/T,TR0,GATE;TH0占用T1控制位:TR1。 T1不能使用方式 不能使用方式3 T1不能使用方式3工作
5.1 89C51的定时与计数 的定时与计数
定时/计数器的 种工作方式 定时 计数器的4种工作方式 计数器的
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。