单片机小白学步系列(十四) 点亮第一个LED的程序分析
本篇我们将分析上一篇所写的程序代码。未来学习单片机的大部分精力,我们也将放在程序代码的编写上。
可是不用操心。我会很具体的介绍每一个程序的编写思路和各种注意事项等。
之前我们写的程序例如以下:
#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、思想篇:单片机/计算机系统设计的project思想
3、学习篇:单片机学习过程、方法和技巧,以51单片机为例介绍,并推广到其它单片机
4、应用篇:遵循规范的project方法,设计单片机系统实例(计划设计的系统有:计算器、电子表、password锁、简易手机。详细看有没有时间再确定)
5、原理篇:从模拟电路、数字电路開始,逐步深入介绍单片机/计算机系统原理。并自行设计简易的CPU(因为个人水平有限,这部分没有把握写好,详细内容视情况而定)
教程特点
1、技术知识点全面,从入门到精通
包括了各种基本知识,尤其是对单片机基本概念的介绍、为什么要用单片机等,在非常多同类书籍教程中都被忽略了。同一时候也包括了一些深入的知识。包括原理篇考虑对单片机的基本原理进行介绍。有助于深入理解单片机。
本系列教程以51单片机为例进行介绍。通过51介绍完单片机的基本知识,我会再把430进行简要介绍,尤其是对照两者之间的优缺点,让大家非常快感受到430的巨大优势,而学习51正好为高速了解430打下了坚实的基础。
2、除了单片机知识,还有思想、方法、技巧的介绍
本系列教程中,介绍单片机各种模块编程知识的主要是学习篇。而学习篇仅仅是整个教程的一部分。在学习篇中我会贯穿各种方法技巧。怎样理解一些模块功能。怎么看时序图。严格遵守project思想进行编程。程序发生了错误怎么调试等等。而在思想篇中会整体介绍非常多重要的思想,为后面的学习做好准备工作。
3、知识先后顺序的设计
单片机学习过程中,涉及大量的知识,并且非常多知识之间相互依赖。关联非常强。
本系列教程对知识的先后顺序进行比較明白的规划,尽最大可能符合人的认知过程。
可是实际规划时发现,不管怎么调整知识的顺序,总有一些知识之间相互依赖,关系复杂。
比如開始讲IO口的时候肯定会提到寄存器,而寄存器这个词的理解,须要深厚的背景知识。可是这些背景知识在没有进行实践的时候也非常难理解。
刚開始学习的人经常就会在这种地方感觉疑惑不解,不知所措。而每次遇到类似这种知识。我会向刚開始学习的人指出,应该怎样对待。
这个知识是应该自己去学习补充,还是等到学完原理篇再做理解,而如今又应该怎么去看待这个名词。
另外,在整个教程的学习前,须要掌握一定的C语言等基础知识,详细可參考教程第〇篇《序》中的相关说明
http://www.hainter.com/mcu-primer-0
4、语言通俗易懂
本系列教程力求语言通俗易懂,而不会用一堆新手不懂的词语去解释还有一个不懂的词语。
可是受限于个人语言表达能力,可能有些地方表述的比較繁琐,或者不清楚,希望大家可以帮忙指出。
其它问题
假设认为我写的对你有帮助,欢迎多多反馈,包含写的不对、不合理、不太明确都能够指出来。这样方便我对其进行完好。
很多其它可參见:《怎样以学习单片机为契机,逐步成为优秀的project师》
http://www.hainter.com/mcu-engineer
本系列教程首发于我的个人主页,欢迎訪问(因为是国外server。速度略微有点慢):
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的程序分析的更多相关文章
- 单片机小白学步系列(二十) IO口原理
IO口操作是单片机实践中最基本最重要的一个知识,本篇花了比較长的篇幅介绍IO口的原理. 也是查阅了不少资料,确保内容正确无误,花了非常长时间写的. IO口原理原本须要涉及非常多深入的知识,而这里尽最大 ...
- 单片机小白学步系列(十三) 点亮第一个LED——好的開始,成功的一半
前面介绍了非常多概念知识.做了非常多准备工作,从这一节開始,我们正式開始单片机的学习.我们将使用单片机完毕一项非常easy的工作:点亮一个发光二极管(即LED:Light-Emitting Diode ...
- struts2官方 中文教程 系列十四:主题Theme
介绍 当您使用一个Struts 2标签时,例如 <s:select ..../> 在您的web页面中,Struts 2框架会生成HTML,它会显示外观并控制select控件的布局.样式和 ...
- 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 闯祸了,生成环境执行了DDL操作《死磕MySQL系列 十四》
由于业务随着时间不停的改变,起初的表结构设计已经满足不了如今的需求,这时你是不是想那就加字段呗!加字段也是个艺术活,接下来由本文的主人咔咔给你吹. 试想一下这个场景 事务A在执行一个非常大的查询 事务 ...
- MP实战系列(十四)之分页使用
MyBatis Plus的分页,有插件式的,也有其自带了,插件需要配置,说麻烦也不是特别麻烦,不过觉得现有的MyBatis Plus足以解决,就懒得配置插件了. MyBatis Plus的资料不算是太 ...
- ADO.NET学习系列(四)---窗体版的登录小程序
1.需求分析:做一个登录的小程序,基于Winform的窗体小程序.基本要求:登录成功:弹框显示登录成功,登录失败就弹框显示失败. 扩展功能:登录次数超过3次,就”锁定“用户,提示登录错误次数过多,不能 ...
- 树莓派GPIO点亮第一个led
代码如下: 注意:::::此时的GPIO口为18编号口而非GPIO18 import RPi.GPIO as GPIO //引入函数库 import time RPi.GPIO.setmode(GPI ...
- WPF入门教程系列十四——依赖属性(四)
六.依赖属性回调.验证及强制值 我们通过下面的这幅图,简单介绍一下WPF属性系统对依赖属性操作的基本步骤: 借用一个常见的图例,介绍一下WPF属性系统对依赖属性操作的基本步骤: 第一步,确定Base ...
随机推荐
- 浅谈html运行原理
浅谈HTML运行原理,所谓的HTML简单的来说就是一个网页,虽然第一节就讲html原理可能大家会听不懂,就当是给一个初步印象把,至少大概知道一个网页的运行流程是怎样的,下面上一张图: 大致的一个htm ...
- Visual C++ 6.0的界面介绍
双击Visual C++ 6.0安装目录下的文件启动Visual C++ 6.0,通过“文件”→“新建”可新建一个Win32 Console Application项目.创建好项目后,显示Visu ...
- KVO的使用及底层实现
1.概念 KVO(Key-Value-Observer)也就是观察者模式,是苹果提供的一套事件通知机制.允许对象监听另一个对象特定属性的改变,并在改变时接收到事件,一般继承自NSObject的对象都默 ...
- asp.net 正则表达式 得到图片url 得到汉字
//取图片 MatchCollection matchs = Regex.Matches(AskText,@"<img\s[^> ]*src=( ...
- React Native - 使用Geolocation进行定位(获取当前位置、监听位置变化)
1,getCurrentPosition()方法介绍 static getCurrentPosition(geo_success, geo_error?, geo_options? 该方法用于获取当前 ...
- ADB 命令和monkey
一.概要 1.什么是adb? adb全称为Android Debug Bridge,就是起到调试桥的作用.顾名思义,adb就是一个debug工具. 2.adb工作原理 不是很理解?那就来看看它的工作原 ...
- jmeter3.1 压测
压测目标:error 为0,线程起到250,服务器配置达到最大 一.Jmeter3.1 压测 JMeter3.1提供一个用于生成HTML页面格式图形化报告的扩展模块.该模块支持通过两种方式生成多维度图 ...
- ldap 禁止匿名登录(5)
[root@zabbix1 ~]# cat disable_anon.ldif dn: cn=config changetype: modify add: olcDisallows olcDisall ...
- javascript正则表达式总结(test|match|search|replace|split|exec)
test:测试string是否包含有匹配结果,包含返回true,不包含返回false. <script type="text/javascript"> var str ...
- vue监听页面大小变化重新刷新布局
在项目中由于某些div元素在布局的时候需要初始化宽高,因为当浏览器缩小屏幕的时候需要重新刷新页面视图. 分析思路: 1.在store中创建state,用于保存当前浏览器的宽.高值. 2.在mounte ...