找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 74|回复: 5
打印 上一主题 下一主题
收起左侧

使用单片机判断拨码开关位数时,返回结果异常

[复制链接]
跳转到指定楼层
楼主
ID:1143744 发表于 2025-5-22 16:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
硬件情况:
             单片机型号是STC8G2K64S4 ,LQFP48封装
             P0 P2是接收端口(准双向置1),P1 P4是驱动端口(准双向置0)

             拨码开关 是多组独立开关的集合体,有4组,6组,8组,9组等
工程原理:
             将拨码开关引脚与单片机端口相连,闭合开关后,检测接收端口0 的个数,来判断当前开关的位数(检测前已确保所有开关闭合)
             由于STC8G系列一组IO只有8个引脚,如果要测量的拨码开关位数大于8,就必须启用两组IO来组合实现
             程序中,先将两组IO的检测结果(8位)组合为16位,然后再从高位往低位计数 “0”的个数,即可得出拨码开关的位数
源代码:
              P1=0x00;P4=0x00;
             _nop_();_nop_();
      
             bits=detect_bit(con_bit(P0,P2));


             unsigned int con_bit (unsigned char vol_high,unsigned char vol_low){
                                return (vol_high<<8)|vol_low ;
                                }


              unsigned char detect_bit(unsigned int vol) {
                                  unsigned int mask = 0x8000;
                                  unsigned char cnt = 0;
                                  while (mask && !(vol & mask)) {       // 当mask位为0时计数
                                   cnt++;
                                  mask >>= 1;
                                   }
                                return cnt;                          // 返回连续高位0的个数(0-16)
                                }
问题:
           经实践,当拨码开关位数<8时,返回的bits 是0;当拨码开关位数>=8时,返回的bits 是8 ,无法按照期望正确返回待测的拨码开关位数
求助大伙,这是什么原因导致的?

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1121801 发表于 2025-5-23 08:28 | 只看该作者
程序模拟运行一下,单步运行,设置位然后观察变量变化.这是单片机程序最简单的检查方法.而且你程序不长,很容易发现问题的.
回复

使用道具 举报

板凳
ID:332444 发表于 2025-5-23 08:51 | 只看该作者
为什么一定要组合?如果是做表决器,一组单独处理后相加即可.
回复

使用道具 举报

地板
ID:1143744 发表于 2025-5-23 11:17 | 只看该作者
cyi8 发表于 2025-5-23 08:28
程序模拟运行一下,单步运行,设置位然后观察变量变化.这是单片机程序最简单的检查方法.而且你程序不长,很容 ...

谢谢您的意见
回复

使用道具 举报

5#
ID:1143744 发表于 2025-5-23 11:21 | 只看该作者
xianfajushi 发表于 2025-5-23 08:51
为什么一定要组合?如果是做表决器,一组单独处理后相加即可.

因为后续程序也会使用到这个组合后的结果,如果分开的话,后面每个调用这个结果的语句及函数都需要进行修改

不过,问题已经找到了,8位的char 左移8位结果会全部丢失,需要强制类型转换
再加上硬件端口排布的小问题

感谢您的回复
回复

使用道具 举报

6#
ID:1133081 发表于 2025-5-23 13:14 | 只看该作者
#define PD P0<<8|P1


unsigned int con_bit()
{
        static unsigned int num=0;
        if(num!=PD)
        {
                num=PD;
                return num;
        }       
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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