嵌入式c和8051微控制器

Joh*_*ino 5 c embedded

复位8051微控制器后,所有端口引脚锁存器的值都设置为"1".现在我正在阅读这本书"嵌入式C",它说明了以下代码的thr问题,它可以让开发人员陷入虚假的安全感:

// Assume nothing written to port since reset
// – DANGEROUS!!!
Port_data = P1;
Run Code Online (Sandbox Code Playgroud)

如果以后某人修改程序以包含写入全部或部分同一端口的例程,则此代码通常不会按要求工作:

unsigned char Port_data;
P1 = 0x00;
. . .
// Assumes nothing written to port since reset
// – WON’T WORK BECAUSE SOMETHING WAS WRITTEN TO PORT ON RESET
Port_data = P1;
Run Code Online (Sandbox Code Playgroud)

任何有嵌入式c知识的人都可以向我解释为什么这段代码不起作用?它只是将0赋值给char变量.

chu*_*ica 2

潜在问题。

1) 与端口关联的数据方向寄存器 (DDR) 可能未按预期设置,因此在上电时,DDR 可能被设置为“输入”。所以把端口写成0可能会意外的读不到read 0。

2) 与端口相关的数据方向寄存器可能已设置为“输出”,而“读取”数据可能没有明确的含义。根据架构的不同,可能需要幻像位来隐藏输出位以进行读回。

3) 上电代码可以通过复位命令输入,该命令只不过是跳转到“复位向量”。因此,不会发生与“冷”加电相关的任何硬件特定操作,因为这是“热”加电。

解决方案:

在上电代码中,显式设置 DDR 和输出值(以及根据需要的影子位)。

可能不适用于 8051 - 一般来说是嵌入式处理器。