电子工程师-单片机编程1_电子工程师博客-程序员宅基地

技术标签: stm32  51单片机  物联网  嵌入式硬件  嵌入式技术分享  mcu  单片机  单片机编程  

4.1 编程基础知识
4.1.1 指令和程序
        欲使单片机工作,必须给它“下命令”,这里的“命令”称作指令,单片机执行不同的指令就可以完成不同的操作。对于一些简单任务,单片机执行一两条指令就可以完成,而一些复杂的任务则需要执行很多条指令才能完成。能使单片机完成特定控制任务的指令集合称为程序。编写这些指令集合的过程称为程序设计。
        程序设计的过程就像是写文章,如果把程序比作文章,那么指令则是文章中的词语。要写好一篇文章,不但要了解词语的含义和用法,还要掌握将词语组合成文章的规则。同样,要设计单片机程序,除了要了解单片机指令的含义和用法外,还要掌握指令组合成程序的规则。

4.1.2 编程语言
        写相同内容的文章时,可以采用汉语,也可以采用英语,还可以采用阿拉伯语。同样,在进行单片机的程序设计时,也可以采用不同的语言。单片机常用的编程语言有机器语言、汇编语言和 C语言。
1.机器语言
        单片机是一种大规模的数字集成电路,它只能识别“0”和“1”这样的二进制代码。在早期的单片机开发过程中,人们用二进制代码编写程序,再把这些二进制代码程序写入单片机,单片机执行这些二进制代码程序就可完成相应的任务。

        用二进制代码编写的程序称为机器语言程序。在用机器语言编程时,不同的指令用不同的二进制代码代表,这种二进制代码构成的指令称为机器指令。在用机器语言编写程序时,由于需要记住大量二进制代码指令及这些代码代表的功能,很不方便且非常容易出错,所以
现在很少有人用机器语言编写程序。
2.汇编语言
        由于机器语言编程不方便,人们便用一些有意义且容易记忆的符号来表示不同的二进制代码指令,这些有意义且容易记忆的符号称为助记符。用有意义的助记符表示的指令称为汇编语言指令,用助记符编写出来的程序称为汇编语言程序。
下面的两行程序分别是机器语言程序和汇编语言程序:
01110100 00000010
MOV A, #02H
        这两行程序的功能是一样的,都是将二进制数据00000010送到累加器A中。可以看出,机器语言程序要比汇编语言程序难写,并且容易出错。
        单片机只能识别机器语言,所以汇编语言程序要先汇编(翻译)成机器语言程序,再写入单片机中。将汇编语言程序汇编成机器语言程序有手工汇编和软件汇编两种方式,手工汇编是指用人工的方法将汇编指令逐个翻译成机器指令,软件汇编是利用汇编软件(汇编器)
自动将汇编指令翻译成机器指令。
3.高级语言
        高级语言是一种近似于日常会话的语言,这些语言是依据数学语言而设计的,在用高级语言编程时不用过多考虑单片机的内部结构。与汇编语言相比,高级语言更易学、易懂,而且通用性很强。高级语言种类很多,如Basic语言、Pascal语言、C语言和Java语言等,单片
机常用C语言作为高级编程语言。

        单片机不能识别高级语言编写的程序,因此用高级语言编写完程序后,还要用编译器将高级语言程序翻译成机器语言程序,再写入单片机中。
        在上面3种编程语言中,高级语言编程较为方便,但实现相同的功能,汇编语言代码少,运行效率更高;另外对于初学者,学习汇编语言编程有利于更好地理解单片机的结构与原理,也能为以后学习高级语言编程打下扎实的基础。
4.1.3 汇编语言指令格式
要用汇编语言编写正确的程序,一定要了解汇编语言的指令格式。汇编语言的指令格式下:
[标号:]操作码(空格)[操作数1] [,操作数2] [,操作数3] [;注释]
下面是一条汇编语言指令:
MAIN:MOV P3,#FFH ;该指令的功能是将数据11111111(即FFH)送到P3端口
① 标号。用来标注指令的地址,一般由 1~8 个字母和数字组合而成,但必须以字母开头,以冒号“:”结束。上面的汇编语言指令中,标号是“MAIN:”。
② 操作码。用来规定指令的操作功能,一般由 2~5 个字母(英文单词或单词的缩写)组成。上面的汇编语言指令中,操作码是“MOV”。
③ 操作数。它是操作码的操作对象,操作数通过空格与操作码分开,在一条指令中可以有0~3个操作数,操作数之间用逗号“,”隔开。上面的汇编语言指令中,操作数是“P3, #0FFH”。

④ 注释。它是编程者对指令的说明,通常用来描述程序的功能。在编写一些大型的、复杂的程序时,对程序进行注释,有利于调试程序,使别人容易读懂程序,注释以分号“;”开始。
在汇编语言指令中,一定要有操作码,而“[ ]”中的内容根据情况可有可无。要注意的是,指令中的“:”、“,”、“;”为半角符号,应在输入法为英文状态时输入。
4.1.4 从实例了解单片机编程
        欲使单片机工作,就需要编写程序,再将程序写入单片机,单片机在程序的控制下工作以完成指定的任务。没有程序的控制,单片机就无法工作。那么如何编写单片机程序呢?
1.从一个实例初步了解编程
图4-1所示是一个边长为100m的正方形跑道,有一个人(称作甲)处于A点,如果要让甲到达B点,可以执行如下的程序:
起点 前进 50m
左转
前进 100m
左转
前进 50m
结束

甲逐条执行程序中的命令:先前进 50m,左转,然后前进100m,左转,再前进50m,结束,就可以到达B点。如果将上述程序改成:
起点 前进 50m
左转
前进 100m
左转
前进 50m
返回到 起点
结束
        甲执行上述程序中的命令时会怎样呢?当他执行到第5行命令时,会到达B点,接着执行第6行命令,该命令使他又返回到起点(标号),甲于是又会执行第1行指令……由于执行到第6行的指令时又会返回执行第1行的命令,永远执行不到结束命令,所以,如果甲执行上
述程序,就会不断在A、B点之间反复运动,不会停止。如果只要求甲在A、B点之间往返3次,上述程序应如何编写呢?读者可以思考一下,在后面的章节将会讲到这个问题。
2.分析一个单片机汇编语言程序

从前面的介绍初步了解了编程思想后,再来分析第3章用到的汇编语言程序,程序如下:
MAIN: MOV P3,#0FFH
LOOP: MOV P1,P3
LJMP LOOP
END
为了更好地理解上面的程序,下面对照图4-2所示的单片机应用电路来进行讲解。第1 行指令“MAIN:MOV P3,#0FFH”的含义是将数据
11111111(0FFH)送到P3 端口的8个寄存器,让P3端口的P3.0~P3.7这8个引脚全部为高电平。
“MAIN:”为标号,表示该行为主程序开始,这里也可省略,并不影响程序的运行;“MOV”为数据传送指令;“P3”表示单片机P3端口内部的8个寄存器;“#0FFH”中的“#”号表示它后面的“0FFH”是一个数据,而不是地址编号,“0FFH”是一个十六进制数,转换成二进制数就是11111111。
        该行指令运行后,图4-2中的单片机P3.0~P3.7这8个引脚内部的寄存器全部为高电平,相应的这8个引脚也为高电平。
        第2行指令“LOOP:MOV P1,P3”的含义是将P3端口8个寄存器中的数据送到P1端口的8个寄存器中。
        “LOOP:”为标号,用来标识指令“MOV P1,P3”,由于该标号后面的指令会被调用,所以不能省略。
        由于第1行指令已经让P3端口8个寄存器内的数据全部为“1”,执行“MOV P1,P3 ”指令后,P1端口8个寄存器内的数据也全部为“1”,单片机的P1.0~P1.7这8个引脚全部为高电平,故发光二极管VD1~VD4全部不亮。

        第 3 行指令“LJMP LOOP”的含义是返回执行标号LOOP所在行的指令。也就是说,当执行到该行指令后,又会返回去执行第2行指令“MOV P1,P3”,即不断将 P3 端口 8 个寄存器中的数据送到P1端口的8个寄存器中。
        第4行指令“END”的含义是程序结束。由于执行到第 3 行指令时会自动返回执行第 2行指令,所以无法执行到第4行指令,即程序无法结束。
        将上面的汇编语言程序汇编成机器语言程序并写入单片机后,在程序的控制下,单片机内部电路不断将P3端口8个寄存器中的数据送给P1端口的8个寄存器。
        图4-2所示的单片机应用电路的工作过程分析如下。

                                                图4-2 单片机应用电路
        在没有按下任何按键时,P3端口8个寄存器的数据都为“1”,所以P1端口8个寄存器的数据也为“1”,P1.0~P1.7这8个引脚都为高电平,发光二极管VD1~VD4全部不亮。

        若按下S1按键,P3.2引脚变为低电平,P3.2端口内部寄存器的数据变为“0”,P3.7~P3.0端口的数据分别为11111011,在第2条指令的控制下,这些数据被送到P1端口,P1.7~P1.0端口的数据分别为11111011,其中P1.2端口的数据为“0”,P1.2引脚为低电平,于是它外接的发光二极管VD1有电流通过而发光。

        若松开S1按键,P3.2引脚变为高电平,P3.2端口的“1”送到P1.2端口,P1.2引脚为高电平,其外接的发光二极管VD1截止而不亮。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43416206/article/details/134365153

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法