当前位置:首页 > 定时器
  • 可编程定时/计数器8253在扬声器中的应用技术

    可编程定时/计数器8253在扬声器中的应用技术

    定时/计数器都有定时或对外部事件计数的功能。通常,定时/计数器归纳起来一般有3种类型:   硬件计数器 可在简单软件控制下计数,特点是成本低,使用方便,但是专用性强,使用不广泛。   软件定时/计数器 特点是几乎没有硬件费用,但他占用CPU的运行时间,降低了CPU的工作效率。   可编程定时/计数器 特点是工作灵活,而且不占用CPU的运行时问,缺点是成本较高。其中可编程定时/计数器8253是一种使用较为普遍的可编程定时/计数器。   可编程定时/计数器8253通过软件设定,可以产生各种时间延迟信号,他的使用非常广泛,通常被用于定时控制、延时、计数等场合,如定时刷新RAM、系统时钟的计时、扬声器的发音长短的控制。在使用的时候,需要进行严密的计算和精确的测试,以满足不同的要求。   1 可编程定时/计数器8253的工作原理   可编程定时/计数器8253是NMOS工艺制成的大规模集成电路,通过简单编程可实现不同的功能,图1为可编程定时/计数器8253的基本原理图。   从图1可以看出,芯片内有3个独立的计数器,分别为计数器0,计数器1,计数器2,每一个计数器都是16位的,可以分别对他们设定工作方式(通过控制字设定)。   图2为封装后的8253引脚图。 可编程定时/计数器8253可以应用在两种情况下:定时、计数。当用作定时器时,可以循环计数,信号来源一般为系统本身;当用作计数器时,信号来源一般为系统文件。在扬声器驱动系统中,可编程定时/计数器8253是作定时器来使用的。   图2中对应引脚的含义如下:   CLK0,CLK1,CLK2:对应计数器的时钟输入。   GATE0,GATE1,GATE2:对应计数器输出信号。   OUT0,OUT1,OUT2:对应计数器输出信号。   RD:读信号。低电平有效,读出计数器的计数值送入缓冲器。   WR:写信号。低电平有效,接收由缓冲器送来的数据。   CS:片选信号。低电平有效。只有在CS信号低电平时8253才能产生读写操作,否则不会读写。   A1~A0:对3个计数器和1个控制寄存器端口进行寻址。   D7~D0:方式控制字。可编程定时/计数器能正确工作与否,与方式控制字密切相关。方式控制字格式如下: 方式控制字对应位的含义见数据手册。   VCC:+5 V电源。   GND:接地引脚。    2 可编程定时/计数器8253在扬声器中的应用   扬声器驱动系统的硬件组成如图3所示。利用8253驱动扬声器发声是由系统插件上8255的外围电路来发出驱动信号的。如图3中的SPK DATA和TIM GATESPK就是接在8255的输出端口上。其中TIM GATESPK控制8253定时器来驱动扬声器,SPK DATA来控制扬声器的门电路。直接由门电路驱动发出的声音比较难听,通过滤波器滤掉杂波之后会更动听一些,所以最好如图3所示加一个滤波器。      (1)首先以流程图的方式说明使用扬声器发声的过程,如图4所示。

    时间:2020-05-07 关键词: 定时器 计数器 8253

  • 臭氧老化箱使用的4个流程简易介绍

    臭氧老化箱使用的4个流程简易介绍

    林频生产制造的臭氧老化箱是科学研究活性氧对硫化橡胶的功效规律性,迅速评定和点评硫化橡胶抗活性氧老化性能与抗活性氧剂安全防护效率的方式、从而采取措施的防脆化对策,以提升橡塑制品的使用期。 下边就臭氧老化箱的定时执行、起动、动态性试验及警报温度4个流程开展简易详细介绍: 一、臭氧老化箱定时执行设置:设定时可根据定时器控制面板上的"+""-"按键来设置(H:钟头、M:分钟、S:秒),如2钟头40分钟,则设置"81H30",设好后开启定时开关,按住开关电源"ON"按键,这时机器设备进到高温控温运作,时间到后,机器设备会全自动断开开关电源。 二、臭氧老化箱活性氧实验起动:开启绿按纽开关电源。把试验箱温度调至50度,等试验箱温度平稳.把活性氧仪表盘归0,等30分钟后把活性氧按纽开启。仪表盘设置看仪表盘使用手册;环境湿度实验时、先查验小水箱里边是不是有水,无水放水.开启寒湿按纽.把实验仪表盘调至必须的实验温度,开启致冷按纽。 三、臭氧老化箱动态性实验:开启轮盘按纽和拉申按纽,依据必须调转速比、排气管按纽是等实验完毕时把活性氧排在户外时开启。 四、臭氧老化箱警报温度设置:按仪表盘设置键"get"5秒,进到仪表盘内部莱单: 1.AL1(警报1):通常为AL1=SV+16℃,该警报高温时功效,超低温不需设置。例:SV为60℃,则AL1为63℃。 2.ATU(自灭磁):自整列入0000表达关掉,0001为开启。本机打开通常不需自灭磁,若某设置温度值无法匀速运动,则开启自灭磁。在自灭磁全过程中,箱里温度会有起伏,属正常问题。

    时间:2020-05-07 关键词: 面板 定时器 机器

  • 正确的时序

    正确的时序

    许多模拟电路需要一种时钟信号,或者要求能在一定时间后执行某项任务。对于这样的应用,有各种各样适用的解决方案。对于简单的时序任务,可以使用标准的555电路。使用555电路和适当的外部组件,可以执行许多不同的任务。然而,使用相当广泛的555定时器有一个缺点,就是设置不太精确。555定时器通过给外部电容充电和检测电压阈值来工作。这种电路很容易制作,但它的精度很大程度上取决于其电容的实际值。晶体振荡器适用于精度要求较高的应用。它们的精度可能很高,但它们有一个缺点:可靠性。参与电气设备维修的人都知道,故障通常是由大型电解电容引起的。晶体振荡器是引起故障的第二大原因。第三种测量时间长度或生成时钟信号的方法是使用一个简单的小型微控制器。当然,可供选择的器件数量繁多,且可以选择各自不同的优化方法。但是,这些器件需要编程,用户需要掌握一定的知识才能使用它;此外,由于其采用数字设计,在关键应用中使用时,必须非常小心谨慎。例如,如果微控制器发生故障,整个系统会出现问题。除了这三种基本的时钟产生构建块之外,还有其他不太为人所知的替代方案。ADI公司提供的TimerBlox模块就是这样一种替代方案。它们是基于硅的时序模块,与微控制器不同,它们在运行中是完全模拟的,可以通过电阻进行调整。所以,它不需要软件编程,功能也非常可靠。图1对不同的TimerBlox模块进行了概述,且介绍了它们各自的基本功能。使用这些基本构建模块可以生成无数其他功能。图1.用于生成各种时序功能的TimerBlox电路与广泛使用的555定时器电路相比,TimerBlox电路不依赖外部电容充电。所有的设置都在电阻中完成,因此其功能更精确。精度可达到1%至2%。晶体振荡器的精度更高,约为100倍,但随之而来的是各种缺点。图2.采用LTC6993 TimerBlox集成电路的包络检波器时序模块的应用非常多样化。ADI公司已经发布了许多示例电路。图2显示了一个包络检波器。几个快速脉冲结合在一起形成一个较长的脉冲。LTC6993-2的外部组件对于这个应用来说是最少的。电路中的电容只是一个支持电源电压的备用电容,对定时模块的精度没有影响。其他有趣的应用还包括用于电源的多个开关稳压器的相移同步,或将扩频调制添加到具有同步输入的开关稳压器IC中。另一个典型的应用是部署指定的延迟,也就是定时器为特定的电路段提供延迟开启的功能。有许多不同的技术解决方案用于生成时钟信号和执行各种基于时间的任务。每种方案各有其优缺点。例如TimerBlox模块这样的硅振荡器,就因为使用可变电阻代替电容,所以具备易于使用、精度高、可靠性高等特点。

    时间:2019-10-15 关键词: 定时器 时序 时钟信号

  • 单片机倒计时定时器

    这里我们先要安装好51试验板上的两个轻触按钮开关,我们采用的是独立式按钮开关,也就是说将开关直接连接到电源的地和单片机的对应引脚之间,这里K1接到单片机的P3.6引脚,K2接到P3.7正常情况下单片机的P3.6P3.7都被程序初始化时置1 当有按键按下时对应的单片机引脚被按钮开关下拉为0,这种方法比较直观,而且比较简单,在按键数量不多的场合下使用很广泛 因为机械开关开关时有抖动,所以需要在程序中加一个软件去抖动程序,它的工作原理如下:当单片机检测到有按键被按下后立即执行一个10毫秒的延时程序,然后再在检测该引脚是否仍然为闭合状态?如果仍然为闭合说明确认该键被按下立即执行相应的处理程序,否则可能是干扰,丢弃这次检测结果 接下来我们再安装一个四位的拨码开关,就是图中红色的开关,它相当于四个装在一起的拨动开关,当开关拨到"ON"一侧时,对应的那路就会接通,反之断开.它在单片机中一般用于设置初始参数,而且不经常改变的场合这里因为单片机引脚资源不够,所以我们只使用了拨码开关的第234位,第1位闲置三个开关可以逻辑组合出8种状态,所以我们能够方便灵活地预置多达7种的倒计时时间 最后我们来安装两个继电器和相关电路,有了继电器我们的实验板不再仅仅是做做实验而已,可以用于控制一些负载,比如说:充电器,洗衣机,电风扇等,使我们的实验板的实用功能大大增强,这也是电子制作实验室网站的单片机实验板和其他公司的产品不同的地方   这里继电器由相应的S8050三极管来驱动,开机时,单片机初始化后的P2.3/P2.4为高电平,+5伏电源通过电阻使三极管导通,所以开机后继电器始终处于吸合状态,如果我们在程序中给单片机一条:CLR P2.3或者CLR P2.4的指令的话,相应三极管的基极就会被拉低到零伏左右,使相应的三极管截至,继电器就会断电释放,每个继电器都有一个常开转常闭的接点,便于在其他电路中使用,继电器线圈两端反相并联的二极管是起到吸收反向电动势的功能,保护相应的驱动三极管,这种继电器驱动方式硬件结构比较简单 ;可设定时间的倒计时定时器,可选择5/15/20/30/35/45/50分钟倒计时 ;倒计时时间由四位拨码开关的2/3/4位来控制, ;第2位表示5分钟,第3位表示15分钟,第4位表示30分钟, ;通过不同的组合可以产生5/15/20/30/35/45/50分钟倒计时 ;P1.0口的外接的发光二极管为状态LED,定时未开始时LED常亮,定时过程中LED闪烁 ;K1为开始按钮,K2为停止按钮 a_bit equ 20h ;数码管个位数存放内存位置 b_bit equ 21h ;数码管十位数存放内存位置 temp equ 22h ;计数器数值存放内存位置 ;开机初始化 MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入 MOV P0,#0FFH;使显示时间数码管熄灭 CLR P1.0;点亮LED指示灯 ;等待键盘输入 START:JB P3.6,$;循环判断开始按钮K1是否按下? ACALL DELAY10;延时10毫秒触点消抖 JB P3.6,START;如果是干扰就返回 JNB P3.6,$;等待按键松开 ;读拨码开关的状态,获得倒计时时间 SET:MOV A,#0;首先对A清零 JB P2.0,A1;判断拨码开关的第2位是否接通,接通就对A加5 ADD A,#5 A1:JB P2.1,A2;判断拨码开关的第3位是否接通,接通就对A加15 ADD A,#15 A2:JB P2.2,A3;判断拨码开关的第4位是否接通,接通就对A加30 ADD A,#30 A3:MOV TEMP,A ;这时TEMP中的值就是倒计时时间 ;数码管显示定时时间的程序 display:CLR P2.4;使继电器1释放,开始定时(开机时继电器处于吸合状态) CLR P2.3;使继电器2释放,开始定时(开机时继电器处于吸合状态) MOV R2,#120 AB:MOV R3,#250 TIME1:mov a,temp ;将temp中的十六进制数转换成10进制 mov b,#10 ;10进制/10=10进制 div ab mov b_bit,a ;十位在a mov a_bit,b ;个位在b mov dptr,#numtab ;指定查表启始地址 mov r0,#4 dpl1: mov r1,#250 ; dplop: mov a,a_bit ;取个位数 MOVC A,@A+DPTR ;查个位数的7段代码 mov p0,a ;送出个位的7段代码 clr p2.7 ;开个位显示 ACALL DELY1;显示1毫秒 setb p2.7;关闭个位显示,防止鬼影 mov a,b_bit ;取十位数 MOVC A,@A+DPTR ;查十位数的7段代码 mov p0,a ;送出十位的7段代码 clr p2.6 ;开十位显示 ACALL DELY1;显示1毫秒 setb p2.6;关闭十位显示,防止鬼影 ;插入一段判断定时过程中是否有按键输入的程序段 C1:JB P3.6,B1 ACALL DELAY10;延时10毫秒消抖 JB P3.6,C1 JNB P3.6,$;等待按键松开 AJMP SET B1:JB P3.7,M33 ACALL DELAY10;延时10毫秒消抖 JB P3.7,B1 JNB P3.7,$;等待按键松开 AJMP OVER M33:djnz r3,TIME1 ;2毫秒循环执行250次,时间约0.5秒 CPL P1.0;使LED每1秒闪烁一次 djnz r2,AB ;循环执行120次,时间为1分钟 DEC TEMP;满一分钟对定时时间减1 MOV A,TEMP JNZ DISPLAY;判断TEMP的数值是否为0?不为0循环 ;结束定时 OVER:CLR P1.0;LED指示灯常亮 SETB P2.4;继电器1吸合,定时结束,退回到开机时的状态 SETB P2.3;继电器2吸合,定时结束,退回到开机时的状态 AJMP START;退到开机初始化状态 ;1毫秒延时子程序 DELY1:MOV R4,#2 D1:MOV R5,#248 DJNZ R5,$ DJNZ R4,D1 RET ;10毫秒延时子程序 DELAY10:MOV R4,#20 D2:MOV R5,#248 DJNZ R5,$ DJNZ R4,D2 RET ;实验板上的7段数码管0~9数字的共阴显示代码 numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH end

    时间:2019-08-04 关键词: 定时器 单片机 倒计时

  • 单片机常用功能模块的使用-定时器

    51 单片机编程经常要求对时间进行某种操作,比如数码管的动态扫描显示、延时等等……对于定时或延时,一般有三种方法实现: ①、软件定时:如常用的延时程序 Delay(),在定时过程中,CPU 循环测试延时变量是否满足条件,此时 CPU 利用率低下; ②、硬件定时:如外部芯片555 时基电路,通过外部阻容,达到一定的延时功能,改变阻容大小可以改变延时长度,这种定时器取决于硬件,设定好以后不能通过软件更改; ③、定时器:利用单片机内部定时器,实现对时间的操作。 1、定时器功能: (1)、定时:产生一个标准的时间间隔:如 20 ms,100 ms 等,单片机使用这种方式可以产生一个符合某一要求的脉冲方波; (2)、计数:对外部的事件(脉冲)进行统计,很明显外部事件的发生是随机的,单片机不可能预知外部事件何时发生,但可以进行统计,当达到所要求的数值时,单片机进行相应的操作。 2、四种工作模式: 模式 0:13 位计数器模式   在某一个初值的基础上加 1 计数,当计数器计满为全“1”,再来一个计数脉冲时,就产生一个“溢出中断信号”TF1=1。 注:由于低 8 位计数器中的高三位没有参与工作,故填装初值时应“避开”此三位。 模式 1:16 位定时/计数模式   类同于模式 0,由于两个计数器为完整的 8 位,故将计算好的 16 位初值可直接填装到 TH、TL 中。 模式 2:8 位自动重装初值模式   TL 做计数器,TH 做初值寄存器,工作前 TL1,TH1 分别预置相同的初值,TL1 计数时,产生溢出的同时,将 TH1 中的初值自动重装 TL1,TL1 继续计数。 模式 3:组合扩展模式(仅适用于 T0)   将 T0 和 T1 重新进行“拆分、组合”,将 T0 变为由 TH0,TL0 组成的两个独立的 8 位定时/计数器。 补充:四种模式比较:   3、定时器参数: (1)、定时器的个数:网上见到的 51 单片机教程都说定时器有 2 个:定时器 0 和定时器 1,实际上有的单片机有 3 个定时器,如博主买的开发板上的单片机:STC89C54RD+,因此,编程时注意看好有几个定时器…… (2)、TL,TH:初值寄存器,分别是低 8 位,高 8 位,后边加上一个数字 0 或 1,代表定时器 0 或定时器 1 (3)、TMOD:模式控制寄存器,属于 SFR 特殊功能寄存器,地址:89H,决定定时/计数器的四种工作模式,8 位   GATE 选通门:GATE=0 时,只要 TR=1,计数器就开始工作 GATE=1 时,只有 INT=TR=1 时,计数器工作(用来测量 INT 脚高电平脉冲的宽度) C/T:计数器输入脉冲选择开关,决定着计数器的“定时”或“计数”的两种工作方式 C/T=0:定时方式:计数器接收内部时钟信号 fosc C/T=1:计数方式:计数器接收引脚上的外部信号 M1、M0 模式选择:确定 4 种工作模式 (4)、TCON:控制寄存器,属于 SFR 特殊功能寄存器,地址:88H,8 位   TF:定时器溢出标志,计数器溢出时硬件自动置位,即 TF=1,进入中断后再由硬件自动清除(TF=0) TR:计数器的控制位 TR=1:计数器开始工作 TR=0:计数器停止计数 IE:外部中断 INT 的请求标志 当单片机检测到 INT 引脚上有下降沿时,IE=1 申请中断,进入中断服务程序时,硬件自动清除 IE 标志 IT:外中断触发类型控制 IT=1 时,外中断信号的下降沿触发 IE 标志 IT=0 时,外中断信号的低电平触发 IE 标志 (5)、作为“定时器”使用时,“定时”与“初值”的关系如下: T = ( M - TC ) × t 其中:T:定时时间 M:计数器的模 TC:计数初值 t:计数器计数脉冲的周期(t = fosc / 12) 注:具体计算实例,参见前面“四种模式比较”中的第二张图……

    时间:2019-07-31 关键词: 定时器 单片机 功能模块

  • 定时器计数实验

    #include typedef unsigned char u8; typedef unsigned int u16; sbit led = P1^0; u8 timer; void main (void) { TMOD = 0x01;//设置TMOD,使得T0工作在16位定时。 TH0 = (65535-50000) / 256; TL0 = (65535-50000) % 256; EA = 1; //开放总中断 ET0 = 1;//开放定时器0的溢出中断 TR0 = 1;//开始定时 while(1) //作用就是让程序结束 否则程序一直在这运行; { ; } } //实现方式一 void timer0_service(void) interrupt 1 { TH0 = (65535-50000) / 256; TL0 = (65535-50000) % 256; //50ms已经设置好了 timer ++; if (timer == 20) { timer = 0; led = ~led; } }    

    时间:2019-07-15 关键词: 定时器 计数实验

  • 单片机定时器的寄存器

    标准的 51 单片机内部有 T0 和 T1 这两个定时器,T 就是 Timer 的缩写,现在很多 51 系列单片机还会增加额外的定时器,在这里我们先讲定时器 0 和 1。前边提到过,对于单片机的每一个功能模块,都是由它的 SFR,也就是特殊功能寄存器来控制。与定时器有关的特殊功能寄存器,有以下几个,大家不需要去记忆这些寄存器的名字和作用,你只要大概知道就行,用的时候,随时可以查手册,找到每个寄存器的名字和每个寄存器所起到的作用。 表 5-1 的寄存器是存储定时器的计数值的。TH0/TL0 用于 T0,TH1/TL1 用于 T1。 表 5-1 定时值存储寄存器名称描述SFR 地址复位值 TH0定时器 0 高字节0x8C0x00 TL0定时器 0 低字节0x8A0x00 TH1定时器 1 高字节0x8D0x00 TL1定时器 1 低字节0x8B0x00 表 5-2 是定时器控制寄存器 TCON 的位分配,表 5-3 是则是对每一位的具体含义的描述。 表 5-2 TCON——定时器控制寄存器的位分配(地址 0x88、可位寻址)位76543210 符号TF1TR1TF0TR0IE1IT1IE0IT0 复位值00000000 表 5-3 TCON——定时器控制寄存器的位描述位符号描述 7TF1定时器 1 溢出标志。一旦定时器 1 发生溢出时硬件置 1。清零有两种方式: 软件清零,或者进入定时器中断时硬件清零。 6TR1定时器 1 运行控制位。软件置位/清零来进行启动/停止定时器。 5TF0定时器 0 溢出标志。一旦定时器 0 发生溢出时硬件置 1。清零有两种方式: 软件清零,或者进入定时器中断时硬件清零。 4TR0定时器 0 运行控制位。软件置位/清零来进行启动/停止定时器。 3IE1外部中断部分,与定时器无关,暂且不看。 2IT1 1IE0 0IT0 大家注意在表 5-3 中的描述中,只要写到硬件置 1 或者清 0 的,就是指一旦符合条件,单片机将自动完成的动作,只要写软件置 1 或者清 0 的,是指我们必须用程序去完成这个动作,后续遇到此类描述就不再另做说明了。 对于 TCON 这个 SFR,其中有 TF1、TR1、TF0、TR0 这 4 位需要我们理解清楚,它们分别对应于 T1 和 T0,我们以定时器 1 为例讲解,那么定时器 0 同理。先看 TR1,当我们程序中写 TR1 = 1 以后,定时器值就会每经过一个机器周期自动加 1,当我们程序中写 TR1 = 0以后,定时器就会停止加 1,其值会保持不变化。TF1,这个是一个标志位,他的作用是告诉我们定时器溢出了。比如我们的定时器设置成 16 位的模式,那么每经过一个机器周期,TL1加 1 一次,当 TL1 加到 255 后,再加 1,TL1 变成 0,TH1 会加 1 一次,如此一直加到 TH1和 TL1 都是 255(即 TH1 和 TL1 组成的 16 位整型数为 65535)以后,再加 1 一次,就会溢出了,TH1 和 TL1 同时都变为 0,只要一溢出,TF1 马上自动变成 1,告诉我们定时器溢出了,仅仅是提供给我们一个信号,让我们知道定时器溢出了,它不会对定时器是否继续运行产生任何影响。 本节开头我们就提到了定时器有多种工作模式,工作模式的选择就由 TMOD 来控制,TMOD 的位分配和描述见表 5-4 到 5-6 所示,TMOD 的位功能如表 5-5 所示。 表 5-4 TMOD——定时器模式寄存器的位分配(地址 0x89、不可位寻址)位76543210 符号GATE (T1)C/T (T1)M1 (T1)M0 (T1)GATE (T0)C/T (T0)M1 (T0)M0 (T0) 复位值00000000 表 5-5 TMOD——定时器模式寄存器的位描述符号描述 T1/T0在表 5-5 中,标 T1 的表示控制定时器 1 的位,标 T0 的表示控制定时器 0 的位。 GATE该位被置 1 时为门控位。仅当„INTx‟脚为高并且„TRx‟控制位被置 1 时使能 定时器„x‟,定时器开始计时,当该位被清 0 时,只要„TRx‟位被置 1,定时 器 x 就使能开始计时,不受到单片机引脚„INTx‟外部信号的干扰,常用来测 量外部信号脉冲宽度。这是定时器一个额外功能,本节课暂不介绍。 C/T定时器或计数器选择位。该位被清零时用作定时器功能(内部系统时钟), 被置 1 用作计数器功能。 表 5-6 TMOD——定时器模式寄存器 M1/M0 工作模式M1M0工作模式描述 000兼容 8048 单片机的 13 位定时器,THn 的 8 位和 TLn 的 5 位组 成一个 13 位定时器。 011THn 和 TLn 组成一个 16 位的定时器。 1028 位自动重装模式,定时器溢出后 THn 重装到 TLn 中。 113禁用定时器 1,定时器 0 变成 2 个 8 位定时器。 可能你已经注意到了,表 5-2 的 TCON 最后标注了“可位寻址”,而表 5-4 的 TMOD 标注的是“不可位寻址”。意思就是说:比如 TCON 有一个位叫 TR1,我们可以在程序中直接进行 TR1 = 1 这样的操作。但对 TMOD 里的位比如(T1)M1 = 1 这样的操作就是错误的。我们要操作就必须一次操作这整个字节,也就是必须一次性对 TMOD 所有位操作,不能对其中某一位单独进行操作,那么我们能不能只修改其中的一位而不影响其它位的值呢?当然可以,在后续课程中你就会学到方法的,现在就先不关心它了。 表 5-6 列出的就是定时器的 4 中工作模式,其中模式 0 是为了兼容老的 8048 系列单片机而设计的,现在的 51 几乎不会用到这种模式,而模式 3 根据我的应用经验,它的功能用模式 2 完全可以取代,所以基本上也是不用的,那么我们就重点来学习模式 1 和模式 2。 模式 1,是 THn 和 TLn 组成了一个 16 位的定时器,计数范围是 0~65535,溢出后,只要不对 THn 和 TLn 重新赋值,则从 0 开始计数。模式 2,是 8 位自动重装载模式,只有 TLn做加 1 计数,计数范围 0~255,THn 的值并不发生变化,而是保持原值,TLn 溢出后,TFn就直接置 1 了,并且 THn 原先的值直接赋给 TLn,然后 TLn 从新赋值的这个数字开始计数。这个功能可以用来产生串口的通信波特率,我们讲串口的时候要用到,本章节我们重点来学习模式 1。为了加深大家理解定时器的原理,我们来看一下他的模式 1 的电路示意图 5-2。   图 5-2 定时器/计数器模式 1 示意图 我带领大家一起来分析一遍这个示意图,日后如果再遇到类似的图,大家就可以自己研究了。OSC 框表示时钟频率,因为 1 个机器周期等于 12 个时钟周期,所以那个 d 就等于 12。下边 GATE 右边的那个门是一个非门电路,再右侧是一个或门,再往右是一个与门电路,大家可以对照一下 5-1 节的内容。 图上可以看出来,下边部分电路是控制了上边部分,那我们先来看下边是如何控制的,我们以定时器 0 为例。 1) TR0 和下边或门电路的结果要进行与运算,TR0 如果是 0 的话,与运算完了肯定是 0,所以如果要让定时器工作,那么 TR0 就必须置 1。 2) 这里的与门结果要想得到 1,那么前面的或门出来的结果必须也得是 1 才行。在 GATE位为 1 的情况下,经过一个非门变成 0,或门电路结果要想是 1 的话,那 INT0 即 P3.2 引脚必须是 1 的情况下,这个时候定时器才会工作,而 INT0 引脚是 0 的情况下,定时器不工作,这就是 GATE 位的作用。 3) 当 GATE 位为 0 的时候,经过一个非门会变成 1,那么不管 INT0 引脚是什么电平,经过或门电路后都肯定是 1,定时器就会工作。 4) 要想让定时器工作,就是自动加 1,从图上看有两种方式,第一种方式是那个开关打到上边的箭头,就是 C/T = 0 的时候,一个机器周期 TL 就会加 1 一次,当开关打到下边的箭头,即 C/T =1 的时候,T0 引脚即 P3.4 引脚来一个脉冲,TL 就加 1 一次,这也就是计数器功能。

    时间:2019-07-12 关键词: 定时器 单片机 寄存器

  • Exynos 4412 看门狗定时器中断

    如果想弄懂看门狗定时器中断,要掌握下面两个知识点:1 懂寄存器Cortex A9采用的是ARM官方规定的中断处理机制有两大类寄存器决定了中断工作状态1) exynos 4412 特有的寄存器(在第26章)2) Cortex A9 规定的工作寄存器(在第9章和第10章)2 懂中断处理过程1) Arm启动先执行一段启动代码(start.S),这段代码是用汇编写的2) 然后,汇编代码再执行到c的main函数start.S讲解.text.global _start @@@@ _start 是一个全局标号 (表示在其他函数可以调用_start)_start: @@@@ 通常被指定为0x0000 0000地址b reset @@@@ 此段代码放在0x0000 0000地址处 ,命令功能是跳转到reset处去执行ldr pc,_undefined_instructionldr pc,_software_interruptldr pc,_prefetch_abortldr pc,_data_abortldr pc,_not_usedldr pc,_irq @@@@ 将_irq地址处的指令地址给PC ,相当于一条跳转命令,这条指令回放在0x0000 0018处ldr pc,_fiq_undefined_instruction: .word _undefined_instruction_software_interrupt: .word _software_interrupt_prefetch_abort: .word _prefetch_abort_data_abort: .word _data_abort_not_used: .word _not_used_irq: .word irq_handler @@@@ .word 是一条伪指令,相当于定义一个4字节的变量_irq,值为irq_handler@@@@ 等价于 int _irq = irq_handler_fiq: .word _fiq@@@@ 伪指令:不是一条实际的汇编指令,变量定义,宏定义,数组定义reset:@@@@ 初始化 协处理器ldr r0,=0x40008000mcr p15,0,r0,c12,c0,0 @ Vector Base Address Register@@@@ 设置cpsr的值,为0xd3mrs r0,cpsrbic r0,r0,#0x1forr r0,r0,#0xd3 @@@@ 0xd3 1101 0011 禁止FIQ, IRQ, 处于ARM状态 ,模式为管理模式 SVCmsr cpsr,r0 @ Enable svc mode of cpuinit_stack: @@@@初始化堆栈, svc, irq, fiq.... 每种模式的堆栈大小为512字节ldr r0,stacktop /*get stack top pointer*//********svc mode stack********/mov sp,r0sub r0,#128*4 /*512 byte for irq mode of stack*//****irq mode stack**/msr cpsr,#0xd2mov sp,r0sub r0,#128*4 /*512 byte for irq mode of stack*//***fiq mode stack***/msr cpsr,#0xd1mov sp,r0sub r0,#0/***abort mode stack***/msr cpsr,#0xd7mov sp,r0sub r0,#0/***undefine mode stack***/msr cpsr,#0xdbmov sp,r0sub r0,#0/*** sys mode and usr mode stack ***/msr cpsr,#0x10mov sp,r0 /*1024 byte for user mode of stack*/@@@此处可以添加自己的初始化代码b main @@@@ 跳转到main函数,不会回来了.align 4/**** swi_interrupt handler ****//**** irq_handler ****/irq_handler: @@@@ 一旦IRQ中断会跳转到这sub lr,lr,#4stmfd sp!,{r0-r12,lr} @@@@ 将r0-r12, lr寄存器入栈,,,,保护现场bl do_irq @@@@ 跳转到中断服务程序do_irq, 执行完再回来ldmfd sp!,{r0-r12,pc}^ @@@@ 将栈中数据出栈,给r0-r12, lr寄存器,,,,恢复现场stacktop: .word stack+4*512.datastack: .space 4*512//////////////////////////////////下面是C代码//////////////////////////////void do_irq(void ) //C语言的中断服务程序代码,这段程序是程序员需要重点完成的{int irq_num;irq_num = (CPU0.ICCIAR & 0x1FF);switch (irq_num) {case 58: //turn on LED2; turn off LED3GPX2.GPX2DAT = 0x1 << 7;GPX1.GPX1DAT &= ~0x1;printf("IRQ interrupt !! turn on LED2; turn off LED3n");//Clear PendEXT_INT41_PEND |= 0x1 << 2;ICDICPR.ICDICPR1 |= 0x1 << 26;break;}// End of interruptCPU0.ICCEOIR = (CPU0.ICCEOIR & ~(0x1FF)) | irq_num;}int main(void){//.....}二:GIC控制器初始化, ARM提供(Generic Interrupt Controller)////////4412 的中断控制其部分,采用了ARM公司的GIC中断控制器架构GIC中断共152个, 分为三部分SGI 16个 Software Generated Interrupt (SGI)PPI 8个 Private Peripheral Interrupt (PPI)SPI 128 Shared Peripheral Interrupt (SPI)每个中断都被编了一个ID可以根据GIC Interrupt Table 来查找SPI Port No SPI中断源编号ID 总的中断源编号exynos4412 已经连接了两个外部中断中断源 SPI Port No IDEINT[9] 25 57GIC 设置流程:1 设置GIC中的某个SPI 中断允许还是禁止////////////////ICDISER(n) ICDISER1, ICDISER2, ICDISER3, ICDISER4SPI中断共128个,分成了4组ICDISER1 ---- > 控制 0-31 (第1组) (控制此中断编号是否可以产生中断 1 允许,0 禁止)ICDISER2 ---- > 控制 32-63 (第2组)ICDISER3 ---- > 控制 64-95 (第3组)ICDISER4 ---- > 控制 96-127 (第4组)INT9 ---- 25号 INT10 ---- 26号ICDISER1 (GIC的通道号0-31) 如果某一位为1 那么中断允许允许INT9 产生中断ICDISER.ICDISER1 |= (0x1 << 25); //中断使能寄存器允许INT10 产生中断ICDISER.ICDISER1 |= (0x1 << 26); //中断使能寄存器练习:允许WDT产生中断(43)ICDISER2 |= 0x1 << 11; (43 % 32)2 设置 某个CPU是否允许响应中断(默认情况,4个CPU都不响应中断)ICCICR: 对应于每个CPU,都有一个ICCICR,他的功能是 控制这个CPU的总的中断开关,1表示这个CPU响应中断, 0表示不响应中断CPU0.ICCICR |= 0x1; (把它值1,表明CPU0响应中断)3 设置 某个CPU响应的中断的最高优先级CPU0.ICCPMR = 0xFF; //上面允许了中断,ICCPMR中断优先级低于设置值的中断允许进入 0xFF最高,如果设置成0,4 设置 中断产生时是否影响中断标志位, 具体中断标志在哪参照ICDICPRICDDCRICDDCR = 1; //总的中断标志置位允许位5 设置某个中断是由哪个CPU来响应ICDIPTR 有很多组:4个中断为1组(中断ID号最大159, 160 / 4 = 40, ICDIPTR 有40个 )如果设置EINT9由CPU0来响应(EINT9 是57号,所以在编号14的寄存器中(56, 57, 58, 59))ICDIPTR.ICDIPTR14 = 0x00000100; //表示总中断号为 57的中断由CPU0来处理如果设置EINT9由CPU1来响应ICDIPTR.ICDIPTR14 = 0x00000200; //表示总中断号为 57的中断由CPU1来处理如果设置EINT9由CPU2来响应ICDIPTR.ICDIPTR14 = 0x00000400; //表示总中断号为 57的中断由CPU2来处理如果设置EINT9由CPU3来响应ICDIPTR.ICDIPTR14 = 0x00000800; //表示总中断号为 57的中断由CPU3来处理如果设置EINT9由CPU4来响应ICDIPTR.ICDIPTR14 = 0x00001000; //表示总中断号为 57的中断由CPU4来处理//上面的寄存器设置我的中断由哪个CPU来处理ICDIPTR 有很多(设置某个中断由哪个CPU来执行)ICDIPTR1 ICDIPTR1 ICDIPTR2 ICDIPTR3 ICDIPTR4 ICDIPTR5........有 160 / 4 个, 共40个, 每个寄存器控制4个中断每个寄存器是32位的,8位为1组, 每组代表某种中断由哪个CPU来执行0000 0001 表示由 CPU0来处理0000 0010 表示由 CPU1来处理0000 0100 表示由 CPU2来处理0000 1000 表示由 CPU3来处理0001 0000 表示由 CPU4来处理0010 0000 表示由 CPU5来处理0100 0000 表示由 CPU6来处理1000 0000 表示由 CPU7来处理一个32位寄存器可以分四组ICDIPTR.ICDIPTR14 = 0x01010101; //编号56,57,58,59四个中断,由CPU0来处理14 是 总的中断编号 / 4如果设置EINT9 (57) 中断优先级10ICDIPR14 = 0x00000A00;下面是看门狗定时器中断示例#include* @brief IRQ Interrupt Service Routine program body* @param[in] None* @return Noneint flag = 0;void do_irq(void){int irq_num;irq_num = (CPU0.ICCIAR & 0x1FF); //获取中断编号printf("n ******* WDT interrupt !!********n");if(flag == 0){//点亮flag = 1;}else{//点灭flag = 0;}//换成点亮或点灭LED3 GPX1_0WDT.WTCLRINT = 1; //清exynos4412中断标志位// End of interruptCPU0.ICCEOIR = (CPU0.ICCEOIR & ~(0x1FF)) | irq_num; //清cpu0中断标志位}void wdt_init(){WDT.WTCNT = 6000; //initial value ,, 延时大概有两秒WDT.WTDAT = 6000; //initial value ,, 延时大概有两秒WDT.WTCON = 0xff<<8 | 1<<5 | 3<<3 | 1<<2 ;}void mydelay_ms(int time){int i, j;while(time--){for (i = 0; i < 5; i++)for (j = 0; j < 514; j++);}}int main(void){/** GIC interrupt controller:* */// Enables the corresponding interrupt SPI43, WDTICDISER.ICDISER2 |= 1<<11; //ICDISER2:spi 32[bit0] ~ 63[bit31], 43 - 32 = [bit11]CPU0.ICCICR |= 0x1; //Global enable for signaling of interruptsCPU0.ICCPMR = 0xFF; //The priority mask level.Priority filter. thresholdICDDCR = 1; //Bit1: GIC monitors the peripheral interrupt signals and// forwards pending interrupts to the CPU interfaces2//ICDIPTR18:SPI40~SPI43; SPI43 interrupts are sent to processor 0ICDIPTR.ICDIPTR18 = (ICDIPTR.ICDIPTR18 & ~(0xFF<<24)) | 1<<24;wdt_init();printf("n****************WDT Interrupt test!!***************n");while(1){mydelay_ms(200);mydelay_ms(200);printf("working...n");}return 0;}

    时间:2019-07-09 关键词: ARM 定时器 看门狗 C语言

  • MCS-51单片机的定时器/计数器概念

    一、MCS-51单片机的定时器/计数器概念 单片机中,脉冲计数与时间之间的关系十分密切,每输入一个脉冲,计数器的值就会自动累加1,而花费的时间恰好是1微秒;只要相邻两个计数脉冲之间的时间间隔相等,则计数值就代表了时间的流逝; 因此,单片机中的定时器和计数器其实是同一个物理的电子元件,只不过计数器记录的是单片机外部发生的事情(接受的是外部脉冲),而定时器则是由单片机自身提供的一个非常稳定的计数器,这个稳定的计数器就是单片机上连接的晶振部件;MCS-51单片机的晶振经过12分频之后提供给单片机的只有1MHZ的稳定脉冲;晶振的频率是非常准确的,所以单片机的计数脉冲之间的时间间隔也是非常准确的,这个准确的时间间隔是1微秒; MCS-51单片机外接的是12MHZ的晶振(实际上是11.0592MHZ),所以,MCS-51单片机内部的工作频率(时钟脉冲频率)是12MHZ/12=1MHZ=1000000次/秒=1000000条指令/秒=1000000次/1000000微秒=1次/微秒=1条指令/微秒;也就是说,晶振振荡一次,就会给单片机提供一个时钟脉冲,花费的时间是1微秒,此时,CPU会执行一条指令,经历一个机器周期;即:1个时钟脉冲=1个机器周期=1微秒=1条指令; 注:个人PC机上的CPU主频是晶振经过倍频之后的频率,这一点恰好与MCS-51单片机的相反,MCS-51单片机的主频是晶振经过分频之后的频率; 总之:MCS-51单片机中的时间概念就是通过计数脉冲的个数来测量出来的;1个脉冲=1微秒=1条指令=1个机器周期; MCS-51单片机定时器/计数器的简单结构图:   8051系列单片机有两个定时器:T0和T1,分别称为定时器和定时器T1,这两个定时器都是16位的定时器/计数器;8052系列单片机增加了第三个定时器/计数器T2;它们都有定时或事件计数功能,常用于时间控制、延时、对外部时间计数和检测等场合; 二、定时器/计数器的结构 8051单片机的两个定时器T0和T1分别都由两个特殊功能寄存器组成;T0由特殊功能寄存器TH0和TL0构成,而T1则是由TH1和TL1构成; 作为定时器使用时,定时器计数8051单片机片内振荡器输出经过12分频后的脉冲个数,即:每个机器周期使定时器T0/T1的寄存器值自动累加1,直到溢出,溢出后继续从0开始循环计数;所以,定时器的分辨率是时钟振荡频率的1/12; 作为计数器使用时,通过引脚T0(P3.4)或T1(P3.5)对外部脉冲信号进行计数,当输入的外部脉冲信号发生从1到0的负跳变时,计数器的值就自动加1;计数器的最高频率一般是时钟振荡频率的1/24; 由此可知,不论是定时器还是计数器工作方式,定时器T0和T1均不占用CPU的时间,除非定时器/计数器T0和T1溢出,才可能引起CPU中断,转而去执行中断处理程序;所以说,定时器/计数器是单片机中效率高而工作灵活的部件; 三、定时器/计数器的工作模式 除了可选择定时器和计数器的这两种工作方式外,每个定时器/计数器都有4种工作模式; 在模式0、1和2时,T0和T1的工作模式相同;在模式3时,两个定时器/计数器的工作模式不同; 工作模式0: 由TL0的低5位和TH0的全部8位共同构成一个13位的定时器/计数器;定时器/计数器启动后,定时或计数脉冲个数加到TL0上,从预先设置的初值(时间常数)开始累加,不断递增1;当 TL0计满后,向TH0进位,直到13位寄存器计满溢出;溢出时,定时器/计数器硬件会自动地把13位的寄存器值清0,中断标记TF0置1;如果需要进一步定时/计数,需要使用相关指令重置时间常数,并把定时器/计数器的中断标记TF0置0;工作模式0的结构如下图:   工作模式1: 模式1与模式0几乎完全相同,唯一的区别就是,模式1中的寄存器TH0和TL0共同构成的是一个16位定时器/计数器来参与操作,因此比模式0中的定时/计数范围更大;工作模式1的结构如下图:   工作模式2: 这种模式又称为自动再装入预置数模式;当定时器/计数器的寄存器TH0/TL0的值溢出时,定时器/计数器硬件设备会自动把寄存器TH0/TL0的值清0,以重新开始操作;但是有时候,我们的定时/计数操作是需要多次重复定时/计数的,如果溢出时不做任何处理,那么,在第二轮定时/计数时就是从0开始定时/计数了,而这并不是我们想要的;所以,要保证每次溢出之后,在重新开始定时/计数的操作是我们想要的,那就要把预置数(时间常数)重新装入某个地方;而重新装入预置数的操作是硬件设备自动完成的,不需要人工干预所以,这种工作模式就叫自动再装入预置数方式;既然需要重新装入预置数,那么预置数就必须要存放在某个地方,才能保证重装操作成功;在工作模式2中,把自动重装入的预置数存放在定时器/计数器的寄存器的高8位中,也就是存放在TH0中,而只留下TL0参与定时/计数操作;显然,定时/计数的方位小了很多; 注:这个工作模式常用于波特率发生器(串口通讯),T1工作在串口模式2;用于这种方式时,定时器就是为了提供一个时间基准;计数溢出之后,不需要做太多的事情,只做一件事就可以,就是重新装入预置数,再开始重新计数,而且中间不需要任何延时;工作模式2的结构如下图:   工作模式3: 由于定时器/计数器T1没有工作模式3,如果把定时器/计数器T0设置为工作模式3,那么TL0和TH0将被分割成两个相互独立的8位定时器/计数器;工作模式3的结构如下图: 四、定时器/计数器的定时/计数范围 工作方式0:13位定时器/计数器工作模式,最多可计数2的13次方次,即:8192次,[0,8191]; 工作方式1:16位定时器/计数器工作模式,最多可计数2的16次方次,即:65536次,[0,65535]; 工作方式2:8位定时器/计数器工作模式,最多可计数2的8次方次,即:256次,[0,255]; 工作方式3:8位定时器/计数器工作模式,最多可计数2的8次方次,即:256次,[0,255]; 预置数的计算公式:预置数=最大值-需要计数的次数; 五、定时器/计数器的控制寄存器 8051单片机设计了两个8位的特殊功能寄存器来控制定时器/计数器的工作状态;这两个特殊功能寄存器分别是TMOD和TCON;它俩都在特殊功能寄存器区; 1、工作模式控制寄存器TMOD(89h):   2、工作状态控制寄存器TCON(88H):   六、定时器/计数器的初始化 1、设置定时器/计数器的工作模式TMOD(常用的是模式1:TMOD=0x01); 2、装入预置数到THx和TLx中(THx=TLx=MAX(8192/65536/256)-计数次数); 3、如果工作在中断方式,则需要开定时器/计数器的中断TCON中的标志位:TF0/TF1=0/1; 4、启动定时器/计数器:TR0/TR1=1; 注:由于8051单片机的定时器/计数器使用的时钟脉冲是外部晶振(12MHZ)经过12分频(12MHZ/12=1MHZ)之后的频率,所以,一个时钟脉冲就是1微秒;所以,8192个脉冲=8192微秒=8.192毫秒; 65536个脉冲=65536微秒=65.536毫秒; 256个脉冲=256微秒=0.256毫秒;

    时间:2019-07-06 关键词: 定时器 单片机 计数器 mcs-51

  • 定时器/计数器控制寄存器TCON的格式与各位功能

    定时器/计数器控制寄存器TCON锁存了外部中断源及其触发方式、定时器T0和T1溢出中断。TCON寄存器中的IE0、IT0、IE1、IT1。TCON中的位格式如下:     IE0:为外部中断INT0的请求标志位。当INT0引脚上出现中断请求信号(低电平或脉冲下降沿)时,硬件自动将IE0置“1”,产生中断请求标志。 IT0:外部中断INT0触发方式控制位。由软件来置“1”或清“0”,以控制外部中断INT0的触发方式。当IT0=1 时,外部中断INT0为下降沿触发。即外部中断INT0出现下降沿时,触发IE0,使其为“1”;当IT0=0时,外部中断INT0为电平触发。即外部中断INT0出现低电平时,触发IE0,使其为“0”。 IE1:为外部中断INT1的请求标志位。功能与IE0相同。 IT1:外部中断INT1触发方式控制位。功能与IT0相同。

    时间:2019-06-30 关键词: 定时器 计数器 tcon 控制寄存器

  • 单片机定时器记数器的作用及使用简介

    1. 计数概念的引入 从选票的统计谈起:画“正”。这就是计数,生活中计数的例程处处可见。例:录音机上的计数器、家里面用的电度表、汽车上的里程表等等,再举一个工业生产中的例程,线缆行业在电线生产出来之后要计米,也就是测量长度,怎么测法呢?用尺量?不现实,太长不说,要一边做一边量呢,怎么办呢?行业中有很巧妙的办法,用一个周长是1米的轮子,将电缆绕在上面一周,由线带轮转,这样轮转一周不就是线长1米嘛,所以只要记下轮转了多少圈,就能知道走过的线有多长了。 2、计数器的容量 从一个生活中的例程看起:一个水盆在水龙头下,水龙没关紧,水一滴滴地滴入盆中。水滴持续落下,盆的容量是有限的,过一段时间之后,水就会逐渐变满。录音机上的计数器最多只计到999….那么单片机中的计数器有多大的容量呢?8031单片机中有两个计数器,分别称之为T0和T1,这两个计数器分别是由两个8位的RAM单元组成的,即每个计数器都是16位的计数器,最大的计数量是65536。 3、定时 8031中的计数器除了能作为计数之用外,还能用作时钟,时钟的用途当然很大,如打铃器,电视机定时关机,空调定时开关等等,那么计数器是如何作为定时器来用的呢? 一个闹钟,我将它定时在1个小时后闹响,换言之,也能说是秒针走了(3600)次,所以时间就转化为秒针走的次数的,也就是计数的次数了,可见,计数的次数和时间之间的确十分相关。那么它们的关系是什么呢?那就是秒针每一次走动的时间正好是1秒。   <单片机定时器记数器结构> 结论:只要计数脉冲的间隔相等,则计数值就代表了时间的流逝。由此,单片机中的定时器和计数器是一个东西,只不过计数器是记录的外界发生的事情,而定时器则是由单片机供给一个非常稳定的计数源。那么供给组定时器的是计数源是什么呢?看图1,原来就是由单片机的晶体震荡器经过12分频后获得的一个脉冲源。晶体震荡器的频率当然很准,所以这个计数脉冲的时间间隔也很准。问题:一个12M的晶体震荡器,它供给给计数器的脉冲时间间隔是多少呢?当然这很不难,就是12M/12等于1M,也就是1个微秒。结论:计数脉冲的间隔与晶体震荡器有关,12M的晶体震荡器,计数脉冲的间隔是1微秒。 4、溢出 让我们再来看水滴的例程,当水持续落下,盆中的水持续变满,最终有一滴水使得盆中的水满了。这个时候如果再有一滴水落下,就会发生什么现象?水会漫出来,用个术语来讲就是“溢出”。 水溢出是流到地上,而计数器溢出后将使得TF0变为“1”。至于TF0是什么我们稍后再谈。一旦TF0由0变成1,就是产生了变化,产生了变化就会引发事件,就象定时的时间一到,闹钟就会响一样。至于会引发什么事件,我们下次课再介绍,现在我们来研究另一个问题:要有多少个计数脉冲才会使TF0由0变为1。 5、任意定时及计数的办法 刚才已研究过,计数器的容量是16位,也就是最大的计数值到65536,因此计数计到65536就会产生溢出。这个没有问题,问题是我们现实生活中,经常会有少于65536个计数值的要求,如包装线上,一打为12瓶,一瓶药片为100粒,怎么样来满足这个要求呢? 提示:如果是一个空的盆要1万滴水滴进去才会满,我在开始滴水之前就先放入一勺水,还需要10000滴嘛?对了,我们采用预置数的办法,我要计100,那我就先放进65436,再来100个脉冲,不就到了65536了吗。定时也是如此,每个脉冲是1微秒,则计满65536个脉冲需时65.536毫秒,但现在我只要10毫秒就能了,怎么办?10个毫秒为10000个微秒,所以,只要在计数器里面放进55536就能了。

    时间:2019-06-30 关键词: 定时器 单片机 记数器

  • 80C51单片机的定时器/计数器的作用与结构

    80C51单片机内部设有两个16位的可编程定时器/计数器。可编程的意思是指其功能(如工作方式、定时时间、量程、启动方式等)均可由指令来确定和改变。在定时器/计数器中除了有两个16位的计数器之外,还有两个特殊功能寄存器(控制寄存器和方式寄存器)。 定时器/计数器的结构:   图片1 从上面定时器/计数器的结构图中我们可以看出,16位的定时/计数器分别由两个8位专用寄存器组成,即:T0由TH0和TL0构成;T1由TH1和TL1构成。其访问地址依次为8AH-8DH。每个寄存器均可单独访问。这些寄存器是用于存放定时或计数初值的。此外,其内部还有一个8位的定时器方式寄存器TMOD和一个8位的定时控制寄存器TCON。这些寄存器之间是通过内部总线和控制逻辑电路连接起来的。TMOD主要是用于选定定时器的工作方式;TCON主要是用于控制定时器的启动停止,此外TCON还可以保存T0、T1的溢出和中断标志。当定时器工作在计数方式时,外部事件通过引脚T0(P3.4)和T1(P3.5)输入。

    时间:2019-06-30 关键词: 定时器 单片机 80c51 计数器

  • pic大神神总结,你知道pic单片机有几大优势吗?

    优势1:PIC最大的特点是不搞单纯的功能堆积,而是从实际出发,重视产品的性能与价格比,靠发展多种型号来满足不同层次的应用要求。就实际而言,不同的应用对单片机功能和资源的需求也是不同的。比如,一个摩托车的点火器需要一个I/O较少、RAM及程序存储空间不大、可靠性较高的小型单片机,若采用40脚且功能强大的单片机,投资大不说,使用起来也不方便。PIC系列从低到高有几十个型号,可以满足各种需要。其中,PIC12C508单片机仅有8个引脚,是世界上最小的单片机。 该型号有512字节ROM、25字节RAM、一个8位定时器、一根输入线、5根I/O线,市面售价在3-6元人人民币。这样一款单片机在象摩托车点火器这样的应用无疑是非常适合。PIC的高档型号,如PIC16C74(尚不是最高档型号)有40个引脚,其内部资源为ROM共4K、192字节RAM、8路A/D、3个8位定时器、2个*模块、三个串行口、1个并行口、11个中断源、33个I/O脚。这样一个型号可以和其它品牌的高档型号媲美。 优势2:精简指令使其执行效率大为提高。PIC系列8位CMOS单片机具有独特的RISC结构,数据总线和指令总线分离的哈佛总线(Harvard)结构,使指令具有单字长的特性,且允许指令码的位数可多于8位的数据位数,这与传统的采用CISC结构的8位单片机相比,可以达到2:1的代码压缩,速度提高4倍。 优势3:产品上市零等待(Zero time to market)。采用PIC的低价OTP型芯片,可使单片机在其应用程序开发完成后立刻使该产品上市。 优势4:PIC有优越开发环境。OTP单片机开发系统的实时性是一个重要的指标,象普通51单片机的开发系统大都采用高档型号仿真低档型号,其实时性不尽理想。PIC在推出一款新型号的同时推出相应的仿真芯片,所有的开发系统由专用的仿真芯片支持,实时性非常好。就我个人的经验看,还没有出现过仿真结果与实际运行结果不同的情况。 优势5:其引脚具有防瞬态能力,通过限流电阻可以接至220V交流电源,可直接与继电器控制电路相连,无须光电耦合器隔离,给应用带来极大方便。 优势6:彻底的保密性。PIC以保密熔丝来保护代码,用户在烧入代码后熔断熔丝,别人再也无法读出,除非恢复熔丝。目前,PIC采用熔丝深埋工艺,恢复熔丝的可能性极小。 优势7:自带看门狗定时器,可以用来提高程序运行的可靠性。 优势8:睡眠和低功耗模式。虽然PIC在这方面已不能与新型的TI-MSP430相比,但在大多数应用场合还是能满足需要的。

    时间:2019-06-27 关键词: 定时器 pic单片机 优势

  • 单片机定时器(51为例)

    计时器记录单片机外部发生的事情;而定时器是单片机自身提供的计数器,51单片机经过12分频后提供给单片机的只有1MHZ的脉冲,脉冲时间间隔1微秒。MC51外接12M晶振(11.0592MHZ),12MHZ/12=1MHZ=1000000次/秒=1000000次/1000000微秒=1次/1微秒=1指令/1微秒。晶体每震荡1次就产生1个脉冲,花费1微秒,执行一次指令。 单片机中的时间概念就是根据脉冲数量得出来的。1脉冲=1微秒=1机器周期=1指令。 MCS-51单片机定时器/计数器的简单结构图:   8051有2个定时器T0、T1,分别由寄存器TL0,TH0和TH1,TL1构成。作为定时器使用时,定时器计数8051单片机片内振荡器输出经过12分频后的脉冲个数,即:每个机器周期使定时器T0/T1的寄存器值自动累加1,直到溢出,溢出后继续从0开始循环计数; 计数器使用时:通过引脚T0(P3.4)或T1(P3.5)对外部脉冲信号进行计数,当输入的外部脉冲信号发生从1到0的负跳变时,计数器的值就自动加1;计数器的最高频率一般是时钟振荡频率的1/24; 每个定时器/计数器工作模式有4种。 在模式0、1和2时,T0和T1的工作模式相同;在模式3时,两个定时器/计数器的工作模式不同; 模式0:TL0低5位,TH0全部8位构成13位计数器/定时器。定时或计数脉冲个数加到TL0上,从预先设置的初值(时间常数)开始累加,不断递增1;当 TL0计满后,向TH0进位,直到13位寄存器计满溢出;溢出时自动清零,切中断标记TF0置1;若需重新计数,则启动相关指令重置质检常数,且中断标记TF0置0;   模式1: 由TL0和TH1共同构成的16位计数器/定时器。   工作模式3: 由于定时器/计数器T1没有工作模式3,如果把定时器/计数器T0设置为工作模式3,那么TL0和TH0将被分割成两个相互独立的8位定时器/计数器;工作模式3的结构如下图:   四、定时器/计数器的定时/计数范围 工作方式0——13位定时器 / 计数器 工作 模式,最多可计数2的13次方 次,即:8192次,[0,8191]; 工作方式1——16位定时器/计数器 工作 模式,最多可计数2的16次方 次,即:65536次,[0,65535]; 工作方式2——8位定时器/计数器工作模式,计算次数最多为2^8,即256,,[0,255]; 工作方式3——8位定时器/计数器工作模式 ,计算次数最多为2^8,即256,,[0,255]; 预置数的计算公式:预置数=最大值-需要计数的次数; 五、计数/定时器的控制寄存器分别是TMOD H和TCON,它们都在特殊寄存器区; 1、工作模式控制寄存器TMOD(89h):   2、工作状态控制寄存器TCON(88H):   IT0:外部中断0触发控制位,1表示边沿,0表示电平; IE0:外部中断申请标志位,1表示有; EX0:外部中断0允许位,1表示允许, ET0:定时/计数器0中断允许位,1表示允许溢出中断 六、定时器/计数器的初始化 注:由于8051单片机的定时器/计数器使用的时钟脉冲是外部晶振(12MHZ)经过12分频(12MHZ/12=1MHZ)之后的频率,所以,一个时钟脉冲就是1微秒;所以,8192个脉冲=8192微秒=8.192毫秒; 65536个脉冲=65536微秒=65.536毫秒; 256个脉冲=256微秒=0.256毫秒; 1、设置定时器/计数器的工作模式TMOD(常用的是模式1:TMOD=0x01); 2、装入预置数到THx和TLx中(THx=TLx=MAX(8192/65536/256)-计数次数); 3、如果工作在中断方式,则需要开定时器/计数器的中断TCON中的标志位:TF0/TF1=0/1; 4、启动定时器/计数器:TR0/TR1=1;

    时间:2019-06-26 关键词: 定时器 单片机

  • AT89S51定时器/计数器的结构

    AT89S51单片机的定时器/计数器结构如下图所示,定时器/计数器T0由特殊功能寄存器TH0、TL0构成,定时器/计数器Tl由特殊功能寄存器TH1、TL1构成。   两个定时器/计数器都具有定时器和计数器两种工作模式,4种工作方式(方式0、方式1、方式2和方式3)。定时器/计数器属于增1计数器。 特殊功能寄存器TMOD用于选择定时器/计数器T0、T1的工作模式和工作方式。特殊功能寄存器TCON用于控制T0、T1的启动和停止计数,同时包含了T0、T1的状态。T0、T1不论是工作在定时器模式还是计数器模式,实质都是对脉冲信号进行计数,只不过是计数信号的来源不同。计数器模式是对加在T0(P3.4)和Tl( P3.5)两个引脚上的外部脉冲进行计数(如上图所示),而定时器工作模式是对单片机的时钟振荡器信号经片内12分频后的内部脉冲信号计数。由于时钟频率是定值,所以可根据对内部脉冲信号的计数值计算出定时时间。 计数器的起始计数都是从计数器的初值开始。单片机复位时计数器的初值为O,也可用指令给计数器装入一个新的初值。 工作方式控制寄存器TMOD AT89S51单片机的定时器/计数器工作方式寄存器TMOD用于选择定时器/计数器的工作模式和工作方式,字节地址为89H,不能位寻址,其格式如下图所示。   8位分为两组,高4位控制Tl,低4位控制T0。 下面对TMOD的各位给出说明。 (1) GATE:门控位。 GATE=0时,仅由运行控制位TRx(x=0,1)来控制定时器/计数器运行。 GATE=1时,用外中断引脚(INT0(的反)INTI(的反))上的电平与运行控制位TRx共同来控制定时器/计数器运行。 (2) M1、M0:工作方式选择位。 Ml、MO共有4种编码,对应于4种工作方式的选择,见下表。 表 M1、M0工作方式选择   (3) C/T(的反):计数器模式和定时器模式选择位。 C/T(的反)=0,为定时器工作模式,对单片机的晶体振荡器12分频后的脉冲进行计数。 C/T(的反)=1,为计数器工作模式,计数器对外部输入引脚TO(P3.4)或T1(P3.5)的外部脉冲(负跳变)计数。 定时器/计数器控制寄存器TCON TCON的字节地址为88H,可位寻址,位地址为88H~8FH。TCON的格式如下图所示。   这里介绍与定时器/计数器相关的高4位功能。 (1) TF1、TF0:计数溢出标志位。 当计数器计数溢出时,该位置1。使用查询方式时,此位作为状态位供CPU查询,但应注意查询有效后,应使用软件及时将该位清0。使用中断方式时,此位作为中断请求标志位,进入中断服务程序后由硬件自动清0。 (2) TR1、TR0:计数运行控制位。 TR1位(或TR0位)=1,启动定时器/计数器工作的必要条件。 TR1位(或TR0位)=0,停止定时器/计数器工作。 该位可由软件置1或清0。

    时间:2019-06-16 关键词: 定时器 计数器 at89s51

  • 单片机定时/计数器实验

    前面我们做了定时器的实验,现在来看一看计数实验,在工作中计数常常会有两种要求:第一、将计数的值显示出来,第二、计数值到一定程度即中断报警。第一种如各种计数器、里程表,第二种如前面例中讲到的生产线上的计数。先看第一种吧。我们的硬件中是这样连线的:324组成的振荡器连到定时/计数器1的外部管脚T1上面,我们就利用这个来做一个计数实验,要将计数的值显示出来,当然最好用数码管了,可我们还没讲到这一部份,为了避免把问题复杂化,我们用P1口的8个LED来显示计到的数据。 程序如下: ORG 0000H , AJMP START ORG 30H START: MOV SP,#5FH MOV TMOD,#01000000B ;定时/计数器1作计数用,0不用全置0 SETB TR1 ;启动计数器1开始运行. LOOP: MOV A,TL0 MOV P1,A AJMP LOOP END 在硬件上用线将324的输出与T1连通(印板上有焊盘)运行这种程序,注意将板按正确的位置放置(LM324放在左手边,LED排列是按从高位到低们排列)看到什么?随着324后接的LED的闪烁,单片机的8只LED也在持续变化,注意观察,是不是按二进制: 00000000 00000001 00000010 00000011 这样的次序在变呢?这就对了,这就是TL0中的数据。 程序二: ORG 0000H AJMP START ORG 001BH AJMP TIMER1 ;定时器1的中断处理 ORG 30H START: MOV SP,#5FH MOV TMOD,#01010000B ;定时/计数器1作计数用,模式1,0不用全置0 MOV TH1,#0FFH MOV TL1,#0FAH ;预置值,要求每计到6个脉冲即为一个事件 SETB EA SETB ET1 ;开总中断和定时器1中断允许 SETB TR1 ;启动计数器1开始运行. AJMP $ TIMER1: PUSH ACC PUSH PSW CPL P1.0 ;计数值到,即取反P1.0 MOV TH1,#0FFH MOV TL1,#0FAH ;重置计数初值 POP PSW POP ACC RETI END 上面这个单片机程序完成的工作很简单,就是在每6个脉冲到来后取反一次P1。0,因此实验的结果应当是:LM324后接的LED亮、灭6次,则P1。0口所接LED亮或灭一次。这实际就是我们上面讲的计数器的第二种应用。 程序三:外部中断实验 ORG 0000H AJMP START ORG 0003H ;外部中断地直入口 AJMP INT0 ORG 30H START: MOV SP,#5FH MOV P1,#0FFH ;灯全灭 MOV P3,#0FFH ;P3口置高电平 SETB EA SETB EX0 AJMP $ INT0: PUSH ACC PUSH PSW CPL P1.0 POP PSW POP ACC RETI END 本程序的功能很简单,按一次按钮1(接在12管脚上的)就引发一次中断0,取反一次P1。0,因此理论上按一下灯亮,按一下灯灭,但在实际做实验时,可能会发觉有时不“灵”,按了它没反应,但在大部份时候是对的,这是怎么回事呢?我们在讲解键盘时再作解释,这个程序本身是没有问题的。

    时间:2019-06-03 关键词: 定时器 单片机 计数器

  • 单片机定时器、中断试验

    我们在学单片机时我们第一个例程就是灯的闪烁,那是用延时程序做的,现在回想起来,这样做不很恰当,为什么呢?我们的主程序做了灯的闪烁,就不能再干其它的事了,难道单片机只能这样工作吗?当然不是,我们能用定时器来实现灯的闪烁的功能。 例1:查询方式 ORG 0000H AJMP START ORG 30H START: MOV P1,#0FFH ;关所 灯 MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#15H MOV TL0,#0A0H ;即数5536 SETB TR0 ;定时/计数器0开始运行 LOOP:JBC TF0,NEXT ;如果TF0等于1,则清TF0并转NEXT处 AJMP LOOP ;不然跳转到LOOP处运行 NEXT:CPL P1.0 MOV TH0,#15H MOV TL0,#9FH;重置定时/计数器的初值 AJMP LOOP END AJMP LOOP END 键入程序,看到了什么?灯在闪烁了,这可是用定时器做的,不再是主程序的循环了。简单地分析一下程序,为什么用JBC呢?TF0是定时/计数器0的溢出标记位,当定时器产生溢出后,该位由0变1,所以查询该位就可知宇时时间是否已到。该位为1后,要用软件将标记位清0,以便下一次定时是间到时该位由0变1,所以用了JBC指令,该指位在判1转移的同时,还将该位清0。 以上程序是能实现灯的闪烁了,可是主程序除了让灯闪烁外,还是不能做其他的事啊!不,不对,我们能在LOOP:……和AJMP LOOP指令之间插入一些指令来做其他的事情,只要保证执行这些指令的时间少于定时时间就行了。那我们在用软件延时程序的时候不是也能用一些指令来替代DJNZ吗?是的,但是那就要求你精确计算所用指令的时间,然后再减去对应的DJNZ循环次数,很不方便,而现在只要求所用指令的时间少于定时时间就行,显然要求低了。当然,这样的办法还是不好,所以我们常用以下的办法来实现。 程序2:用中断实现 ORG 0000H AJMP START ORG 000BH ;定时器0的中断向量地址 AJMP TIME0 ;跳转到真正的定时器程序处 ORG 30H START: MOV P1,#0FFH ;关所 灯 MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#15H MOV TL0,#0A0H ;即数5536 SETB EA ;开总中断允许 SETB ET0 ;开定时/计数器0允许 SETB TR0 ;定时/计数器0开始运行 LOOP: AJMP LOOP ;真正工作时,这里可写任意程序 TIME0: ;定时器0的中断处理程序 PUSH ACC PUSH PSW ;将PSW和ACC推入堆栈保护 CPL P1.0 MOV TH0,#15H MOV TL0,#0A0H ;重置定时常数 POP PSW POP ACC RETI END 上面的例程中,定时时间一到,TF0由0变1,就会引发中断,CPU将自动转至000B处寻找程序并执行,由于留给定时器中断的空间只有8个字节,显然不足以写下所有有中断处理程序,所以在000B处安排一条跳转指令,转到实际处理中断的程序处,这样,中断程序能写在任意地方,也能写任意长度了。进入定时中断后,首先要保存当前的一些状态,程序中只演示了保存存ACC和PSW,实际工作中应该根据需要将可能会改变的单元的值都推入堆栈进行保护(本程序中实际不需保存护任何值,这里只作个演示)。 上面的两个单片机程序运行后,我们发现灯的闪烁非常快,根本分辨不出来,只是视觉上感到灯有些晃动而已,为什么呢?我们能计算一下,定时器中预置的数是5536,所以每计60000个脉冲就是定时时间到,这60000个脉冲的时间是多少呢?我们的晶体震荡器是12M,所以就是60000微秒,即60毫秒,因此速度是非常快的。如果我想实现一个1S的定时,该怎么办呢?在该晶体震荡器濒率下,最长的定时也就是65。536个毫秒啊!上面给出一个例程。 ORG 0000H AJMP START ORG 000BH ;定时器0的中断向量地址 AJMP TIME0 ;跳转到真正的定时器程序处 ORG 30H START: MOV P1,#0FFH ;关所 灯 MOV 30H,#00H ;软件计数器预清0 MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#3CH MOV TL0,#0B0H ;即数15536 SETB EA ;开总中断允许 SETB ET0 ;开定时/计数器0允许 SETB TR0 ;定时/计数器0开始运行 LOOP: AJMP LOOP ;真正工作时,这里可写任意程序 TIME0: ;定时器0的中断处理程序 PUSH ACC PUSH PSW ;将PSW和ACC推入堆栈保护 INC 30H MOV A,30H CJNE A,#20,T_RET ;30H单元中的值到了20了吗? T_L1: CPL P1.0 ;到了,取反P10 MOV 30H,#0 ;清软件计数器 T_RET: MOV TH0,#15H MOV TL0,#9FH ;重置定时常数 POP PSW POP ACC RETI END 先自己分析一下,看看是怎么实现的?这里采用了软件计数器的概念,思路是这样的,先用定时/计数器0做一个50毫秒的定时器,定时是间到了以后并不是立即取反P10,而是将软件计数器中的值加1,如果软件计数器计到了20,就取反P10,并清掉软件计数器中的值,不然直接返回,这样,就变成了20次定时中断才取反一次P10,因此定时时间就延长了成了20*50即1000毫秒了。 这个思路在工程中是非常有用的,有的时候我们需要若干个定时器,可51中总共才有2个,怎么办呢?其实,只要这几个定时的时间有一定的公约数,我们就能用软件定时器加以实现,如我要实现P10口所接灯按1S每次,而P11口所接灯按2S每次闪烁,怎么实现呢?对了我们用两个计数器,一个在它计到20时,取反P10,并清零,就如上面所示,另一个计到40取反P11,然后清0,不就行了吗?这部份的程序如下 ORG 0000H AJMP START ORG 000BH ;定时器0的中断向量地址 AJMP TIME0 ;跳转到真正的定时器程序处 ORG 30H START: MOV P1,#0FFH ;关所 灯 MOV 30H,#00H ;软件计数器预清0 MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#3CH MOV TL0,#0B0H ;即数15536 SETB EA ;开总中断允许 SETB ET0 ;开定时/计数器0允许 SETB TR0 ;定时/计数器0开始运行 LOOP: AJMP LOOP ;真正工作时,这里可写任意程序 TIME0: ;定时器0的中断处理程序 PUSH ACC PUSH PSW ;将PSW和ACC推入堆栈保护 INC 30H INC 31H ;两个计数器都加1 MOV A,30H CJNE A,#20,T_NEXT ;30H单元中的值到了20了吗? T_L1: CPL P1.0 ;到了,取反P10 MOV 30H,#0 ;清软件计数器 T_NEXT: MOV A,31H CJNE A,#40,T_RET ;31h单元中的值到40了吗? T_L2: CPL P1.1 MOV 31H,#0 ;到了,取反P11,清计数器,返回 T_RET: MOV TH0,#15H MOV TL0,#9FH ;重置定时常数 POP PSW POP ACC RETI END 您能用定时器的办法实现前面讲的流水灯吗?试试看。

    时间:2019-06-03 关键词: 定时器 单片机 中断

  • 单片机定时器/计数器的方式控制字

    从上一节我们已经得知,单片机中的定时/计数器都能有多种用途,那么我怎样才能让它们工作于我所需要的用途呢?这就要通过定时/计数器的方式控制字来设置。 在单片机中有两个特殊功能寄存器与定时/计数有关,这就是TMOD和TCON。顺便说一下,TMOD和TCON是名称,我们在写程序时就能直接用这个名称来指定它们,当然也能直接用它们的地址89H和88H来指定它们(其实用名称也就是直接用地址,汇编软件帮你翻译一下而已)。   从图1中我们能看出,TMOD被分成两部份,每部份4位。分别用于控制T1和T0,至于这里面是什么意思,我们下面介绍。   从图2中我们能看出,TCON也被分成两部份,高4位用于定时/计数器,低4位则用于中断(我们暂不管)。而TF1(0)我们上节课已提到了,当计数溢出后TF1(0)就由0变为1。原来TF1(0)在这儿!那么TR0、TR1又是什么呢?看上节课的图。 计数脉冲要进入计数器还真不不难,有层层关要通过,最起码,就是TR0(1)要为1,开关才能合上,脉冲才能过来。因此,TR0(1)称之为运行控制位,可用指令SETB来置位以启动计数器/定时器运行,用指令CLR来关闭定时/计数器的工作,一切尽在自已的掌握中。   <单片机定时器/计数器结构> 定时/计数器的四种工作方式 工作方式0 定时器/计数器的工作方式0称之为13位定时/计数方式。它由TL(1/0)的低5位和TH(0/1)的8位组成13位的计数器,此时TL(1/0)的高3位未用。 我们用这个图来讨论几个问题: M1M0:定时/计数器一共有四种工作方式,就是用M1M0来控制的,2位正好是四种组合。 C/T:前面我们说过,定时/计数器即可作定时用也可用计数用,到底作什么用,由我们根据需要自行决定,也说是决定权在我们&#0;&#0;编程者。如果C/T为0就是用作定时器(开关往上打),如果C/T为1就是用作计数器(开关往下打)。顺便提一下:一个定时/计数器同一时刻要么作定时用,要么作计数用,不能同时用的,这是个极普通的常识,几乎没有教材会提这一点,但很多开始学习者却会有此困惑。 GATE:看图,当我们选择了定时或计数工作方式后,定时/计数脉冲却不一定能到达计数器端,中间还有一个开关,显然这个开关不合上,计数脉冲就没法过去,那么开关什么时候过去呢?有两种情况 GATE=0,分析一下逻辑,GATE非后是1,进入或门,或门总是输出1,和或门的另一个输入端INT1无关,在这种情况下,开关的打开、合上只取决于TR1,只要TR1是1,开关就合上,计数脉冲得以畅通无阻,而如果TR1等于0则开关打开,计数脉冲无法通过,因此定时/计数是否工作,只取决于TR1。 GATE=1,在此种情况下,计数脉冲通路上的开关不仅要由TR1来控制,而且还要受到INT1管脚的控制,只有TR1为1,且INT1管脚也是高电平,开关才合上,计数脉冲才得以通过。这个特性能用来测量一个信号的高电平的宽度,想想看,怎么测? 为什 么在这种模式下只用13位呢?干吗不用16位,这是为了和51机的前辈48系列兼容而设的一种工作式,如果你觉得用得不顺手,那就干脆用第二种工作方式。 工作方式1 工作方式1是16位的定时/计数方式,将M1M0设为01即可,其它特性与工作方式0相同。 工作方式2 在介绍这种式方式之前先让我们思考一个问题:上一次课我们提到过任意计数及任意定时的问题,比如我要计1000个数,可是16位的计数器要计到65536才满,怎么办呢?我们讨论后得出的办法是用预置数,先在计数器里放上64536,再来1000个脉冲,不就行了吗?是的,但是计满了之后我们又该怎么办呢?要知道,计数总是持续重复的,流水线上计满后马上又要开始下一次计数,下一次的计数还是1000吗?当计满并溢出后,计数器里面的值变成了0(为什么,能参考前面课程的说明),因此下一次将要计满65536后才会溢出,这可不符合要求,怎么办?当然办法很简单,就是每次一溢出时执行一段程序(这常常是需要的,要不然要溢出干吗?)能在这段程序中做把预置数64536送入计数器中的事情。所以采用工作方式0或1都要在溢出后做一个重置预置数的工作,做工作当然就得要时间,一般来说这点时间不算什么,可是有一些场合我们还是要计较的,所以就有了第三种工作方式&#0;&#0;自动再装入预置数的工作方式。 既然要自动得新装入预置数,那么预置数就得放在一个地方,要不然装什么呢?那么预置数放在什么地方呢?它放在T(0/1)的高8位,那么这样高8位不就不能参与计数了吗?是的,在工作方式2,只有低8位参与计数,而高8位不参与计数,用作预置数的存放,这样计数范围就小多了,当然做任可事总有代价的,关键是看值不值,如果我根本不需要计那么多数,那么就能用这种方式。看图4,每当计数溢出,就会打开T(0/1)的高、低8位之间的开关,计预置数进入低8位。这是由硬件自动完成的,不需要由人工干预。 常常这种式作方式用于波特率发生器(我们将在串行接口中讲解),用于这种用途时,定时器就是为了供给一个时间基准。计数溢出后不需要做事情,要做的仅仅只有一件,就是重新装入预置数,再开始计数,而且中间不要任何延迟,可见这个任务用工作方式2来完成是最妙不过了。 工作方式3 这种式作方式之下,定时/计数器0被拆成2个独立的定时/计数器来用。其中,TL0能组成8位的定时器或计数器的工作方式,而TH0则只能作为定时器来用。我们知道作定时、计数器来用,需要控制,计满后溢出需要有溢出标记,T0被分成两个来用,那就要两套控制及、溢出标记了,从何而来呢?TL0还是用原来的T0的标记,而TH0则借用T1的标记。如此T1不是无标记、控制可用了吗?是的。 一般情况处,只有在T1以工作方式2运行(当波特率发生器用)时,才让T0工作于方式3的。 定时器/计数器的定时/计数范围 工作方式0:13位定时/计数方式,因此,最多能计到2的13次方,也就是8192次。 工作方式1:16位定时/计数方式,因此,最多能计到2的16次方,也就是65536次。 工作方式2和工作方式3,都是8位的定时/计数方式,因此,最多能计到2的8次方,也说是256次。 预置值计算:用最大计数量减去需要的计数次数即可。 例:流水线上一个包装是12盒,要求每到12盒就产生一个动作,用单片机的工作方式0来控制,应当预置多大的值呢?对了,就是8192-12=8180。 以上是计数,明白了这个道理,定时也是一样。这在前面的课程已提到,我们不再重复,请参考前面的例程。

    时间:2019-06-03 关键词: 定时器 单片机 计数器

  • 单片机定时器与计数器

    一、计数概念的引入 从选票的统计谈起:画“正”。这就是计数,生活中计数的例程处处可见。例:录音机上的计数器、家里面用的电度表、汽车上的里程表等等,再举一个工业生产中的例程,线缆行业在电线生产出来之后要计米,也就是测量长度,怎么测法呢?用尺量?不现实,太长不说,要一边做一边量呢,怎么办呢?行业中有很巧妙的办法,用一个周长是1米的轮子,将电缆绕在上面一周,由线带轮转,这样轮转一周不就是线长1米嘛,所以只要记下轮转了多少圈,就能知道走过的线有多长了。 二、计数器的容量 从一个生活中的例程看起:一个水盆在水龙头下,水龙没关紧,水一滴滴地滴入盆中。水滴持续落下,盆的容量是有限的,过一段时间之后,水就会逐渐变满。录音机上的计数器最多只计到999….那么单片机中的计数器有多大的容量呢?8031单片机中有两个计数器,分别称之为T0和T1,这两个计数器分别是由两个8位的RAM单元组成的,即每个计数器都是16位的计数器,最大的计数量是65536。 三、定时 8031中的计数器除了能作为计数之用外,还能用作时钟,时钟的用途当然很大,如打铃器,电视机定时关机,空调定时开关等等,那么计数器是如何作为定时器来用的呢? 一个闹钟,我将它定时在1个小时后闹响,换言之,也能说是秒针走了(3600)次,所以时间就转化为秒针走的次数的,也就是计数的次数了,可见,计数的次数和时间之间的确十分相关。那么它们的关系是什么呢?那就是秒针每一次走动的时间正好是1秒。   <单片机定时器记数器结构> 结论:只要计数脉冲的间隔相等,则计数值就代表了时间的流逝。由此,单片机中的定时器和计数器是一个东西,只不过计数器是记录的外界发生的事情,而定时器则是由单片机供给一个非常稳定的计数源。那么供给组定时器的是计数源是什么呢?看图1,原来就是由单片机的晶体震荡器经过12分频后获得的一个脉冲源。晶体震荡器的频率当然很准,所以这个计数脉冲的时间间隔也很准。问题:一个12M的晶体震荡器,它供给给计数器的脉冲时间间隔是多少呢?当然这很不难,就是12M/12等于1M,也就是1个微秒。结论:计数脉冲的间隔与晶体震荡器有关,12M的晶体震荡器,计数脉冲的间隔是1微秒。 四、溢出 让我们再来看水滴的例程,当水持续落下,盆中的水持续变满,最终有一滴水使得盆中的水满了。这个时候如果再有一滴水落下,就会发生什么现象?水会漫出来,用个术语来讲就是“溢出”。 水溢出是流到地上,而计数器溢出后将使得TF0变为“1”。至于TF0是什么我们稍后再谈。一旦TF0由0变成1,就是产生了变化,产生了变化就会引发事件,就象定时的时间一到,闹钟就会响一样。至于会引发什么事件,我们下次课再介绍,现在我们来研究另一个问题:要有多少个计数脉冲才会使TF0由0变为1。 五、任意定时及计数的办法 刚才已研究过,计数器的容量是16位,也就是最大的计数值到65536,因此计数计到65536就会产生溢出。这个没有问题,问题是我们现实生活中,经常会有少于65536个计数值的要求,如包装线上,一打为12瓶,一瓶药片为100粒,怎么样来满足这个要求呢? 提示:如果是一个空的盆要1万滴水滴进去才会满,我在开始滴水之前就先放入一勺水,还需要10000滴嘛?对了,我们采用预置数的办法,我要计100,那我就先放进65436,再来100个脉冲,不就到了65536了吗。定时也是如此,每个脉冲是1微秒,则计满65536个脉冲需时65.536毫秒,但现在我只要10毫秒就能了,怎么办?10个毫秒为10000个微秒,所以,只要在计数器里面放进55536就能了。

    时间:2019-06-03 关键词: 定时器 单片机 计数器

  • 51单片机 | 定时器中断应用实例

    51单片机 | 定时器中断应用实例

    设计要求: 每秒点亮P1.0口的发光二极管一次,然后熄灭,使发光二极管形成闪烁效果 实现思路: 通过定时/计数器,每秒触发一次P1.0取反 涉及到的功能模块:定时器,中断,LED操作 定时器装填: 需要计数每秒的话,计数921600时溢出即可,在四种方式定时方式中,最大的计数范围是方式2:65536,将921600分解成20份,每份计数46080时溢出,当溢出20次时灯闪烁,每次定时器溢出都要重新装填 模块设计 1、初始化 LED(上拉输入模式) 定时器(T0,工作方式1,装填初值,启动(在中断初始化后启动)) 中断(开放中断,开放T0中断) 2、while(1) 3、中断 重置定时器(溢出位复位,重新装填计时) 判断溢出次数(到达20次时LED改变状态,计数清零。未到达20次时溢出次数加一) 实现代码: #include #include typedef unsigned char uchar; sbit LED = P1 ^ 0; uchar count = 0; void Interrupt() interrupt 1 { TH0 = (65536 - 46080) / 256; //触发中断时重新装填计时 TL0 = (65536 - 46080) % 256; if (count == 20) { LED = ~LED; count = 0; } else ++count; } void main(void) { LED = 0xff; //初始化LED TMOD = 0x01; //初始化TMOD,定时器0,方式1 TH0 = (65536 - 46080) / 256; //装填计数 TL0 = (65536 - 46080) % 256; EA = 1; //开放所有中断 ET0 = 1; //开放定时器0中断控制位 TR0 = 1; //定时器0开始计时 while(1) { _nop_(); }   }

    时间:2019-05-26 关键词: 定时器 51单片机 中断 技术教程

首页  上一页  1 2 3 4 5 6 7 8 9 10 下一页 尾页
发布文章

技术子站

更多

项目外包