24小时热门版块排行榜    

查看: 1192  |  回复: 3

yeyu370784

新虫 (初入文坛)

[求助] 52单片机的程序问题,程序刚开始可以执行,可是执行一段时间后就不灵敏了!求高人指点 已有1人参与

#include <reg52.h>        // 89C52单片机头文件
#include <stdio.h>       
#include <intrins.h>
sbit key1=P1^0;
sbit key2=P1^1;
sfr ISP_CONTR=0xe7;
idata unsigned char dis5_temp_buf[50];
unsigned int num4=0,temp=0,num5=0;
unsigned char temp_buf_f=0;
unsigned int  flag=0,flag1=0,flag2=0,flag3=0,flag4=0;
double num2=0,num3=0;
unsigned int num=0,num1=0;
unsigned  char dis0_temp_buf[7]={"<!@CSB"};
unsigned  char dis4_temp_buf[6]={"<!>JI"};          
unsigned  char dis6_temp_buf[2]={'#'};
unsigned  char dis7_temp_buf[11]={"<!>KF报警#"};
unsigned  char dis10_temp_buf[10]={"<!AKF1140"};
idata unsigned  char dis11_temp_buf[9]={"<!>KG常#"};
idata unsigned  char dis12_temp_buf[11]={"<!>LF故障#"};
idata unsigned  char dis13_temp_buf[10]={"<!ALF1140"};
idata unsigned  char dis14_temp_buf[9]={"<!>LG常#"};
idata unsigned  char dis15_temp_buf[8]={"<!>KK1#"};
idata unsigned  char dis16_temp_buf[8]={"<!>KK0#"};
idata unsigned  char dis17_temp_buf[5]={"<!LL"};
idata unsigned  char dis18_temp_buf[5]={"<!LH"};



void delayms(unsigned int xms)         //延时程序
{
        unsigned int m,n;
        for(m=xms;m>0;m--)
                for(n=110;n>0;n--);
}

void T_init (void)           //T0用于计数,T2用于定时
{   
        TMOD=0x25;             //设置T1定时器和T0计数器的工作方式
        TH0=0;                           //设置T0计数器初值
        TL0=0;
        TR0=1;                           // 启动定时器T0

       
        TH1=0xfd;                   //串口初始化设置
    TL1=0xfd;
    TR1=1;                           
    SM0=0;
    SM1=1;
        REN=0;
    ES=1;

        RCAP2H=(65536-45872)/256;        //T2定时器的初始化设置
        RCAP2L=(65536-45872)%256;
        TH2=RCAP2H;
        TL2=RCAP2L;
        T2CON=0x04;       
        ET2=1;
       
               
}

/*void uart0_rx_isr() interrupt 4           //串口中断
{

RI=0;
temp_buf[temp_buf_f++]=SBUF;
if (temp_buf_f>=17)
{
   temp_buf_f=0;
}

} */          
  
void USART_Transmit( unsigned char date )        // 发送数据
{
ES=0;
SBUF=date;
while(!TI);
TI=0;
ES=1;
}

void send_data(unsigned char *buffer, unsigned char len)
{
unsigned char i=0;
for(i=0;i<len;i++)  //数据长度为包长度
{
  USART_Transmit(*buffer++);
}  
}

void shipin_init (void)                                                          //视频初始化设置
{
  send_data(dis0_temp_buf,sizeof(dis0_temp_buf));
  delayms(10);
}  



void main(void)                                                                                //主函数
{   
shipin_init();
EA=1;
T_init();
// WDT_CONTR=0x34;
P1=0xff;
//key2=1;
while(1)
{
        if(flag==1)       
         {   
            flag=0;
                delayms(2);            
                if(key1!=0)
                {
                    flag1=1;
                        delayms(20);
                        send_data(dis10_temp_buf,sizeof(dis10_temp_buf));
                        delayms(10);
                        send_data(dis11_temp_buf,sizeof(dis11_temp_buf));
                        delayms(10);
                         
                }
           if(key1==0)
                {       
                        delayms(10);
                        if (key1==0)
                         { flag1=0;
                           flag2=1;
                           flag3=0;
                           num4=0;
                           delayms(10);
                           send_data(dis7_temp_buf,sizeof(dis7_temp_buf));
                           delayms(10);
                           send_data(dis15_temp_buf,sizeof(dis15_temp_buf));
                           delayms(10);
                           send_data(dis18_temp_buf,sizeof(dis18_temp_buf));
                           delayms(10);
                          
                         }
                }
                temp=flag2+flag1;
                flag1=0;
            if (temp==2)
                {        temp=0;
                        flag3=1;
                        if(num4>=200)
                        {       
                            //delayms(1);
                                send_data(dis16_temp_buf,sizeof(dis16_temp_buf));
                                delayms(10);
                                send_data(dis17_temp_buf,sizeof(dis17_temp_buf));
                                delayms(10);
                                num4=0;
                                flag3=0;
                                flag2=0;
                        }

                }       
                if(key2!=0)
                {       
                          delayms(10);
                    //send_data(dis13_temp_buf,sizeof(dis13_temp_buf));
                        delayms(10);
                        send_data(dis14_temp_buf,sizeof(dis14_temp_buf));
                        delayms(10);

                }
            if (key2==0)
                {
                        delayms(2);
                   if (key2==0)
                         {
                           send_data(dis12_temp_buf,sizeof(dis12_temp_buf));
                         }
                }
                sprintf(dis5_temp_buf,"%.1f",num3) ;           //速度值保留一位小数
                delayms(10);
                send_data(dis4_temp_buf,sizeof(dis4_temp_buf));
            send_data(dis5_temp_buf,sizeof(dis5_temp_buf));
             send_data(dis6_temp_buf,sizeof(dis6_temp_buf));
                delayms(10);
                if(flag4==1)
                {
                        flag4=0;
                        ISP_CONTR=0x20;
                }
                delayms(100);
                  
            
         }

}          
       
}

void T2_() interrupt 5                          //定时器T2中断
{
        TF2=0;
        num1++;
        num5++;
        if(num1==10)                                  //定时1秒
        {  
           num1=0;
           flag=1;
           num=256*TH0+TL0;
           TH0=0;
           TL0=0;

           num2=(double)num/27.69;
           num3=num2;
        }          
        if(flag3==1)
        {
                num4++;
        }
        if(num5>=6000)
        {
           num5=0;
           flag4=1;
        }
}  

程序就是采集一个脉冲变量,还有两个开关量,为什么那key1开关量,在程序运行一段时间后,给1或者给0都没有变化,但是key2开关量一直都是正常的,跪求高人指点啊 。如果可以,有酬谢。
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

兰大小精灵

铜虫 (初入文坛)

【答案】应助回帖

★ ★ ★ ★ ★
感谢参与,应助指数 +1
yeyu370784: 金币+5, ★★★很有帮助 2014-03-21 13:01:48
改到别的端口试试,比如1.2,1.3或者1.4这三个端口。
2楼2014-03-04 17:27:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yeyu370784

新虫 (初入文坛)

引用回帖:
2楼: Originally posted by 兰大小精灵 at 2014-03-04 17:27:02
改到别的端口试试,比如1.2,1.3或者1.4这三个端口。

我试过p3.6,p3.7不行之后,我就改成了p1.0,p1.1,我想是这个的问题的可能性不大,您帮我看看还有没有其他的问题啊,谢谢
3楼2014-03-06 09:06:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

兰大小精灵

铜虫 (初入文坛)

引用回帖:
3楼: Originally posted by yeyu370784 at 2014-03-06 09:06:56
我试过p3.6,p3.7不行之后,我就改成了p1.0,p1.1,我想是这个的问题的可能性不大,您帮我看看还有没有其他的问题啊,谢谢...

之所你让你改端口是排除引脚的复用问题,1.0是52的tx,1.1是txen,你只之前用的两个口也有引脚的第二功能,程序既然能跑,说明功能上应该问题不大,至于失灵,大多都是别的功能影响了,该关的中断没关,该打开的功能没打开。另外这个问题你也应该去专业的单片机论坛上去问,学校和公司的差别还不小,民间单片机和电路高手都很多。
4楼2014-03-07 11:00:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 yeyu370784 的主题更新
信息提示
请填处理意见