- 打卡等级:以坛为家I
 
				- 打卡总天数:228
 
				
				
				- 最近打卡:2025-11-04 00:10:42
 
				  
管理员 
 
	- 积分
 - 20169
 
 
 
 
 | 
 
刚在地球上飘,在某个角落看到1个1周无人回答到位的问题: 
关于STC8单片机改用内部上拉电阻后每次上电按键INT0误触发1次原因探讨 
 
 
一、问题 
近日碰到个奇怪的问题:STC8单片机按键接P32脚INT0(边沿或下降沿),用外部上拉电阻本来很正常的,后来改用内部上拉4.1K电阻后,每次上电INT0误触发+1次!理应等同,已验证内部上拉电阻设置成功,已排除其他干扰,百思不得其解!决定必须一查到底! |   二、之前代码- void BOOT()                     //总初始化 最简整理221215;      (STC8G1K08)
 - {
 -     dl_ms(100);                 //上电适当延时一下好些;
 -     P1M1=P5M1=0x00, P1=P5=0xff, //P1P5口:均设双向置1;    其他默认;
 -     P3M1=0x0C;       P3 |=0xf3; //P3  口:P32按键、P33脚都是边沿中断设高阻不置1,其余双向置1;
 -     status=Kc= 0;               //初值: status工作状态标志 (开机0/待机1/复位2), Kc短按次数);
 -     G=R=b=W=0, dl_ms(1000);     //开机/复位后: 绿红蓝白灯 全亮1s灭1s;
 -     G=R=b=W=1, dl_ms(1000);     //               问题发现: 以上3行放最后面编译代码少1B;奇怪?
 -     P_SW2 |= 0x80;              //访问XSRF先BIT7=1; 统一放前无需归零(有外扩64K扩展RAM时才要);
 -     P3IE=0x0C, P1IE=0x00, P5IE=0x20; //输入只留P32、P33、P55(其余全关);
 -                                 //P55控制大灯W(用到if W==1读端口还是读引脚?先不关);
 -     P3PU=0x04;                  //使能内部上拉电阻;
 -     TMOD= 0x01;                 //T0:模式01;16位不自动重载(默认12T);消抖用的查询方式;
 -     EX0=EX1=EA =1;              //开中断;
 - }
 
 
  
[color=rgb(51, 102, 153) !important]复制代码 
[color=rgb(51, 102, 153) !important]三、措施对策 1、 先暂时软件处理-1次。可以解决。但还得追究根本原因; 
2、先后试了开中断前后加空操作或足够的延时等办法,均无效; 
3、最后,调整段落,发现将第3段代码(最后5行)改到第2段代码(中间3行)的前面后,居然就正常了(终于用内部上拉或外部上拉都完全一样了)!代码附后; 
4、但还是百思不得其解! 后面有空再继续研究,走过路过感兴趣的朋友不妨一起查查具体原因。 
      理论上:  上拉电阻用外接或内置完全等同, 只需注意先设置好后再开中断; 
      问题是:后2段代码前后调换,究竟哪里不同了?  注意到编译后代码量还会差1B; 为什么?         
四、目前代码- void BOOT()                         //总初始化 最简整理221217改;      (STC8G1K08)
 - {
 -     dl_ms(100);                      //不变;
 -     P1M1=P5M1=0x00, P1=P5=0xff,      //不变;
 -     P3M1=0x0C;       P3 |=0xf3;      //不变;
 -     P_SW2 |= 0x80;                   //;
 -     P3IE=0x0C, P1IE=0x00, P5IE=0x20; //;
 -     P3PU=0x04;                       //;
 -     TMOD= 0x01;                      //;
 -     EX0=EX1=EA =1;                   //开中断; 前4行任1条放最后面多1B;奇怪?
 -   //以上5行改放最后每次上电int0误触发1次! 但加外接上拉电阻随便几K就不会!奇怪?
 -     status=Kc= 0;                    //;
 -     G=R=b=W=0, dl_ms(1000);          //;
 -     G=R=b=W=1, dl_ms(1000);
 - }
 
 
  
复制代码 
| csdn上面也有此文,均为本人所发,暂未有人答复。 |  
  
 
 
 
 
  
 
 |   
 
 
 
 |