单片机程序看不懂,希望可以解答
1个回答
关注
展开全部
亲,我来为您解答1.单片机程序执行流程这是我们首先必须要知道的。单片机程序一般就有两种,一种是汇编程序,一种是c语言程序。这里我们讲c语言程序。单片机程序都有一个包含主函数的文件,包含主函数的文件都有一个统一的结构,如下所示:#include “xxx.h”int main() // 这是主函数的函数名{。..。..; // 若干条语句。..。..;while(1) // while括号中是1,说明程序进入后将在while里面无线循环,不会出来了,不懂的去看c语言基础之while篇{。..。..; // 若干条语句。..。..;}}
咨询记录 · 回答于2022-12-25
单片机程序看不懂,希望可以解答
亲,我来为您解答1.单片机程序执行流程这是我们首先必须要知道的。单片机程序一般就有两种,一种是汇编程序,一种是c语言程序。这里我们讲c语言程序。单片机程序都有一个包含主函数的文件,包含主函数的文件都有一个统一的结构,如下所示:#include “xxx.h”int main() // 这是主函数的函数名{。..。..; // 若干条语句。..。..;while(1) // while括号中是1,说明程序进入后将在while里面无线循环,不会出来了,不懂的去看c语言基础之while篇{。..。..; // 若干条语句。..。..;}}
重点:单片机一上电,从主函数main的第一条语句开始执行,是一条语句接着一条语句从上而下执行,直到进入while后,再从while的第一条语句执行到最后一条语句,由于是死循环,会再从while的第一条语句执行到最后一条语句,如此反复执行,永不停止!直到断电!这些语句当中,有些是函数的调用,遇到函数的调用,进入到函数,再从函数的第一条语句执行到最后一条语句,然后跳出函数,再从刚才主函数中那条函数的下一条语句开始执行。如果实在搞不明白函数是怎么一回事,你可以用函数里面的所有语句代替函数在主函数中的位置。例如:#include “LPC11XX.H”#define LED1_ON LPC_GPIO1-》DATA &= ~(1《《0)#define LED1_OFF LPC_GPIO1-》DATA |= (1《《0)#define LED2_ON LPC_GPIO1-》DATA &= ~(1《《1)#define LED2_OFF LPC_GPIO1-》DATA |= (1《《1)/***********************************//* 延时函数 *//***********************************/
void delay(){uint16_t i,j;for(i=0;i《5000;i++)for(j=0;j《200;j++);}/***********************************//* LED初始化函数 *//***********************************/void led_init(){LPC_SYSCON-》SYSAHBCLKCTRL |= (1《《16);LPC_IOCON-》R_PIO1_0 &= ~0x07;LPC_IOCON-》R_PIO1_0 |= 0x01;LPC_IOCON-》R_PIO1_1 &= ~0x07;LPC_IOCON-》R_PIO1_1 |= 0x01;LPC_SYSCON-》SYSAHBCLKCTRL &= ~(1《《16);LPC_GPIO1-》DIR |= (1《《0);LPC_GPIO1-》DATA |= (1《《0);LPC_GPIO1-》DIR |= (1《《1);LPC_GPIO1-》DATA |= (1《《1);
}/***********************************//* 主函数 *//***********************************/int main(){led_init();while(1){delay();LED1_ON;LED2_OFF;delay();LED1_OFF;LED2_ON;}}
上面这个例子中,单片机一上电,会执行主函数的第一条语句,也就是led_init(),这个是一个函数的调用语句,程序会从led_init函数中的第一条语句开始执行,直到执行完最后一条语句后,回到主函数,进入while,从while的第一条语句delay()开始执行,delay()又是一个函数,程序会从delay()的第一条语句开始执行,delay()函数中有两个for循环,执行完for循环后,就跳出delay()函数,执行LED1_ON,由于LED1_ON是个用#define定义的宏定义,由c语言基础知识之#define宏定义篇,我们知道,LED1_ON就是LPC_GPIO1-》DATA &= ~(1《《0),如此继续执行下去……。如果不用define宏定义,也不用函数,上面的例子就可以写为如下形式:#include “LPC11XX.H”/***********************************//* 主函数 *//***********************************/int main(){//LED初始化LPC_SYSCON-》SYSAHBCLKCTRL |= (1《《16);LPC_IOCON-》R_PIO1_0 &= ~0x07;LPC_IOCON-》R_PIO1_0 |= 0x01;LPC_IOCON-》R_PIO1_1 &= ~0x07;LPC_IOCON-》R_PIO1_1 |= 0x01;LPC_SYSCON-》SYSAHBCLKCTRL &= ~(1《《16);LPC_GPIO1-》DIR |= (1《《0);
LPC_GPIO1-》DATA |= (1《《0);LPC_GPIO1-》DIR |= (1《《1);LPC_GPIO1-》DATA |= (1《《1);while(1){for(i=0;i《5000;i++)for(j=0;j《200;j++);LPC_GPIO1-》DATA &= ~(1《《0);LPC_GPIO1-》DATA |= (1《《1);for(i=0;i《5000;i++)for(j=0;j《200;j++);LPC_GPIO1-》DATA |= (1《《0);LPC_GPIO1-》DATA &= ~(1《《1);}}有没有发现,第二种表示方法,虽然不涉及函数和宏定义了,对于c语言掌握不是很好的人来说,看的比较爽。如果你掌握了c语言的这些宏定义和函数的小技巧,第一种表示方法是不是更有利于阅读程序的功能呢?
2.读懂程序需要c语言基础知识,当然,也可以边看程序,边学习c语言基础知识。3.读懂程序需要会看单片机的寄存器定义,在程序中,大都是在给单片机的寄存器进行配置或是获取单片机寄存器的数据。看哪种单片机程序,就要学会看哪种单片机的寄存器定义。知道了寄存器的定义,就知道如何配置寄存器或是获取的寄存器数据代表的意义了。例如我们要看LPC1114的程序,那么LPC1114的用户手册是必须要打开的。例如LPC_SYSCON-》SYSAHBCLKCTRL |= (1《《16);这条语句,就是在给SYSCON模块中的SYSAHBCLKCTRL寄存器进行配置,所以我们要找到这个寄存器的定义。首先,打开用户手册,找到SYSCON这一章,然后找到寄存器描述这一节,就可以找到这个寄存器的定义了。至于(|=(1《《16))这些,都是写基本的逻辑运算,也是些c语言的基础知识而已。例如(|=(1《《16)) 这个就是把1左移16个位,然后把左移后的数据与SYSAHBCLKCTRL寄存器进行或运算,运算后的结果再放入SYSAHBCLKCTRL寄存器当中。1左移16个位,就是bit16为1,其它位为0。与寄存器SYSAHBCLKCTRL进行或运算,我们不管这个寄存器原来的值是多少,我们现在只知道,1或任何数,都等于1;0或任何数,都等于任何数。所以,1左移16位后,再与寄存器进行或运算,实际上是把寄存器的bit16置1,剩下的位原来是多少,还是多少。