6354|6

3

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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

#include         // 89C52单片机头文件
#include         
#include
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]={"
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]={"
idata unsigned  char dis11_temp_buf[9]={"KG常#"};
idata unsigned  char dis12_temp_buf[11]={"LF故障#"};
idata unsigned  char dis13_temp_buf[10]={"
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]={"
idata unsigned  char dis18_temp_buf[5]={"



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
{
  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开关量一直都是正常的,跪求高人指点啊 。如果可以,有酬谢。
此帖出自51单片机论坛

最新回复

那你检查一下你ttl电平低电平持续的时间吧,你程序有一堆软件延时,如果低电平持续时间不足,检查不到是很正常的  详情 回复 发表于 2014-3-11 09:24
点赞 关注
 

回复
举报

13

帖子

0

TA的资源

一粒金砂(中级)

推荐
 
那你检查一下你ttl电平低电平持续的时间吧,你程序有一堆软件延时,如果低电平持续时间不足,检查不到是很正常的
此帖出自51单片机论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
没看明白的说!什么叫不灵敏?
此帖出自51单片机论坛

点评

程序开始还行,执行一段时间没问题,这个时间可能是十几分钟,也可能是1个多小时,可是后面他就不灵敏了,我在KEY1为低电平时,他有时候能够执行if(key1==0)后面的语句,有时候不能执行if(key1==0)后面的语句。  详情 回复 发表于 2014-3-11 09:07
 
个人签名51嵌入式,嵌入式开发的家园!51嵌入式官方QQ群52497844,欢迎爱好者加入。
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
最好在读key前,将端口置1(上拉),防止之前端口被意外修改.
测量下key1电平是否在按键按下和释放有0到1的变化.
此帖出自51单片机论坛

点评

我的程序是500ms执行一次,每次都要制1吗?我的key1是外接的一个TTL的信号,平时为高电平,等有报警时为低电平,我就是要采集到低电平,然后发从“报警”两个字。还望您给看看,谢谢  详情 回复 发表于 2014-3-11 09:11
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

4
 
Hugo801122 发表于 2014-3-11 01:10
没看明白的说!什么叫不灵敏?

程序开始还行,执行一段时间没问题,这个时间可能是十几分钟,也可能是1个多小时,可是后面他就不灵敏了,我在KEY1为低电平时,他有时候能够执行if(key1==0)后面的语句,有时候不能执行if(key1==0)后面的语句。还望帮忙看看,谢谢啊
此帖出自51单片机论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

5
 
cd666 发表于 2014-3-11 08:36
最好在读key前,将端口置1(上拉),防止之前端口被意外修改.
测量下key1电平是否在按键按下和释放有0到1的变 ...

我的程序是500ms执行一次,每次都要制1吗?我的key1是外接的一个TTL的信号,平时为高电平,等有报警时为低电平,我就是要采集到低电平,然后发从“报警”两个字。还望您给看看,谢谢
此帖出自51单片机论坛
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

6
 
那你检查一下你ttl电平低电平持续的时间吧,你程序有一堆软件延时,如果低电平持续时间不足,检查不到是很正常的
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表