求教 51单片机程序调试方法

求教 51单片机程序调试方法,第1张

那得看你的开发环境是什么了,如果是Keil51,那就是软件仿真那样,单步执行,观察变量和寄存器的变化,这个搜搜开发软件的使用就行了。看现象的话是有硬件最好,下进去看看就知道;没硬件,可以用Proteus 搭建一个硬件仿真系统,很强大。

P0=P0<<1,这个语句执行的是读改写指令,你给P0口赋值0x01,数据是写在P0口锁存器里的输出电平信号,而读P0口读的是读引脚,读引脚的信号是输入电平信号,所以你的程序逻辑本身是不对的。另外,输入电平信号调试程序是要你自己手动给出的。还要注意一点,程序调试时,外部信号是你手动给出,与输出信号无关,如果是实际实验,读外部信号前,一定要把该口锁存器信号置1,不然无论外部信号是高电平还是低电平,读取的信号都是低电平。

调试就是将你写的代码,翻译成汇编语言(一条一条指令),然后一步一步地去执行这个指令的过程。在其中,你可以查看到一些程序变量的数值变化。

作用:

1矫正程序代码:方便你在发现程序出了问题之后,通过调试,发现到底是哪一部出了问题,然后查找和修改代码,达到矫正程序的作用。

2理解程序的执行过程:如果你对某段程序不熟悉,或者不知道它到底是怎么运行的,你可以通过调试,查看变量的变化和程序代码的执行过程,了解到这段程序是怎么实现的。

仿真器调试也是把程序烧进芯片运行,这与直接烧写没什么区别。不一样的在于程序调试的结果,因为在调试的时候你可以控制程序的单步运行,就相当于把每条语句之间的时间拉了很长,而且整个系统的运行速度会比正常运行要低。而单片机运行的时候是全速跑的,由于这两个时间的差别就决定了在你调试时序方面的程序的时候会比较麻烦,可能在仿真器调试的时候很正常,烧进片子跑就不行,关键就在于运行程序时间的不同。

程序正确就不会死机,就算你单步运行也不会影响定时器,也就是说你用6s时间单步执行了两句话,那么这时候全速跑,只要时间到还是会马上跳进你的断点,死机的可能是数组越界之类的,PC指针不知道跳哪去了,呵呵,祝成功~

///////////spih/////////////////////////////

#ifndef

SPI_H

#define

SPI_H

#include

<stc12le5a60s2h>

#include

<spih>

//sfr

P4

=

0xe8;

//STC12LE5A60S2单片机自带SPI控制器连接

//sbit

VCC1

=

P2^0;//

VCC1

NO

USE

//sbit

SON

=

P1^6

;//

MISO

//sbit

SIN

=

P1^5

;//

MOSI

//sbit

SCKN

=

P1^7

;

//

SCK

sbit

CSN

=

P1^4

;//

28J60

--

CS

//sbit

RSTN

=

P3^5

;

//RST,

no

use

//sbit

INTN

=

P3^3

;

//

INT,

no

use

void

init_spi(void);

void

WriteByte(u8_t

temp);

u8_t

ReadByte(void);

#endif

////////////////////////////////////////////////////////////////

///////////////////////////spic/////////////////////////////

#include<spih>

//STC12LE5A60S2单片机自带SPI控制器连接

void

init_spi(void)

{

//SSIG

=

1;

//忽略SS脚

//SPEN

=

1;

//允许SPI工作

//DORD

=

0;

//先传高位MSB

//MSTR

=

1;

//设置单片机为主机

SPCTL

=

0xD0;

//SPI

Control

Register

SSIG

SPEN

DORD

MSTR

CPOL

CPHA

SPR1

SPR0

0000,0100

SPSTAT

=

0xC0;

//

//IE2

|=

0x02;

//允许SPI中断控制位

}

void

WriteByte(u8_t

temp)

{

SPDAT

=

temp;

while(!(SPSTAT

&

0x80));

SPSTAT

=

0xC0;

}

u8_t

ReadByte(void)

{

idata

u8_t

temp;

//SPSTAT

=

0xC0;

SPDAT

=

0x00;

while(!(SPSTAT

&

0x80));

temp

=

SPDAT;

SPSTAT

=

0xC0;

return

temp;

}

////////////////////////////////////////////////////////////////

不同的型号的单片机需要不同的开发软件。我们以80C51系列

单片机程序的编写不需要任何特殊的软件,只要是文本编缉软件就可以了,如WINDOWS自带的记事本,WORD等,不过这些软件编写并不方便,有一些更好的文本编缉器可供选择,如UltraEdit,PE2等。当然,人们最常用的还是使用开发软件自带的编缉器来进行编写。以80C51系列单片机为例,最为流行的软件是Keil软件。Keil软件是一款综合开发工具,内置了编缉器,ASM汇编器,C51编译器,调试器等部分。

学习单片机还需要单片机开发板,最好是视频教程详细的,比如吴鉴鹰单片机开发板就不错

单片机学习可以到吴鉴鹰吧交流,资料来源吴鉴鹰吧

F10和F11的区别在于是否跳入函数内部,举例

int func(int x)

{

return x;

}

void mian()

{

int a=1;

int b=func(a);

int c=b;

}

比如上面这一段,你在main函数里的第二行int b=func(a);加个断点。运行,运行到这里停住了。

此时如果你按F10,那么单步执行,但是不进入函数,程序会运行到第三行int c=b;这一行停下来。

如果你按F11,那么单步执行,进入函数,程序会运行到函数func内部的第一行return x;停下来

以上就是关于求教 51单片机程序调试方法全部的内容,包括:求教 51单片机程序调试方法、C51单片机程序调试中,为什么移位后,P0口直接为0、单片机keil软件的调试是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9284688.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存