liude2006 发表于 2016-4-12 16:24:55

单片机延时出问题了

本帖最后由 liude2006 于 2016-4-12 16:38 编辑

uint zheyang_time = 15;   //2.5分钟
uint Flag_zheyang = 0;
void control_right_left()
{
        if(Flag_zheyang_time >= zheyang_time && zheyang_zheng == 1)
        {
                Flag_zheyang_time = 0;
                zheyang_zheng = 0;
                RELAY_P2_0 = RELAY_OFF;                  
                RELAY_P2_2 = RELAY_OFF;
        }
        if(Flag_zheyang_time >= zheyang_time && zheyang_fan == 1)
        {
                Flag_zheyang_time = 0;
                zheyang_fan = 0;
                RELAY_P2_1 = RELAY_OFF;                  
                RELAY_P2_3 = RELAY_OFF;
        }
}

void main(void)
{
       Relay_Init();              //继电器初始化
           Serial_Init();       //串口初始化

       Delay(1000);

       Receive_Flag = 0;
       Flag_Rece_Uartbuf = 0;
       F_Packet_Clear(&sPacket_Receive);

       while(1)
       {
                if(Flag_Rece_Uartbuf == 1)          //数据包接收完全正确   执行相应动作
                {
                case 0x30: RELAY_P2_0 = RELAY_ON;         //P2_1 P2_3 电机正转开始
                        RELAY_P2_2 = RELAY_ON;        
                        zheyang_zheng = 1;
                        Flag_zheyang_time = 0;
                        Flag_zheyang = 0;                                                                                                             
                break;
                case 0x31: RELAY_P2_0 = RELAY_OFF;        //P2_1 P2_3 正转停止
                        RELAY_P2_2 = RELAY_OFF;                          
                break;       
                case 0x40: RELAY_P2_1 = RELAY_ON;         //P2_2 P2_4 电机反转开始
                        RELAY_P2_3 = RELAY_ON;
                        zheyang_fan = 1;
                        Flag_zheyang_time = 0;
                        Flag_zheyang = 0;                                                          
                break;
                case 0x41: RELAY_P2_1 = RELAY_OFF;                //P2_2P2_4反转停止
                        RELAY_P2_3 = RELAY_OFF;
                break;       
                default: break;
                }
        }       

        control_right_left();
}
//串口接收中断函数
void ver()interrupt 4
{
        RI = 0;
        Receive_Value = SBUF;

        ParseData();//判断接收到的数据
}
void timer0() interrupt 1
{
        TH0 = (65535-5000)/256;                                        //定时5ms
        TL0 = (65535-5000)%256;

        Flag_zheyang++;
        if(Flag_zheyang == 2000)// Flag_zheyang == 2000 定时10S,
        {   
                Flag_zheyang = 0;
                Flag_zheyang_time++;
        }
}

此程序是控制电机正反转的,现在的问题是明明定时的是2.5分钟,,结果电机只动作了二十几秒就停止了,请高手看看问题出在哪里了?急急急   用的是52单片机,11.0592的晶振

jzkn 发表于 2016-4-12 16:27:27

看一下定时器里面的Flag_zheyang变量是不是申明为char了。你这个代码风格有点乱啊。

jbpan852 发表于 2016-4-12 16:29:28

没看到Flag_zheyang数据类型,是不是溢出了

liude2006 发表于 2016-4-12 16:39:21

jzkn 发表于 2016-4-12 16:27
看一下定时器里面的Flag_zheyang变量是不是申明为char了。你这个代码风格有点乱啊。 ...

Flag_zheyang是uint型的

liude2006 发表于 2016-4-12 16:40:10

jbpan852 发表于 2016-4-12 16:29
没看到Flag_zheyang数据类型,是不是溢出了

Flag_zheyang是uint型的

jzkn 发表于 2016-4-12 16:44:18

用串口先调试一下你的定时器吧。这么看看不出来个啥。

klxx68 发表于 2016-4-12 17:03:36

定时器初始化在哪里?

饭桶 发表于 2016-4-12 17:29:13

INT    溢出了。

liude2006 发表于 2016-4-12 17:48:49

饭桶 发表于 2016-4-12 17:29
INT    溢出了。

具体是指。。。。。

czg1411 发表于 2016-4-12 17:52:24

这程序怎么编译过的。。。

albert.hu 发表于 2016-4-12 18:48:33

看不出来有定时关闭电机的动作

shuipaopao 发表于 2016-4-13 11:38:26

主程序中没定时器初始化吧,还有中断开启了吗

so_so_so_so 发表于 2016-4-13 11:44:56

也是,没看到定时器初始化和中断使能控制。

rain73 发表于 2016-4-13 12:59:39

比较乱,没看懂。

ywlzh 发表于 2016-4-13 18:43:36

首先control_right_left();这个函数在while(1)之外

再有 你的case 怎么能通过编译器的请你告诉我一下,很厉害呀,swtich呢?

liuyonguo 发表于 2016-4-13 20:15:51

这个风格真心没看明白呀

hyg5200aaa 发表于 2016-4-13 20:57:08

先写正转,调试成功再反转

xiaobendan 发表于 2016-4-14 06:55:54

可能楼主的程序代码发上了的时候做了删减

longwu537 发表于 2016-4-14 07:09:27

多用点()

liuyonguo 发表于 2016-4-14 10:17:51

历害,这也被发现了!
页: [1]
查看完整版本: 单片机延时出问题了