找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3422|回复: 35
收起左侧

关于STC8单片机改用内部上拉电阻后每次上电按键INT0误触发1次原因探讨

  [复制链接]
ID:975054 发表于 2022-12-20 22:56 | 显示全部楼层 |阅读模式
一、问题
近日碰到个奇怪的问题:STC8单片机按键接P32脚INT0(边沿或下降沿),用外部上拉电阻本来很正常的,后来改用内部上拉4.1K电阻后,每次上电INT0误触发+1次!理应等同,已验证内部上拉电阻设置成功,已排除其他干扰,百思不得其解!决定必须一查到底!
二、之前代码
  1. void BOOT()                     //总初始化 最简整理221215;      (STC8G1K08)        
  2. {                                                         
  3.     dl_ms(100);                 //上电适当延时一下好些;
  4.     P1M1=P5M1=0x00, P1=P5=0xff, //P1P5口:均设双向置1;    其他默认;   
  5.     P3M1=0x0C;       P3 |=0xf3; //P3  口:P32按键、P33脚都是边沿中断设高阻不置1,其余双向置1;   
  6.    
  7.     status=Kc= 0;               //初值: status工作状态标志 (开机0/待机1/复位2), Kc短按次数);           
  8.     G=R=b=W=0, dl_ms(1000);     //开机/复位后: 绿红蓝白灯 全亮1s灭1s;
  9.     G=R=b=W=1, dl_ms(1000);     //               问题发现: 以上3行放最后面编译代码少1B;奇怪?   

  10.     P_SW2 |= 0x80;              //访问XSRF先BIT7=1; 统一放前无需归零(有外扩64K扩展RAM时才要);   
  11.     P3IE=0x0C, P1IE=0x00, P5IE=0x20; //输入只留P32、P33、P55(其余全关);
  12.                                 //P55控制大灯W(用到if W==1读端口还是读引脚?先不关);
  13.     P3PU=0x04;                  //使能内部上拉电阻;
  14.     TMOD= 0x01;                 //T0:模式01;16位不自动重载(默认12T);消抖用的查询方式;
  15.     EX0=EX1=EA =1;              //开中断;
  16.                               
  17. }
复制代码
三、措施对策
1、 先暂时软件处理-1次。可以解决。但还得追究根本原因;
2、先后试了开中断前后加空操作或足够的延时等办法,均无效;
3、最后,调整段落,发现将第3段代码(最后5行)改到第2段代码(中间3行)的前面后,居然就正常了(终于用内部上拉或外部上拉都完全一样了)!代码附后;
4、但还是百思不得其解! 后面有空再继续研究,走过路过感兴趣的朋友不妨一起查查具体原因。
      理论上:  上拉电阻用外接或内置完全等同, 只需注意先设置好后再开中断;
      问题是:后2段代码前后调换,究竟哪里不同了?  注意到编译后代码量还会差1B; 为什么?        
四、目前代码
  1. void BOOT()                         //总初始化 最简整理221217改;      (STC8G1K08)        
  2. {                                                         
  3.     dl_ms(100);                      //不变;
  4.     P1M1=P5M1=0x00, P1=P5=0xff,      //不变;   
  5.     P3M1=0x0C;       P3 |=0xf3;      //不变;   

  6.     P_SW2 |= 0x80;                   //;
  7.     P3IE=0x0C, P1IE=0x00, P5IE=0x20; //;
  8.     P3PU=0x04;                       //;
  9.     TMOD= 0x01;                      //;
  10.     EX0=EX1=EA =1;                   //开中断; 前4行任1条放最后面多1B;奇怪?  
  11.   //以上5行改放最后每次上电int0误触发1次! 但加外接上拉电阻随便几K就不会!奇怪?
  12.    
  13.     status=Kc= 0;                    //;           
  14.     G=R=b=W=0, dl_ms(1000);          //;
  15.     G=R=b=W=1, dl_ms(1000);
  16. }
复制代码






回复

使用道具 举报

ID:975054 发表于 2022-12-21 11:24 | 显示全部楼层
csdn上面也有此文,均为本人所发,暂未有人答复。
回复

使用道具 举报

ID:624769 发表于 2022-12-21 16:07 来自手机 | 显示全部楼层
要先开上拉,再清 IE0,IE1, 最后, 再开中断。
回复

使用道具 举报

ID:1034262 发表于 2022-12-21 16:51 | 显示全部楼层
上电时INT0已经检测到一次上升沿,所以你一允许外部中断,立刻进去中断。
正确的初始化应该是:每次允许外部中断前,设置中断方式,清除外部中断标志,加3个NOP,然后允许外部中断。
原则上,其余的中断我都会先清除中断标志再允许,比如定时器,如果溢出过,则溢出标志会置1,一旦允许定时器中断,则马上就进去中断了,所以要先清除中断标志。
回复

使用道具 举报

ID:213173 发表于 2022-12-21 21:16 | 显示全部楼层
代码书写不规范所致。
回复

使用道具 举报

ID:401564 发表于 2022-12-21 21:38 | 显示全部楼层
代码一段一段的,也不知道你要干嘛
P3端口要读取外部电平,必需 P3 = 0xff 51hei截图20221221213728.png

也就是说,你之前的程序并不对,只是误打误撞而已
回复

使用道具 举报

ID:879348 发表于 2022-12-22 08:51 | 显示全部楼层
不用探讨,任何外部中断开启前都要清理标记位

评分

参与人数 1黑币 +15 收起 理由
ax6808 + 15 彻底解决问题的稻草!

查看全部评分

回复

使用道具 举报

ID:975054 发表于 2022-12-25 12:02 | 显示全部楼层
188610329 发表于 2022-12-21 16:07
要先开上拉,再清 IE0,IE1, 最后, 再开中断。

收到,谢谢! 近日全羊在家休息,能量恢复中...   
其实就1段5行代码,其他用上电复位值(如默认采用边沿中断IT0=IT2=0等):
    P_SW2 |= 0x80;                               //必须放前面的,访问XSRF先BIT7=1;
    P3IE=0x0C, P1IE=0x00, P5IE=0x20;  //输入允许设置(省电考虑的事情,只留P32等3个脚,写成一行而已);
    P3PU=0x04;                                    //使能P32上拉;
    TMOD= 0x01;                                 //T0:设模式01,消抖用;
    EX0=EX1=EA =1;                           //最后开中断; 写成1行而已;
                                                         //其他都是默认上电复位值(如边沿中断IT0=IT2=0等)
回复

使用道具 举报

ID:975054 发表于 2022-12-25 12:11 | 显示全部楼层
coody_sz 发表于 2022-12-21 16:51
上电时INT0已经检测到一次上升沿,所以你一允许外部中断,立刻进去中断。
正确的初始化应该是:每次允许外 ...

收到,谢谢指导!
分析的有道理! 因只涉及到上电或软复位,而我只用了复位后已有的默认值,可能偷工减料了!
回复

使用道具 举报

ID:975054 发表于 2022-12-25 12:18 | 显示全部楼层
wulin 发表于 2022-12-21 21:16
代码书写不规范所致。

感谢总工指导!  
近期我在代码整理中,确实大量使用了简写连写等,不过已尽量完善注释:
1、一行中好几条同类代码的连写;
2、甚至用;代替NOP等等;
3、大量使用了默认复位值;
回复

使用道具 举报

ID:975054 发表于 2022-12-25 13:01 | 显示全部楼层
本帖最后由 ax6808 于 2022-12-25 15:27 编辑
Y_G_G 发表于 2022-12-21 21:38
代码一段一段的,也不知道你要干嘛
P3端口要读取外部电平,必需 P3 = 0xff

感谢总工指导!近日全羊在家休息研究暂停了几天;
1.  其实代码功能很简单:主要就是想好好利用边沿中断(INT0/P32判断按键长短按,用INT1/P33判断充电状态);其他就好说了,都是陪衬;
2.  其实关键就2行:
    P3M1=0x0C;  P3 |=0xf3; //P3口:P32、P33都默认边沿中断,设高阻不置1,其余双向置1;
                                        // P3口要读外部电平,必需P3=0xff : P3 |=0xf3: 其实都可省掉,反正复位都是1;
    P3PU=0x04;                  //使能内部上拉电阻;
   说明:I/O口设置:P32按键脚采用内部上拉电阻省个外接电阻,可设双向或高阻,最后统一设成高阻了;
                          P33脚平时未充电已外部拉低,充电:上升沿+外部电平检测,设高阻省电,拔电:下降沿+电平实时判断;
3.  之前的程序并不对,只是误打误撞而已: 我也怀疑多处使用了上电复位值等,可能真是误打误撞;
4.等感冒完全恢复了,我再一条条试试;
回复

使用道具 举报

ID:975054 发表于 2022-12-25 13:05 | 显示全部楼层
wufa1986 发表于 2022-12-22 08:51
不用探讨,任何外部中断开启前都要清理标记位

感谢指导!
任何外部中断开启前都要清理标记位? 我暂时是尽量使用的上电复位值,及硬件自动置位或清0,有空我再试试...
回复

使用道具 举报

ID:975054 发表于 2022-12-25 13:13 | 显示全部楼层
wufa1986 发表于 2022-12-22 08:51
不用探讨,任何外部中断开启前都要清理标记位

外部中断0的中断标志位必须由(硬件) 清零。
回复

使用道具 举报

ID:975054 发表于 2022-12-25 13:15 | 显示全部楼层
  1. void INT0() interrupt 0              //INT0:长短按: 改边沿触发+20msT0消抖+电平检测; 理论上:按键检测用边沿触发+定时消抖最可靠;                                                                                                
  2. {                                                                                          //关键:短按一般0.1~0.3s,弹起很快;
  3.     TH0=TL0=0xB8, TR0=1;             //消抖: 20ms(B8实20.2),每次跳变抖动都重新计时;
  4.     while(!TF0) ; TF0=0;             //查询: 一直等TF0=1才往下执行,注意用;号;查询方式要清0; 双沿EA=0没必要;
  5.     if(key==1) {Kc++, Kc=Kc%6;}      //短按: 上升沿有效; 弹起20ms即可切换1次彩灯:6次循环; Kc=Kc%6等效if(Kc>=6) Kc=0;         
  6.     else                                         //长按: 下降沿有效; 短按一般0.1~0.3s,超过为长按,弹起很快;
  7.    { dl_ms( 480);                                 //      按下0.3-0.5s仍未弹起赶紧执行长按代码(不然总体太慢);
  8.      if(key==0)                             //           未弹起(再处理大白灯和待机):
  9.     {dl_ms(1000);                                 //           再延时1s,总1.5s;
  10.      if(key==0)   W=!W;              //白灯: 长按1.5s则:白灯开/关; Kc要-1;                    
  11.      dl_ms(1000);                                 //           再延时1s,总2.5s;
  12.      if(key==1)   Kc--;                       //           按下1.5-2s期间已经弹起, Kc先-1;
  13.       else                                         //复位: 按下1.5-2s期间仍未弹起, 则准备处理复位;
  14.      {dl_ms(500), W=!W;              //           先延时0.5s,总3s;白灯闪1次再准备进复位,方便观察;效果很好!
  15.              dl_ms(100), status=2;                 //           长按超3s则:复位;状态标志2(开机0/待机1/复位2); ok!很好!
  16.    }}}                                          //效果: 改双沿后短按迅速(之前等0.5秒), 无需开关中断防干扰;
  17. }

  18. void INT1() interrupt 2            //INT1:充电监控: 边沿触发+20msT0消抖+电平检测;主要实时唤醒掉电状态; 1212;
  19. {                                          //理论: 本监控电路其实只用中断+20ms软件消抖也可靠,暂统一用边沿触发+定时消抖好了;
  20.     TH0=TL0=0xB8, TR0=1;             //消抖: 20ms(实20.2),每次跳变抖动都重新计时;
  21.     while(!TF0) ; TF0=0;             //查询: 一直等到TF0=1才往下执行,注意;号; 查询方式要清0; EA=0防干扰没必要;
  22. }
复制代码


回复

使用道具 举报

ID:975054 发表于 2022-12-25 13:19 | 显示全部楼层
前面补充上传了长短按及充电状态监控中断服务代码, 最后都回主函数主循环处理(较简单,未贴出代码)
目前总体代码运行还是很稳定的.P32长短按功能手感也很好.
回复

使用道具 举报

ID:401564 发表于 2022-12-25 14:23 | 显示全部楼层
ax6808 发表于 2022-12-25 13:19
前面补充上传了长短按及充电状态监控中断服务代码, 最后都回主函数主循环处理(较简单,未贴出代码)
目前总 ...

这种程序,最好是上传工程文件,想必也不是什么商业机密
人家有条件的,可以直接下载打开
代码不全,很难看明白的,虽说都是C,但是,每个人编程的思维是不一样的

评分

参与人数 1黑币 +5 收起 理由
ax6808 + 5

查看全部评分

回复

使用道具 举报

ID:1034262 发表于 2022-12-25 14:24 | 显示全部楼层
ax6808 发表于 2022-12-25 13:13
外部中断0的中断标志位必须由(硬件) 清零。

外部中断0的中断标志位,在进入中断时会自动清零。但是如果没允许INT0中断,则开中断前,要手动清零。

评分

参与人数 1黑币 +7 收起 理由
ax6808 + 7

查看全部评分

回复

使用道具 举报

ID:975054 发表于 2022-12-25 22:32 来自手机 | 显示全部楼层
Y_G_G 发表于 2022-12-25 14:23
这种程序,最好是上传工程文件,想必也不是什么商业机密
人家有条件的,可以直接下载打开
代码不全,很难看 ...

感谢批评指正!老射频工程师,才搞嵌入式一年多,个人经验不足,有些基本功能还在逐步探索应用中,没有任何商业秘密可言…
这个问题:是本人用内置上拉电阻替换外部上拉电阻的反复拷机试验中才发现的,千真万确存在的一个莫名其妙问题!几乎与设置无关,只与上电期间某些机理有关。
等我感冒恢复了,会继续查下去……
回复

使用道具 举报

ID:975054 发表于 2022-12-25 22:36 来自手机 | 显示全部楼层
统一回复:感谢大家出谋献策!等我感冒好利索了,会继续进行各种对比试验!务必查出本案内/外部上拉电阻效果就是不同的根本原因!究竟
回复

使用道具 举报

ID:401564 发表于 2022-12-26 22:50 | 显示全部楼层
ax6808 发表于 2022-12-25 22:32
感谢批评指正!老射频工程师,才搞嵌入式一年多,个人经验不足,有些基本功能还在逐步探索应用中,没有任 ...

我并没有非常认真的看你的程序,只是大概的看了一下
但我还是认为:很多时候,问题出在人身上,或者是说单片机本身就是这个特性,你只是"自我的"觉得它不正常而已
STC虽说不是ST这样的大公司,但上拉这种小问题肯定是不会有的,而且,STC也是一直在进步的
所以,更多的把精力放在自身的问题上,不要想着单片机有什么问题

评分

参与人数 1黑币 +5 收起 理由
ax6808 + 5

查看全部评分

回复

使用道具 举报

ID:77589 发表于 2022-12-27 11:14 | 显示全部楼层
兄弟,这个问题不是秃子头上的虱子吗?
外部上拉,只要系统供电正常,P32就马上拉成高电平,不管你MCU是否工作。
如果是内部上拉呢?必须要等MCU正常启动后(最起码要系统时钟正常稳定后),运行代码去配置P32内部上拉。在你的程序还没有执行到配置P32内部上拉的时候,P32就响应了一次外中断。

所以,外部上拉还是靠谱的多。如果要坚持使用内部上拉,估计得调整代码,先让程序配置P32内部上拉,稳定后,再开启外中断。
回复

使用道具 举报

ID:1042619 发表于 2022-12-27 15:05 | 显示全部楼层
       这种小问题,您应该去他们新官网下载个正规的新资料看下 I/O 部分,不就懂了1 现在的MCU太快,外部上拉,是MCU 正式开跑之前,外部已被拉高;外部无上拉,程序开跑时,你才打开内部上拉,你要等1段时间,外部才被拉高,现在是高速数字电路的时代
      如有问题您@我头像

回复

使用道具 举报

ID:1042619 发表于 2022-12-27 15:12 | 显示全部楼层
不是误触发,是 MCU 太快
这种小问题,看下 I/O 部分,不就懂了, 现在的MCU 太快  !
外部上拉,是MCU 正式开跑之前,外部已被拉高;
外部无上拉,程序开跑时,你才打开内部上拉,你要等1段时间,外部才会被拉高到2V以上,
===你程序要加延时!!!
STC8/STC32G系列是高速MCU 时代

评分

参与人数 1黑币 +9 收起 理由
ax6808 + 9 感谢支持和鼓励!

查看全部评分

回复

使用道具 举报

ID:975054 发表于 2022-12-28 00:40 | 显示全部楼层
wufa1986 发表于 2022-12-22 08:51
不用探讨,任何外部中断开启前都要清理标记位

统一回复:
拜读查阅了大量案例, 结论:
1. 确实"不用探讨,任何外部中断开启前都要清理标志位"才可靠! 本案我反复测试在EX0=EX1=EA =1前加上IE0=0就ok了(IE1=0可加可不加,无影响,是P33充电检测脚,平时已拉低);
2. 外接上拉电阻和内置上拉电阻正常运行时完全一样,但注意在刚上电或软复位或刚设置上拉未稳定期间一定有所不同,需要以自行测试结果为准,无需大惊小怪;
    例如本案:若开中断前未清理IE0标志位,不管我怎么弄,开机后状态两者就是不同,我不再继续钻牛角尖了,解决了就好!
3.其他: 因我这次的按键P32及串口P30和P31还想复用兼容软件复位进入模拟USB下载等等,所以又好好学习了一下最新版手册;
      附:   STC8最新版手册又增加了一些新的说明(特别是第4-5条,呵呵,学无止境):
  关于 I/O 的注意事项:
  1、 P3.0 和 P3.1 口上电后的状态为弱上拉双向口模式
  2、 除 P3.0 和 P3.1 外,其余所有 IO 口上电后的状态均为高阻输入状态,用户在使用 IO 口
前必须先设置 IO 口模式
  3、 芯片上电时如果不需要使用 USB 进行 ISP 下载, P3.0/P3.1/P3.2 这 3 个 I/O 口不能同时
为低电平,否则会进入 USB 下载模式而无法运行用户代码
  4、 芯片上电时,若 P3.0 和 P3.1 同时为低电平, P3.2 口会短时间由高阻输入状态切换到双
向口模式,用以读取 P3.2 口外部状态来判断是否需要进入 USB 下载模式
  5、 当使用 P5.4 当作复位脚时,这个端口内部的 4K 上拉电阻会一直打开; 但 P5.4 做普通
I/O 口时,基于这个 I/O 口与复位脚共享管脚的特殊考量, 端口内部的 4K 上拉电阻依
然会打开大约 6.5 毫秒时间,再自动关闭( 当用户的电路设计需要使用 P5.4 口驱动外
部电路时,请务必考虑上电瞬间会有 6.5 毫秒时间的高电平的问题)
回复

使用道具 举报

ID:975054 发表于 2022-12-28 00:58 | 显示全部楼层
统一补充回复: 目前:
1.  反正用“四、目前代码”: 开中断前无需清0,  用内置电阻就很正常,跟用外部上拉一模一样;
2.  反正用“二、之前代码“: 开中断前必须清0,  用内置电阻就很正常,跟用外部上拉一模一样;
    若不先清0:无论我怎么处理内置上拉电阻,如前后延迟1秒或几秒,都会误触发1次,而外接上拉就永远不会;
3.  情况就是这么个情况,呵呵呵! 谢谢大家一起研究!
回复

使用道具 举报

ID:975054 发表于 2022-12-28 01:09 | 显示全部楼层
Y_G_G 发表于 2022-12-26 22:50
我并没有非常认真的看你的程序,只是大概的看了一下
但我还是认为:很多时候,问题出在人身上,或者是说单片 ...

嗯!有道理! 我91年毕业后在某通信研究所专业从事射频空间抗干扰研究多年,对某些干扰类机理比较敏感;学无止境,喜欢STC!
回复

使用道具 举报

ID:383215 发表于 2022-12-28 15:19 | 显示全部楼层
我的一些程序,经常在STC和AVR之间移植过来移植过去,就发现STC单片机只要把端口设置为推挽输出,端口立即就是高电平,假如这个端口驱动继电器,继电器就吸合,即使后面加一句这个端口=0,也不行,每次上电继电器都会“喀嗒”一声,AVR单片机就没有这个问题,我立即就知道这是因为51内核上电之后的端口为高,所以我在端口设置为推挽输出之前加一句这个端口=0,之后再设置为推挽输出,继电器就不会吸合了。说具体点,传统51单片机上电复位期间端口为高电平,STC单片机上电复位期间端口为高阻高电平,而AVR单片机上电复位期间端口为高阻低电平,所以AVR单片机就不存在这个问题。
楼主发现“每次上电按键INT0误触发1次”和我发现的每次上电继电器都会“喀嗒”一声可能是一样的原因,这个原因就是STC单片机自身的原因,和自己的编程没有关系,STC单片机把51架构玩成一朵花,你就得把这些怪异的问题用代码解决。楼上有人说“更多的把精力放在自身的问题上,不要想着单片机有什么问题”,这个就是单片机自身的问题。我多次说过,至少要学会两种以上单片机,互相对比编程,比只学一种单片机学到的东西更多更实在,只会一种单片机,有的问题百思不得其解。假如楼主用AVR单片机编程,“每次上电按键INT0误触发1次”这个问题可能并不存在。我并不是说AVR单片机比STC单片机好,目前来看,AVR单片机除了抗干扰略比STC强一点,其它优势不值一提,最大问题是AVR单片机价格太高了,我已经放弃AVR单片机,用STC8H1K08替换ATMEG8,试验已经成功。
回复

使用道具 举报

ID:401564 发表于 2022-12-29 19:52 | 显示全部楼层
kmsj 发表于 2022-12-28 15:19
我的一些程序,经常在STC和AVR之间移植过来移植过去,就发现STC单片机只要把端口设置为推挽输出,端口立即 ...

个人玩的东西,我还是很喜欢STC的单片机的,当然,就功能而言,还是更喜欢STM32,用STM32很多时候压根就用考虑内存,浮点数据运算速度之类的
但做产品的话,基本上没用过STC做产品,没什么优势可言,毕竟低到3毛的STC单片机是没有的,人家OTP型单片机3毛钱就能有几路12位的ADC......
回复

使用道具 举报

ID:1059700 发表于 2022-12-29 22:29 | 显示全部楼层
代码书写的逻辑问题。
回复

使用道具 举报

ID:1034262 发表于 2022-12-31 17:36 | 显示全部楼层
kmsj 发表于 2022-12-28 15:19
我的一些程序,经常在STC和AVR之间移植过来移植过去,就发现STC单片机只要把端口设置为推挽输出,端口立即 ...

那是因为你不熟悉51架构造成的。51架构的MCU出现与上世纪80年代初,复位后准双向口输出高电平,后来的8086、8098、80186都是类似的。
STC8系列的改为上电为高阻,不会再出现你所说的问题。而AVR上电后也是高阻。
先输出低电平,再设置为推挽输出。
回复

使用道具 举报

ID:383215 发表于 2022-12-31 22:03 | 显示全部楼层
Y_G_G 发表于 2022-12-29 19:52
个人玩的东西,我还是很喜欢STC的单片机的,当然,就功能而言,还是更喜欢STM32,用STM32很多时候压根就用考虑 ...

对于我而言,一块多钱的STC8H1K08我非常满意,之前ATMEGA8只用了1兆的内部RC振荡器,移植程序到STC8H1K08也只用了1兆的内部RC振荡器,后来发现,有的STC8H1K08无法使用1兆的内部RC振荡器,就被迫把内部RC振荡器提高到1.2兆,至于STM32,我只学习到流水灯就没有学下去了,一块多钱的STC8H1K08能做到的事情,我为什么要用七、八块钱甚至十几块钱的STM32?至于那些几毛钱的单片机,目前我用不上,有个老朋友的一个老产品要是可以上量的话,我可能会考虑几毛钱的单片机,但是,那个产品上量的可能性几乎为零。

评分

参与人数 1黑币 +5 收起 理由
ax6808 + 5

查看全部评分

回复

使用道具 举报

ID:383215 发表于 2022-12-31 22:31 | 显示全部楼层
coody_sz 发表于 2022-12-31 17:36
那是因为你不熟悉51架构造成的。51架构的MCU出现与上世纪80年代初,复位后准双向口输出高电平,后来的808 ...

我为什么一定要熟悉51架构?我学单片机是从48单片机开始的,传统51单片机的代表芯片是8031,你知道48单片机的代表芯片是什么吗?我只知道51单片机是48单片机的改进型单片机,还真不知道什么是51架构,我觉得我学单片机对我提高最大的就是48单片机,而且是本子京三制作所用48单片机制造的一个老设备,从这个48单片机的老设备我悟出了步骤式编程和CPU应用率编程,并且应用到51、430、AVR、STM32,经过20多年的总结,我可以让我的程序占用CPU时间最短,我可以让我的程序运行速度有的可以提高10倍以上。我为楼主回答的问题,是告诉楼主,没有什么墨守成规的编程方法,多学几种单片机就很容易发现不同单片机正确的编程方法。不过话又说回来,单片机编程只是我的业余爱好,懂不懂51架构对我编程没有什么影响。
回复

使用道具 举报

ID:975054 发表于 2023-1-1 22:10 | 显示全部楼层
嗯!大家新年快乐!
可笑的三年!刚好有个小设备没人愿意做我就顶上去了,没想到让我这个射频工程师老鸟学会了STC嵌入式单片机,可以随型所欲的极简设计一些传感+控制+3D小外壳设计全套玩意,也是一种莫大的收获及乐趣! 共勉!
回复

使用道具 举报

ID:975054 发表于 2023-1-2 02:38 | 显示全部楼层
今天又碰到个问题:
STC8省电: 平时2秒掉电唤醒1次正常, 但自动待机后4秒还会误唤醒1次?想了好一会,原来是我在自动待机前忘关掉电唤醒定时器了,呵呵! 原来如此!  
自动待机前关掉掉电唤醒定时器后,拿高精度万用表测试了一下待机电流,工作电压约3.8V时约0.5μA(手册5V时0.6μA),很舒服哦!  
之前只测过最低2.3μA,原来是含掉电唤醒定时器工作电流,而一直待机不含(手册里的数据得到比较精确的验证,呵呵!)
回复

使用道具 举报

ID:308903 发表于 2023-1-3 08:55 | 显示全部楼层
感觉~好高端的问题
回复

使用道具 举报

ID:975054 发表于 2023-4-30 16:35 | 显示全部楼层
1261867136qq 发表于 2023-1-3 08:55
感觉~好高端的问题

见笑了!我是射频总体技术工作三十几年的老鸟,但嵌入式还只是近二年自己感兴趣自学的菜鸟,好在系统总体经验教训相对较足,普通硬件外围应用电路设计及PCB布板电装测试验证可以一条龙搞定,不然我老人家就根本吃不消了。。。
近期仍在不断研究优化,力求小东西设计最简、好用且最可靠、最省电...把简单的东西做到越来越精致当快乐了!
很多东西都要具体问题具体分析,就如我前面上传的单按键长短按中断检测消抖代码(说明:当时T0定时器消抖用的还是查询方式while(!TF0),其实与随便调用一句20ms延时完全等效)。一般中断里都尽量少调用延时(主要会延长处理时间,系统复杂时代码执行易混乱),但我东西简单主要就处理按键中断,里面暂时全是延时,反正又不是键盘一直在按,可靠就好,另外的原因是我用的最小8脚MCU,配合外围四个LED控制及早晚光控及充电电池检测指示省电等等等基本特性功能,有几个脚都复用了,包括这个关键引脚P32,代码逻辑策略设计原因,暂时只能这样处理,不排除后面还会继续综合优化。。。学海无涯回头是岸

节日无事,偶来这里学习学习,顺便留言! 顺祝大家节日快乐!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表