找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1948|回复: 11
打印 上一主题 下一主题
收起左侧

51单片机定时器中断问题

[复制链接]
跳转到指定楼层
楼主
ID:917597 发表于 2021-12-2 11:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新人,关于定时器中断有些疑问。之前看一些教程会了一些简单的使用,像用定时器中断控制灯闪烁时间之类的。最近在尝试控制直流电机,用PWM控制直流电机正反转调速。因为89C51单片机没有专门的PWM模块嘛,要用定时器中断来模拟PWM波。
我如果要任意的控制这个PWM波输出脚,输出一段时间低电平,然后输出PWM波,一段时间后又低电平。这样定时器中断函数该怎么写呢?在中断函数里面用if条件判断来执行不同的语句吗?如果某标志位为1或者按键按下之类的,输出低电平,否则就正常输出PWM波?感觉如果逻辑比较复杂的话这个中断函数好难写。能不能将中断函数写成像普通函数一样可以随时调用的呢?之前看的一些简单例程整段代码就光只有定时器中断,定时器中断它是全局的独立于主函数一直在跑(我是这么理解的),又不知道怎么可以让他随时调用。有没有大佬能给我答疑解惑。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:578842 发表于 2021-12-2 12:45 | 只看该作者
我只是说一点建议,定时计数器中断最好不要放入太大的程序,最好用标志位软件定时,PWM最好封装一个函数,在主函数大循环中调用。然后你就可以自由使用了
回复

使用道具 举报

板凳
ID:624769 发表于 2021-12-2 14:16 | 只看该作者
假定 你模拟 PWM  用的 T2, 控制P10口,

开多一个定时器,比如定时器0,优先级要低于 T2中断,在中断里面计数,计数时间到了之后。
TR2 = 0;
TF2 = 0;
P10 = 0;

过一段时间要继续输出 PWM 了 再 TR2 = 1; 即可
回复

使用道具 举报

地板
ID:917597 发表于 2021-12-2 18:29 | 只看该作者
wps10025 发表于 2021-12-2 12:45
我只是说一点建议,定时计数器中断最好不要放入太大的程序,最好用标志位软件定时,PWM最好封装一个函数, ...

定时器中断函数不是放在整段程序最后面吗?我想了一下不知道怎么把PWM封成一个函数。要如何操作?
回复

使用道具 举报

5#
ID:612392 发表于 2021-12-2 19:30 | 只看该作者
jsezcyc 发表于 2021-12-2 18:29
定时器中断函数不是放在整段程序最后面吗?我想了一下不知道怎么把PWM封成一个函数。要如何操作?

他的意思是,增加一个PWM电平转换的标志位,在定时器中断函数里,只负责判断是否进行电平转换,然后将标志位置1,就退出中断程序。再将你需要进行PWM的操作,单独做一个子函数,在main函数里不断地查询这个PWM电平转换标志位是否生效,生效则运行PWM子函数,不生效则不运行。
这样程序运行效率高,不同的中断之中不容易出现冲突,不会出现由于中断程序过长,导致中断程序还没结束,下一次中断又来了,卡在中断里出不来了。
回复

使用道具 举报

6#
ID:983476 发表于 2021-12-2 20:24 | 只看该作者
这个你在中断服务函数里面设置一个计数器,每次中断都给这个计数器加一,然后计数器会有一个值,你不是想一段时间输出低电平吗?那么你可以控制这个计数值如果这个计数值大于某个值的时候你就让他输出低电平,而这个低电平输出的时间你仍然可以用一个计数的变量来实现,这样就可以实现你要的功能了
回复

使用道具 举报

7#
ID:401564 发表于 2021-12-2 20:50 | 只看该作者
unsigned int Duty,PWM;
bit HI;
sbit out;
void Time1() interrupt 3                //PWM调节
{                       
        unsigned int a;
        a=Duty;                                                   //
        if(HI==0)
        {                                                                                                 
                TH1=(65535-a)/256; //         高电平时间
                TL1=(65535-a)%256; //       
                HI=1;
                out=1;
                       
        }
                else
        {
                TH1=(65535-PWM+a)/256; //         低电平时间
                TL1=(65535-PWM+a)%256; //
                HI=0;
                out=0;         
        }                               
        TR1=1;
}



Duty调节占空比
HI为输出电平标志位
out为控制引脚
PWM为PWM的周期
TR1.......这个不用解释了吧

都这样了,你还不知道怎么控制,那就没话说了

回复

使用道具 举报

8#
ID:917597 发表于 2021-12-3 11:16 | 只看该作者
cjjdemon 发表于 2021-12-2 19:30
他的意思是,增加一个PWM电平转换的标志位,在定时器中断函数里,只负责判断是否进行电平转换,然后将标 ...

/***********PWM开关**********/
void PWM_select(bit a)   //不断循环读取PWM输出标志,并影射至PWM输出引脚,关闭即跳出循环,并给PWM引脚低电平
{

        while(a)//a=1PWM开,a=0PWM关
        {
        if (H_out==1) PWM0=1;
        if (H_out==0) PWM0=0;
        }
        PWM0=0;
}

请帮我看看是这个样子吗?我按照你的意思定时器中断里面只改变H_out这个PWM输出标志位的值,然后写循环读取标志位来改变PWM输出脚的电平。但是我发现一旦进入PWM输出这个循环就没办法跳出去了,除非再加一个按键的外部中断。不知道是不是我理解的不对,这样子也没办法把PWM写成一个可以随时调用的子函数。
回复

使用道具 举报

9#
ID:57657 发表于 2021-12-3 11:29 | 只看该作者
wps10025 发表于 2021-12-2 12:45
我只是说一点建议,定时计数器中断最好不要放入太大的程序,最好用标志位软件定时,PWM最好封装一个函数, ...

定时器0中断里你放多大的程序都可以,只要没有再次溢出。
  1. void Timer0Interrupt() interrupt 1{         //12Mhz 1mS定时器中断
  2.     TH0 = 0xFC;
  3.     TL0 = 0x18;
  4.     Delay900us();
  5.     P1++;
  6.     if (_testbit_(TF0)) {
  7.         P1 = 0xAA;
  8.         PCON |= 0x02;
  9.         _nop_(); _nop_();
  10.         _nop_(); _nop_();
  11.     }
  12. }
复制代码
回复

使用道具 举报

10#
ID:917597 发表于 2021-12-3 12:33 | 只看该作者
Y_G_G 发表于 2021-12-2 20:50
unsigned int Duty,PWM;
bit HI;
sbit out;

谢谢大佬,看懂了,又学到一种生成PWM波的写法,之前只会用定时器定一个标准溢出时间,然后计数4次溢出以后更改电平,计数10次溢出以后周期结束计数清零这种方式。如您这种方式,PWM一直在输出,我怎么样能将PWM波的输出写成像函数一样可以随便调用?只有调用的时候输出脚才输出PWM波。
回复

使用道具 举报

11#
ID:401564 发表于 2021-12-3 12:46 | 只看该作者
jsezcyc 发表于 2021-12-3 12:33
谢谢大佬,看懂了,又学到一种生成PWM波的写法,之前只会用定时器定一个标准溢出时间,然后计数4次溢出以 ...

你把控制的部分写成一个函数不就可以了?
你也可以在定时器中断中增加一个变量,用来记录PWM输出的次数,在主程序中通过检测这个变量来进行控制
程序是死的,人是活的,要有想法,要动手,更改个三四百次的,自然你就会知道这些了
回复

使用道具 举报

12#
ID:313854 发表于 2021-12-3 14:28 | 只看该作者
按键检测在主函数,定时器中判断标识输出引脚电平,裸机程序可以这样做
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表