找回密码
 立即注册
查看: 447|回复: 0

冲哥8051实验箱-STC32G12K128第八集:蜂鸣器的应用

[复制链接]
  • TA的每日心情
    开心
    2024-3-1 13:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    16

    主题

    4

    回帖

    130

    积分

    注册会员

    积分
    130
    发表于 2023-5-21 10:16:11 | 显示全部楼层 |阅读模式
    本帖最后由 15614423926 于 2023-5-22 11:16 编辑

    1、打印异常,我逻辑已经混乱了,代码如下:

    u8 Run_Mode = 0;        //0-8 开关变量 0:没有模式

    BEEP = 0;                        //打开蜂鸣器
    delay_ms(100);
    BEEP = 1;                        //关闭蜂鸣器

    Run_Mode++;                        //模式选择
    if(Run_Mode > 8)        //如果模式大于8
    Run_Mode = 1;                //回到模式1

    printf("模式值:%d \r\n",Run_Mode);
    printf("模式值-1:%d \r\n",(Run_Mode-1));
    printf("模式值-1后左移一位:%d \r\n",1 << (Run_Mode-1));
    printf("模式值-1后左移一位且取反:%x \r\n",(u8)~(1 << (Run_Mode-1)));
    P2 =~(1 << (Run_Mode-1));        //  1<<1  0000 0001 -> 1111 1110

    printf("P2:%x \r\n",P2);

    2、串口打印如下
    冲哥8051实验箱-STC32G12K128第八集:蜂鸣器的应用-1.png

    3、若要实现流水灯,需按以下输出实现
    冲哥8051实验箱-STC32G12K128第八集:蜂鸣器的应用-2.png

    4、
    疑惑点1:初始状态为模式1,P2 =~(1 << (Run_Mode-1));其中Run_Mode-1值为0,接下来的执行的左移应该也是0,为什么是1;

    解答:左移右移的逻辑关系搞混了
    1<<0 ->  0000 0001 << 0 -> 0000 0001
    1<<1 ->  0000 0001 << 1 -> 0000 0010
    1<<2 ->  0000 0001 << 2 -> 0000 0100
    1<<3 ->  0000 0001 << 3 -> 0000 1000
    1<<4 ->  0000 0001 << 4 -> 0001 0000
    1<<5 ->  0000 0001 << 5 -> 0010 0000
    1<<6 ->  0000 0001 << 6 -> 0100 0000
    1<<7 ->  0000 0001 << 7 -> 1000 0000

    疑惑点2:printf("模式值-1后左移一位且取反:%x \r\n",(u8)~(1 << (Run_Mode-1)));不加强制转换符打印出来的是FFFE,这是原因,起初已用全局变量定义Run_Mode为u8;
    解答:同上

    疑惑点3:为什么printf("模式值-1后左移一位且取反:%x \r\n",(u8)~(1 << (Run_Mode-1)));和printf("P2:%x \r\n",P2);打印出输出数据不一样,且P2值错误;

    解答:加延时即可解决




    老工程师果然经验丰富,扎实的基础也是必须的











    回复 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-20 21:59 , Processed in 0.053690 second(s), 31 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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