打印

程序跑飞了,麻烦高手看看,非常感谢

[复制链接]
2629|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
momolf0727|  楼主 | 2010-12-6 17:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 momolf0727 于 2010-12-6 17:12 编辑

用892051写的程序老师跑飞,麻烦高手给我看看吧,非常感谢
/*******************************************************************************************************
        MCU:AT89C2051
        晶振:12MHz
        定时器0:定时中断每3s轮流显示调节电压与最低工作电压与输出频率为200Hz的方波
        定时器1:定时中断5s
******************************************************************************************************/
#include        <AT89C2051.H>           //包含头文件
#include        <intrins.h>
#define         uint         unsigned   int
#define         uchar        unsigned   char
//---------------------------------------I/O口及参数定义------------------------------------------------
sbit            VREG28       = P1^4;     //28V电压调节
sbit            VREG14       = P1^5;     //14V电压调节
sbit            P_control    = P1^6;     //单双P控制信号
sbit            Vol_1428     = P1^7;     //电压输出控制,14V或者28V
sbit            Wai_control  = P3^0;     //外搭铁
sbit            Nei_control  = P3^1;     //内搭铁
sbit            Wai_p        = P3^2;     //外搭铁判断
sbit            Nei_p        = P3^3;     //内搭铁判断
sbit            Vreg_control = P3^4;     //调节电压14V与28V切换
sbit            Vr_Vm        = P3^5;     //Vreg与Vmin切换控制
sbit            Dect_f       = P3^7;     //F探测信号
uchar           ZT,RZT;               //面板状态与5s标志位
uint            flag=0;
uint            Cnt_T1=200,Cnt_T0=5;    //定时器T0与T1中断常数
//------------------------------------------延时程序----------------------------------------------------
void            delay(uint   xms)       //延时xsm毫秒
{
        uint    i,j;
        for(i=xms;i>0;i--)
                          for(j=110;j>0;j--);
}
//------------------------------------------初始化程序--------------------------------------------------
void            init(void)
{
        P1=0x2f;                        //初始13V
        Wai_control=1;                  //关闭外打铁
        Vreg_control=0;                 //初始14V
        Vr_Vm=0;                        //初始显示调节电压
        TMOD=0x11;                      //T0,T1工作方式1
        TL0=(655235-500)%256;            //定时器T0 0.5ms溢出一次
        TH0=(65535-500)/256;             //
//        TL1=(65535-50000)%256;           //定时器T1 50ms溢出一次
//        TH1=(65535-50000)/256;           //
        TR0=1;
//        TR1=0;                          //启动定时器T0
        ET0=1;
//        ET1=0;
        EA=1;                           //开总中断
}
//-----------------------------------------14V调节电压函数-----------------------------------------------
void            Vol_reg14(void)
{
        while(Dect_f==1)
        VREG14=0;
        while((Dect_f==0)&&(flag<50000))
        {
                VREG14=1;
                _nop_();
                _nop_();
                if(Dect_f==0)
                flag++;               
        }
        RZT=P1&0x0f;    //读取面板
}
                           
//-----------------------------------------28V调节电压函数-----------------------------------------------
void            Vol_reg28(void)
{
        while(Dect_f==1)
        VREG28=0;
        while((Dect_f==0)&&(flag<50000))
        {
                VREG28=1;
                _nop_();
                _nop_();
                if(Dect_f==0)
                flag++;
        }
        RZT=P1&0x0f;      //读取面板
}
//--------------------------------------------14V外搭铁--------------------------------------------------
void           wai14(void)
{
        VREG28=0;
        VREG14=1;
        Vol_1428=0;                     //13V
        Vreg_control=0;
        delay(10);
        Nei_control=1;                  //关闭内搭铁
        Nei_p=1;                        //关闭内搭铁判断
        delay(10);                      //延时5ms
        Wai_control=0;                  //搭铁置外
        Wai_p=1;                        //关闭外搭铁判断
        delay(10);                      //延时5ms
        while((Dect_f==1)&&(ZT==RZT))
        {
                _nop_();
                _nop_();
                _nop_();
                Vol_reg14();
                _nop_();
                _nop_();
                _nop_();
        }
}
//--------------------------------------------14V内搭铁--------------------------------------------------
void           nei14(void)
{
        VREG28=0;
        VREG14=1;
        Vol_1428=0;                     //13V
        Vreg_control=0;
        delay(10);
        Wai_control=1;                  //关闭外搭铁
        Wai_p=1;                        //关闭外搭铁判断
        delay(10);                      //延时5ms
        Nei_control=0;                  //搭铁置内
        Nei_p=1;                        //关闭内搭铁判断
        delay(10);                      //延时5ms
        while((Dect_f==1)&&(ZT==RZT))
        {
                _nop_();
                _nop_();
                _nop_();
                Vol_reg14();
                _nop_();
                _nop_();
                _nop_();
        }
}
//--------------------------------------------28V外搭铁--------------------------------------------------
void           wai28(void)
{
        VREG28=1;
        Vol_1428=1;             //输出电压由14V档打到28V档
        Vreg_control=1;         //负载由14V档打到28V档
        delay(10);
        Nei_control=1;          //关闭内搭铁
        Nei_p=1;                //关闭内搭铁判断
        delay(10);              //延时15ms
        Wai_control=0;          //置外
        Wai_p=1;
        delay(10);              //延时15ms
        while((Dect_f==1)&&(ZT==RZT))
        {
                _nop_();
                _nop_();
                _nop_();
                Vol_reg28();
                _nop_();
                _nop_();
                _nop_();
        }
}
//--------------------------------------------28V内搭铁--------------------------------------------------
void           nei28(void)
{
        VREG28=1;
        Vol_1428=1;             //输出电压由14V档打到28V档
        Vreg_control=1;         //负载由14V档打到28V档
        Wai_control=1;          //关闭外搭铁
        Wai_p=1;                //关闭外搭铁判断
        delay(10);              //延时15ms
        Nei_control=0;          //置内
        Nei_p=1;
        delay(10);              //延时15ms
        if(Dect_f==1)
        while((Dect_f==1)&&(ZT==RZT))
        {
                _nop_();
                _nop_();
                _nop_();
                Vol_reg28();
                _nop_();
                _nop_();
                _nop_();
        }
}
//-----------------------------------------------总函数--------------------------------------------------
void           main(void)
{
        init();                         //调用初始化
        while(1)
        {
                ZT=P1&0x0f;
                RZT=ZT;
                flag=0;
                switch(ZT)
                {
                   case 0x0e:        //电压:14V,搭铁:自动
                        VREG28=0;               //
                        VREG14=1;               //
                        Vol_1428=0;             //13V
                        Vreg_control=0;
                        delay(10);
                        Nei_p=1;                //关闭内搭铁判断
                        Nei_control=1;          //关闭内搭铁
                        delay(10);              //延时5ms
                        Wai_p=0;                //先判断外搭铁
                        delay(1);
                        if(Dect_f==1)           //调节器通
                        {
                                wai14();
                        }
                        else
                        {
                                Wai_p=1;                //关闭外搭铁判断
                                Wai_control=1;          //关闭外搭铁
                                delay(10);              //延时5ms
                                Nei_p=0;                //再判断内搭铁
                                delay(1);
                                if(Dect_f==1)
                                {
                                        nei14();
                                }
                        }
                        break;
                   case 0x0d:           //电压:28V,搭铁:自动
                        VREG28=1;
                        Vol_1428=1;                     //26V
                        Vreg_control=1;                 //负载由14V档打到28V档
                        Nei_p=1;                        //关闭内搭铁判断
                        Nei_control=1;                  //关闭内搭铁
                        delay(10);                      //延时5ms
                        Wai_p=0;                        //先判断外搭铁
                        delay(1);
                        if(Dect_f==1)                   //调节器通
                        {
                                wai28();
                        }
                        else
                        {
                                Wai_p=1;                //关闭外搭铁判断
                                Wai_control=1;          //关闭外搭铁
                                delay(10);              //延时5ms
                                Nei_p=0;                //再判断内搭铁
                                delay(1);
                                if(Dect_f==1)
                                {
                                        nei28();
                                }
                        }
                        break;
                   case 0x06:            //电压:14V,搭铁:外
                        wai14();
                        break;
                   case 0x0a:            //电压:14V,搭铁:内
                        nei14();
                        break;
                   case 0x09:           //电压:28V,搭铁:内
                        nei28();
                        break;
                   case 0x05:           //电压:28V,搭铁:外
                        wai28();
                        break;
                   case 0x0b:           //电压:自动,搭铁:外
                        Nei_control=1;          //关闭内搭铁
                        Nei_p=1;                //关闭内搭铁判断
                        delay(10);              //延时15ms
                        Wai_control=0;          //置外
                        Wai_p=1;
                        delay(10);
                        VREG28=0;
                        VREG14=0;               //16V
                        Vol_1428=0;
                        Vreg_control=0;
                        delay(10);
                        if(Dect_f==1)
                        {
                                wai28();
                        }
                        else
                        {
                                wai14();
                        }
                        break;
                   case 0x07:           //电压:自动,搭铁:内
                        Wai_control=1;          //关闭外搭铁
                        Wai_p=1;                //关闭外搭铁判断
                        delay(10);               //延时5ms
                        Nei_control=0;          //置内
                        Nei_p=1;
                        VREG28=0;
                        VREG14=0;               //16V
                        Vol_1428=0;
                        Vreg_control=0;
                        delay(10);
                        if(Dect_f==1)
                        {
                                nei28();
                        }
                        else
                        {
                                nei14();
                        }
                        break;
                   case 0x0f:           //电压:自动,搭铁:自动
                        VREG28=0;
                        VREG14=1;
                        Vol_1428=0;             //13V
                        Vreg_control=0;
                        delay(10);
                        Nei_p=1;                //关闭内搭铁判断
                        Nei_control=1;          //关闭内搭铁
                        delay(5);
                        Wai_p=0;                //先判断搭铁,外
                        delay(5);
                        if(Dect_f==1)           //调节器是外搭铁?
                        {
                                Wai_control=0;  //搭铁置外
                                delay(10);      //延时5ms
                                Wai_p=1;
                                VREG14=0;       //再判断电压,16V
                                delay(10);
                                if(Dect_f==1)   //调节器通?
                                {
                                        wai28();
                                }
                                else
                                {
                                        VREG14=1;//13V
                                        delay(5);
                                        wai14();
                                }
                        }
                        else                   //不是外搭铁再判断是否是内搭铁?
                        {
                                Wai_control=1; //关闭外搭铁
                                Wai_p=1;       //关闭外搭铁判断
                                delay(10);     //延时5ms
                                Nei_control=1;
                                Nei_p=0;       //开启内搭铁判断
                                delay(10);
                                if(Dect_f==1)  //调节器通?
                                {
                                        Nei_control=0;
                                        Nei_p=1;
                                        VREG14=0;                         //16V
                                        delay(10);
                                        if(Dect_f==1)
                                        {
                                                nei28();
                                        }
                                        else
                                        {
                                                nei14();
                                        }
                               }
                        }
                        break;
                }
       }
}
//----------------------------------定时器0中断函数----------------------------------------------
void    Timer0(void)    interrupt 1             //定时器T0中断
{
        TL0=(65535-500)%256;                     //定时器T0 0.5ms溢出一次
        TH0=(65535-500)/256;                     //
        Cnt_T0--;
        if(Cnt_T0==0)                          //0.5ms到
        {
                Cnt_T0=5;
                P_control=~P_control;           //输出方波信号
        }
}
/*/----------------------------------定时器1中断函数-----------------------------------------------
void    Timer1(void)    interrupt 3            //定时器T1中断
{
        TL1=(65535-50000)%256;                   //定时器T1 50ms溢出一次
        TH1=(65535-50000)/256;                   //
        Cnt_T1--;
        if(Cnt_T1==0)        //时间到3s,不为内搭铁调节器且接到控制
        {
                Cnt_T1=200;
                TR1=0;
                flag=1;                                   //调节电压与最低工作电压轮流显示
        }
} */
------------------------老是不执行红色部分,直接就跳出循环了------------

相关帖子

沙发
POINTRTOS| | 2010-12-6 17:34 | 只看该作者
while((Dect_f==0)&&(flag<50000))
?
不是很简单嘛,要么就是Dect_f不等于零,要么就是flag大于等于50000.也许是没有初始化,也许是哪里进行了别的运算导致.

使用特权

评论回复
板凳
momolf0727|  楼主 | 2010-12-7 11:16 | 只看该作者
:)en,谢谢,楼上,呵呵,我估计是硬件的问题。LM2576-adj这个片子怎么样?好像电压变化不够快啊

使用特权

评论回复
地板
areshan| | 2010-12-7 14:43 | 只看该作者
sbit            Dect_f       = P3^7;     //F探测信号
uint            flag=0;
while((Dect_f==0)&&(flag<50000))
不执行一定是条件不满足了!你的Dect_f有问题,只有在程序执行到这行时,此时如果P3^7=0,flag<5000条件才能满足。。。
建议你用外部中断来F探测信号!!!!!!

使用特权

评论回复
5
yewuyi| | 2010-12-7 14:48 | 只看该作者
程序跑飞首先要解决的硬件问题,其次是解决软件强壮性问题。

使用特权

评论回复
6
softerchang| | 2010-12-9 09:21 | 只看该作者
分析一下,不知对你有没有帮助:
 
while((Dect_f==0)&&(flag<50000))
1:Dect_f是位,是个io口,而flag是数据。这里应改一下它们的算法。
2:io口用逻辑运算来做判断更好.

使用特权

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

本版积分规则

2

主题

27

帖子

0

粉丝