如何读懂单片机程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何读懂单片机程序
这是一篇关于单片机入门的基础文章!刚刚接触单片机的朋友,简直是无从下手,打开一个程序,更会被复杂的结构和密密麻麻的代码吓倒!多么想找个人耐心的指导一下,是你们内心的强烈意识!好吧,我来满足你!
我对单片机的总结:“单片机其实就是一个芯片,内部有若干寄存器,外部有若干引脚,我们可以通过程序控制内部的寄存器使得引脚与外部世界保持联系!”就这几句话,道出了单片机的真谛!有没有感觉到单片机是多么的简单!
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++);