完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
求大神看一看我的程序,为什么我按了按键让key=1了之后按理说应该进入case1里面一直显示700啊,可是为什么进去一会儿自己就又自动跑出来到case0里面去显示case0里面的内容啊,而且如果我不开串口的接收中断程序就运行正常,一旦开串口中断程序就跑到case0里面去了,万分紧急求大神不吝赐教。
#include #include #include #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; ***it xie_yi=P1^4;// ***it P13=P1^3;//附加按键确认 ***it P16=P1^6;//遥测按键 ***it 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=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; } } |
|
相关推荐
7个回答
|
|
定义mode是直接赋值1,看看还会不会进入case0,或者在进入while(1)前加一个led亮一段时间在进入while后关闭目的检测是否是哪里触发了复位
最佳答案
|
|
|
|
你串口是哪两个引脚,与key冲突没
|
|
|
|
|
|
|
|
零tot 发表于 2016-1-28 22:41 您好 我像您说的那样在while(1)前面加了一个小灯,确认他是跳出了大循环 又重新执行了,可是我没有让他跳出大循环,是怎么跳出来的呢 |
|
|
|
看一下是否是那个管脚干扰到复位了
|
|
|
|
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
690 浏览 0 评论
735 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
624 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1099 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1092 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11794 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 11:32 , Processed in 0.710475 second(s), Total 83, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号