打印
[51单片机]

请教大侠一个51中断的问题

[复制链接]
1488|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rdfeps|  楼主 | 2014-2-15 21:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个产生PWM的程序  ,下载到实验板上的现像是一个LED灯一直亮暗亮暗的循环。中断部分我不理解,望大侠给解释一下。谢谢!
#include <reg52.h>

sbit LED = P1^0;
unsigned char CYCLE;
unsigned char PWM_ON ;
void delay(unsigned int cnt)
{

while(--cnt);
}                                                   延时函数结束

main()                                       主函数开始
{
bit Flag;                                    确定标志位只能是0或者1

TMOD |=0x01;                                定时器工作在16位计数方式
TH0=(65536-100)/256;                   高8位初始值
TL0=(65536-100)%256;                 低8位初始值
IE= 0x82;                                        打开中断总开关,打开定时器0开关
TR0=1;                                         定时器开始计数

CYCLE = 10;                               一个电平翻转的周期是10个中断,也就是20个中断为一个PWM周期
while(!Flag)                                     这一段小程序循环10次                          
  {         
     delay(200000);
   PWM_ON++;   
   if(PWM_ON ==CYCLE)            
     {         
      Flag=1;                                标志位置1
     }
  }

while(Flag)                                这一段小程序运行10次
  {
   delay(200000);
   PWM_ON--;
   if(PWM_ON == 0)
     {
      Flag=0;                                           标志位置0
   }
  }
}
void tim(void) interrupt 1 using 1            定时器0的中断
{
static unsigned char count;                     static是什么意思 ,在这有什么用?

TH0=(65536-100)/256;                         定时器恢复初始值
TL0=(65536-100)%256;                        定时器恢复初始值
if (count==PWM_ON)                        PWM-ON在主程序中是一值变化 的,它们两个怎么比较?
    {
     LED = 1;  
  }
  count++;
if(count == CYCLE)
    {
    count=0;
if(PWM_ON!=0)
    LED = 0;
}}
有如下几个问题   1 :TR0=1 这个中断开关一但打开,就会一直定时吗   ?当定时器溢出后主函数响应, 开
                     始运行中断函数,就会把中断函数从头到尾走一遍然后再重新定时吗?         
                 2:中断函数中,  PWM-ON在主程序中是一值变化 的,它们两个怎么比较?
                 3: static 这个关键字在中断函数中有什么用,我是初学,还没有接触过它。
这个程序上部分没有写出来,还有,哪位大侠用白话把中断函数中的语句翻译一下,谢谢

相关帖子

沙发
ningling_21| | 2014-2-15 21:57 | 只看该作者
TR0=1 是计数器开关,写1就计数写0就停止计数,不是中断开关。

使用特权

评论回复
板凳
NE5532| | 2014-2-15 22:03 | 只看该作者
TR0这个标志不是控制中断,是Timer0的RUN使能标志吧,楼主去找数据手册或者讲51的书确认一下,这个标志一旦置1,Timer0就开始运行了。定时器溢出以后,不是主函数来响应,而是Timer0的溢出中断函数来响应,就是说void tim(void) interrupt 1 using 1这个函数,TH0=(65536-100)/256; TL0=(65536-100)%256; 这两句已经是让定时器重新跑了。

中断函数执行时,主程序是不可能被执行的,任何单片机都是这样,同一时间只能执行一条语句,所以这个地方PWM-ON是一个固定值,不是变化的,你可以理解MAIN循环里面通过这个值来向中断服务函数“传递”控制信息。

static是关键字,声明变量为“静态”,就是说,当退出这个函数时,这个变量的值也继续保持(如果不声明,一旦退出该函数,这个变量的值就不固定了)。

至于白话解释的活路,留给楼主自己画个流程图出来瞧瞧就知道了。

使用特权

评论回复
地板
lnulibin| | 2014-2-15 22:24 | 只看该作者
刚学习单片机,学习点简单的程序。有助于理解硬件。
等到有一定积累之后,再看这种程序。

使用特权

评论回复
5
tzq3434hr| | 2014-2-15 22:46 | 只看该作者
一起学习学习

使用特权

评论回复
6
rdfeps|  楼主 | 2014-2-16 12:20 | 只看该作者
ningling_21 发表于 2014-2-15 21:57
TR0=1 是计数器开关,写1就计数写0就停止计数,不是中断开关。

谢谢大侠

使用特权

评论回复
7
rdfeps|  楼主 | 2014-2-16 12:22 | 只看该作者
NE5532 发表于 2014-2-15 22:03
TR0这个标志不是控制中断,是Timer0的RUN使能标志吧,楼主去找数据手册或者讲51的书确认一下,这个标志一旦 ...

太感谢了,虽然还是有一点不懂,谢谢你

使用特权

评论回复
8
NE5532| | 2014-2-16 16:03 | 只看该作者
rdfeps 发表于 2014-2-16 12:22
太感谢了,虽然还是有一点不懂,谢谢你

不懂就问拉,都是这样过来的。另外要记得学会画流程图。

使用特权

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

本版积分规则

9

主题

23

帖子

1

粉丝