如何读懂单片机程序_第1页
如何读懂单片机程序_第2页
如何读懂单片机程序_第3页
如何读懂单片机程序_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、如何读懂单片机程序这是一篇关于单片机入门的基础文章! 刚刚接触单片机的朋友, 简直是无从下手, 打开一个程序, 更会被复杂的结构和密密麻麻的代码吓倒! 多么想找个人耐心的 指导一下,是你们内心的强烈意识!好吧,我来满足你!我对单片机的总结: “单片机其实就是一个芯片,内部有若干寄存器,外部有若 干引脚,我们可以通过程序控制内部的寄存器使得引脚与外部世界保持联系!” 就这几句话,道出了单片机的真谛!有没有感觉到单片机是多么的简单!1. 单片机程序执行流程 这是我们首先必须要知道的。 单片机程序一般就有两种, 一种是汇编程序, 一种 是 c 语言程序。这里我们讲 c 语言程序。单片机程序都有一个包

2、含主函数的文件, 包含主函数的文件都有一个统一的结构, 如下所示:#include "xxx.h"int main() /; /这是主函数的函数名若干条语句while(1) / while 括号中是 1,说明程序进入后将在 while 里面无线循环, 不会出来了,不懂的去看 c 语言基础之 while 篇; / 若干条语句重点:单片机一上电,从主函数 main 的第一条语句开始执行,是一条语句接着 一条语句从上而下执行, 直到进入 while 后,再从 while 的第一条语句执行到最 后一条语句,由于是死循环,会再从 while 的第一条语句执行到最后一条语句, 如此反复

3、执行,永不停止!直到断电!这些语句当中,有些是函数的调用,遇到函数的调用,进入到函数,再从函数的 第一条语句执行到最后一条语句, 然后跳出函数, 再从刚才主函数中那条函数的 下一条语句开始执行。 如果实在搞不明白函数是怎么一回事, 你可以用函数里面 的所有语句代替函数在主函数中的位置。例如:#include "LPC11XX.H"#define LED1_ON LPC_GPIO1->DATA &= (1<<0) #define LED1_OFF LPC_GPIO1->DATA |= (1<<0) #define LED2_ON L

4、PC_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

5、->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 mai

6、n()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 循环后,就跳 出de

7、lay()函数,执行LED1_ON由于LED1_O是个用#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 &= 0x

8、07;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(

9、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 语言的这些宏

10、定义和函数的小技 巧,第一种表示方法是不是更有利于阅读程序的功能呢?2. 读懂程序需要c语言基础知识,当然,也可以边看程序,边学习c语言基础知识。3. 读懂程序需要会看单片机的寄存器定义,在程序中,大都是在给单片机的寄 存器进行配置或是获取单片机寄存器的数据。看哪种单片机程序,就要学会看 哪种单片机的寄存器定义。知道了寄存器的定义,就知道如何配置寄存器或是 获取的寄存器数据代表的意义了。例如我们要看LPC1114的程序,那么LPC1114的用户手册是必须要打开的。例如 LPC_SYSC0N->SYSAHBCLKCTR1<v16);这条语句,就是在给 SYSCO模块中的 SYSAHB

11、CLKCT寄存器进行配置,所以我们要找到这个寄存器的定义。首先,打 开用户手册,找到SYSCO这一章,然后找到寄存器描述这一节,就可以找到这 个寄存器的定义了。至于 (|=(1<<16) 这些,都是写基本的逻辑运算,也是些 c 语言的基础知识而已。例如 (|=(1<<16) 这个就是把 1 左移 16个位,然后把左 移后的数据与SYSAHBCLKCT寄存器进行或运算,运算后的结果再放入SYSAHBCLKCT寄存器当中。1左移16个位,就是bit16 为1,其它位为0。与 寄存器SYSAHBCLKCT进行或运算,我们不管这个寄存器原来的值是多少, 我们 现在只知道, 1 或任何数,都等于 1;0或任何数,都等于任何数。所以, 1 左移 16位后,再与寄存器进行或运算, 实际上是把寄存器的 bit16 置 1,剩下的位原 来是多少,还是多少。 (常有人问我,怎么判断自己适不适合学单片机,现在我 告诉你,你能把这些“或”“与”“非”“进制转换”搞清楚,就可以,如果这 些搞不清楚,就不要学了,同学,单片机不适合你)。4.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论