编程定时器
⑴ 定时器编程
#include<reg52.h>
sbit light=P2^0;
unsigned char flag;
void main()
{
EA=1;
ET0=1;
TMOD=0x01;//定时器工作在1方式
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TR0=1;
while(1)
{
if(flag==1)
{
light=0;
}
}
}
void timer() interrupt 0
{
unsigned char i,j;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
i++;
if(i==20)
{
i=0;
j++;
if(j==99) flag=1;
}
}
⑵ 可编程定时器的介绍
可编程定时器又简称为“可编定时器”(programmable timer),使用者可以通过手动设置预置编程指令并根据对时钟脉冲累积计时的一种定时器。值得一提的是,现在的可编程定时器越来越趋向与家庭使用,目前也有很多企业开始开发另类可编程定时器,像加入防雷这样的技术措施,对电流缓冲最了一定的处理使得可编程定时器能更好的保护好其连接的设备1。
⑶ 定时器/计时器在编程中要(_)(_)(_)等三个步骤。
SetTimer函数的用法
1 )用WM_TIMER来设置定时器
先请看SetTimer这个API函数的原型
UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);
例如
SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器
在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了
于是SetTimer函数的原型变为:
UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD))
当使用SetTimer函数的时候,就会生成一个计时器。函数中nIDEvent指的是计时器的标识,也就是名字。nElapse指的是时间间隔,
也就是每隔多长时间触发一次事件。第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,
也就是使用系统默认的回调函数,系统默认认的是onTime函数。这个函数怎么生成的呢?你需要在需要计时器的类的生成onTime函数:
在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成onTime函数了。然后在函数里添加代码,让代码实现功能。
每隔一段时间就会自动执行一次。
例:
SetTimer(1,1000,NULL);
1:计时器的名称;
1000:时间间隔,单位是毫秒;
NULL:使用onTime函数。
当不需要计时器的时候调用KillTimer(nIDEvent);
例如:KillTimer(1);
2) 调用回调函数
此方法首先写一个如下格式的回调函数
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);
然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。
二. 或许你会问,如果我要加入两个或者两个以上的 timer怎么办?
继续用SetTimer函数吧,上次的timer的ID是1,这次可以是2,3,4。。。。
SetTimer(2,1000,NULL);
SetTimer(3,500,NULL);
嗯,WINDOWS会协调他们的。当然onTimer函数体也要发生变化,要在函数体内添加每一个timer的处理代码:
onTimer(nIDEvent)
{
switch(nIDEvent)
{
case 1:........;
break;
case 2:.......;
break;
case 3:......;
break;
}
}
⑷ 可编程式电子定时器怎么调定时
定时器调时间的方法:
调整星期:先按下【时钟】键,再按下【星期】键,调整到当前星期值。
调整小时:先按下【时钟】键,再按下【小时】键,调整到当前小时值。
请在本产品的外部也采取安全措施,使本产品发生故障或因外部原因发生异常时,系统整体也可安全运转。
请勿在有可燃性气体的环境中使用。否则会引起爆炸。
请勿将本产品投入火中,否则会造成电池及电子部件等的破裂。
为防止异常发热及冒烟,应把有关本产品的保证特性及性能的数值设定为低于规定数值后再使用。
故障现象:
1、如果本开关某一天该开的时间没开,或者开了以后到关的时间还没关,那可能是因为作定时设置的“星期”没调对,请按照"定时设置"中介绍的方法检查或重调。
2、如果确认“开启”和“关闭”时间调得完全正确,开关仍然动作不正常,或者不该关的时候被关掉,那可能是因为多余的几组开关时间没有消除,请参照“定时设置”中介绍的方法消除(注意:开关时间显示“--:--”才能表示消除,不要认为“00:00"表示消除)。
3、如果以上两条全部正确,而本开关仍然动作不正常,有可能是"自动/手动"键被人为动作,检查"开、自动、关"的标志,将其调到当前时间所处的状态,再调回到自动位置。
⑸ 可编程定时器的工作原理
可编程定时器是根据时钟脉冲累积计时的,时钟脉冲有 1ms、10ms、100ms等不同规格。(定时器的工作过程实际上是对时钟脉冲计数)因工作需要,定时器除了占有自己编号的存储器位外,还占有一个设定值寄存器(字),一个当前值寄存器(字)。设定值寄存器(字)存储编程时赋值的计时时间设定值。当前值寄存器记录计时当前值。这些寄存器为16位二进制存储器。其最大值乘以定时器的计时单位值即是定时器的最大计时范围值。定时器满足计时条件开始计时,当前值寄存器则开始计数,当当前值与设定值相等时定时器动作,起常开触点接通,常闭触点断开,并通过程序作用于控制对象,达到时间控制的目的。定时器相当于继电器电路中的时间继电器,可在程序中作延时控制。
⑹ 编程使定时器T1(工作方式6MHZ)定时100ms产生一次中断,使接在P1.0的发光二极管间隔1s亮1次亮10次停止工作
CLOCK DATA 30H
ORG 0000H ;
LJMP 0030H
ORG 000BH ;
LJMP abc
ORG 0030H
SETB EA ;开启总中断
MOV TH0,#3CH ;
MOV TL0,#0B0H
MOV R0,#2
SETB ET0 ;开启定时器0中断
SETB TR0 ;启动定时器T0
SJMP $
ORG 0200H
abc:
MOV TH0,#3CH ;重赋初值
MOV TL0,#0B0H
DJNZ R0,LOOP ;判断中断计数器是否到
MOV R0,#2
CPL P1.0 ;P1.0取反
LOOP:
RETI ;中断返回
END
⑺ 简述8051单片机定时计数器编程的基本步骤
设置定时计数器的工作方式。
给定时器赋初始值:THx 和TLx;
允许定时器中断;
允许全局中断;
启动定制器;
中断函数编写(这个是目的,定时计数最终要干什么?)
⑻ 台达plc的定时器怎么编程
台达PLC的T1为100ms时间继电器,59mX60s=3540s=35400ms,所以直接使用是不行的,因为台达PLC中的常数值最大为32767。
你可用两个时间继电器实现,即将59分分开两部分,如T0为30分,T1为29分:
ld x1
tmr t0 k1800(注:30分钟)
and t0
tmr t1 k17400(注:29分钟)
ld t1
out y1
也可用计数器来实现,用T1来执行1分钟脉冲,用C1来执行分钟输出,如:
ld x1
tmr t1 k600
andp t1
cnt c1 k59
ld c1
out y1
⑼ 单片机定时器的使用方法
第一步:设置特殊功能寄存器 TMOD,配置好工作模式。
第二步:设置计数寄存器 TH0 和 TL0 的初值。
第三步:设置 TCON,通过 TR0 置 1 来让定时器开始计数。
第四步:判断 TCON 寄存器的 TF0 位,监测定时器溢出情况。
写程序之前,我们要先来学会计算如何用定时器定时时间。我们的晶振是 11.0592M,时钟周期就是 1/11059200,机器周期是 12/11059200,假如要定时 20ms,就是 0.02 秒,要经过x 个机器周期得到 0.02 秒,我们来算一下 x*12/11059200=0.02,得到 x= 18432。16 位定时器的溢出值是 65536(因 65535 再加 1 才是溢出),于是我们就可以这样操作,先给 TH0 和 TL0一个初始值,让它们经过 18432 个机器周期后刚好达到 65536,也就是溢出,溢出后可以通过检测 TF0 的值得知,就刚好是 0.02 秒。那么初值 y = 65536 - 18432 = 47104,转成 16 进制就是 0xB800,也就是 TH0 = 0xB8,TL0 = 0x00。
这样 0.02 秒的定时我们就做出来了,细心的同学会发现,如果初值直接给一个 0x0000,一直到 65536 溢出,定时器定时值最大也就是 71ms 左右,那么我们想定时更长时间怎么办呢?用你小学学过的逻辑,倍数关系就可以解决此问题。
好了,我们下面就用程序来实现这个功能。
#include
sbit LED = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main(){
unsigned char cnt = 0; //定义一个计数变量,记录 T0 溢出次数
ENLED = 0; //使能 U3,选择独立 LED
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
TMOD = 0x01; //设置 T0 为模式 1
TH0 = 0xB8; //为 T0 赋初值 0xB800
TL0 = 0x00;
TR0 = 1; //启动 T0
while (1){
if (TF0 == 1){ //判断 T0 是否溢出
TF0 = 0; //T0 溢出后,清零中断标志
TH0 = 0xB8; //并重新赋初值
TL0 = 0x00;
cnt++; //计数值自加 1
if (cnt 》= 50){ //判断 T0 溢出是否达到 50 次
cnt = 0; //达到 50 次后计数值清零
LED = ~LED; //LED 取反:0--》1、1--》0
}
}
}
}
程序中都写了注释,结合前几章学的内容,自己分析一下,不难理解。本程序实现的结果是开发板上最右边的小灯点亮一秒,熄灭一秒,也就是以 0.5Hz 的频率进行闪烁
⑽ 51单片机定时器的汇编语言程序编程,
LED BIT P1.0 ;定义LED的引脚
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H ;定时器0工作模式1
MOV TH0,#HIGH(65536-50000) ;初值,50毫秒中断一次
MOV TL0,#LOW(65536-50000)
SETB TR0 ;启动定时器
SETB ET0 ;启动定时器中断
SETB EA ;开总中断
MOV R2,#40 ;中断计数初始值
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
DJNZ R2,T0E ;R2减到0重新赋值,否则退出
MOV R2,#40
CPL LED ;LED亮灭转换
T0E:
RETI
END