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

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-03-01 13:29:54

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, 2025-6-19 02:19 , Processed in 0.124788 second(s), 49 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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