在我的工作中,作者实际上使用了51个微控制器,例如AT89C2051,AT89C51和AT89C52,后来使用了来自Xinmao和Huabang等制造商的51个微控制器。书中找不到许多在实践中遇到的问题。在我的印象中,书中只有一页知识,这是CPU的计时图。最初,该程序直接与组件编写,然后是C51嵌套组件。编译器使用Weifu系列编译器,后来使用了Keil等,并且认为这些编译器是相似的。它需要熟练的C语言基础,以及微控制器应用程序的特殊性质。
本文总结了我实际遇到的51个微控制器的应用中的一些常见问题。由于本文的空间有限,这些问题远非足以表达微控制器的常见问题。我希望这对初学者有帮助。请给我一些有关本文不完整内容的建议。谢谢!
1。C51编译器如何区分位地址和字节地址
它由预定义实现,例如:sfr p0 = 0x80; SBIT P0_0 = 0x80;前者宣布P0端口地址位于0x80,后者显示P0端口的BIT0(即P0.0)位于位地址空间0x80。这2个0x80具有完全不同的含义,并且由关键字SFR和SBIT区分。这样,当编译程序时,编译器将相应地将其编译为相应的汇编语言。例如:
C51语句:P0 = 1;
P0称为SFR,因此将其编译到:MOV 80H,01H和0x01数据将发送到0x80单元。由于0x80单元实际上对应于P0端口,因此P0.0 PIN将输出高水平(实际上处于高阻抗状态,P0端口独有),而其他PINS.1-.7输出低水平。
C51语句:p0_0 = 1;
P0_0被声明为SBIT,因此将其编译为:SETB 80H,将位地址空间中0x80地址的位设置为1。该位正好是端口P0的位0。执行后,P0.0将输出高阻抗状态。和P0.1-.7不会改变。
2。为什么需要组装C51
51微控制器的一个重要优点是指令执行时间是固定的,因此它可以适应时间严格的情况。例如,符合ISO7816协议的CPU卡的读取和写作具有严格的计时要求。实际上,它是由IO脚制成的同步半双链串行端口。支持CPU卡的程序通常很大,需要使用C51进行组织。但是,由于C汇编的不确定性,必须将基础程序封装到汇编语言模块中并嵌入项目中。这带来了几个问题:如何声明功能,如何传递参数等。由于空间限制,我们无法详细说明。这里有示例:
汇编器分别保存文件并将其添加到项目中。该功能如下:
_proc_a:
MOV A,R7
INC
mov r7,a
ret
用C语言在.h文件中声明:extern unsigned char proc_a(unsigned char val);
当调用时,表格如下:retValue = proc_a(0x11);
阐明:
答:如果汇编器采用参数,则需要在汇编程序之前添加一个额外的下划线。而且无需将其添加到声明的地方(根据WEIFU编译器的要求)。
B:该函数正式参数中的第一个参数在R7中传递,并且该函数的返回值在R7中返回,这是C51的一般规范。其他参数具有相应的法规。该功能可以返回一点,并使用PSW的C位返回。
C:上述语句的执行顺序是将0x11给予R7,然后跳到子例程,然后子例程将其添加到1,然后将其发送回。
D:当功能跳到汇编器时,可以使用SubRoutine使用该区域中的R0-R7,A,B,PSW,DPTR和其他寄存器,并且无需考虑在通话后是否需要恢复这些常规资源。在上面的示例中,函数使用A的值,并且程序员不必在调用之前还原值。
3.51微控制器的P0端口的特殊功能
许多新手遇到了这个问题。实际上非常简单。这涉及芯片的IO-tot的方式。这对于硬件工程师非常重要。 TTL的io-to-tot型号:
P1,P2和P3端口都可以理解为左图。请注意,VCC下有一个电阻,因此可以理解为:引脚输出1的能力很弱。地面上没有电阻,可以理解为销钉具有很强的吸收电流的能力。 P0端口可以理解为右侧的图片。这是开放的收集器输出,也称为OC输出。可以看出,当ctr = 1时,晶体管被打开并接地。当Ctr = 0时,晶体管被关闭并且销浮动,这也称为三态。该端口的目的是考虑P0端口负责读取和编写数据和地址重复使用。这种关系需要仔细了解CPU时序图。因此,应将合适的上拉电阻添加到P0端口,并且不要添加下拉电阻。上拉电阻的选择取决于外部负载条件。
4。如何输入和输出P1-3端口
从上一节中的左图可以看出它。执行输出时,如果CTR = 1输出,则强信号为0,如果CTR = 0是输出,则弱信号为1。当输入IO PIN时,应进行CTR = 0,以便关闭晶体管。如果外部信号为1,上拉电阻会加强此1,而微控制器将读取1。当外部信号为0时,请注意,必须取消上拉电阻的上拉效果才能在引脚上获得0。
因此,对于程序,设置IO PIN 1处于接收状态,当然也处于输出状态。如果程序将IO端口设置为1,则读取信号为1,取决于外部电路。如果外电路不“吃”上拉电阻的电流,则将读取1个。相反,尽管该程序将IO PIN设置为1,但读取为0。
因此,如果您以高水平的IO引脚驾驶外部电路,请小心外部电路“吃”此1,以免输出1。作为输入,在0级别的外围设备必须能够将IO PIN降低。因此,当使用IO脚直接点亮LED时,最好使用反向逻辑,即输出0并让LED灯亮起。这确保了驾驶能力。也就是说,IO PIN连接到LED的负端,LED的正端与VCC连接。
因此,当IO引脚输出1时,外部电路迫使其接地并不重要,当IO引脚输出0时,外电路迫使电源并损坏IO PIN。因此,在程序上电动后,所有的IO端口通常写为1:mov p0,0ffh。
P3端口引脚多路复用,所有销都必须在输出1状态下。例如,如果RXD引脚输出0,则无法读取任何数据。作者在发现串行端口无法接收数据之前进行了整整一天的调试,因为它没有设置RXD 1,并浪费了他的所有时间。当时他很ham愧。
5。与晶体振荡器有关
微控制器的晶体振荡器可以内部简化为反向器。当晶体振荡器输入引脚XI仅越过新月形压力并被认为1时,输出引脚XO输出0。此0将驱动晶体振荡器以降低XI电压。当考虑新月压力0时,输出引脚XO输出1。此循环会重复自身。
因此,当观察正常工作的晶体示波器时,获得既不高也不低的水平线。 XO是具有较大振幅的正弦波。在测量晶体示波器输入引脚XI时,示波器计必须在X10水平上打开,否则仪表可以停止晶体振荡器。
因此,接线时,晶体振荡器输入引脚XI应尽可能靠近晶体振荡器,而XO引脚可能会稍微稍微稍微稍微稍微稍微稍微稍微稍微稍微稍微稍微稍微稍微稍微稍微稍微稍微稍微稍微更远。同时,XO具有某些驾驶功能,有些芯片可以使用它来驱动其他正时电路(不建议这样做,因为系统可靠性降低)。