打印
[51单片机]

为什么灯在5秒之后不闪?谢谢

[复制链接]
2084|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1349236685|  楼主 | 2015-1-14 12:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么灯在5秒之后不闪?我想让灯亮五次之后,5秒之后继续闪五次。。。这样循环下去?

#include<reg51.h>

#define uchar unsigned char
#define uint unsigned int

sbit led=P2^7;
sbit jum=P3^2;

uint x;
uchar n,num,m,a;

        void init()
        {
                num=0;
            led=0;
            
        }       
//        void int0() interrupt 0
//        {
//                EA=1;
//                EX0=1;
//                a=0;
//        }
        void time0() interrupt 1
        {
                uchar m=0;
            TH0=(65536-50000)/256;
            TL0=(65536-50000)%256;
            num++;

                if(m==0)
            {
                        if(num==10)
                    {
                                led=1;
                                TH0=(65536-50000)/256;
                            TL0=(65536-50000)%256;
               
                       
                        }
                    if(num==20)
                    {
                                num=0;
                                led=0;
                                TH0=(65536-50000)/256;
                            TL0=(65536-50000)%256;
                                num=0;
                                n++;                     
                       
                        }
                        if(n==5)
                        {
                                led=1;
                                TR0=0;
                                m=1;

                        }
                }
                else
                {
                        led=1;
                        TR0=1;
                        TH0=(65536-50000)/256;
                    TL0=(65536-50000)%256;
                        a++;
                }
                if(a==100)
                {
                    a=0;
                        m=0;
                }
       
        }

void main()
{
        init();
        TMOD=0X11;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        ET0=1;
        EA=1;
        TR0=1;
       
  
        while(1)
    {
           
    }
                 

}

相关帖子

沙发
huangxz| | 2015-1-14 13:29 | 只看该作者
定时器停掉了.

使用特权

评论回复
板凳
ningling_21| | 2015-1-14 14:06 | 只看该作者
定时器被停止计数

使用特权

评论回复
地板
1349236685|  楼主 | 2015-1-14 14:32 | 只看该作者
huangxz 发表于 2015-1-14 13:29
定时器停掉了.

定时器我又置1了~~在else里

使用特权

评论回复
5
1349236685|  楼主 | 2015-1-14 14:32 | 只看该作者
ningling_21 发表于 2015-1-14 14:06
定时器被停止计数

在else里的定时器我又置1了~~别的地方哪里有错?

使用特权

评论回复
6
ayb_ice| | 2015-1-14 14:35 | 只看该作者
为什么总是在重装载定时器呢

这可不是好的习惯

使用特权

评论回复
7
ayb_ice| | 2015-1-14 14:38 | 只看该作者
void time0() interrupt 1
{
        uchar m=0;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        num++;

        if(m==0)

这里的初始化为0了,每次判断都会为0,是何意呢

使用特权

评论回复
8
ningling_21| | 2015-1-14 14:39 | 只看该作者
1349236685 发表于 2015-1-14 14:32
在else里的定时器我又置1了~~别的地方哪里有错?

定时器初值不需要多次装载,进中断装载就可以了

使用特权

评论回复
9
1349236685|  楼主 | 2015-1-14 16:06 | 只看该作者
ayb_ice 发表于 2015-1-14 14:38
void time0() interrupt 1
{
        uchar m=0;

为0时闪,为1时是暂停5秒

使用特权

评论回复
10
1349236685|  楼主 | 2015-1-14 16:07 | 只看该作者
ningling_21 发表于 2015-1-14 14:39
定时器初值不需要多次装载,进中断装载就可以了

嗯,好

使用特权

评论回复
11
1349236685|  楼主 | 2015-1-14 16:08 | 只看该作者
ningling_21 发表于 2015-1-14 14:39
定时器初值不需要多次装载,进中断装载就可以了

嗯,好

使用特权

评论回复
12
ayb_ice| | 2015-1-14 16:13 | 只看该作者
1349236685 发表于 2015-1-14 16:06
为0时闪,为1时是暂停5秒

每次进来都初始化为0了,还有可能为1吗,即使为1也被初始化为0了

使用特权

评论回复
13
joyme| | 2015-1-14 17:23 | 只看该作者
m用全局变量,或用静态变量static

使用特权

评论回复
14
1349236685|  楼主 | 2015-1-14 18:49 | 只看该作者
joyme 发表于 2015-1-14 17:23
m用全局变量,或用静态变量static

嗯,那staic怎么用?我是菜鸟,谢谢您~~

使用特权

评论回复
15
1349236685|  楼主 | 2015-1-14 18:51 | 只看该作者
本帖最后由 1349236685 于 2015-1-14 18:52 编辑
ayb_ice 发表于 2015-1-14 16:13
每次进来都初始化为0了,还有可能为1吗,即使为1也被初始化为0了


好,谢谢您,明白了~~

使用特权

评论回复
16
HORSE7812| | 2015-1-14 22:30 | 只看该作者

使用特权

评论回复
17
734664813| | 2015-1-15 12:21 | 只看该作者
你的else语句是不起作用的,也就是程序永远不会跳转过去
if(n==5)
                        {
                                led=1;
                                TR0=0;
                                m=1;

                        }
你的这个if语句把定时器关了,也就是说当执行完if(n==5)之后程序停留在while循环里,不会再进入中断子程序,这样说明白么

使用特权

评论回复
18
jie1095| | 2015-1-15 13:10 | 只看该作者
LZ写得有点复杂了,变量m没必要,重复赋值TH0=(65536-50000)/256;TL0=(65536-50000)%256;,而且这应该是50ms的定时器吧,你让它计时到num==20时,也就是1s,再让n==5时,再改变LED,直接让num==100不就行了吗?而且你想让LED闪烁,可以用异或语句,LED ^= 1;之类的不是简单点吗

使用特权

评论回复
19
1349236685|  楼主 | 2015-1-17 12:35 | 只看该作者
734664813 发表于 2015-1-15 12:21
你的else语句是不起作用的,也就是程序永远不会跳转过去
if(n==5)
                        {

明白~~谢谢

使用特权

评论回复
20
1349236685|  楼主 | 2015-1-17 12:38 | 只看该作者
jie1095 发表于 2015-1-15 13:10
LZ写得有点复杂了,变量m没必要,重复赋值TH0=(65536-50000)/256;TL0=(65536-50000)%256;,而且这应该是50m ...

num=20时要清0,要是num=100,led取余的话,灯也不能闪啊  请问这个问题怎么解决?谢谢~~我写的确实有点复杂

使用特权

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

本版积分规则

33

主题

71

帖子

0

粉丝