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

2019-03-24 18:27发布

#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开关量一直都是正常的,跪求高人指点啊 。如果可以,有酬谢。
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
cd666
1楼-- · 2019-03-25 01:15
那你检查一下你ttl电平低电平持续的时间吧,你程序有一堆软件延时,如果低电平持续时间不足,检查不到是很正常的
Hugo801122
2楼-- · 2019-03-25 07:14
 精彩回答 2  元偷偷看……
cd666
3楼-- · 2019-03-25 12:36
最好在读key前,将端口置1(上拉),防止之前端口被意外修改.
测量下key1电平是否在按键按下和释放有0到1的变化.
yeyu370784
4楼-- · 2019-03-25 13:46
Hugo801122 发表于 2014-3-11 01:10
没看明白的说!什么叫不灵敏?

程序开始还行,执行一段时间没问题,这个时间可能是十几分钟,也可能是1个多小时,可是后面他就不灵敏了,我在KEY1为低电平时,他有时候能够执行if(key1==0)后面的语句,有时候不能执行if(key1==0)后面的语句。还望帮忙看看,谢谢啊
yeyu370784
5楼-- · 2019-03-25 16:47
 精彩回答 2  元偷偷看……
cd666
6楼-- · 2019-03-25 17:17
那你检查一下你ttl电平低电平持续的时间吧,你程序有一堆软件延时,如果低电平持续时间不足,检查不到是很正常的

一周热门 更多>