#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开关量一直都是正常的,跪求高人指点啊 。如果可以,有酬谢。
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
测量下key1电平是否在按键按下和释放有0到1的变化.
程序开始还行,执行一段时间没问题,这个时间可能是十几分钟,也可能是1个多小时,可是后面他就不灵敏了,我在KEY1为低电平时,他有时候能够执行if(key1==0)后面的语句,有时候不能执行if(key1==0)后面的语句。还望帮忙看看,谢谢啊
一周热门 更多>