单片机定时器不够用 定时器问题

单片机定时器中断的问题_百度知道
单片机定时器中断的问题
void T1_INT()interrupt 3
TH1=()/256;
TL1=()%256;
BEEP=-BEEP;
//根据高温还是低温警报设定不同延时间隔if(L_LED==0)
if(++t!=150)
if(++t!=60)
DelayMS(20);
} 这是c51单片机定时中断的一个部分。我想问那个”根据高温还是低温警报设定不同延时间隔“是怎么做到的,下半部分的程序看不懂
提问者采纳
这个程序你要明白几个知识点1、这个中断函数是每1毫秒(12M晶振下)执行一次。2、return:执行return之后,整个函数返回了,return之后的代码不在执行。看你的代码beep=-应该是个喇叭什么的吧,只要中断函数执行,喇叭就会响。如果L_LED等于0的时候,t会自加到150,在没有达到150之前,都会运行return,所以,这段时间是不会运行t=0;DelayMS(20);的,所以这段时间里中断美毫秒执行一次,DEEP也就每毫秒取反,输出方波,驱动喇叭同理 L_LED等于1的时候,也是一样的原理当达到条件运行DelayMS(20);的时候,程序中断会再这里空耗20毫秒,这20毫秒时间里,DEEP没有输出方波,喇叭就不响了。应该看懂了吧,好好想想,想不通再联系我
那么那个定时器的计数初值是起什么作用的?不是确定喇叭响的时间的吗?
定时器的计数初值是确定定时器的溢出时间,也就是中断函数多久运行一次,这里的初值是(/256和%256只是用于取高低八位)也就是计时1000个时钟周期才溢出产生中断(加到65535就溢出了)如果是12M晶振的话,就是1毫秒中断一次,中断了就执行中断函数所以这个程序里中断函数每毫秒运行一次,也就是每毫秒取反下DEEP,在deep引脚就输出方波了定时器中断有两个作用,一个作用是在BEEP引脚输出1毫秒的方波驱动喇叭另一个作用就是响的时间了。其实你想想你的程序里,你需要两个时间,一个时间是方波的周期,另一个时间是响的时间输出方波的时间短(1毫秒),而响的时间长(60或者150毫秒)而你只有一个定时怎么办?办法那就是定时1毫秒产生方波,然后对这个1毫秒进行计数,计数达到响的时间了,就延时,延时的时候中断函数不会再执行,所以延时的时候DEEP没有方波输出,就不响了。不知道这么说你明白了没有。PS:强烈要求增加悬赏分......还有,修正楼上的答案,响的时间只有t决定,而delay是决定不响的时间,另外,定时器初值对响的时间有影响,对喇叭的声调也有影响(输出方波的频率)再有,给你列出关系:
响的时间 = 定时器初值 X t
不响的时间 = delayMS ( 和定时器初值一点关系没有)
喇叭声调 = 定时器初值在修改下答案,补充 中断函数返回后,是返回到主函数了,继续执行主函数,等下一次定时器溢出(1毫秒)后,产生定时器中断,就又执行中断函数了
提问者评价
查了下蜂鸣器的工作原理明白了
其他类似问题
定时器的相关知识
按默认排序
其他2条回答
void T1_INT()interrupt 3
TH1=()/256;
TL1=()%256;
BEEP=-BEEP;
//根据高温还是低温警报设定不同延时间隔if(L_LED==0)//L_LED一定是低温/高温显示,即L_LED==0是低温;==1是高温
{//如果是低温时,看看t到没到150,如果没到直接返回
if(++t!=150)
{//L_LED==1,说明是高温,看看t到没到60,如果没到直接返回
if(++t!=60)
}\\低温时(L_LED==0),t==150说明是延时到了;或者高温时(L_LED==1),t==60说明延时到了。
t=0;//t清零
DelayMS(20);//延时
如果返回是返回到哪继续执行?报警声频率是T定时器的计数值决定的还是t决定的或者是DelayMS决定的还是三者都有
返回时此次中断结束,等待下一次定时中断。每一次定时中断有时间间隔的,频率由定时器常数决定。这里决定频率:(TH1=()/256;
TL1=()%256;
BEEP=-BEEP;)如果想改变频率,
BEEP=-BEEP;的位置不对?++t不是每一次把t加一了。t到60或150,t清零。t和delay决定响的时长。
if(++t!=150) return;//t等于150否,不等于就结束中断函数if(++t!=60)//t 等于60否,不等于也跳出中断函数假如你是12M晶振的呵呵,其实就是低温报警延时150*1ms,高温报警60*1ms,报警声调是固定的嘛。
等待您来回答
您可能关注的推广
下载知道APP
随时随地咨询
出门在外也不愁请问怎么同时使用51单片机的定时器0和定时器一进行定时啊? (请各位高手指点下,完整解决问题者再加50分_百度知道
请问怎么同时使用51单片机的定时器0和定时器一进行定时啊? (请各位高手指点下,完整解决问题者再加50分
提问者采纳
注意定时中断不能过短,否则始终在一个中断中,另一个被屏蔽,你是产生两路PWM吧,
提问者评价
谢谢!大哥的是正解!大哥威武
其他类似问题
51单片机的相关知识
其他3条回答
没问题啊,直接用就好了,你遇到什么问题,,
可是我同时用定时器0和定时器1只有定时器0工作啊!你知道这是什么原因呢?
;定时部分的程序:MOV TMOD,#0021HMOV TH0,#0FCH; MOV TL0,#0B8H;方式0初值,定义1毫秒MOV TH1,#3CH;MOV TL1,#0B0H;方式1定义50毫秒SETB TR0SETB ET0;启动定时器0SETB TR1SETB ET1;启动定时器1SETB EA
请用C语言编写好么?
void Timer_Init(){TMOD = 0X21;TH0 = 0XFC;
定时器0定义1毫秒的初值(晶振12MHz)TL0 = 0XB8;TH1 = 0X3C;
定时器1定义50毫秒的初值TL1 = 0XB0;TR0 = TR1 = 1;ET0 = ET1 = 1;EA = 1;}
定时,也不需要用两个定时器呀。用T0定时,T1控制波特率,一般就够用了。你看电子时钟:时时:分分:秒秒。秒,是1秒加一次一;分,是60秒加一次一;时,是3600秒加一次一。可能还有定时打铃的时刻等等。这么多事,用一个T0定时就都解决了。
等待您来回答
您可能关注的推广回答者:回答者:
下载知道APP
随时随地咨询
出门在外也不愁请教Atmega16单片机定时器2问题
请教Atmega16单片机定时器2问题
我想问大家一下,我想产生100HZ的pwm信号,应该付什么样的值?快速PWMTCNT2=OCR2=TCCR2=这个值是怎么算的?
还有我如果程序里有2个定时器已经在用了,而我想关一个定时器的话,应该怎么做?
补充:有2个定时器在输出pwm,我如果关一个定时器不想让他输出pwm的话,应该怎么办?到时关了后,在想用怎么开?
你用的是定时器2的快速PWM有点不好配,他是从BUTTON 到 MAX
多以你的TCNT2和OCR2没有意义的,你只能配T2频 和时钟频
我估算了一下
1MHZ=1000KHZ
你要的是0.1KHZ
1000KHZ/0.1KHZ=10000
(倍频系数)
AVR里(我看的是MEGA128)支持 1,8,64。。。。找不到个相近的。所以劝你还是用CTC吧。快速PWM其实也能做到这点,不过你要开OCN中断,出个波就开中断,趁不住吧……
你说的怎么关定时器,其实你就把CS配成没有连接时钟 T就停了
建议你还是多看DATASHEET ,AVR的都是中文的,看起来不累。
我给你用CTC配了一个
(内部时钟1M)这个时钟通过熔丝配置。
#include "iom128v.h"#include &macros.h&
void IO_init(void){ DDRA=0X00;PORTA=0xFF; DDRB=0XFF;PORTB=0X00; DDRC=0X00;PORTC=0XFF; DDRD=0X00;PORTD=0XFF; DDRE=0X00;PORTE=0XFF; DDRF=0X00;PORTF=0XFF; DDRG=0X00;PORTG=0XFF; DDRG=0X00;PORTG=0XFF;}
void timer2_init(void){TCCR2|=((1&&WGM21)|(0&&WGM20));//CTCTCCR2|=((0&&COM21)|(1&&COM20));//连接OC2 比较匹配取反TCNT2=0;OCR2=18;//你看一下DATASHEET 上面有个公式 可以算出来TCCR2|=((1&&CS22)|(0&&CS21)|(0&&CS20));//CLK_IO/256
void main(void){IO_init();timer2_init();while(1);}
mega16单片机是怎么关闭2的,我用iccAVR软件6.13A
TCCR2|=((0&&CS22)|(0&&CS21)|(0&&CS20));
将CS全部配成000 就关闭了 你看一下 上面有写
等待您来回答
编程领域专家AT89S52单片机定时器问题
AT89S52单片机定时器问题
我最近在做一个小 项目,要用两个定时器,在初始化中,我不知道该怎么做,我试了一下,好像 下面 这样 不行:
void init()
TMOD=0x11;
//延时10MS
为什么呢? 有谁能告诉我 吗???
完全可以用1个定时器 替代
设标志位2个
第一次到5MS了
标志1位置1
下次再到5MS 标志位2置1
PS
定时器光计时 记不到5MS
你好像没写全
的感言:谢谢,我用的就是两个定时器,我今天已经做出来了...
其他回答 (1)
你这样不行得,就算是延时也不会准,一般都不会两个都用于定时的。像你这样一个定时器就够了
我的意思是,一个用于键盘扫描,一个用于数码管的扫描显示。但是
void init()
TMOD=0x11;
TCON=0x50;
这样就行了啊,为什么啊,不是一样的吗????
等待您来回答
编程领域专家单片机编程问题_百度知道
单片机编程问题
用803l的定时器0进行三种不同的定时控制,使得在P1口的三个引脚上输出三个不同频率的方波,方波的周期分别是15Hz,20 Hz和30Hz,803l时钟的频率是12MHz。请写出相应的汇编语言主程序和中断服务子程序以及C语言程序。 急急急急!!!!!!
提问者采纳
这个蛮简单的吧,精度要求不高的话。用定时器中断,大概有10几微妙左右的偏差吧。#include&reg51.h& sbit&FQ15Hz=P1^0;&sbit&FQ20Hz=P1^1;&sbit&FQ30Hz=P1^2;&unsigned&char&Ref30;unsigned&char&Ref20;unsigned&char&Ref15;//定时器0初始化void&Init_Timer0(void){ TMOD&|=&0x01; //模式1,16位定时器最大65535us,12MHz晶振
&&&&& TH0=0x00;
//定时初始值 TL0=0x00; EA=1;
//总中断打开 ET0=1;
//定时器0中断开 TR0=1;
//定时器0开个打开}//主程序main(){ P0=0; Init_Timer0(); while(1);}//定时器0中断服务程序void&Timer0_isr(void)&interrupt&1&using&1{ TH0=0xDF;
//重设定时初始值&取60Hz的8.333ms TL0=0x80; Ref30++; Ref20++; Ref15++; Ref30%=2;
//每两次中断反转一次是30Hz& Ref20%=3;&
//每三次中断反转一次是20Hz Ref15%=4;&
//每四次中断反转一次是15Hz
if(Ref30==0)&
FQ30Hz=~FQ30Hz; //30Hz输出 if(Ref20==0)&
FQ20Hz=~FQ20Hz; //20Hz输出 if(Ref15==0)&
FQ15Hz=~FQ15Hz; //15Hz输出}看看就知道了,比较简单,写了点注释。
提问者评价
灰常感谢!
其他类似问题
6人觉得有用
单片机的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 单片机定时器 的文章

 

随机推荐