嵌入式c与8051单片机

嵌入式c与8051单片机,c,embedded,C,Embedded,8051微控制器复位后,所有端口引脚锁存器的值均设置为“1”。现在我正在阅读这本书《嵌入式C》,书中指出,下面代码的问题在于,它可能会使开发人员产生错误的安全感: // Assume nothing written to port since reset // – DANGEROUS!!! Port_data = P1; 如果以后有人修改程序,使其包含一个用于写入同一端口全部或部分的例程,则此代码通常无法按要求工作: unsigned char Port_data; P1 = 0x00; .

8051微控制器复位后,所有端口引脚锁存器的值均设置为“1”。现在我正在阅读这本书《嵌入式C》,书中指出,下面代码的问题在于,它可能会使开发人员产生错误的安全感:

// Assume nothing written to port since reset
// – DANGEROUS!!!
Port_data = P1;
如果以后有人修改程序,使其包含一个用于写入同一端口全部或部分的例程,则此代码通常无法按要求工作:

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;
任何了解嵌入式c的人都可以向我解释为什么这段代码不起作用?它所做的只是将0赋给一个char变量

潜在问题

1) 与端口关联的数据方向寄存器(DDR)可能未按预期设置,因此通电时,DDR可能会设置为“输入”。因此,将端口写入0可能会意外地不读取0

2) 与端口相关的数据方向寄存器可能已设置为“输出”,并且“读取”数据可能没有明确的含义。根据体系结构的不同,可能需要幻像位对输出位进行阴影处理,以便进行回读

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

解决方案:

在通电代码上,显式设置DDR和输出值(以及所需的阴影位)


可能不适用于8051-一般来说,与嵌入式处理器对话。

几个月前,我在读同一本书,也有同样的困惑。后者正在从事与PIC18和M0+有关的项目,并正在了解它的真正含义

实际上,这不是软件/编程问题,而是硬件/电子问题。如果805X代码希望能够从管脚上的外部输入读取1和0,则代码必须提前将1写入管脚。如果您的代码提前将0写入引脚,外部外围设备将无法将引脚拉高并允许代码读取1。为什么?电子产品!!想象一下,如果你想享受窗外的风,你必须先打开窗户

如果你真的感兴趣,谷歌“pin值vs闩锁值”由你自己。我认为程序员把这个留给硬件工程师是可以的。我相信805X没有DDR作为高级的。在输入和输出模式之间切换引脚可能很容易,但容易混淆