问题标签 [8051]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 8051(8 位)微控制器上的意外位移结果
考虑以下代码:
此代码在 TI CC1111 SoC(具有 8051 内核)上运行,并使用 IAR EW8051 8.10.3 编译/调试,配置为使用 C99 方言,未进行优化。评论中的值是使用 IAR 调试器观察到的(使用模拟器或实际设备的结果相同)。
我希望之后crc16 = crc16 << 8;
,crc16
会有价值0x4300
,而不是0x0000
。
根据 C99 标准(嗯,2005-05-06 年 5 月的草案),第 6.5.7.3-4 节。
对每个操作数执行整数提升。结果的类型是提升的左操作数的类型。如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。
E1 << E2 的结果是 E1 左移 E2 位位置;空出的位用零填充。如果 E1 具有无符号类型,则结果的值为 E1 × 2^E2,比结果类型中可表示的最大值多模一减少。如果 E1 具有带符号类型和非负值,并且 E1 × 2^E2 在结果类型中是可表示的,那么这就是结果值;否则,行为未定义。
我对此的看法是,结果类型应该是一个无符号的 16 位整数,其值为((0x0043)*(2^8)) % 0x10000 == 0x4300
.
我错过了什么吗?谢谢。
frequency - C8051F996 的 UART 和 FSK 实现
我正在尝试发送一个 UART 信号,但 FSK 编码。我有 UART 工作,波特率 290。我在 P0.7TX 上发送。当连接到计算机时,我得到了预期的结果。但是,我想生成这个 UART 的 FSK 信号以通过音频发送并在那里解码。目前,我只专注于发送数据。
我创建了两个基于 PCA 的函数来创建零频率和一频率。大约 1.2kHz 和 2.4kHz。我还发现“loopOne”和“loopZero”必须在中断内完成,否则 MCU 会依次背靠背调用 loopOne 和 loopZero 来扭曲波形。
所以,我的问题是我无法弄清楚如何通过中断线获取 UART 的输出,既调用中断,然后根据 TX 是低电平还是高电平让中断调用函数。
我可以使用两个外部中断来做到这一点:一个用于输出低电平时,一个用于输出高电平时,但我需要其中一个中断用于其他目的,因此我需要连接并使用相同的中断或单独的中断和它需要区分调用哪个函数。
我正在使用 c 代码中的 Silicon Laboratories IDE。MCU 是 SiLabs C8051F996。
c - 地址空间溢出
我的代码遇到问题。当我编译代码时,我得到错误地址空间溢出。我该如何帮助解决这个问题。我正在使用 keil 编译器和 AT89C51RD2 MCU,这是迄今为止使用的空间 -
程序大小: data=149.0 xdata=594 const=1136 code=8467。
我可能已经用完了整个内存。
错误声明是这样的:
错误 L107:地址空间溢出
空间:内存空间(DATA)
段:段名(Function_name)
长度:000004H
说明:指定的段不能位于指定的地址空间。 该段被忽略。
谢谢
c - 函数根本没有执行或没有正确执行
我正在开发一个嵌入式 C 程序,即使调用 killnoise 函数并且程序总是到达它,它也不会执行,但是当我检查这个函数输出的值时,我发现没有发生任何事情:
这是我称之为的地方和方式:
其中 NUMPOINTS、biguparray、bigleftarray ... 是先前声明的全局变量:
非常感谢您的帮助,(我在使用另一个功能时遇到了同样的问题)
c - 为什么我的位不左移?
我在 Keil 上使用嵌入式 C。我正在尝试编程,使其存储一个位,位移,然后再次存储它并重复,直到存储所有八位。
但是,当我调试(可能调试错误)时,该值仅显示“01 00 00 00 00 00 00 ...”。当它存储逻辑'1'然后左移时,它显示“02 00 00 00 00 00 00...”。当循环重复时,它会一遍又一遍地显示相同的内容。我所期望的是“01 01 01 01 01 01 01 ...”(假设所有输入位都是“1”)。我该如何解决这个问题?
啊,我已经解决了。
c - keil uvision4是否足以替代8051硬件
我想在 8051 MC 上编写一些程序或 Embedded-C。ISR、LED 闪烁、轮询等程序。没有硬件可以吗?只有keil uvision4硬件模拟器就够写程序了?请帮忙。
c - 最快的归零方法
将无符号整数清零的最快方法是什么?
我目前只是将值设置为 0,但我不知道是否有任何技巧可以将变量归零?在我当前的项目中,我需要几个时钟周期。我使用的是标准 8051 处理器,如果有帮助的话,我需要将两个不同的变量归零。
c - 在串口传输上需要一些帮助
我目前在 Keil C51 编程中使用 DS89C450 MCU。
我有一个连接到 P3^2 的红外接收器,它是下降沿触发器。每当我按下遥控器上的一个键时,它都会触发中断并将其保存到 xdata X 或 Y 中(逐位然后逐字节保存 500 个字节)。
我正在尝试通过串行端口将数据位(“1”或“0”)从缓冲区传输到超级终端。但是,当我按下遥控器时,我没有显示任何数据。
任何专家都可以告诉我为什么以及如何让它工作吗?
程序在这里:
c - 是否可以将计时器值存储到变量中?
当传入数据的值为“0”时,我使用 DS89C450 timer0 从 0 开始计数,并且它只会在数据“1”时停止,并且它将与我拥有的值进行比较。但是,是否可以存储计时器计数的值,以便我可以使用 if 循环来比较这些值。
例如:
有谁知道可以这样做吗?
c - 8051 中的代码优化
所以,我必须完成这个挑战,即为一个 8051 微控制器实现一个摄像头监控系统。
这些是规格:
每个摄像机都与一个运动传感器相关联,每次检测到运动时,该摄像机的记录都会被注册并保存。如果传感器超过 5 秒没有捕捉到任何动作,则此摄像机将不再被记录;
如果没有摄像头,录像机必须处于“暂停”状态;
如果打开了多个摄像机,则必须使用多路复用器(mux)以某种方式选择摄像机信号,以便在 3 秒内记录每个摄像机。这样,必须在 3 秒内记录所有活动的摄像机。如果只有一台摄像机处于活动状态,则它的信号必须是多路复用器中唯一的一台。
我已经在下面的代码中完成了这一点。而我们现在要做的就是在没有编译器优化的情况下优化代码的大小。代码现在是 198 字节,但我试图低于 180 字节。
可能吗?我已经尝试进行#define 的计算,但编译器已经为我优化了它。