求大神看一看我的程序,万分紧急,希望不吝赐教,谢谢
时间:10-02
整理:3721RD
点击:
求大神看一看我的程序,为什么我按了按键让key=1了之后按理说应该进入case1里面一直显示700啊,可是为什么进去一会儿自己就又自动跑出来到case0里面去显示case0里面的内容啊,而且如果我不开串口的接收中断程序就运行正常,一旦开串口中断程序就跑到case0里面去了,万分紧急求大神不吝赐教。
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned int idata juan_jim[4]={0};//取四次18次的值
unsigned int idata chu_liw[18]={0};//直接取值所得的结果
unsigned int idata chu_liz[18]={0};//送出值后进行排序
unsigned char idata chuan_jie[4]={0};//每次送过来的后三个字节和前边一个字节
unsigned char idata biao_zhi[2]={0};//五个字节的前两个字节作为标志位
void InitUART (void);
void tong_ji_1(void);
void xian_1(void);
uchar key_scan(void);
void pai_xu(void);
void kan_zhi(void);
void zijie_wr(uint s,uint t);
uint zijie_rd(uint t);
void delay_ms(uint c);
void G_xian();
void D_xian();
void GUAN_xian();
void seg_dis();
uchar q=0,x,y,key,mode=0,z,u,flag_1,zhi,d;
uint i=0,m,f,itemp,ipos,a,lin,g;
float w,c;
sbit xie_yi=P1^4;//
sbit P13=P1^3;//附加按键确认
sbit P16=P1^6;//遥测按键
sbit P17=P1^7;//要求标定按键
void main()
{
InitUART();
while(1)
{
key=key_scan();
switch(mode)
{
case 0:
if(key==1)
{
SBUF=0XF0;
mode=1;
}
tong_ji_1();
m=g;
seg_dis();
break;
case 1:
m=700;
seg_dis();
break;
default:break;
}
}
}
void InitUART (void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收这一位中的SM2必须置为0
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xF4; // TH1: 重装值 2400 波特率 晶振 11.0592MHz
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
ES = 1; //打开串口中断
}
void UART_SER (void) interrupt 4 //串行中断服务程序
{ if(TI==1)
{
TI=0;
}
if(RI==1)
{
RI=0;
biao_zhi[u]=SBUF;
if(((biao_zhi[0])==0xff)&&((biao_zhi[1])==0xff))
{
flag_1=1;
}
u++;
if(u==2)
{
u=0;
}
if(flag_1==1)
{
chuan_jie[i]=SBUF;
i++;
}
if(i==4)
{
i=0;
flag_1=0;
kan_zhi();
}
}
}
void seg_dis()//液晶动态刷新
{
uchar va;
xian_1();
XBYTE[0XC000]=(((m%10000)/1000)<<4)|(((m%10000)%1000)/100);
va=((m%10000)%1000)%100;
XBYTE[0XA000]=((va/10)<<4)|(va%10);
}
void xian_1(void)//最高位是否显示
{
if(m>10000)
{
xie_yi=1;
}
else
{
xie_yi=0;
}
}
void delay_ms(uint c)//延时子函数
{
uchar i;
for(;c>0;c--)
for(i=0;i<255;i++);
}
uchar key_scan(void)//按键扫描子程序
{
uchar rec=0;
if(P16==0||P17==0)
{
delay_ms(10);
if(P16==0)
rec=1;
if(P17==0)
rec=2;
}
else
{
rec=3;
}
while(P16==0||P17==0);
return rec;
}
void kan_zhi(void)
{
if(((chuan_jie[1])&0x80)==0)//查看第一字节的高电平情况
{
zhi=0;
}
else if(((chuan_jie[1])&0x40)==0)
{
zhi=1;
}
else if(((chuan_jie[1])&0x20)==0)
{
zhi=2;
}
else if(((chuan_jie[1])&0x10)==0)
{
zhi=3;
}
else if(((chuan_jie[1])&0x08)==0)
{
zhi=4;
}
else if(((chuan_jie[1])&0x04)==0)
{
zhi=5;
}
else if(((chuan_jie[1])&0x02)==0)
{
zhi=6;
}
else if(((chuan_jie[1])&0x01)==0)
{
zhi=7;
}
else
{
zhi=4;
}
chu_liw[q]=(zhi+((chuan_jie[2])+(chuan_jie[3])*256)*8);//对采集的数值进行还原
q++;
}
void tong_ji_1(void)//处理串口来的三组数据
{
if(q==18)
{
for(z=0;z<18;z++)//送临时值给终极变量
{
chu_liz[z]=chu_liw[z];
}
for(x=0;x<17;x++)//对接收到来的12组数据进行排序处理,剔除最大四组与最小四组
{
itemp=chu_liz[x];
ipos=i;
for(y=x+1;y<18;y++)
{
if(chu_liz[y]<itemp)
{
itemp=chu_liz[y];
ipos=y;
}
}
chu_liz[ipos]=chu_liz[x];
chu_liz[x]=itemp;
}
w=chu_liz[5]+chu_liz[6]+chu_liz[7]+chu_liz[8]+chu_liz[9]+chu_liz[10]+chu_liz[11]+chu_liz[12];//取排序后的存储值
c=w/2;
juan_jim[d]=(int)c;
d++;
if(d==4)
{
d=0;
}
g=(juan_jim[0]+juan_jim[1]+juan_jim[2]+juan_jim[3])/4;//取72次均值
q=0;
}
}
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned int idata juan_jim[4]={0};//取四次18次的值
unsigned int idata chu_liw[18]={0};//直接取值所得的结果
unsigned int idata chu_liz[18]={0};//送出值后进行排序
unsigned char idata chuan_jie[4]={0};//每次送过来的后三个字节和前边一个字节
unsigned char idata biao_zhi[2]={0};//五个字节的前两个字节作为标志位
void InitUART (void);
void tong_ji_1(void);
void xian_1(void);
uchar key_scan(void);
void pai_xu(void);
void kan_zhi(void);
void zijie_wr(uint s,uint t);
uint zijie_rd(uint t);
void delay_ms(uint c);
void G_xian();
void D_xian();
void GUAN_xian();
void seg_dis();
uchar q=0,x,y,key,mode=0,z,u,flag_1,zhi,d;
uint i=0,m,f,itemp,ipos,a,lin,g;
float w,c;
sbit xie_yi=P1^4;//
sbit P13=P1^3;//附加按键确认
sbit P16=P1^6;//遥测按键
sbit P17=P1^7;//要求标定按键
void main()
{
InitUART();
while(1)
{
key=key_scan();
switch(mode)
{
case 0:
if(key==1)
{
SBUF=0XF0;
mode=1;
}
tong_ji_1();
m=g;
seg_dis();
break;
case 1:
m=700;
seg_dis();
break;
default:break;
}
}
}
void InitUART (void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收这一位中的SM2必须置为0
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xF4; // TH1: 重装值 2400 波特率 晶振 11.0592MHz
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
ES = 1; //打开串口中断
}
void UART_SER (void) interrupt 4 //串行中断服务程序
{ if(TI==1)
{
TI=0;
}
if(RI==1)
{
RI=0;
biao_zhi[u]=SBUF;
if(((biao_zhi[0])==0xff)&&((biao_zhi[1])==0xff))
{
flag_1=1;
}
u++;
if(u==2)
{
u=0;
}
if(flag_1==1)
{
chuan_jie[i]=SBUF;
i++;
}
if(i==4)
{
i=0;
flag_1=0;
kan_zhi();
}
}
}
void seg_dis()//液晶动态刷新
{
uchar va;
xian_1();
XBYTE[0XC000]=(((m%10000)/1000)<<4)|(((m%10000)%1000)/100);
va=((m%10000)%1000)%100;
XBYTE[0XA000]=((va/10)<<4)|(va%10);
}
void xian_1(void)//最高位是否显示
{
if(m>10000)
{
xie_yi=1;
}
else
{
xie_yi=0;
}
}
void delay_ms(uint c)//延时子函数
{
uchar i;
for(;c>0;c--)
for(i=0;i<255;i++);
}
uchar key_scan(void)//按键扫描子程序
{
uchar rec=0;
if(P16==0||P17==0)
{
delay_ms(10);
if(P16==0)
rec=1;
if(P17==0)
rec=2;
}
else
{
rec=3;
}
while(P16==0||P17==0);
return rec;
}
void kan_zhi(void)
{
if(((chuan_jie[1])&0x80)==0)//查看第一字节的高电平情况
{
zhi=0;
}
else if(((chuan_jie[1])&0x40)==0)
{
zhi=1;
}
else if(((chuan_jie[1])&0x20)==0)
{
zhi=2;
}
else if(((chuan_jie[1])&0x10)==0)
{
zhi=3;
}
else if(((chuan_jie[1])&0x08)==0)
{
zhi=4;
}
else if(((chuan_jie[1])&0x04)==0)
{
zhi=5;
}
else if(((chuan_jie[1])&0x02)==0)
{
zhi=6;
}
else if(((chuan_jie[1])&0x01)==0)
{
zhi=7;
}
else
{
zhi=4;
}
chu_liw[q]=(zhi+((chuan_jie[2])+(chuan_jie[3])*256)*8);//对采集的数值进行还原
q++;
}
void tong_ji_1(void)//处理串口来的三组数据
{
if(q==18)
{
for(z=0;z<18;z++)//送临时值给终极变量
{
chu_liz[z]=chu_liw[z];
}
for(x=0;x<17;x++)//对接收到来的12组数据进行排序处理,剔除最大四组与最小四组
{
itemp=chu_liz[x];
ipos=i;
for(y=x+1;y<18;y++)
{
if(chu_liz[y]<itemp)
{
itemp=chu_liz[y];
ipos=y;
}
}
chu_liz[ipos]=chu_liz[x];
chu_liz[x]=itemp;
}
w=chu_liz[5]+chu_liz[6]+chu_liz[7]+chu_liz[8]+chu_liz[9]+chu_liz[10]+chu_liz[11]+chu_liz[12];//取排序后的存储值
c=w/2;
juan_jim[d]=(int)c;
d++;
if(d==4)
{
d=0;
}
g=(juan_jim[0]+juan_jim[1]+juan_jim[2]+juan_jim[3])/4;//取72次均值
q=0;
}
}
定义mode是直接赋值1,看看还会不会进入case0,或者在进入while(1)前加一个led亮一段时间在进入while后关闭目的检测是否是哪里触发了复位
你串口是哪两个引脚,与key冲突没
没有冲突 按键用的是1.6和1.7
您好 我像您说的那样在while(1)前面加了一个小灯,确认他是跳出了大循环 又重新执行了,可是我没有让他跳出大循环,是怎么跳出来的呢
看一下是否是那个管脚干扰到复位了
问题解决了,不过还要谢谢您一直帮我解决问题
解决就好小事情,互帮互助