定时-计数器编程实例
实验三 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、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; } } } } }