打印

如何用中断产生固定个数脉冲

[复制链接]
3429|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alaic123|  楼主 | 2012-12-3 16:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何用中断产生固定个数脉冲 ,请各位大神指点迷津 就用一个定时器。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar time;
uchar period=250;
uchar high=50;
sbit a=P1^3;
void init_timer0(void)
{
  TMOD |=0x00;
  TH0=0x00;
  TL0=0x00;
  EA=1;
  ET0=1;
  TR0=1;
   

}
void main()
{
init_timer0();
while(1);
}
void Timer0_isr(void) interrupt 1 using 1
{ int i;
  
for(i=0;i<30;i++)
{
  
  
  TH0=0xff;
  TL0=0xfe;
  if(++time==high)
  a=1;
  else if(time==period)
  {time=0;a=0;}

  }
  
}

相关帖子

沙发
wangyy608| | 2012-12-3 16:46 | 只看该作者
TMOD|=0X00?????啥都没干

使用特权

评论回复
板凳
coody| | 2012-12-3 16:57 | 只看该作者
定时中断里输出脉冲数,并且计数,这个不难吧?

使用特权

评论回复
地板
东北小辉辉| | 2012-12-3 18:58 | 只看该作者
TMOD |=0x00;
楼主并没有选择定时器也没有选择工作方式?

使用特权

评论回复
5
alaic123|  楼主 | 2012-12-3 22:02 | 只看该作者
wangyy608 发表于 2012-12-3 16:46
TMOD|=0X00?????啥都没干

哦 错了 是0X01

使用特权

评论回复
6
alaic123|  楼主 | 2012-12-3 22:03 | 只看该作者
coody 发表于 2012-12-3 16:57
定时中断里输出脉冲数,并且计数,这个不难吧?

有点迷 能具体点吗

使用特权

评论回复
7
alaic123|  楼主 | 2012-12-3 22:13 | 只看该作者
东北小辉辉 发表于 2012-12-3 18:58
TMOD |=0x00;
楼主并没有选择定时器也没有选择工作方式?

哦哦  0X00 这不是M1M0都为O的方式0工作方式吗

使用特权

评论回复
8
alaic123|  楼主 | 2012-12-4 08:59 | 只看该作者
刚才网上搜了下 说TMOD 0X00这种方式已经没人用了除了我这菜~~  ! 求产生脉冲个数能通过什么实现 比如循环 或者TF0计数 在中断中实现还是在主函数里。跪求大神

使用特权

评论回复
9
wangyy608| | 2012-12-4 09:10 | 只看该作者
1.如果是要TMOD为0X00也不应该是TMOD|=0X00;
2.可以在中断中实现,你的思路已经差不多了,不用for(),再加个计数就可以了

使用特权

评论回复
10
alaic123|  楼主 | 2012-12-4 09:32 | 只看该作者
wangyy608 发表于 2012-12-4 09:10
1.如果是要TMOD为0X00也不应该是TMOD|=0X00;
2.可以在中断中实现,你的思路已经差不多了,不用for(),再加 ...

1.加了|会有什么不同?
2.那我通过记录什么为标志比较好?

使用特权

评论回复
11
zhang7676050| | 2012-12-4 09:36 | 只看该作者
工作模式都没有选,计数应该没有问题吧

使用特权

评论回复
12
alaic123|  楼主 | 2012-12-4 10:01 | 只看该作者
zhang7676050 发表于 2012-12-4 09:36
工作模式都没有选,计数应该没有问题吧

工作模式? 晕了  关键词,能说是TCON还是什么滴具体点 谢谢了

使用特权

评论回复
13
mingyuenu| | 2012-12-4 16:25 | 只看该作者
看不懂诶

使用特权

评论回复
14
alaic123|  楼主 | 2012-12-5 16:43 | 只看该作者
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar time;
uchar period=4;
uchar high=1;
sbit a=P1^3;
int i=0;

int M = 10;  



void init_timer0(void)
{
         TMOD =0x01;
         TH0=0xFF;
         TL0=0xF2;

         EA=1;
         ET0=1;
         TR0=1;
                


}

void main()
{

init_timer0();

while(1);
  


}





void Timer0_isr(void) interrupt 1 using 1       
       
{                 
               
                  
                        TH0=0xff;
                        TL0=0xf2;
                        if(M!=0)M--;
                    if(M>1)               
                        {   
                            if(++time==high)
                                a=1;
                                else if(time==period)
                                {time=0;a=0;}
               
                        }
                //        else if(M==0)M=10;
                  
         
}
已修改但是还是达不到固定脉冲个数,。我到底该这么做呢? 求指点,别太高深了,小民智商没底线~~

使用特权

评论回复
15
ZG11211| | 2012-12-5 18:11 | 只看该作者
根据脉冲宽度设定定时器参数,定时器中断一次就发一次脉冲,计数函数++;如果计数函数==你需要的数,退出,关闭定时器,函数清零

使用特权

评论回复
16
alaic123|  楼主 | 2012-12-6 10:11 | 只看该作者
ZG11211 发表于 2012-12-5 18:11
根据脉冲宽度设定定时器参数,定时器中断一次就发一次脉冲,计数函数++;如果计数函数==你需要的数,退出, ...

在定时器中断里能关闭定时器吗? 是针对ET0,TR0置0? ET0我试过 没什么反应

使用特权

评论回复
17
ZG11211| | 2012-12-6 10:48 | 只看该作者
定时器中断函数()
{
执行你要的指令;
x++;
if(x==你要的数){xx(各种必要的操作,比如X清零);最后加一句TR0=0;}
}

使用特权

评论回复
18
alaic123|  楼主 | 2012-12-11 11:14 | 只看该作者
ZG11211 发表于 2012-12-6 10:48
定时器中断函数()
{
执行你要的指令;

后来我写出来了 观察发现其中和TIME有些关系  谢谢了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:LIFE

3

主题

54

帖子

0

粉丝