本篇我们将分析上一篇所写的程序代码。未来学习单片机的大部分精力,我们也将放在程序代码的编写上。但是不用担心,我会非常详细的介绍每个程序的编写思路和各种注意事项等。

之前我们写的程序如下:

#include <reg52.h>

sbit LED = P1^0;

void main()

{

LED = 0;

while(1);

}

头文件

第一行包含头文件,这个和C语言编写HelloWorld时的#include 一样。头文件reg52.h中定义了单片机的一些寄存器,如P0~P3等。至于什么是寄存器,将在原理篇中具体介绍,现在我们只要把它想象成C语言中常说的内存就好了。有兴趣的读者可以右击reg52.h打开头文件看一看。

C51的变量类型

这里我们使用的语言是C51,和标准C语言相比,最主要的特点就是多出来两种变量类型:sfr和sbit。sfr和char一样是一个8位数据类型,表示一个8位的寄存器。例如头文件reg52.h中就有一句sfr P1 = 0x90,它定义了寄存器P1。由于P1是IO口寄存器,所以对P1赋值,则相应的, IO口P1将输出对应的高低电平。而sbit则是一个1位数据类型,只有0和1两种值,它对应寄存器中的一个位。

于是在第二行里,我们定义了sbit型变量LED,并设置LED对应P1的最低位bit0。此时变量LED就和IO口P1.0关联起来。执行赋值语句LED = 0,IO口P1.0就会输出低电平,于是我们电路中的LED就会亮起来了。是不是非常神奇呢?在原理篇中,我会一步一步讲解单片机是如何实现这种功能的。

位寻址

在其他的很多单片机中,我们只能读写整个P1寄存器,而不能直接定义类似sbit这种对应寄存器一位的数据类型,另外51单片机里面有些寄存器也只能整个8位一起读写。这种直接读写一个寄存器位的特性被叫做位寻址功能。

又是一个很难理解的概念,同样,还是需要了解原理篇才能很好的理解它,现在完全不用担心,我提这个就是想让初学者对此提前有个大体印象。毕竟很多知识都是慢慢积累的,如果把大量这样的小知识全部放在原理篇中一并介绍,反而难以接受。

主函数的特点:没有参数和返回值

读者应该已经看到了无参数且无返回值的void main()函数,以及倒数第二行的while(1)语句,并可能疑惑不解。没错,主函数没有参数也没有返回值,倒数第二行的这句是一个死循环,程序永远也不会退出。这和计算机上的程序有很大的不同。下面简单的说明一下这样做的原因何在,更深入的原因,则需要读者看完原理篇后才能理解透彻。

在计算机中,我们开机时看到的启动界面是操作系统,如Windows、Linux等,我们编写的程序则是在操作系统的环境下运行的。程序执行时,相当于系统调用main函数,所以系统可以向main函数传递参数,也可以获取main函数执行结束时的返回值,程序执行结束后,会重新回到操作系统环境下。而在这里,我们写的程序是直接运行在单片机上的,不依赖操作系统。我们程序中的main函数不会被操作系统调用,因此通常它不需要参数,也不需要返回值。事实上,main函数有些情况下是被启动代码调用的,而启动代码是汇编语言写的,还记得上一篇中提到的启动代码么?

主函数的特点:死循环,不会执行结束

在计算机中,我们写的程序执行结束会回到操作系统环境下。而在单片机中,一旦单片机上电复位,就会执行我们写的main函数,直到断电。而如果main函数执行结束,将发生不可预知的结果。

实际实验时,STC单片机会复位并重新开始执行程序,或许只是个巧合,因为官方的芯片手册中并没有明确说明这一点。本着严谨的科学态度,我们不利用这种未经官方确认的特点来开发我们的程序。程序的可靠性是非常重要的,这一点要引起重视。

试想如果你用单片机开发的是医疗相关的产品,或者是控制一些大型机器等,一旦发生意外,后果难以想象。即使你开发的是普通的产品,如果总是出现奇怪的故障,也足以让用户抓狂。因此这一点要引起读者注意。所以,单片机的程序是不应该执行结束的,因此最后必然是一个死循环,这样才能保证单片机系统的可靠性。

总结

于是我们总结出通常情况下51单片机程序的几个特点:

1、包含REG52.H,该文件中定义了P0-P3接口等信息(sfr型和sbit型)。

2、单片机主函数没有参数,没有返回值(当然写成int型也不会报错,但是没必要)。

3、单片机主函数末尾会有个死循环,不会退出。

=======================================================

《单片机小白学步》系列教程(原名《单片机入门指南》)介绍

本系列教程从最基本的入门知识开始,逐步深入介绍单片机系统设计,内容包括:
1、入门篇:单片机等基本概念、各种电子设计基本知识
2、思想篇:单片机/计算机系统设计的工程思想
3、学习篇:单片机学习过程、方法和技巧,以51单片机为例介绍,并推广到其他单片机
4、应用篇:遵循规范的工程方法,设计单片机系统实例(计划设计的系统有:计算器、电子表、密码锁、简易手机,具体看有没有时间再确定)
5、原理篇:从模拟电路、数字电路开始,逐步深入介绍单片机/计算机系统原理,并自行设计简易的CPU(由于个人水平有限,这部分没有把握写好,具体内容视情况而定)

教程特点

1、技术知识点全面,从入门到精通

包含了各种基本知识,尤其是对单片机基本概念的介绍、为什么要用单片机等,在很多同类书籍教程中都被忽略了。同时也包含了一些深入的知识,包括原理篇考虑对单片机的基本原理进行介绍,有助于深入理解单片机。

本系列教程以51单片机为例进行介绍。通过51介绍完单片机的基本知识,我会再把430进行简要介绍,尤其是对比两者之间的优缺点,让大家很快感受到430的巨大优势,而学习51正好为快速了解430打下了坚实的基础。

2、除了单片机知识,还有思想、方法、技巧的介绍

本系列教程中,介绍单片机各种模块编程知识的主要是学习篇,而学习篇只是整个教程的一部分。在学习篇中我会贯穿各种方法技巧,如何理解一些模块功能,怎么看时序图,严格遵守工程思想进行编程,程序发生了错误怎么调试等等。而在思想篇中会总体介绍很多重要的思想,为后面的学习做好准备工作。

3、知识先后顺序的设计

单片机学习过程中,涉及大量的知识,而且很多知识之间相互依赖,关联很强。

本系列教程对知识的先后顺序进行比较明确的规划,尽最大可能符合人的认知过程。但是实际规划时发现,无论怎么调整知识的顺序,总有一些知识之间相互依赖,关系复杂。例如开始讲IO口的时候肯定会提到寄存器,而寄存器这个词的理解,需要深厚的背景知识。但是这些背景知识在没有进行实践的时候也很难理解。

初学者常常就会在这样的地方感觉疑惑不解,不知所措。而每次遇到类似这样的知识,我会向初学者指出,应该如何对待。这个知识是应该自己去学习补充,还是等到学完原理篇再做理解,而现在又应该怎么去看待这个名词。

另外,在整个教程的学习前,需要掌握一定的C语言等基础知识,具体可参考教程第〇篇《序》中的相关说明
http://www.hainter.com/mcu-primer-0

4、语言通俗易懂

本系列教程力求语言通俗易懂,而不会用一堆新手不懂的词语去解释另一个不懂的词语。但是受限于个人语言表达能力,可能有些地方表述的比较繁琐,或者不清楚,希望大家能够帮忙指出。

其他问题

如果觉得我写的对你有帮助,欢迎多多反馈,包括写的不正确、不合理、不太明白都可以指出来,这样方便我对其进行完善。

更多可参见:《如何以学习单片机为契机,逐步成为优秀的工程师》
http://www.hainter.com/mcu-engineer

本系列教程首发于我的个人主页,欢迎访问(由于是国外服务器,速度稍微有点慢):
http://www.hainter.com/category/hacker/mcu-primer

同时会将其转发到CSDN、电子发烧友等站点,欢迎关注。
CSDN专栏网址 http://blog.csdn.net/column/details/mcu-introduction.html
电子发烧友论坛 http://bbs.elecfans.com/zhuti_mcu_1.html

本文首发自我的个人主页, 转载请注明来源:http://www.hainter.com/mcu-primer-14

单片机小白学步系列(十四) 点亮第一个LED的程序分析相关推荐

  1. 单片机小白学步系列(四) 模拟电路、传统数字电路与单片机

    大家都用过计算器,有没有想过它是怎么实现的呢?这里我不详述计算器的原理,而只对思路进行简单介绍.等我们学会了单片机,也可以亲手制作一个计算器.通过电路进行数学计算,应该怎么做呢?为了便于理解,下面我举 ...

  2. 单片机小白学步系列(二十) IO口原理

    IO口操作是单片机实践中最基本最重要的一个知识,本篇花了比较长的篇幅介绍IO口的原理.也是查阅了不少资料,确保内容正确无误,花了很长时间写的.IO口原理原本需要涉及很多深入的知识,而这里尽最大可能做了 ...

  3. 单片机小白学步系列(十三) 点亮第一个LED——好的開始,成功的一半

    前面介绍了非常多概念知识.做了非常多准备工作,从这一节開始,我们正式開始单片机的学习.我们将使用单片机完毕一项非常easy的工作:点亮一个发光二极管(即LED:Light-Emitting Diode ...

  4. 单片机小白学步系列(十五) 单片机程序下载失败总结

    前面介绍了点亮第一个LED的全过程,很多人可能很幸运的点亮了LED,然而也很可能不少人非常不幸没有把程序下载进去.初学者常会遇到程序无法下载的情况,很多人在尝试多次未果后比较受打击,因此放弃了学习,实 ...

  5. 单片机小白学步系列(十六) 单片机/计算机系统概述:模块化思想

    截至目前,单片机入门篇的介绍就告一段落了.从本文开始将进入思想篇的学习. 思想篇对后面的具体知识学习进行整体的框架介绍,解释一些基础名词,以及对学习思想方法进行总结.思想篇的内容,对于后面的学习有很大 ...

  6. 单片机小白学步系列(十二) Proteus仿真软件简介

    Proteus软件是英国Labcenter electronics公司出版的EDA工具软件.常用于单片机等数字电路仿真,分为ISIS和ARES两个程序,前者用于仿真,后者用于设计PCB.我们常使用IS ...

  7. 单片机小白学步系列(十九) 单片机/计算机系统概述:扩展模块

    本篇简单介绍各种单片机外设模块,目前考虑不全,可能会在后期进一步修改完善. ==================================== 前面介绍的核心模块,是微机系统中比较重要甚至是必不 ...

  8. 单片机小白学步系列(十八) 单片机/计算机系统概述:通信接口与协议

    前面说了信息与数据的概念,这里要说的是与之关系密切的问题--通信. 通信 何为通信?在英文中,通信用Communication表示,这个词也有交流的意思.实际上,通信和交流确实是一样的意思.不过在汉语 ...

  9. 单片机小白学步系列(十) 单片机程序下载相关知识

    注:本篇在写<单片机入门指南系列>之前就已经写过,现在发现这篇比较合理的位置,应该是放在<单片机入门指南系列(六) 单片机最小系统--麻雀虽小,五脏俱全>之后的,但是由于之前考 ...

最新文章

  1. 如何用Jupyter Notebook制作新冠病毒疫情追踪器?
  2. mac mysql 链接_Mysql mac安装以及navicat链接
  3. 哈尔滨工业大学-数据库系统(基本知识与关系模型3)
  4. java打开文件(Windows exe,应用文件exe,以及其他任何格式的文件)
  5. Leetcode--923. 三数之和的多种可能
  6. 数据可视化系列(一):Matplotlib初相识
  7. btoa java_javascript atob()函数和 btoa()函数-Base64的编码与解码-Go语言中文社区
  8. css就近原则_CSS的引入方式和优先级
  9. 解决 OCS: No schema for XXX at xx index, context <Quirks> 警告
  10. 导线怎么用计算机平差,在计算机上实现导线网的自动条件平差
  11. 给电脑设置视力保护色
  12. STM32F103C8T6 I/O口驱动4位共阳数码管
  13. 信签纸有虚线怎么写_写观后感的信签纸格式
  14. py----Geany编辑器的安装_配置与使用
  15. package ‘gdm‘ has no installation candidate
  16. 利用Python将Word试卷匹配转换为Excel表格
  17. 软件测试搭建环境--在Linux安装MySQL(详细),精细整理
  18. 第一章:pycharm、anaconda、opencv、pytorch、tensorflow、paddlex等环境配置大全总结【图像处理py版本】
  19. Python - 在for循环体内修改i值
  20. 帝国理工计算机软件工程,帝国理工学院计算机软件工程理学硕士

热门文章

  1. JAVA基础学习笔记(2)
  2. u-boot懂你并不难
  3. 【object-c基础】Object-c基础之三:面对对象开发@interface,@implementation
  4. 通过IGRP路由协议实现非等值带宽的负载平衡
  5. python里、能用分支结构写出循环的算法吗_python变量运算符分支结构循环结构及例题...
  6. 绿米空调伴侣接入iobroker_普通空调用它变成互联网智能空调,你觉得怎么样?...
  7. Pytorch(四) --基于Pytorch实现线性回归
  8. 整数序列(牛客,线段树)
  9. mysql_sed_使用sed提取mysql备份的一行部分
  10. linux下启动solr命令,如何自动启动Solr?