单片机读写端口与引脚区别及实例解析(基于STC8G1K08A最小8脚嵌入式单片机LED安全夜灯方案)

51单片机读引脚和读端口测试总结_单片机怎么读取引脚电平_爱嘟嘟的小屁孩的博客-CSDN博客

近期看了几篇有关单片机读/写端口或引脚的区别的文章,其中上面引用本CSDN的这篇文章,总结的2点感觉还不错,先引用一下:

1. 51单片机里对某一个I/O口进行读–改–写(例如上面的取反后写回)操作时,读取的是与之对应的锁存器的输出,而不是实际物理引脚的电平;其他非读–改–写(例如上面的if XX== 0)指令读取的是引脚电平。

2. 读引脚电平时一定要先向该端口写1,然后再读取引脚电平!

其中:第2点说的可能是针对已设置I/O为双向的情况!  实际可能不用写1,只需临时改写端口为高阻态也行的,高阻态时不用管原来写的端口是1还是0,反正我只是读外部引脚状态,该办法的具体应用实例详见我下面的笔记内容:

现在,直接用C语言编程的的多,用汇编的越来越少了。就如我一个老射频电子工程师,几十年前啥都学过,真正要理解和说清楚单片机读/写端口还是引脚的区别,可能也得理论和实践相结合才能说的简单,通俗易懂。

我玩STC两年才2年,也是近期才比较深刻的体会,理论暂不多说,只分享一下本人近期在设计一种LED安全夜灯时涉及的其中有关笔记:时间关系,下面直接引用了一下我研究过程中的一些笔记,可能有点啰嗦了,后面必要时有空再精简(可能对有些人有用,暂保留)。

1、我近期在用STC8G1K08A(SOP8脚带ADC)代替之前的Tssop20脚封装的MCU,力求总体方案最为精简可靠,物尽其用,8脚能搞定的尽量不用16脚或20脚(16脚的一般SOP8封装体积很大,Tssop20封装的很薄很小其实也贵不了几毛钱,关键看自己需要,我选8脚主要是练习引脚复用,优化精简电路,自己岁数大了也好焊接,呵呵!);

2、8脚除去电源和地只剩6脚:控制1个微型三色LED(红蓝绿可组合7色常亮或7色常闪共二类14种模式,常亮可当小夜灯或氛围灯,常闪可当安全警示灯或充电电量指示灯)和1个大的白色LED(主要当夜灯用)用掉4个脚,剩下2个脚1个接按键1个接充电检测电路。这样8脚已满,且P30P31本身已复用串口收发及ISP代码下载口用了。 原用20脚有1脚分压检测电池电量的,这次改用内部15通道ADC测VCC再修正为电池电压Vbat了(选STC8G1K08A,8脚带A的才有ADC功能,外围有防反接二极管降压等,Vbat值修正可得),又省1个脚8脚足矣!

3、后来又加了一个早晚自动亮灭光控功能,究竟该复用哪个脚呢?期间研究分析计算测试验证了很久,才最终确定了某一种最简引脚复用方案。而引脚复用期间,往往势必首先就会碰到更多的读写引脚还是读写端口的问题!读引脚就得充分结合自己设计的外围电路!例如:复用充电检测、按键还是LED控制引脚,外围电路设计方案都大不相同。感兴趣的另行探讨…

4、前面只是引子,下面再具体实例说一下其中一种利用改变I/O口设置来解决具体问题的方法:

假设白色夜灯用了P55脚!白天怎么自动关闭它而晚上又能自动复原呢(不是主动开关那种)?其中一种方法就是:白天DN=0(晚上DN=1)把这个P55引脚I/O设置为高阻(电流不进不出不就关灯了么!)晚上设回双向夜灯自动复原(注意原状态可能关也可能开,反正不管,复原即可):if(DN==0)P5M1=0x20;else P5M1=0x00;这句中临时改变P55I/O口设置也是写端口(寄存器)的一种;若直接写端口/引脚P55=1/0呢:状态就变成人为主动的开或关灯了,性质不同,不属于早晚自动亮灭了!

假设我想晚上P55白色夜灯亮时自动关闭/屏蔽3色彩灯(P30P31P54),夜灯灭时彩灯又能自动复原,早晚都能自动亮灭,可用:if(P55==0){P3M1=0x03,P5M1=0x30;};这句中if(P55==0)就是读外部夜灯P55引脚状态(0亮灯1灭灯),这时高阻和双向时都可正确读外部引脚状态(可不管原来是开0/关1)!若关闭彩灯直接写端口/引脚P30=P31=P54=1(注:可连写的,但是又变成人为的主动开关彩灯了,不属于早晚自动亮灭了);

以上2种情况涉及夜灯原来状态需要早晚自动亮灭问题的最简解决办法,当然,也可先记录一下原来开关状态(可能要结合EEPR记录和复原等办法,方法就相对复杂很多了)…

假设我光控检测电路复用按键脚P32或充电检测脚P33又或LED控制脚:因涉及具体LED等特性,外围电路设计大为不同,说起来确实有点复杂,我也搞了很久才最终定下一个最简方案,还请先自行思考,必要时再进一步补充或探讨…

总之,要真正理解读写引脚或端口的不同,灵活设置I/O口设置,才能得心应手。

注1:封面配图:为本人自学3dmax改进设计的其中一种某经典跑车模型外壳,可以直接放大或缩小并交付3D打印.壳底直插自己设计的很小的PCB(外壳约56*25*18mm,PCB约47*15mm);对3DMAX设计或外壳3D打印感兴趣的朋友再行探讨;

附1:就是本人近期利用最小的STC8G1K08A,8脚MCU设计的小玩意简介,可见8脚MCU功能的强大。其实8K代码我才用不到2K,小儿科了,但也涉及了最基本一键长短按、ADC电池监控、LED读写控制、早晚光控自动亮灭以及多脚复用或究竟是读写端口还是引脚、超级省电技术等等也不算很少的小而全的代码逻辑问题了,需要时还可略改外围电路复用更多引脚功能,如气压温湿度传感控制或泡水防火监控等等等等,仅供参考:代码略,需要时另行行探讨;

LED安全夜灯使用指南(V230530)

功能简介

基于STC8G1K08A最小8脚嵌入式单片机、光控及超级省电技术,一键操作、早晚自动亮灭、通用USB充电口、低电量告警或自动关机。小巧玲珑(总重约13克)、省电耐用,可当床头夜灯、室内外安全警示灯或小玩具使用。其中:(大)夜灯独立大LED;小彩灯为一颗微型RGB三色LED,单色或组合混色共14种模式:常亮7种(绿、红、蓝、白、青、黄、紫)可当小夜灯用,常闪7种(同前)可当安全警示灯。

使用指南

  1. 彩灯 短按开机,14种彩灯模式全天自动隔2秒顺序循环显示,中间灭4秒;再次短按循环显示即停,即选好想要的彩灯模式,后面也可手动短按选择彩灯模式,按1次换1种;早晚自动亮灭;白天短按可检查彩灯设置:亮4秒或闪2次后自动灭灯。
  2. 夜灯长按1秒开/关夜灯,夜灯开彩灯灭,早晚自动亮灭;夜灯关全灭自动待机。白天短按可检查大灯设置:若夜灯已开亮0.5秒自动灭,若夜灯已关自动转彩灯循环显示可选彩灯模式。
  3. 自动待机灯已全关或电量过低(xx%)自动待机;短按开机或充电解除。
  4. 一键关机长按3秒一键关机;短按开机或充电解除。
  5. 充电(电量指示)不足50%:红灯亮1秒闪1次;50%以上:红灯亮1秒绿灯闪1次;75%以上:绿灯亮1秒红灯闪1次; 90%以上:绿灯亮1秒闪1次;充满 绿灯常闪(快闪)。
  6. 告警电量低于xx%告警(红灯隔2秒快闪2次);电池充满绿灯快闪可当提醒。
  7. 基本性能(满电状态可连续使用时长)大夜灯模式约5天; 小彩灯常亮模式(小夜灯)约1个月;小彩灯常闪模式(安全警示)约2.5个月; 可连续待机约2年。
  8. 注意事项儿童使用须有大人看管!   室外使用谨防日晒雨淋!该外壳3D打印材料特性:负荷变形温度xx℃,不适宜放置高温及强太阳光环境;内置xxmAh聚合物锂电池:有过充过放及短路保护电路,但不宜经常过充/过放。
物联沃分享整理
物联沃-IOTWORD物联网 » 单片机读写端口与引脚区别及实例解析(基于STC8G1K08A最小8脚嵌入式单片机LED安全夜灯方案)

发表评论