定时-计数器编程实例
实验三 8253定时 计数器实验
实验三8253定时/计数器实验一.实验目的了解8253的硬件连接方法,掌握8253的各种方式的编程及其原理。
二.实验要求编写程序,将8253的计数器0设置为方式3(方波),计数器1设置为方式2(分频),计数器2设置为方式2(分频);计数器0的输出作为计数器1的输入,计数器1的输出作为计数器2的输入;计数器2的输出接在一个LED上,运行后可观察到该LED在不停地闪烁。
1. 编程时用程序框图中的三个计数初值,计算OUT2的输出频率,用手表观察LED,进行核对。
2. 修改程序中的三个计数初值,使OUT2的输出频率为1Hz,用手表观察LED,进行核对。
3. 上面计数方式选用的是16进制,现若改用BCD码,试修改程序中的三个计数初值,使LED的闪亮频率仍为1Hz。
三.实验电路及连线GATE0~GATE2连至电源+5V,从波特率开关边的f插孔用线连至CLK0,OUT0用线连至CLK1,OUT1用线连至CLK2,OUT2用线连至一个发光管(DL1),8253片选孔CS 用线连至译码处228~22FH插孔。
四.实验说明8253工作频率为0~2MHZ,所以输入的时钟频率必须在2MHZ之下。
实验板上的晶振为4.9152MHZ,需经74LS393(16分频),由Q3输出307200HZ到CLK0(将波特率开关拨至9600)。
五.实验内容(一)程序:DA TA SEGMENTDA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: PUSH DSMOV AX,0HPUSH AXMOV AX,DATAMOV DS,AXCLI ;关中断MOV DX,22BH ;定时器0工作在方式3MOV AL,00110111BOUT DX,ALMOV DX,228HMOV AL,00HOUT DX,ALMOV AL,02HOUT DX,ALMOV DX,22BH ;定时器1工作在方式2MOV AL,01110101BOUT DX,ALMOV DX,229HMOV AL,18HOUT DX,ALMOV AL,00HOUT DX,ALMOV DX,22BH ;定时器2工作在方式2MOV AL,10110101BOUT DX,ALMOV DX,22AHMOV AL,0AHOUT DX,ALMOV AL,00HOUT DX,ALSTIJMP $CODE ENDSEND START输出频率:f=307200HZ/(200H*18H*0AH)=2HZ修改后程序:DA TA SEGMENTDA TA ENDSCODE SEGMENTSTART: PUSH DSMOV AX,0HPUSH AXMOV AX,DATAMOV DS,AXCLI ;关中断MOV DX,22BH ;定时器0工作在方式3 MOV AL,00110111BOUT DX,ALMOV DX,228HMOV AL,00HOUT DX,ALMOV AL,02HOUT DX,ALMOV DX,22BH ;定时器1工作在方式2 MOV AL,01110101BOUT DX,ALMOV DX,229HMOV AL,30H ;初值30HOUT DX,ALMOV AL,00HOUT DX,ALMOV DX,22BH ;定时器2工作在方式2 MOV AL,10110101BOUT DX,ALMOV DX,22AHMOV AL,0AHOUT DX,ALMOV AL,00HOUT DX,ALSTIJMP $CODE ENDSEND START输出频率1HZ(二)OUT1----LED1:点亮0.5s,熄灭0.5sOUT2----LED2:点亮1s,熄灭3s程序:DA TA SEGMENTDA TA ENDSCODE SEGMENTSTART: PUSH DSMOV AX,0HPUSH AXMOV AX,DATAMOV DS,AXCLI ;关中断MOV DX,22BH ;定时器0工作在方式3 MOV AL,00110111B ;OUT DX,ALMOV DX,228HMOV AL,00HOUT DX,ALMOV AL,02HOUT DX,ALMOV DX,22BH ;定时器1工作在方式2 MOV AL,01110111BOUT DX,ALMOV DX,229HMOV AL,35H ;35H 58hOUT DX,ALMOV AL,15H ;15H 02hOUT DX,ALMOV DX,22BH ;定时器2工作在方式2 MOV AL,10110100BOUT DX,ALMOV DX,22AHMOV AL,04H ;04hOUT DX,ALMOV AL,00HOUT DX,ALSTIJMP $CODE ENDSEND START。
8253可编程定时计数器应用实验
8253可编程定时计数器应用实验一、实验要求:按照电路图连接好电路,利用8253定时计数器0产生500Hz,250Hz,125Hz 的方波信号,显示在示波器上;然后用8253定时计数器1制作一个频率计以检测4060和定时计数器0输出方波的频率。
二、实验目的:1、了解如何利用计数器(以4060为例)制作分频器2、熟悉8253在系统中的典型接法。
3、掌握8253的工作方式及应用编程。
三、实验电路及连线:输入时钟产生模块YQNQLQJQIQHQGQFQEQD图1,分频器4060就是一个纯粹的计数器,当作分频用,QD-DN就是对输入频率的4分频-8192分频,直接接到8253相应的定时器计数器时钟输入端口即可8253接口模块X图2,定时器计数器8位数据线和单片机的P0口相连;片选信号CS和P1.0相连;WR/RD分别和单片机相应的WR/RD相连;A0,A1分别和单片机的P3.4、P3.5相连;CLK0直接和4060的QD时钟输出相连;OUT0接示波器和CLK1。
四、实验说明:8253是一款拥有3个完全相同的16位定时器计数器的定时器计数器芯片,三个通道完全独立,其引脚功能为D0-D7:8位数据双向I/O口WR/RD:写/读信号,低电平有效CS:片选信号,低电平有效GATE0-2:三个定时器计数器的门信号CLK0-2:三个定时器计数器的时钟输入信号OUT0-2:三个定时器计数器的输出信号A0,A1:定时器计数器读写地址选择,00 定时器计数器0;01定时器计数器1;10 定时器计数器2;11 控制寄存器定时器计数器采用倒计数,即每输入一个时钟脉冲自减1,当计数寄存器减为0时OUT输出一个脉冲信号,但输出受工作方式和GATE引脚控制。
定时时间=时钟脉冲周期×预置的计数初值8253的定时器计数器有6种工作模式,具体工作模式由状态寄存器决定,如下SC1,SC0:计数器选择 00:选择计数器001:选择计数器110:选择计数器2RW1,RW0:读/写指示 00:计数器锁存命令01:只读/写低 8位10:只读/写高 8位11:先读/写低8位,再读/写高 8位M2,M1,M0:定时器计数器工作方式选择:000-101,方式0-5BCD:计数寄存器数制选择,1:BCD码;0:二进制码8253每个定时器计数器都有6种工作方式,具体如下所述方式0:计数结果中断方式8253工作于方式0时,在写入初始值n后,GATE为高电平时开始计数,OUT 为输出低电平,直到计数器为0,OUT变为高电平直到下次计数开始再变为低电平。
定时器 计数器编程举例
1 定时器
● 定时器的组成框图如图8-1所示。它有3个存储器映象寄存器:TIM、PRD和TCR。这3个寄存器 在数据存储器中的地址及其说明如表8-1所示。定时器控制寄存器(TCR)位结构如图8-2所示, 各控制位和状态位的功能如表8-2所示。
返回首页
图8-1 定时器组成框图
3.中断初始化 (1)中断屏蔽寄存器IMR中的定时屏蔽位TINT0置1,开放定时器0中断。 (2)状态控制寄存器ST1中的中断标志位INTM位清零,开放全部中断。
4.汇编源程序如下:
.mmregs
.def _c_int00
STACK
.usect "STACK",100h
t0_cout
.usect "vars",1 ;计数器
●所 谓 硬 件 配 置 PLL, 就 是 通 过 C54x 的 3 个 引 脚 CLKMD1、CLKMD2 和 CLKMD3的状态,选定时钟方式,如表8-3所示。由表8-3可见,不用PLL 时,CPU的时钟频率等于晶体振荡器频率或外部时钟频率的一半;若用 PLL,CPU 的 时 钟 频 率 等 于 晶 体 振 荡 器 频 率 或 外 部 时 钟 频 率 乘 以 系 数 N (PLLN),使用PLL可以使用比CPU时钟低的外部时钟信号,以减少高 速开关时钟所造成的高频噪声。
INT1
INT2
.space 4*16 .space 4*16 .space 4*16 .space 4*16 .space 4*16 .space 4*16 .space 4*16 .space 4*16 .spac;定时器0寄存器地址
PRD0
.set 0025H
TCR0
.set 0026H
实验二定时器、计数器指令编程实验
实验二定时器、计数器指令编程实验一、实验目的:1.熟悉西门子STEP 7编程软件的使用方法。
2.掌握定时器、计数器指令的使用方法。
3.学会用定时器、计数器指令实现顺控系统的编程。
4.掌握定时器、计数器波形的画法和含义。
5.学会用PLC改造典型继电器电路的方法。
二、实验设备:PLC实验台:主机挂件(西门子S7-300 PLC)、基本逻辑指令实验挂件、PC机、连接导线三、预习内容:1.熟悉西门子STEP 7编程软件的使用方法。
2.熟悉西门子S7-300 PLC的基本位设备:I、Q、M、T、C。
3.熟悉时间继电器典型电路的工作原理。
4.预习本次实验内容,在理论上分析运行结果,预先写出程序的调试步骤。
四、实验步骤:1.电路连接好后经指导教师检查无误,并将RUN/STOP开关置于STOP后,方可接入220V 交流电源.2.在PC机启动西门子STEP 7编程软件,新建工程,进入编程环境。
3.根据实验内容,在STEP 7编程环境下输入梯形图程序,转换后,下载到PLC中。
4.程序运行调试并修改。
5.写实验报告。
五、实验内容:1. 断电延时脉冲控制程序(基础题)(1) 控制要求:编制输入/输出信号波形图如下的程序。
输入I0.0:输出Q4.0:要求用通电延时型定时器实现,定时器分辨率为100ms(2)参考程序(梯形图)如图2.1:(3) 程序分析:当I0.0接通,M0.0.0线圈接通并自锁,同时T0线圈断电;当I0.0断开,则T0线圈通电,T0开始延时,同时Q4.0线圈通电;延时时间到后,T0常闭触点断开使得M0.0、Q4.0断开。
(4) 思考:用断电延时型定时器实现2. 方波(2S )发生器控制程序(较难题)(1) 控制要求:编制输入/输出信号波形图如下的程序。
输入I0.0:输出Q0.0:(2) 参考程序(梯形图)如下:(3) 程序分析:当I0.0接通,Q0.0接通、 T0线圈通电开始延时,延时时间到后,T0常闭触点断开使得Q0.0断开;T0常开触点接通,使得T1线圈通电开始延时,延时时间到后,T1常闭触点使得T0线圈断电,T1线圈断开;Q0.0接通、 T0线圈通电开始延时,……,图2.1 断电延时控制程序产生方波,直到I0.0断开,所有输出断开。
实验五可编程定时器计数器8254实验
实验五 可编程定时器计数器 8254/8253 实验图 1 可编程定时器/计数器 8253/8254 原理图1 实验目的 了解计数器的硬件连接方法及时序关系,掌握 8254/8253 的各种模式的编程及其原理,用示波器观察 各信号之间的时序关系。
2 实验设备(1) PC 机一台;(2) QTH-8086B 16 位微机教学实验仪一套。
3 实验说明8253/8254 是一种可编程的定时器/计数器芯片,它具有 3 个独立的 16 位计数器通道,每个计数器都 可以按照二进制或二-十进制计数,每个计数器都有 6 种工作方式,计数频率可高达 24MHz ,芯片所 有的输入输出都与 TTL 兼容。
计数器都有 6 种工作方式:方式 0—计数过程结束时中断;方式 1—可编程的单拍脉冲;方式2— 频率发生器;方式 3—方波发生器;方式 4—软件触发;方式 5—硬件触发。
6 种工作方式主要有 5 点 不同:一是启动计数器的触发方式和时刻不同;二是计数过程中门控信号 GATE 对计数操作的影响不 同;三是 OUT 输出的波形不同;四是在计数过程中重新写入计数初值对计数过程的影响不同;五是计 数过程结束,减法计数器是否恢复计数初值并自动重复计数过程的不同。
4 实验内容将 32Hz 的晶振频率作为 8254 的时钟输入,利用定时器 8254 产生 1Hz 的方波,发光二极管不 停闪烁,用示波器可看到输出的方波。
5 实验原理图6 实验步骤(1)实验连线:信号源模块短路32.0Hz,CLK 连到8254 模块的CLK0。
8254 模块选通线CS 连到MCU 主模块的地址A14。
8254 模块GATE0 接电源+5*;OUT0 接发光二极管L1。
该模块的WR、RD 分别连到MCU 主模块的WR、RD。
该模块该模块的数据(AD0~AD7)、地址线(A0~A7)分别连到MCU 主模块的数据(AD0~AD7)、地址线(A0~A7)。
PLC初学者定时器、计数器程序编写图解(实验篇)
PLC初学者定时器、计数器程序编写图解(实验篇)一、实验目的1)通过实验了解和熟悉plc的结构和外部接线方法;2)了解和熟悉简易编程器或编程软件的使用方法;3)掌握简单程序的写入、编辑、监视和模拟运行的方法,熟悉PLC的基本指令,掌握定时器、计数器的工作原理。
二、实验装置1)三菱FX系列PLC1台;2) FX-20P-E简易编程器1只或装有编程软件的计算机1台(附连接电缆);3)开关量输入电路板1块。
(三)实验内容1.PLC外部接线PLC外部接线图如图1所示,用开关量输入电路板上的按钮或开关信号作为PLC的输入,PLC输出可不接,直接通过在PLC输出指示灯上观察输出情况。
图1 PLC的外部接线图2.程序的写入、检查及修改将编程器或装有编程软件的计算机接到PLC上,并将PLC上的“RUN”开关拨到“STOP”位置,接通PLC的电源。
选择联机方式,按[RD/WR]键,使编程器处于W(WR)工作方式,再按以下顺序操作:[NOP]-[A]-[GO]-[GO],将PLC用户程序存储器中的内容全部清除。
同样,也可按编程软件的操作方法将用户程序清除。
用编程器或计算机写入图2(a)对应的梯形图或指令表程序,写入后从第0步开始逐条检查程序;如发现错误,显示出错误指令后再写入正确的指令。
图2 简单PLC程序梯形图3.模拟运行程序写入的程序经检查无错误后,断开实验板上的全部输入开关,将“RUN”开关拨到RUN位置,写入的程序开始运行,同时“RUN”的LED灯亮。
按照表1所示操作X0-X2对应的钮子开关,通过PLC上的LED观察Y0和Y1的状态,并填入表中。
表中的脉冲波形表示开关接通后马上断开(模拟按钮的操作),0、1分别表示开关断开和接通。
表1 信号状态表3.指令的读出、删除、插入和修改将“RUN”开关拨到“STOP”位置,将图2(a)对应的梯形图程序改为图2(b)对应的梯形图程序,按下述步骤进行操作:(1)删除指令AND X2和OUT Y1。
实验二 单片机定时器计数器编程
实验二单片机定时器/计数器编程一、实验目的1、掌握单片机定时器/计数器的工作方式;2、掌握单片机定时器/计数器的编程方法。
二、实验内容1、学习单片机定时器/计数器的工作方式、初始化以及应用等;2、利用单片机定时器/计数器编写程序驱动开发板上的LED灯按一定规律工作。
基本要求:利用定时器1控制LEDB闪烁,闪烁频率为2Hz。
提高要求:读懂教材定时器/计数器的应用实例4和5,在实验室开发板上采用分模块设计的方法编程实现以下两个任务之一:1、控制LEDB闪烁,2.5秒一个周期,亮0.5s,灭2s,周而复始。
2、将教材例5对P1.0和P1.1的控制,改为对LEDB和LEDG的控制,时序不变。
三、实验设备1、STC单片机开发板;2、PC机以及串口线。
四、实验分析及关键代码(1)利用定时器1控制LEDB闪烁,闪烁频率为2Hz。
实验分析:控制LEDB闪烁,频率为2Hz,即0.5s。
解决思路:定时器工作方式选0x01,计数器初值为(65536-50000),循环10次即为0.5s。
代码如下:#include<reg51.h>#define uchar unsigned char sbit A=P2^4;uchar i=0;void main (){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;while(1){while(TF0){TF0=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;i++;if(i==10){A=!A;i=0;}}}}(2)控制LEDB闪烁,2.5秒一个周期,亮0.5s,灭2s,周而复始。
解决思路:设置两个循环,计数器初值设为(65536-50000),亮灯循环10次,灭灯循环40次。
代码如下:#include<reg51.h>#define uchar unsigned charsbit A=P2^4;uchar i=0;void main (){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;while(1){while(TF0){TF0=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;i++;if(i==10){A=1;}if(i==50){A=0;i=0;}}}}五、实验总结对软件及计数器的操作及代码不太熟悉,多次查询课本及上网查找资料后懂得计数器工作方式及计数操作,其他问题迎刃而解。
用KeilC51开发定时器计数器
用KeilC51开发定时器计数器用Keil C51开发定时器/计数器原文:基本的51单片机内部有两个16位可编程的定时器/计数器T0和T1。
它们各自具有4种工作状态,其控制字和状态均在相应的特殊功能寄存器中,可以通过软件对控制寄存器编程设置,使其工作在不同的定时状态或计数状态。
现在,许多厂家生产的8051兼容单片机上,还加入了定时器/计数器2,使单片机的应用更为灵活,适应性更强。
很多8051单片机的书籍都对定时器/计数器有详细的介绍,我们在此不再详细地讨论。
但因为编写或或阅读程序时经常要查阅定时器/计数器的设置情况,因此我们仅对一些编程时经常要用到的较重要的寄存器和设置方式进行简要简介。
1 定时器/计数器简介8051单片机的定时器/计数器基本结构如图1-1所示,定时器T0由两个8位计数器TH0和TL0构成,定时器T1也由两个8位计数器TH1和TL1构成,TMOD寄存器控制定时器的工作方式,TCON寄存器控制定时器的启动和停止以及定时器的状态。
图1-1 定时器/计数器结构在作定时器使用时,输入的时钟脉冲是由晶体振荡器的输出经12分频后得到的。
实际上,定时器就是单片机机器周期的计数器。
因为每个机器周期包含晶体振荡器的12个振荡周期,而每一个机器周期定时器加1,故其频率为晶振频率的1/12。
如果晶振频率为12MHz,则定时器每接收一个输入脉冲的时间为1?s。
选择计数器工作方式时,计数脉冲来自相应的外部输入引脚T0(P3.4)或T1(P3.5)。
在这种情况下,当检测到输入引脚上的电平由高跳变到低时,计数器就加1。
2 控制和状态寄存器(1)定时器控制寄存器(TCON)TCON为定时器/计数器的控制寄存器,同时也锁存外部中断请求标志,各位定义如下。
TF1:定时器/计数器1中断请求标志位。
当定时器计数满溢出回零时,由硬件置位,并可申请中断。
当CPU响应中断并进入中断服务程序后,TF1自动清零。
TR1:定时器/计数器1运行控制位,靠软件置位或清除。
实验二、定时器计数器编程
实验二、定时器/计数器编程
一、实验目的
1、掌握定时器的基本编程方法。
2、掌握计数器的基本编程方法。
二、实验内容
设计单片机程序,用T0作定时器产生周期为1秒的方波在P3.7输出,用示波器显示该信号,用T1作计数器对该脉冲进行计数并在数码管上显示。
三、实验原理
电路原理图如下,所需元件为:AT89C52、7SEG-BCD、LED
当晶振为12M时机器周期为1微秒,要实现500毫秒的定时,需要500000个机器周期,对于51单片机内部定时器来说,最大只能定时65536个机器周期,能定时65.535毫秒,不能满足要求,为此必须借助软件循环进行扩展,当中断定时为10毫秒时,扩展50倍可得到500毫秒的定时,当到达500毫秒时,在输出P3.7输出一个脉冲信号。
让T1工作于计数器模式,就可以对外部引脚P3.5的脉冲进行计数,所以将
P3.5与P3.7相连,能对P3.7进行计数。
对计数值进行显示需要读出T1的计数值,送到P1在数码管上显示。
有关定时计数器的特殊功能寄存器,请参考课本。
四、实验预习
1、学习有关定时器和计数器的知识。
2、提前编写程序,写出预习报告。
五、实验报告
1、总结出实验的详细步骤。
2、写出调试正确的程序及框图。
三菱PLC用定时器与计数器实现的时间控制编程实例三菱plc
三菱PLC用定时器与计数器实现的时间把握编程实例 - 三菱plc三菱plc FX系列的定时器为通电延时定时器,其工作原理是,定时器线圈通电后,开头延时,待定时时间到,触点动作;在定时器的线圈断电时,定时器的触点瞬间复位。
但是在实际应用中,我们常遇到如断电延时、限时把握、长延时等把握要求,这些都可以通过程序设计来实现。
1、通电延时把握延时接通把握程序如图3-27所示。
它所实现的把握功能是,X1接通5、后,Y0才有输出。
工作原理分析如下:当X1为0N状态时,帮助继电器M0的线圈接通,其常开触点闭合自锁,可以使定时器T0的线圈始终保持得电状态。
T0的线圈接通5s后,T0的当前值与设定值相等,T0的常开触点闭合,输出继电器Y0的线圈接通。
当X2为ON状态时,帮助继电器M0的线圈断开,定时器T0被复位,T0的常开触点断开,使输出继电器Y0的线圈断开。
2、断电延时把握延时断开把握程序如图3-28所示。
它所实现的把握功能是,输入信号断开l0s后,输出才停止工作。
工作原理分析如下:当X0为ON状态时,帮助继电器M0的线圈接通,其常开触点闭合,输出继电器Y3的线圈接通。
但是定时器T0的线圈不会得电(由于其前面(图)是断开状态)。
当X0由ON变为OFF状态,(图)都处于接通状态,定时器T0开头计时。
l0s后,T0的常闭触点打开,M0的线圈失电,输出继电器Y0断开。
3、限时把握在实际工程中,常遇到将负载的工作时间限制在规定时间内的把握。
这可以通过如图3-29所示的程序来实现,它所实现的把握功能是,把握负载的最大工作时间为l0s。
如图3-30所示的程序可以实现把握负载的最少工作时间。
该程序实现的把握功能是,输出信号Y2的最少工作时间为10s。
4、长时间延时把握程序在PLC中,定时器的定时时间是有限的,最大为3276.7s,还不到lh。
要想获得较长时间的定时,可用两个或两个以上的定时器串级实现,或将定时器与计数器协作使用,也可以通过计数器与时钟脉冲协作使用来实现。
proteus实验例子8253计时器
proteus实验例子8253计时器篇一:实验八可编程定时计数器8253的Proteus仿真实验实验八可编程定时/计数器8253的Proteus仿真实验一、实验要求利用 8086 外接8253 可编程定时/计数器,可以实现方波的产生。
二、实验目的1、学习8086 与8253 的连接方法。
2、学习8253 的控制方法。
3、掌握8253 定时器/计数器的工作方式和编程原理三、实验电路及连线1、Proteus 实验电路2、硬件验证实验硬件连接表四、实验说明1、8253 芯片介绍8253 是一种可编程定时/计数器,有三个十六位计数器,其计数频率范围为0-2MHz,用+5V 单电源供电。
2、8253的功能用途:(1)延时中断(2)可编程频率发生器(3)事件计数器(4)二进制倍频器(5)实时时钟(6)数字单稳(7)复杂的电机控制器3、8253 的六种工作方式:(1)方式0:计数结束中断(2)方式l:可编程频率发生(3)方式2:频率发生器(4)方式3:方波频率发生器(5)方式4:软件触发的选通信号(6)方式5:硬件触发的选通信号五、实验程序流程图六、实验步骤1、Proteus 仿真a.在 Proteus 中打开设计文档“8253_STM.DSN”;b.建立实验程序并编译,仿真;c.如不能正常工作,打开调试窗口进行调试。
参考程序:CODE SEGMENT;H8253.ASMASSUME CS:CODESTART:JMP TCONTTCONTROEQU0A06HTCON0 EQU0A00HTCON1 EQU0A02HTCON2 EQU0A04HTCONT:MOV DX,TCONTROMOV AL,16H ;计数器0,只写计算值低8 位,方式3,二进制计数 OUT DX,ALMOV DX,TCON0MOV AX,20 ;时钟为1MHZ,计数时间=1us*20=20us,输出频率50KHZ OUT DX,ALJMP $CODE ENDSEND START2、实验板验证a.通过USB 线连接实验箱b.按连接表连接电路c.运行PROTEUS 仿真,检查验证结果篇二:基于Proteus的单片机计时器设计基于Proteus的单片机计时器设计和丽花:《电子世界》20XX年第15期【摘要】计时器广泛应用于日常生活和自动化工业控制中。
单片机C语言编程定时器计数器
6.2.4 模式3的逻辑结构及应用
1、T0模式3的结构特点
M1 M0 =11,选择模式3。逻辑结构如图 6-8和6-9所示:
结构: TL0、TH0分为两个独立的8位计数器 TL0: 8位定时器/计数器
使用T0所有的资源和控制位 TH0:8位定时器
使用T1所有的资源(中断向量、中断控制 ET1、PT1)和控制位(TR1、TF1)
第6章 MCS-51单片机定时器/计数器
目录
6.1 MCS-51定时器/计数器 的结构及原理
6.2 定时器T0、T1 6.3 定时器T2 6.4 定时器应用举例
第6章 MCS-51单片机的定时器/计数器
本章主要讨论MCS-51单片机定时器/计 数器的逻辑结构和工作原理。内容主要有 MCS-51单片机定时器T0、T1、T2的逻辑结 构,工作方式的选择和应用。
6.1.3 定时器/计数器的方式和控制寄存器
M1、M0——工作模式选择位。
如下表所示:
表6-1 定时器/计数器的工作模式
M1 M0 工作模式
功能
0 0 模式0 13位定时器/计数器
0 1 模式1 16位定时器/计数器
10 11
模式2 模式3
8位自动重置定时器/计数器
定时器0:TL0为8位定时器/计 数器,TH0为8位定时器。 定时器1:无此方式
MCS-51单片机之所以设置几乎完全一 样 的方 式0和方式1,是出于与 MCS-48单片机兼容的。
6.2.3 模式2的逻辑结构及应用
M1 M0 =10时,选择模式2。逻辑结构 如图6-7所示。
T0的结构: TL0:8位的定时器/计数器; TH0:8位预置寄存器,用于保存初值。 工作过程:当TL0计满溢出时,TF0置1, 向CPU发出中断请求;同时引起重装操作 (TH0的计数初值送到TL0),进行新一轮 计数。
c语言单片机定时器计数器程序
C语言单片机定时器计数器程序1. 简介C语言是一种被广泛应用于单片机编程的高级编程语言,它可以方便地操作单片机的各种硬件模块,包括定时器和计数器。
定时器和计数器是单片机中常用的功能模块,它们可以用来实现精确的时间控制和计数功能。
本文将介绍如何使用C语言编程实现单片机的定时器计数器程序。
2. 程序原理在单片机中,定时器和计数器通常是以寄存器的形式存在的。
通过对这些寄存器的操作,可以实现定时器的启动、停止、重载以及计数器的增加、减少等功能。
在C语言中,可以通过对这些寄存器的直接操作来实现对定时器和计数器的控制。
具体而言,可以使用C语言中的位操作和移位操作来对寄存器的各个位进行设置和清零,从而实现对定时器和计数器的控制。
3. 程序设计在编写单片机定时器计数器程序时,首先需要确定定时器的工作模式,包括定时模式和计数模式。
在定时模式下,定时器可以按照设定的时间间隔生成中断,从而实现定时功能;在计数模式下,定时器可以根据外部的脉冲信号进行计数。
根据不同的应用需求,可以选择不同的工作模式,并根据具体情况进行相应的配置。
4. 程序实现在C语言中,可以通过编写相应的函数来实现对定时器和计数器的控制。
需要定义相关的寄存器位置区域和位掩码,以便于程序对这些寄存器进行操作。
编写初始化定时器的函数、启动定时器的函数、停止定时器的函数、重载定时器的函数等。
通过这些函数的调用,可以实现对定时器的各种操作,从而实现定时和计数功能。
5. 示例代码以下是一个简单的单片机定时器计数器程序的示例代码:```c#include <reg52.h>sbit LED = P1^0; // 定义LED连接的引脚void InitTimer() // 初始化定时器{TMOD = 0x01; // 设置定时器0为工作在方式1TH0 = 0x3C; // 设置初值,定时50msTL0 = 0xAF;ET0 = 1; // 允许定时器0中断EA = 1; // 打开总中断void Timer0_ISR() interrupt 1 // 定时器0中断服务函数{LED = !LED; // 翻转LED状态TH0 = 0x3C; // 重新加载初值,定时50msTL0 = 0xAF;}void m本人n(){InitTimer(); // 初始化定时器while(1){}}```以上代码实现了一个简单的定时器中断程序,当定时器计数到50ms 时,会触发定时器中断,并翻转LED的状态。
定时计数器的初始化编程及应用
定时计数器的初始化编程及应⽤定时/计数器的初始化编程及应⽤⼀.定时/计数器的编程MCS-51单⽚机定时/计数器初始化过程如下:1.根据要求选择⽅式,确定⽅式控制字,写⼊⽅式控制寄存器TMOD。
(⼯作⽅式:⽅式0⽅式1 ⽅式2⽅式3)2.根据要求计算定时/计数器的计数值,再由计数值求得初值,写⼊初值寄存器。
3.根据需要开放定时/计数器中断(后⾯须编写中断服务程序)。
4.设置定时/计数器控制寄存器TCON的值,启动定时/计数器开始⼯作。
5.等待定时/计数时间到,到则执⾏中断服务程序;如⽤查询处理则编写查询程序判断溢出标志,溢出标志等于1,则进⾏相应处理。
⼆.定时/计数器的应⽤通常利⽤定时/计数器来产⽣周期性的波形。
利⽤定时/计数器产⽣周期性波形的基本思想是:利⽤定时/计数器产⽣周期性的定时,定时时间到则对输出端进⾏相应的处理。
如产⽣周期性的⽅波只须定时时间到对输出端取反⼀次即可。
(举例1)如果定时时间⼤于65536µs,这时⽤⼀个定时/计数器直接处理不能实现,这时可⽤两个定时/计数器共同处理或⼀个定时/计数器配合软件计数⽅式处理。
(1)⽤寄存器R2作计数器软件计数,中断处理⽅式。
(举例2.1)(2)⽤定时/计数器T1计数实现,定时/计数器T1⼯作于计数⽅式时,计数脉冲通过T1(P3.5)输⼊,设定时/计数器T0定时时间到对T1(P3.5)取反⼀次,则T1(P3.5)每20ms 产⽣⼀个计数脉冲,那么定时500ms只须计数25次,设定时/计数器T1⼯作于⽅式2,初值X=256-25=231= 11100111B=E7H,TH1=TL1=E7H。
因为定时/计数器T0⼯作于⽅式1,定时,则这时⽅式控制字为01100001B(61H)。
定时/计数器T0和T1都采⽤中断⽅式⼯作。
(举例2.2)定时:设置为定时⼯作⽅式时,定时器计数的脉冲是由8051⽚内振荡器输出经12分频后产⽣的。
每个机器周期使定时器(T0或T1)的数值加1直⾄计计数满产⽣溢出。
定时器、计数器简单电路编程及梯形图的经验设计法
正品
M
次品
M
Y
S1
S2
SB1
SB2
4. PLC I/O端口分配及参考程序 输入 SB1 I0.0 M启动按钮 SB2 I0.1 M 停止按钮(常闭) S1 I0.2 检测站1 S2 I0.3 检测站2
输出 M Q0.0 电动机(传送带驱动) Y Q0.1 次品剔除
4 .2根据继电器电路图设计梯形图
LAD
STL
说明 TON—通电延时定时器 TONR—记忆型通电延时定时 器 TOF—断电延时型定时器 IN是使能输入端,指令盒上 方输入定时器的编号(T×× ),范围为T0-T255;PT是预 置值输入端,最大预置值为 32767;PT的数据类型:INT ; PT操作数有:IW,QW, MW,SMW,T,C,VW, SW,AC,常数
TON/TOF
10 100
2)1ms、10ms、100ms定时器的刷新方式不同。
1ms定时器每隔1ms刷新一次与扫描周期和程序处理无关即采用 中断刷新方式。因此当扫描周期较长时,在一个周期内可能被 多次刷新,其当前值在一个扫描周期内不一定保持一致。 10ms 定时器则由系统在每个扫描周期开始自动刷新。由于每个 扫描周期内只刷新一次,故而每次程序处理期间,其当前值为 常数。
表4-4 定时器的类型
工作方式
时基(ms) 1 TONR 10 最大定时范围(s) 32.767 327.67 定时器号 T0,T64 T1-T4,T65-T68
100
1
3276.7
32.767 327.67 3276.7
T5-T31,T69-T95
T32,T96 T33-T36,T97-T100 T37-T63,T101-T255
51单片机定时计数器软件编程范例
51单片机定时/计数器软件编程范例我们以一个实际的时钟电路来说明定时器的软件编程方法,时钟就是我们最为常见的显示时、分、秒为单位的计时工具,它是典型的应用代表。
时钟的最小计时单位是秒,但使用单片机定时器来进行计时,若使用6.0MHz的晶振,即使按工作方式1工作,最大的计时时间也只能到131ms,所以我们可把每个定时时间取12 5ms,这样定时器溢出8次(125ms╳8=1000ms)就得到最小的计时单位秒。
而要实现8次计数用软件方法实现是轻而易举的。
我们使用定时器1,以工作方式1工作,定时器进行125ms定时。
采用中断方法进行溢出次数的累计,当计满8次即得到1秒的计时。
一个时钟的计时累加,要实现分、时的进位,要用到多种进制,秒、分、时中的进位是十进制,秒向分进位和分想时进位却是六十进制,而每天又有十二小时制或二十四小时制,它们分别又是十二进制和二十四进制。
从秒到分和从分到小时可以通过软件累加和数值比较方法实现。
在单片机的内部RAM中,需要设置显示缓冲区,显示的时、分、秒值是从显示缓冲区中取出的,在RAM中设置四个单元作为显示缓冲区,分别是7AH、7BH、7CH。
为使电路和原理叙述方便,我们这里不显示秒值,秒的进位我们通过闪烁分值实现。
这样我们一共有四位LED分别显示时和分值。
同时时钟都需要校准的。
在程序中还需设置显示码表,要显示的数值通过查表指令将显示用的真正码值送到LED上。
我们用单片机AT89C2051的PP3.4和P3.5两个I/O口外接微动开关来实现时和分的校正,每按一次小时或分值加1,连续按下数值累计下去,实现时钟的校准。
在电路中我们还设置了一个蜂鸣器,用作简单报时用,如可设早上7:30分起床,中午1点30分再有起床报时,每次响时1分钟,响1秒,停2秒的方式,而不是连续响铃。
这个程序我们采用12小时制,为此,要在程序中设置相应的标志,以利于主程序识别。
同样计时程序中还会有几个相关的标志,主要是控制程序流的转向。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void TIMER0_ISR (void) interrupt 1
{ TH0=(65536-250)/256; TL0=(65536- 250)%256; i++; if(i < = 3) { P1_0=1; } if(I = = 4) { P1_0=0; i=0; }
定时/计数器编程实例
数码管显示实验 “实现数值0~65535的变化显 示” 问题:如何使数值变化的速 度减慢?(如每隔1秒数值 加1)
方法一? 方法二?
定时/计数器
void main(void) { unsigned char i,j; unsigned int uiTemp = 0; while(1) { convert(uiTemp); for(i=0;i<6;i++) { P2=LED_seg[i]; //送段码 P0=LED_bit[i]; //送位码 delay1ms(5); //5ms延迟 } j ++; if ( j == 33 ) //约1秒 { uiTemp++; j = 0; } } }
长定时的实现
思路:定时间隔为1秒,使用T0无法直接得到1秒 的定时。因此,需要使用多次定时复合的方法来得 到较长时间的定时。
方法二 仅使用一个定时/计数器实现
使用方法一时需要使用两个定时器和两个IO引脚,资源消 耗比较多。如何使用较少的资源实现同样的定时功能?
#include < reg51.h> void main( ) sbit WAVE = P1^7; { unsigned char glucCounter; WAVE = 0; void Timer0( ) interrupt 1 using 1 TMOD = 0x01; 100ms定时 { TH0 = (65536 – 50000) / 256; TH0 = (65536 – 50000) / 256; TL0 = (65536 – 50000) % 256; TL0 = (65536 – 50000) % 256; EA = 1; glucCounter ++ ; ET0 = 1; if ( glucCounter == 10 ) TR0 = 1; 定义一个全局 glucCounter = 0; { 变量,实现计 WAVE = ! WAVE; while(1) { ; } 数功能。 glucCounter = 0; } } }
TH0=(65536- 250)/256;
TL0=(65536- 250)%256; ET0=1; EA=1; TR0=1; i = 0; P1_0 = 1; while (1) { ; }
}
}
2-3、定时/计数器的应用实例
例3:设单片机fosc=6MHz,要求在P2.0引脚上输出周期为2ms,占空 比为75%的矩形波。在例2基础上应作何修改?
TH0=(65536- 250)/256;
TL0=(65536- 250)%256; ET0=1; EA=1; TR0=1; i = 0; P1_0 = 1; while (1) { ; }
}
}
2-3、定时/计数器的应用实例
例3:设单片机fosc=6MHz,要求在P2.0引脚上输出周期为2ms,占空 比为65%的矩形波。在例2基础上应作何修改?
2-3、定时/计数器的使用
例2:设晶振频率fosc=6MHz,要求在P2.0脚上输出周期为 2ms的方波。
解:采用定时器T0的方式1进行编程 思路:采用定时间隔1ms,每次时间到P2.0取反并且启动下一 次定时,从而实现2ms周期的方波。 定时所需计数次数n=1000us/2us=500 由于计数器递增计数,为得到500个计数之后的定时器溢出, 必须给定时器置初值65536-500。
2-3、定时/计数器的应用实例
例3:设单片机fosc=6MHz,要求在P2.0引脚上输出周期为 2ms,占空比为75%的矩形波。在例2基础上应作何修改?
P2.0
1ms 1ms
2ms,占空比50%
MCU
1.5ms
0.5ms
2ms,占空比75%
2-3、定时/计数器的应用实例
例3:设单片机fosc=6MHz,要求在P2.0引脚上输出周期为 2ms,占空比为75%的矩形波。在例2基础上应作何修改?
精度?
使用查询方式进行编程:
#include <reg51.h> sbit P2_0=P2^0; void main(void) { TMOD=0x01; //T0工作在定时器方式l TH0= (65536-500)/256; //计数初值 TL0=(65536-500)%256; TR0=1; //启动T0 while(1) { TH0= (65536-500)/256; //计数初值 TL0=(65536-500)%256; while (!TF0); 查询TF0是否为‘1’, P2_0 = ! P2_0; 如果为‘1’则说明溢 TF0 = 0; 出(定时时间到) } }
TH0=(65536- 50)/256;
TL0=(65536- 50)%256; ET0=1; EA=1; TR0=1; i = 0; P1_0 = 1; while (1) { ; }
}
}
2-3、定时/计数器的应用实例
例4:设晶振频率fosc=6MHz,要求在P2.0脚上输出周期为2s的 方波。(同例1)
#include "reg51.h" sbit P1_0=P1^0; unsigned char i; void main (void) { TMOD=0x01;
void TIMER0_ISR (void) interrupt 1
{ TH0=(65536-250)/256; TL0=(65536- 250)%256; i++; if(i = = 3) { P1_0=0; } if(I = = 4) { P1_0=1; i=0; }
P2.0
2ms
MCU
使用中断方式进行编程: #include <reg51.h> sbit P2_0=P2^0; void T0_ISR() interrupt 1 using 1 //T0中断服务程序入口 { TH0= (65536-500)/ 256; //计数初值重载 TL0=(65536-500)% 256; P2_0=!P2_0; //P2.0取反 } void main(void) { TMOD=0x01; //T0工作在定时器方式l TH0=(65536-500)/256; //计数初值 TL0=(65536-500)%256; ET0=1; EA=1; //中断使能 TR0=1; //启动T0 while(1); }
解:采用定时器T0的方式1进行编程
思路:采用定时间隔0.5ms,并设置一个全局变量i对定时器 的中断次数进行计数,小于等于3时输出高电平,等于4时输 出低电平,以此循环。
0.5ms i=1
0.5ms i=2
0.5ms i=3
0.5ms i=4
2ms,占空比75%
2-3、定时/计数器的应用实例
例3:设单片机fosc=6MHz,要求在P2.0引脚上输出周期为 2ms,占空比为75%的矩形波。在例2基础上应作何修改?
#include "reg51.h" sbit P1_0=P1^0; unsigned char i; void main (void) { TMOD=0x01;
void TIMER0_ISR (void) interrupt 1
{ TH0=(65536-50)/256; TL0=(65536- 50)%256; i++; if(i = = 7) { P1_0=0; } if(I = = 20) { P1_0=1; i=0; }
void main(void) { unsigned char i,j; gluiTemp = 0; TMOD = 0x01; TH0 = (65536 – 50000) / 256; TL0 = (65536 – 50000) % 256; ET0 = 1; EA = 1; TR0 = 1; while(1) { convert(gluiTemp); for(i=0;i<6;i++) { P2=LED_seg[i]; //送段码 P0=LED_bit[i]; //送位码 delay1ms(5); //5ms延迟 P0=0; } } }
gluiTemp ++ ;
}
例1:实现数值0~65535的变 化显示,每隔1s数值加1。 ( 设晶振频率为12MHz)
void main(void) { unsigned char i,j; gluiTemp = 0; glucCounter = 0; TMOD = 0x01; TH = (65536 – 50000) / 256; #include < reg51.h> TL = (65536 – 50000) % 256; unsigned char glucCounter ; ET0 = 1; unsigned int gluiTemp ; 定义一个全局 EA = 1; void Timer0( ) interrupt 1 using 1变量,实现计 TR0 = 1; while(1) 数功能。 { { TH0 = (65536 – 50000) / 256; convert(gluiTemp); TL0 = (65536 – 50000) % 256; for(i=0;i<6;i++) glucCounter ++ ; { P2=LED_seg[i]; //送段码 if ( glucCounter == 20 ) P0=LED_bit[i]; //送位码 { delay1ms(5); //5ms延迟 gluiTemp ++ ; P0=0; glucCounter = 0; } } } } }