微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求大神看一看我的程序,万分紧急,希望不吝赐教,谢谢

求大神看一看我的程序,万分紧急,希望不吝赐教,谢谢

时间: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;
                }
}











定义mode是直接赋值1,看看还会不会进入case0,或者在进入while(1)前加一个led亮一段时间在进入while后关闭目的检测是否是哪里触发了复位

你串口是哪两个引脚,与key冲突没

没有冲突    按键用的是1.6和1.7

您好   我像您说的那样在while(1)前面加了一个小灯,确认他是跳出了大循环 又重新执行了,可是我没有让他跳出大循环,是怎么跳出来的呢

看一下是否是那个管脚干扰到复位了

问题解决了,不过还要谢谢您一直帮我解决问题

解决就好小事情,互帮互助

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top