首页 单片机学习资料

单片机学习资料

举报
开通vip

单片机学习资料单片机学习资料 目录 第一课 单片机的概述和分类 第二课 单片机引脚功能介绍 第三课 单片机内部结构(一) 第四课 单片机内部结构(二) 第五课 单片机内部结构(三) 第六课 单片机内部结构(四) 第七课 单片机内部结构(五) 第八课 单片机内部结构(六) 第九课 单片机是如何工作的? 第十课 寻址是如何实现的, 第十一课 单片机的指令(一) 第十二课 单片机的指令(二) 第十三课 单片机的指令(三) 第十四课 单片机的指令(四) 第十五课 单片机的指令(五) 第十六课 单片机程序...

单片机学习资料
单片机学习资料 目录 第一课 单片机的概述和分类 第二课 单片机引脚功能介绍 第三课 单片机内部结构(一) 第四课 单片机内部结构(二) 第五课 单片机内部结构(三) 第六课 单片机内部结构(四) 第七课 单片机内部结构(五) 第八课 单片机内部结构(六) 第九课 单片机是如何工作的? 第十课 寻址是如何实现的, 第十一课 单片机的指令(一) 第十二课 单片机的指令(二) 第十三课 单片机的指令(三) 第十四课 单片机的指令(四) 第十五课 单片机的指令(五) 第十六课 单片机程序的 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 第十七课 单片机定时/计数器 第十八课 单片机的中断系统 第十九课 定时与中断实验一 第二十课 定时与中断实验二 第二十一课 键盘接口与编程一 第二十二课 键盘接口与编程二 第二十三课 数码管接口与编程 1 第二十四课 数码管接口与编程 2 课 第一课 单片机的概述和分类 一、单片机的概述 单片机,专业名称—Micro Controller Unit(微控制器件),它是由大名鼎鼎 的 INTEL 公司发明的,最早的系列是 MCS-48,后来有了 MCS-51,现在还有 MCS-96 系列 。 我们经常说的 51 系列单片机就是 MCS-51, 它是一种 8 位的单片机, 而 MCS-96 系列则是一种 16 位的单片机, 至于它们之间有何区别, 我们以后会讲到。 后来 INTEL 公司把它的核心技术转让给了世界上很多的小公司(不过,再小也有几个亿的销售/ 年哦),所以世界上就有许多公司生产51 系列兼容单片机,比如飞利浦的 87 LPC 系列,华邦的 W78L 系列,达拉斯的 DS87 系列,现代 GSM97 系列等等 。 目前在我国比较流行的就是美国ATMEL公司的89C51它是一种带Flash ROM 的单片机(至于什么是 Flash ROM,我在这儿先不作介绍,等以后大家学到相关的 知识时自然就会明白),我们的讲座就是以该型号的单片机来作实验的。讲到这里 , 也许有的人会问:我平时在各种书上看到全是讲解8031,8051 等型号的单片机,它 们又有什么不同呢,其实它们同属于一个系列,只是 89C51 的单片机更新型一点(事 实上,89C51目前正在用89S51代替, 我们的实验系统采用就是89S52的, 兼容89C52) 。 1 这里随便说一下,目前国内的单片机教材都是以 8051 为蓝本的,尽管其内核也是 51 系列的,但毕竟 8051 的单片机已经属于淘汰产品,在市场上也很少见到了,所以由 此感叹,国内的高等教育是如此的跟不上时代的发展需要~这话可能会引起很多人 的不满,所以大家千万别传出去哦~ 二(主要单片机的分类 再给大家介绍一下我们经常在各种刊物上看到的AVR系列和PIC系列单片机 是怎么回事,以便让大家对单片机的发展有一个较全面的认识。在没有学习单片机 之前, 这是一个令很多初学者非常困惑的问题, 这么多的单片机我该先学哪一种呢, AVR 系列单片机也是 ATMEL 公司生产的一种 8 位单片机,它采用的是一种 叫 RISC(精简指令集单片机)的结构,所以它的技术和 51 系列有所不同,开发设备 也和 51 系列是不通用的,它的一条指令的运行速度可以达到纳秒级(即每秒 1000000000 次),是 8 位单片机中的高端产品。由于它的出色性能,目前应用范围 越来越广,大有取代 51 系列的趋势,所以学完了 51 系列的,看来必须学会 AVR 的 才行,可叹知识爆炸,人生苦短。 说完了 AVR 的,再来说说另一种--PIC 系列单片机,它是美国 MICROCHIP 公 司,唉,又是老美,叫微芯公司的生产的另一种 8 位单片机,它采用的也是 RISC 的 指令集,它的指令系统和开发工具与 51 系列更是不同,但由于它的低价格和出色性 能,目前国内使用的人越来越多,国内也有很多的公司在推广它,不过它的影响力 远没有 51 系列的大,所以作为初学者,51 系列当然(不,绝对)是首选。 以上几种只是比较多见的系列,其实世界上还有许多的公司生产各种各样的 单片机,比如:MOTOROLA 的 MC68H 系列(老牌的单片机),TI 的 MSP430C 系列(极 低功耗的单片机),还有日本的 TOSHIBA,日立的 HITACH,德国的西门子 SIEMENS 等等,它们都有各自的结构体系,并不与 51 系列兼容。为了不搞大家的脑筋,这里 就不介绍了,等大家入门了以后自己再去研究它吧~现在我们还是回来了解一下51 系列单片机到底是个什么东西,它有那些部分组成,请接着往下看: 三(单片机的结构及组成 单片机到底是一种什么东东,它究竟能做什么呢,其实它就是一种能进行数 学和逻辑运算,根据不同使用对象完成不同控制任务的面向控制而设计的集成电 路 。 此话好象有点绕口,没关系,大家都应该知道我们经常使用的电脑吧,在电脑上, 我们可以用不同的软件在相同的硬件上实现不同的工作。 比如我们用 WORD 可以打字 , 用 PROTEL 可以设计图纸等等,单片机其实也是如此,同样的芯片可以根 据他不同 的要求做出截然不同的产品,只不过电脑是面向应用的,而单片机是面向控制的, 比如控制一个指示灯的亮和灭,控制一台电机的启动和停止等等。 那么它的内部究竟由哪些部件组成的呢,大家都知道我们的电脑有很多的 零件,比如 CPU(中央处理),RAM(内存),ROM(程序存储器),输入输出设备(并 行串行口)等等,在单片机中这些部件都有,而且还把它们全部做到了一块芯片上 (这就是单片机名称的由来)。 讲到这里,您一定会想,这么多零件集成在一块芯片上,那为什么单片机的价 格会这么便宜(89S51 每块才 10 元左右),其实原因很简单----功能有强弱,就象 我们平时用的 PLC,控制一台数控机床要用 128 点的,而控制一台电机有几点的就足 够了,另外这种芯片的产量很大,技术也非常的成熟,自然价格也就很低了。那么 2 单片机是如何来工作的,我们学习单片机又需要做哪些准备呢,对于一个初学者来 说这是很有必要了解的: 四(学习单片机的准备工作 首先您需要一台电脑,这是最基本的,配置嘛,P2 以上的就可以了;然后您需 要一套开发单片机的软件,这个软件叫KEIL C51,它是美国 Keil Software 公司专 门为 MCS-51 系列单片机开发的第三方软件,最新版本是V7.09,安装时选择 Uvision2,虽然有 2K 代码的限制,但足以满足我们学习的需要; 其次,您还需要一台编程器,它一种把程序写进单片机芯片的设备,这种 设备品种很多,操作也很简单,大家既可以买现成的产品(价格从200 多元到 2000 多元的都有),也可以自己制作;有了这两样东西还不行,为了看到程序执行的结 果,我们还需要一块实验板。 好在现在出现了一种支持在线下载的单片机,只要满足一定的外部条件 , 就能够直接把汇编的程序下载到目标单片机中。经过反复的实验,我们开发设计了 这样的一套实验系统,它采用了一套集源代码编辑、软件汇编、程序下载于一体的 专业软件,采用具有在线下载功能的 FLASH ROM 单片机 89S52,配合本教程,可以 完成教程中的每一个实验。这样既免去了您添置编程器和仿真器等设备的昂贵费用 , 又可以直接在实验板上看到程序执行的结果,更由于采用的是FLASH ROM 的存储 器,烧写次数可以达到 1000 次以上。 第二课 单片机引脚功能介绍 1(VCC(40):电源+5V。 2(VSS(20):接地,也就是 GND。 3(XTL1(19)和 XTL2(18):振荡电路。 单片机是一种时序电路,必须有脉冲信号才能工作,在它的内部有一个时钟产 生电路,有两种振荡方式,一种是内部振荡方式,只要接上两个电容和一个晶振即 可; 另一种是外部振荡方式, 采用外部振荡方式时, 需在 XTL2 上加外部时钟信号 (详 细的内容将在以后的课程中专门介绍)。 4(PSEN(29):片外 ROM 选通信号,低电平有效。 5(ALE/PROG(30):地址锁存信号输出端/EPROM 编程脉冲输入端。 6(RST/VPD(9):复位信号输入端/备用电源输入端。什么是复位信号,为什么要 加复位信号,当然也暂时不去管它。 7(EA/VPP(31):内/外部 ROM 选择端。在 30、9 脚的功能上不知大家注意没有, 都有一个/,什么意思呢,这是引脚的第二功能,也就是说,该引脚既可以作前面的 功能,也可以作后面的功能,至于它是如何工作的,我们暂时也别去研 究。 8(P0 口(39-32):双向 I/O 口。9(P1 口(1-8):准双向通用 I/0 口。 10( P2 口(21-28):准双向 I/0 口。11(P3 口(10-17):多用途口。I/O 就是英 文 IN/OUT 的缩写,这些引脚的功能想必大家也都明白了,(就是输入/输出的意思),这 32 个 I/O 口就是留给我们作连接外围电路用的,那么它们之间有些什么不同呢,这个 问题稍微有点复杂。 二、单片机的电路连接和开发过程 单片机是如何工作的,我们的实验是让一个LED 灯亮起来,亮哪一个,这就随便你 3 了,比如我们就让 LED1 亮起来吧,仔细看一下电路图,LED1 接在什么地方呢, 接在单片机的 P1.0 的引脚(也就是 1 脚)上,那么按照该电路图的连接方 法,当 1 脚为高电平时,LED1 是不亮的;只有当 1 脚为低电平时,LED1 才会亮起来 , 怎样才能让 1 脚由高电平变为低电平呢,我们让人做事,就必须对她说一声,也就 是发布命令,想让单片机工作,也得发布命令,不过在计算机中那叫指令,我们要 让 1 脚变为低电平的指令是 CLR P1.0 (让 1 脚变为高电平的指令是 SETB P1.0) , 这就是我们通常所说的源代码。(这是我们开发产品的第一步—源代码编辑) 怎么做呢,我们首先得打开实验软件,屏幕出现一个浏览器的软件窗口,点 击左边的扩展实验,选中实验 16—自动温度控制器,再点击工具栏里的调试按钮, 弹出一个记事本对话框,写入 CLR P1.0; 输入完毕后选择文件?保存即可;那么单片机能读懂这条指令吗,当然不 能。 接下来我们还有一件事情要做,就是把这句指令翻译成单片机能读懂的东 西, 单片机能读懂什么呢,它其实只懂一样--就是数字, 因此, 我们就把 CLR P1.0 翻译成 C2H,90H,至于为什么要翻译成这样,这当然是 INTEL 公司规定好的,我们就 不需要去研究它了。这个过程我们叫作编译,(这是我们开发产品的第二步) 那么指令是怎么译过来的呢,这就得靠专业的软件了,我们做实验使用的软 件就有此功能,只要点击工具栏上的编译按钮,稍等片刻即出现一个编译信息窗口 , 如果编译通过就会有编译完成,结果如下:0 个警告,0 个错误的编译信息,如果编 译错误则会出现编译错误的信息,并提示错误的行号;编译完了之后通常要进行程 序仿真(这是第三步,当然我们的实验程序很简单是不需要仿真的; 接下来怎么才能把编译通过的指令写入单片机中呢,这通常需要借助于一 种硬件工具,叫编程器(也叫烧录器),不过我们的实验板采用的是具有串行下载 功能的单片机,所以您只要直接点击快捷工具栏上的下载按钮,程序就进入了实验 (这是第四步—编程)。自此就完成了单片机开发的全过程。全部工作结束后,我 们看到了什么,接 P1.0(1 脚)的 LED1 亮了起来; 改变源代码,变成 SETB P1.0;进行编译,下载,看看结果是不是 LED1 不亮了。 第三课 单片机内部结构(一) 单片机的内部究竟有哪些部分组成的,它们都有些什么作用呢,让我们先来了解其 中的 ROM 存储器: 一(半导体存储器 ROM 1(几个基本概念 上一课我们讲到了把编译后的指令下载到单片机后这条指令一定在单片机内 的某个地方,那么它究竟在哪里呢,原来它就放在一个叫程序存储器的地方,英文 名称 ROM(全称为 Read Only Memory),叫只读存储器。它是一个什么东西呢,在 讨论这个问题之前,让我们先来看几个物理现象:(1)数和物理现象的关系 不知 大家是否还记得,在学习数字电路时我们曾用一盏灯的亮和灭来表示电平的高和低 , 即用“1”来表示高电平,用“0”来表示低电平,如果现在有两盏灯那它会有几种 状态呢, 0 0 0 1 1 0 1 1 两盏灯的组合就是四种状态:00,01,10,11。如此看来灯的亮 和灭这种物理现象同数字确实有着某种联系,如果我们把它们按一定的规律排列好 , 那么电平的高或低就可以用数字来表了,换句话说:不同的数字可以代表不同数量 4 灯的电平高或低。比如: 0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011 , 1100,1101,1110,1111 这十六种组合就可以代表四盏灯的状态,能理解吗, (2)位及字节的含义 在单片机中,一盏灯(实际上是一根线)我们称它为一位,它有两种状态 (“0”或“1”),分别应电平的高或低,它是单片机最基本的数量单位,用BIT 来表示。8 盏灯(八根线)有 256 种状态,这 8 盏灯(也就是 8 位)我们把它称为一 个字节,用 BYTE 表示。至于为什么要怎么规定,这就不需要你我操心了,我们只要 记住就可以了。那么单片机是如何来储存这些数字所代表的字节的状态的呢,接着 往下看: 2(半导体存储器的工作原理 存储器就是用来存放数据的地方,它其实是利用电平的高或低来存放数据 的,也就是说,它实际上存放的是电平的高或低的状态,而不是我们所习惯上认为 的“1234”这样的数字。那它是如何工作的呢,一个存储器就象一个小抽屉,一个 小抽屉里有 8 个小盒子每个小盒子用来存放 1 位“电荷”,电荷通过与它相连的电 线传进来或释放掉,至于电荷在小盒子里是怎样存放的,这就不用我们操心了,您 可以把电线想象成水管,小盒子里的电荷就象是水,那就好理解了存储器中的1 个 小抽屉我们把它称之为 1 个“单元”,相当于 1 个字节,而 1 个小盒子就相当于 1 位。 有了这么一个构造,我们就可以开始存放数据了,比如我们要放进一个数 据“00011010”,我们只要把第 2 号、第 4 号和第 5 号小盒子里存满电荷,而其它 小盒子里的电荷给放掉就行了。可是问题又出来了,一个存储器有好多相同的单元 , 线是并联着的(看 D7-D0),在放入电荷的时候,会将电荷放入所有的字节单元中 , 而释放电荷的时候,会把每个单元中的电荷都放掉,这样的话,不管存储器有多少 个字节单元,都只能放同一个数,这当然不是我们所希望的。 因此,我们要在结构上稍作变化,看上面的图,在每个单元上有根线与译码 器相连,我想要把数据放进哪个单元,就通过译码器给哪个单元发一个信号,由译 码器的通过这根线把相应的开关打开,这样电荷就可以自由地进出了。那么这样是 不是就能随意地向存储器写入或者读出数据了呢,其实还不能,当我们向存储器写 入数据时,必须先把这个开关切换到写入端;而要读出数据时,就得先把开关切换 到读出端;而片选端则是为了区分不同的存储器设置的。 3(半导体存储器的译码 简单介绍一下:我们知道,1 根线可以代表 2 种状态;2 根线可以代表 4 种状态;3 根线可以代表 8 种;256 种状态又需要几根线代表,8 根线,所以一片 6264 存储器 我们只需要 16 根线就可以了。 4(存储器的选片及总线的概念 至此,译码的问题解决了,让我们再来关注另外一 个问题:送入每个字节的 8 根线又是从什么地方来的呢,它就是从单片机的外部引 脚上接过来的,一般这 8 根线除了接一个存储器之外,还要接其它的器件,这样问 题又出来了,这 8 根线既然不是存储器和单片机之间专用的,如果总是将某个单元 接在这 8 根线上,就不行了,比如这个存储器单元中的数值是“FFH”,另一个存储 器的单元是“00H”,那么这根线到底是处于高电平,还是低电平,岂不是要打架看 谁历害了,所以我们必须让它们分离。 5 办法当然也简单,当外面的线接到集成电路的引脚上来后,不直接接到各单 元去,中间再加一组开关就行了。这组开关就是前面提到的控制器(看前面的图) , 平时我们让开关打开着,如果确实是要向这个存储器中写入数据,或要从存储器中 读出数据,再让开关切换到相应的位置就行了。这组开关由三根引线选择读控制端 、 写控制端和片选端,要将数据写入,先由控制器选中该片,然后发出相应的写信号 , 开关切换到相应的位置,并将传过来的数据(电荷)写入片中;如果要读信号,先 选中该片,然后发出读信号,开关也切换到相应的位置上,数据就被送出去了;另 外读和写信号还同时受到译码器的控制,由于选端的不同,所以虽有读或写信号, 但没有片选信号,所以另一个存储器就不会“误会”而开门,造成冲突,那么会不 会同时选中两个存储器呢,只要是设计好的系统就不会,因为它是由计算机来控制 的,如果真的出现同时选中两个存储器的话,那就是电路出故障了。 如此看来,存储器要想写入或者读出数据还真是不简单,不过好在这些都是 由计算机自动完成的,不需要我们去操心。从上面的介绍中我们已经看到,用来传 递数据的 8 根线(51 单片机是 8 根)并不是专用的,而是很多器件大家共用的,所 以我们把它们称之为数据总线(总线英文名为BUS),即公交道,谁都可以走;而 16 根地址线(51 单片机共有 16 根地址线,这些以后会讲解,这里不必死记硬背) 也是连在一起的,我们把它们称之为地址总线, 5(半导体存储器的分类 第一课中我们提到过,89C51 是一种带 Flash ROM 的单片机,什么是 Flash ROM,它 到底是一种什么东西呢,ROM 我们已经知道,是只读存储器,所谓只读,从字面上理 解那就是只可以从里面读出数据,而不能写进去,它类似于我们的书本,发到我们 手里之后,我们只能读里面的内容,不可以随意更改书本上的内容。ROM 就是单片机 中用来存放程序的地方,前面我们下载到单片机的指令就放在这个地方。讲到这里 大家也许会感到困惑,既然 ROM 是只读存储器,那么指令又是如何进入其中的呢, 其实所谓的只读只是针对正常工作情况下而言,也就是在使用这块存储器的时候, 而不是指制造这块芯片的时候,只要让存储器满足一定的条件就能把数据预先写进 去,这个道理也很好理解,书本拿到我们手里是不能改了,但当它还是原材料--白 纸的时候,我们完全可以由印刷厂把内容印上去嘛。前面的编程就是这么回事~ Flash ROM 是一种快速存储式只读存储器,这种程序存储器的特点就是既可 以电擦写,而且掉电后程序还能保存,编程寿命可以达到几千至几万次,所以我们 的实验系统是可以反复烧写的,您尽管使用。目前新型的单片机都采用这种程序存 储器;当然,除了这种程序存储器外,还有两种早期的程序存储器产品,简单介绍 一下:PROM EPROM 和 EEPROM,PROM 称之为可编程只读存储器,就象我们的练习本 , 买来的时候是空白的,可以写东西上去,可一旦写上去,就擦不掉了,所以它只能 写一次,要是写错了,就报废了,习惯上我们把带这种程序存储器的单片机称为OTP 型单片机,如果您的产品批量生产,又要求价格比较低的话,带这种程序存储器的 单片机是非常合适的; EPROM,称之为紫外线擦除的可编程只读存储器,它里面的内容写上去之后 , 如果觉得不满意,可以用一种特殊的方法去掉后重写,就是用紫外线照射,紫外线 就象“消字灵”,可以把字去掉,然后再重写,当然消的次数多了,也就不灵光了 , 所以这种芯片可以擦除的次数也是有限的——几百次吧,电脑上的 BIOS 芯片采用的 就是这种结构的存储器;EEPROM,前一种存储器的擦写要用紫外线,而这种存储器 6 可以直接用电擦写,比较方便数据的改写,它有点类似于 FLASH 存储器,但比 FLASH 存储器速度要慢,现在新型的外部扩展存储器都是都是这种结构。 了解了 ROM,让我们再来简单讲讲另一种存储器,叫随机存取存储器,也叫内 存,英文缩写为 RAM(Random Access Memory),它是一种既可以随时改写,也可以 随时读出里面数据的存储器,类似于我们上课用的黑板,可以随时写东西上去,也 可以用黑板擦随时擦掉重写,它也是单片机中重要的组成部分,单片机中有很多的 功能寄存器都与它有关。 二(本课总结 本课主要讲述了单片机的两种半导体存储器—只读存储器 ROM 和随机存储器 RAM 的工作原理,它们是单片机的重要组成部分,了解它的内部结构对我们学习单片机 是很有帮助的。不过如果您一时对本课的内容还无法搞得很明白,也没有关系,随 着学习的深入,我们还会慢慢地讲解相应的基础知识,可千万不要放弃哟,我在没 有学会单片机之前也是如此囫囵吞枣的。 第四课 单片机内部结构(二) 一(LED 灯闪烁的实验程序 我们要让 LED1 不断的闪烁,就象大海中用的航标灯。怎样才能让LED1 不断的闪烁 呢,实际上就是让它亮几秒, 再灭几秒, 也就是让 P1.0 交替地输出高电平或低电平 , 按照前面所学的知识,我们写出下面的程序: CLR P1.0;SETB P1.0;编译后下载到单片机, 这里有两个问题:首先计算机执行指令的速度很快,执行完第 1 条指令后 LED1 是灭 了,但在极短的时间内又去执行第 2 条指令,LED1 又亮了,我们根本无法看到灯曾 经灭过;第二个问题是当执行完第 2 条指令后,不会再去执行第 1 条指令了,因为 单片机执行指令的过程是一条一条地顺序执行的。 如何解决这两个问题呢,我们可以作如下的设想: 第一,执行完第 1 条指令后让单片机延时一段时间(几秒或零点几秒),然后再去 执行第 2 条指令,这样就可以看到 LED1 曾经灭过了; 第二,让单片机执行完全部指令后再返回去执行第1 条指令,如此不断的循环就可 以达到我们的要求了。 实验程序如下: 主程序 MAIN:SETB P1.0 ;(,) LCALL DELAY ;(,) CLR P1.0 ;(,) LCALL DELAY ;(,) LJMP MAIN ;(,) 子程序 DELAY:MOV R7,#250 ;(,) D1:MOV R6,#250 ;(,) D2:DJNZ R6,D2 ;(,) DJNZ R7,D1 ;(,) RET ;(,,) END .(,,) 7 还记得软件的使用方法吗,调试,写入源代码,编译,下载到单片机,看看是不是 我们想要的结果?? 在分析这段程序之前,先来说明几个标点符号的意义: 1.分号在这里起一个分隔符的作用,表示这条指令到此为止; 2.括号内的数字在这里是为了解释程序用的,实际的编译过程中是没有意义的,也 就是说没有也是一样的,只是为了程序的可读性更强,我们一般会在分号的后面加 上程序的注释文字(后面我们会用到); 3.特别:程序中的标点符号只能在英文状态下输入,当使用中文输入时,必须切换 到半角状态,不然编译软件会出错。接下来我们分析一下这段程序:按照我们的要 求,第 1 条,让灯灭,第 2 条应该是延时,第 3 条是让灯亮,第 4 条和第 2 条一样 也应该是延时,第 5 条应当返回去执行第 1 条指令。 看一下上面的程序,第 1 条我们已经懂了,是让 LED1 灭,第 2 条和第 4 条 我们等一下讨论,第 5 条是 LJMP MAIN,LJMP 是一条指令,意思是转移,转移到什 么地方去呢,看一下 LJMP 后面跟着什,是 MAIN,什么地方有 MAIN,在第 1 条指令 的开头就是 MAIN,所以第 5 条指令的意思就是跳转到 MAIN(即第 1 条指令处继续执 行),如此一来,就不断地重复执行这些指令。 那么 MAIN 又是什么意思呢,它实际上是我们为这段程序起的一个名称,专 业术语叫标号,既然是一个名称那可不可以用 mcu,CHINA 等等的其他名字呢,当然 可以,这完全取决于您的需要(?:不过也有一些是不能采用的,我们以后再讲) 。 再来分析第 2 条和第 4 条指令,看看它们是如何实现延时的, LCALL DELAY,LCALL 也是一条指令,这条指令叫做调用子程序指令,看看 LCALL 后面跟着的是什么--DELAY,哪里有 DELAY,在第 6 条指令的开头,很显然这 也是一个标号,这条指令的作用就是当执行到这条指令时就转去执行LCALL 后面标 号所在处的程序,如果在执行程序时遇到RET 指令(RET 叫返回指令),就返回到 LCALL 指令的下面一条(即第 3 条指令)处继续执行,在第 9 条指令后确实有 RET 指 令,那么在执完第 2 条指令后就应该去执行第 6.7.8.9 条指令,之后遇到第 10 条指 令:RET,执行完这条指令后就回去执行第 3 条指令,将 P1.0 清零,也就是让 LED1 亮,然后再去执行第 4 条指令,执行完后又回到 6.7.8.9.10 条指令,最后执行第 5 条指令:LJMP MAIN,也就是我们刚才说的跳转到第 1 条, 将 P1.0 置位,就是 LED1 灭掉。如此周而复始,LED1 就不断的闪烁。好好理解这段文字,务必把它搞清楚~~ ~ 从标号 DELAY 处(即第 6 条)开始到 RET 的这一段指令我们称之为子程序 , 它是一段延时程序,至于延时多长时间,我们会在以后的课程中学习。程序的最后 一条是 END,它不是指令,它只是告诉编译软件整个程序到此结束了,它叫“伪指 令”。在大家以后的编程中,写完程序都要加上这一条。 在上面的程序中我们知道了从标号 DELAY 开始的子程序是一段延时程序 , 那么它又是如何工作的呢,在了解它的工作过程之前我们必须先知道其中的一些符 号,就从 R7 开始吧,它是单片机内部的一个重要组成部分,叫工作寄存器,什么是 工作寄存器,下面我们就来讲解这个问题: 二(工作寄存器 上一课我们已经讲过,在单片机中有许多的功能寄存器和半导体存储器RAM 有关, 那么工作寄存器又属于哪一部分呢,它是用来干什么的呢,要搞清楚这个问题,让 8 我们先从日常生活中的一个例子说起,如我们要做一道数学题 123+456,您会马上得 出答案:579,接下来再看一道题: 123+456+789,要你马上得出答案就不那么容易了,通常我们会怎么做呢,一般总是 先把 123+456 的结果 579 写在一张纸上,然后再算 579+789=1368,这 1368 就是我们想要的最终结果, 而 579 只是为了得到最终结果而暂时记下来的中间结果, 单片机中做运算和我们生活中 做运算一样,也需要把中间结果放在某个地方,那么计算机把它放在哪儿呢,前面 我们提到的 ROM(只读存储器)中,不行~因为 ROM 是用来存放程序的,它只能写进 去,能读出来(再次提醒一下,这只是相对而已),所以只能放在单片机的另一个 区域—RAM 中(即随机存取存储器)中。R7 就是 RAM 区域中划出的一部分。知道了 R7,接下来让我们来分析一下这段子程序(延时程序)。 三(LED 灯闪烁程序子程序的分析 首先看第 6 条,MOV R7,#250,这也是一条指令,意思是传递数据。我们知道在日 常生活中,要传递一件东西就必须要有一个传递者,一个接受者和被传递的东西, 那么在单片机中是怎么区分它们的呢,在这条指令中,R7 是接受者,250 就是要传 递的东西(单片机中要传递的东西当然是数字了),这里传递者被省略了(顺便提 一下,并不是每条指令都能省略的,事实上大部分的指令都要有传递者),这样一 来,这条指令的意思也很清楚了:就是把 250 这个数传递给 R7 这个工作寄存器(也 就是把 250 个数送入 R7 中),这样执行完这条指令后 R7 中的值就应该是 250,我们 可以用 DUBG8051 这个软件来验证一下,看是不是符合。讲到这里,不知大家注意没 有,在 250 这个数的前面有个#,它是什么意思呢,这个#就说明 250 是一个被传递 的数的本身,而不是传递者。看懂了MOV R7,#250,那么 MOV R6,#250 也应该很清 楚了。 接着看第 8 条 DJNZ R6,D2,这又是另一条指令,我们来看一下 DJNZ 后面跟 着什么,一个是 R6,一个是 D2,R6 我们已经知道了,再找一下 D2,D2 在本行的开 头,我们已经学过,它是标号。那么这条指令是怎么执行的呢,它的执行过程是这 样的:它将后面的值(即工作寄存器R6 中的值)减 1,然后查一下这个值是否等于 “0”, 如果等于“0”就往下执行, 如果不等于“0”就转移, 转移到什么地方去呢, 大家应该明白了,实际上这条指令的执行结果就是在原地转250 次;当 R6 中的值等 于“0”之后,程序就去执行第 9 条指令,也就是 DJNZ R7,D1,大家自行分析一下 这条指令的结果(是不是转去执行 MOV R6,#250,同时 R7 中的值减 1),这段子程 序的最终执行结果就是 DJNZ R6,#250 这条指令被 16 执行了 250*250=62500 次, 执行这么多次干吗,就是为了延时。 课 第五课 单片机内部结构(三) 1(时序的由来 已经知道单片机执行指令的过程就是顺序地从ROM(程序存储器)中取出指令一条 一条的顺序执行,然后进行一系列的微操作控制,来完成各种指定的动作。它在协 调内部的各种动作时必须要有一定的顺序,换句话说,就是这一系列微操作控制信 号在时间上要有一个严格的先后次序,这种次序就是单片机的时序。就好比学校上 课时用的电铃,为了保证课堂秩序,学校就必须在铃声的统一协调下安排各个课程 和活动。那么单片机的时序是如何规定的呢,接着往下看: 2(时序的周期 9 计算机每访问一次存储器的时间,我们把它称为一个机器周期,它是一个时间基准 , 就象我们日常生活中使用的秒一样,计算机中一个机器周期包括12 个振荡周期, 什 么是振荡周期,一个振荡周期是多少时间,振荡周期就是振荡源的周期,也就是我 们使用的晶振的时间周期,一个 12M 的晶振,它的时间周期是多少,如果电子技术 学得好的朋友应该不难算出(T=1/f) ,也就是 1/12 (微秒) ,那么使用 12M 晶振的 单片机,它的一个机器周期就应该等于12*1/12(微秒) ,也就是 1μS。 在 MCS-51 系列单片机中,有些指令只要一个机器周期,而有些指令则需要两个或 三个机器周期,另外还有两条指令需要4 个机器周期,这也不难理解,你在家擦地 板的话总比擦桌子的时间要长,不过我可是大男子主义,从来不做家务的。开句玩 笑~ ~ ~如何衡量指令执行时间的长短,我们就要用到一个新的概念:指令周期—即 执行一条指令所需的机器周期,INTEL 公司规定了每一条指令执行的机器周期,当 然这不需要我们非把它记住,不过在这里DJNZ 指令我们是要记住的,它是双周期 指令,执行一次需要两个机器周期,即 2μS。 (12M 晶振的话) ,回到我们上一课的 实验,延时的时间就应该算出来了吧,是 62500*2μS=125000μS,也就是 125mS 。 这么大的数字也就 0.125S,怪不得 LED1 闪烁的这么快。二(单片机的时钟电路, 单片机是在一定的时序控制下工作的,那么时序和时钟又有什么关系呢,时钟是时 序的基础,单片机本身就如同一个复杂的同步时序电路,为了保证同步工作方式的 实现,电路就要在唯一的时钟信号控制下按时序进行工作。那么单片机内的时钟是 如何产生的呢, 1( 内部时钟电路 在 MCS-51 单片机的内部有一个高增益的反相放大器, 其输入端为引脚 XTL1 (19) , 输出端为 XTL2 我们只要在外部接上两个电容和一个晶振,就能构成一个稳定的自激振荡器,它的 内部电路的工作原理就不介绍了,这里主要讲一下电容和晶振的选择,看上面的图 , 晶振的大小与单片机的振荡频率有关,我们到串行接口时再详细讲解,电容的大小 影响着振荡器振荡的稳定性和起振的快速性,通常选择 10-30P 的瓷片电容或校正电 容;另外在设计电路时,晶振和电容应尽可能的靠近芯片,以减少 PCB 板的分布电 容保证振荡器振荡工作的稳定性,提高系统的抗干扰能力 2( 外部时钟电路 除了内部时钟方式外,单片机还可以采用外部引入时钟的振荡方式,什么时候需要 采用外部时钟方式呢,当我们的系统由多片单片机组成时,为了保证各单片机之间 时钟信号的同步,就应当引入唯一的公用的外部脉冲信号作为各单片机的振荡脉冲 , 此时应将 XTAL2 悬空不用,外部脉冲信号由 XTAL1 引入,如上右图所示,外部信 号的高低电平持续时间应大于 20, S 课 第六课 单片机内部结构(四) 一(单片机 I/O 口的输出实验 1(实验程序如下: LOOP:MOV P1,#0FFH ; LCALL DELAY ; MOV P1,#00H ; LCALL DELAY ; 10 LJMP LOOP ; 调试,写入源代码,编译,下载,看到了什么,8 只 LED 灯都在闪烁(注意:前面 的实验是让一个 LED 灯闪烁),分析一下程序: 2(程序分析 这段程序和前面的程序比较,有两处不同,第1 条,原来是 SETB P1.0,现在改为 MOV P1,#0FFH, 第 3 条,原来是 CLR P1 ,现在改为 MOV P1,#00H 。为什么这样改了之后就变 成了 8 只 LED 灯同时闪烁了,原来 P1 代表了 P1.7-P1.0 的全部,我们把它当作一 个存储器单元(即一个字节),不过对一个存储器单元送数就应该用MOV 指令了; 在这里 P1(P1.7-P1.0 )接的是 LED 灯(也就是负载),它起到了一个输出端的作 用。那如果把 P1 改为 P2 或 P3 或 P4 行不行呢,答案是肯定的,为什么,我们稍 后再谈,接着看第 2 个实验。 由上面两个实验我们得出结论,凡是以 P 开头的管脚都可以用作输入输出口,在 89C51 中这 32 个管脚我们就称之为并行口。它们实际上就是特殊功能存储器 SFR (什么是特殊功能寄存器,我们后面再讲)中的四个,记作P0,P1,P2,P3,它们 都是双向通道,即既可以作为输出口,也可以作为输入口,作输出时数据可以锁存 , 作输入时数据可以缓冲,那么它们是怎么实现输入输出功能的呢,继续往下看。 三(单片机并行口的结构分析先来看看输入结构: 1(输入结构 I/O 口作为输入口时有两种工作方式,即所谓的读端口与读引脚。读端口时实际上 并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或 变换后再写回到端口锁存器。比如取反,置位,清零等等指令;而读端口时才真正 地把外部的数据读入到内部总线, 图中的两个三角形表示的就是输入缓冲器, CPU 将 根据不同的指令,分别发出“读端口”或“读引脚”信号,以完成不同的操作,这 是硬件自动完成的,不需要我们操心。 读引脚时,也就是把端口作为外部输入线时,首先要通过外部指令把端口锁存器置 “1”,然后再实行读引脚操作,否则就可能读入出错。为什么,看上面的图,如果 不对端口置“1”,端口锁存器原来的状态有可能为“0”(Q 端为 0,Q^为 1)加到 场效应管栅极的信号为“1”,该场效应管就导通,对地呈现低阻抗,此时即使引脚 上输入的信号为“1”,也会因端口的低阻抗而使信号变低,使得外加的“1”信号 读入后不一定是“1”,若先执行置“1”操作,则可以使场效应管截止,引脚信号 直接加到三态缓冲器中,实现正确的读入。由于在输入操作时还必须附加一个准备 动作,所以这类 I/O 口被称为“准双向”口,MCS-51 的 P0,P1,P2,P3 口作为输 入/输出口时都是“准双向”口。接下来让我们再看另一个问题,从图中可以看出 , 这四个端口还有一个差别,除了 P1 口外,P0,P2,P3 口都还有第二功能,这些第 二功能又是作什么用的呢, 2(端口的工作原理(1)。P0 口 先来看 P0 口,从图中可以看到,P0 口的内部有一个 2 选 1 的选择器,受内部信号 的控制,如果在图中的位置则处在 I/O 口工作方式,此时相当于一个“准双向口” , 输入时须先将口置“1”,每根口线可以独立定义为输入或输出,但是须在口线上加 上拉电阻。如果将开关往另一个方向,则就是另一个功能—作为地址/数据复用总线 用,此时不能逐位定义为输入/输出,它有两种用法:当作数据总线用时,输入 8 位 11 数据;而当作地址总线用时,则输出 8 位地址。再强调一点,当 P0 口作为地址/数 据总线用之后,就再也不能作 I/O 口使用了。讲到这里,也许大家会感到困惑,什 么叫作地址/数据复用,这其实是当单片机的并行口不够用时,需要扩展输入输出口 时的一种用法,知道了 P0 口,再来看 P1 口。 (2)P1 口 同 P0 不同,P1 口只能作为 I/O 口使用,但它的内部有一个上拉电阻,所以连接外 围负载时不需要外接上拉电阻,这一点P1,P2,P3 都一样,务必请大家注意。 (3)P2 口 P2 口作为 I/O 口线用时,与 P0 口一样,当内部开关向另一个方向时,即作地址输 出时,可以输出程序存储器或外部数据存储器的高8 位地址,并与 P0 口输出的低 地址一起构成 16 位的地址线,从而可以分别寻址 64K 的程序存储器或外部数据存 储器,同样地址线是 8 位一起自动输出的,不能象 I/O 口线那样逐位定义。 (4)P3 口 P3 口作为 I/O 口线用时,同 P1 口相同,也是“准双向口”;不同的是,P3 口的 每一位都有另一种功能,也叫第二功能,各位的功能如下,它们的具体作用我们用 到时再详细解释。 既然单片机的引脚有第二功能,那么CPU 是如何来区分的呢,这是一个令许多初学 者困惑的问题,其实单片机的第二功能是不需要人工干预的,也就是说只要CPU 执 行到相应的指令,就自动转成了第二功能。了解了各个I/O 口的功能和作用,再来 给大家讲解一下单片机 I/O 与外围电路的连接方法。 四(单片机 I/O 口的连接方法 当单片机的 I/O 口作输出时可以直接与外部设备连接,不过由于在实际的应用中, 由于其驱动电流是有限的(P0 口 10mA,P1,P2,P3 口 20mA),所以我们常常需要 通过接口电路来扩展它的驱动能力,在单片机的后向通道控制系统中,常用的功率 控制器件有机械继电器、晶闸管、固态继电器等等,下面我们将以机械继电器和固 态继电器的应用为例介绍其具体的使用方法。 1( 单片机与机械继电器的接口 单片机的一个 I/O 口只能灌入 20mA 的电流, 所以往往不足以驱动一些功率开关 (比 如稍大一点的机械继电器等),此时,就应该采用必要的扩展电路,如何来实现单 片机与机械继电器的接口呢,其实很简单,我们通常采用下面的接法(如图),为 了防止前向通道信号的干扰, 常采用一些光电隔离器件, 比如光电耦合器 4N25, PC814 等,当单片机的 P1.0 脚输出为低电平时,光藕受电导通,Q1 饱和开通,继电器吸 合,负载电路接通。这里请注意?:P0-P3 口作输出控制端时,应尽量采用低电平 控制方法,这是因为在低电平时,I/O 口允许灌入的电流比高电平时要大,一般情 况下,低电平的灌入电流为高电平的4 倍。 另外为了防止电压间的互相干扰,继电器的工作电压VDD 与单片机的工作电压 VCC 不要使用同一个电源,接地端也不要连在一起,即所谓的模拟地与数字地分开,驱 动管的电流要大于继电器的工作电流,其他的元件就不讲了,大家自行分析一下。讲 了单片机与继电器的接口,再来介绍与固态继电器的接口方法,接着往下看: 2( 单片机与固态继电器的接口 普通继电器由于开关速度慢、易跳火、易机械磨损,通常用于要求不高的场合,在 某些特殊应用场合,比如防火、防爆等系统中,则应采用固态继电器。固态继电器 12 是一种无触点的电子继电器,它的输入端只要很小的控制电流,可以与单片机的 I/O 口直接连接;输出则采用双向晶闸管控制,其输入输出间均通过内部光电耦合器隔 离,可以防止信号间的干扰,是单片机接口的理想器件,随着其技术的成熟,应用 的广泛,价格也已经非常的便宜,1A/250V 的目前在 10 元左右,它与单片机的连接 方法如图所示,当“-”端所接的 P1.0 为低电平时,SSR 导通,负载工作。除了以 上两种连接方法外,单片机与 TTL,CMOS 管等都可以连接。 课 第七课 单片机内部结构(五) 讲到了指令 MOV P3,#0FFH 能使 P3 口全部为高电平,而在第四课中 LED 灯闪烁程 序中给 R7 送数用的指令是 MOV R7,#250 ,那么这#250 和#0FFH 到底有什么不同, 它们又代表什么意思呢, 复习一下数字电路中学过的数制概念: 一(数制 1(十进制数(Decimal Number) 在日常生活中,我们表示数的多少用的是十进制数,即 0,1,2,3,4,5,6,7,8 , 9。它遵循“逢十进一,借一当十”的原则,通常我们把计数符号的个数叫做基数 , 十进制的基数就是十。 比如一个十进制数 5847=5*1000+8*100+4*10+7*1 ,它的每一个数码都有一个系数 1000,100,10,1;这个系数叫做权或位权。十进制数虽然非常符合我们的使用习 惯,但计算机中却无法采用,因为计算机只能有两种状态:“0”和“1”,所以我 们还得应用二进制数。 2(二进制数(Binary Number) 二进制的基数为二,0 和 1,它遵循的是“逢二进一,借一当二”的进借位原则。 也 就是当某位计数到两个数时就向高位进“,”,同时本位变为“,”。 比如二进制数 1100=1*23+1*22+0*21+0*20,二进制数只有 0 和 1 两个数,正好代表 了计算机中电路的两种状态,所以它在计算机中被广泛应用。下面是二进制的加法 和乘法运算规则: 加法:0+0=0;1+0=0+1=1;1+1=10 乘法:0*0=0;1*0=0*1=0;1*1=1 二进制数虽然在计算机中处理很方便,但当位数较多时,就不容易记忆和书写了, 所以计算机中又有了十六进制数。 3(十六进制数(Hexadecimal Number) 十六进制也遵循两个规则,一是有十六个基数,即 0,1,2,3,4,5,6,7,8,9 , A,B,C,D,E,F;另一个规则是“逢十六进一,借一当十六”。 比如我们前面提到的#0FFH 就是一个十六进制数,#--我们已经明白了,它表示的是 传递数的本身,“H”叫数制简码,它表示这个数是十六进制数,为什么前面我在标 题后面都加了英文注释,相信大家也应该明白了吧(这里随便提一下,二进制简码 B 和十进制简码 D 通常是可以省略的,我们以后的课程中用到的数都是这样写的), 那么 0FFH 这个十六进制数的表示方法是怎么样的呢,用十进制表示 0FFH=F*161+F*160,即等于 255 。 (大家也许会疑问,这里的“0”到哪里去了呢, 原来,在单片机中,当我们用十六进制格式表示一个数时,如果高位的数字为 “A-F ”时,高位前面就得加上个“0”,不然,编译软件会出错,就象#0FFH。二 ( 进制之间的转换 13 十进制有使用比较习惯的特点,二进制有易于表示和运算方便的特点,十六进制又 有表示位数较多的特点,但有时我们常常要把十进制数转换成二进制数或十六进制 数来处理;把二进制数逆转换成十六进制数,如何进行这种转换呢,下面就举几个 例子: 1( 十进制数与非十进制数之间的转换 (1)非十进制数转换为十进制数 具体做法是:将一个非十进制数按权展开成一个多项式,每项是该位数码与相应权 值之积,把多项式按十进制的规则进行计算求和,所得的结果就是该数的十进制形 式。 比如: 二进制数 1011B 转换成十进制为 1*23+0*22+1*21+1*20=8+2+1=11D , 再比如 : 十六进制数 FFH 转换成十进制为 255D。 (2)十进制数转换为非十进制数 十进制数转换为非十进制数时,可将其分为整数部分和小数部分分别进行转换,最 后将结果合并为目的数。为了简单,我这里只讲整数部分的转换。这种转换叫做除 基取余法,具体做法是用欲转换数制的基数去除十进制数的整数部分,第一次除所 得余数为目的数的最低位,把得到的商再除以该基数,所得余数为目的数的次低位 , 依次类推,继续上面的过程,直至商位为0,此时所得余数为目的数的最高位。 比如:将十进制数 53D 转换成二进制数为 53D=110101B。 2?53 2?26??1 2?13??0 2?6??1 2?3??0 2?1??1 0 ??1 2( 二进制数与十六进制数之间的转换 四位二进制共有 16 种组合,而这 16 种组合正好与十六进制数的 16 个基数一致, 所以每 4 位二进制数对应一位十六进制数,我们只要把二进制数的整数部分自右向 左每 4 位一组,最后不足 4 位的用 0 补足;小数部分自左向右每 4 位一组,最后 不足 4 位的在右面补 0,再将每 4 位二进制数对应的十六进制数写出即可。相反, 如果将十六进制数转换为二进制数只需将每位十六进制数写成对应的4 位二进制数 即可。 比如:将 1101011B 转换成十六进制数为 D6H,再比如:将 F0FH 转换成二进制数为 111100001111B 。 上面的表格就是二进制数、十进制数和十六进制数之间的对应关系。 三(立即数的写法 通过前面一小节的讲解,我们已经懂了,MOV R7,#250 和 MOV R7,#OFFH 中#250 和 #0FFH 原来是十进制数 250D 和十六进制数 FFH 的区别,在单片机中,通常我们把 这个数称之为立即数,那么如果我在编写指令时把立即数#0FFH 写成二进制数(即 11111111 )或用十进制写法(255 )是不是可以呢,当然可以,立即数既可以是二 进制数,也可以是十进制数或十六进制数。不过有一点再重复一遍:那就是当用十 六进制格式表示一个立即数时,如果高位的数字为“A-F”时,高位前面要加上个 14 “0”,请大家务必记住了。 这里再讲一下,关于数制以及二进制、十进制和十六进制数的关系,大家可以在以 后的实践中慢慢去理解和掌握,如果您一时记不住,千万不要刻意地去死记硬背~ 下面让我们来讨论另一个问题: 四(存储器的地址 什么是存储器的地址,地址和数据又有什么关系呢,这个问题往往让初学者非常的 难以理解,既然单片机存储器内存放的是数据,为什么还要有地址的概念,让我们 从生活中的一个例子谈起:大家都知道寄信是怎么回事吧~我们要寄一封信就必须 写好信的内容,然后在信的封面写上详细地址,邮局才能按地址把它寄出去;我们 给单片机送数也一样,除了要给出立即数(犹如信的内容),还必须知道这个数送 达的地址(犹如信的地址或邮政编码),所以就必须给每个寄存器(即半导体存储 器)都规定不同的地址,只不过在单片机中地址的编码也是用数字来表示的,那么 单片机中有多少个寄存器呢,它们的地址又是如何规定的呢, 前面我们学过,单片机有两种存储器,即只读存储器ROM 和随机存储器 RAM,它们 都被规定了各自的地址,我们把它称做寻址空间。既然是空间,就必然有一个范围 的概念,接下来就让我们看看 MCS-51 单片机中程序存储器 ROM 的寻址范围: 1(内部 R0M 的寻址范围 89C51 的内部有 4K 的 FLASH ROM 空间,其寻址范围为 000H-0FFH(16*16*16),这 4K 的 ROM 空间就是用来存放我们为单片机编写的程序的, 单片机执行指令时就是一 条一条地顺序地从 ROM 中寻找指令进行执行。了解了 ROM 的寻址范围,让我们接着 来看另一种存储器:内部 RAM 的寻址范围单片机的内部 RAM 共有 256 个字节,寻址 范围为 00H-FFH(即 16*16),它被分为两个部分:第一部分从 00H-7FH 共 128 个 字节是真正的 RAM 区,可以用来读写各种数据,在这 128 个字节中,又分成三个区 域:第一个区域 00H-1FH 安排了 4 组工作寄存器,每组用 8 个字节,共 32 个字节 , 分别为 R0-R7,当然在同一时刻,只能用其中的一组工作寄存器,怎么来控制它, 就 要用程序状态字 PWS 中的 RS0、 RS1 两位, (这我们后面再讲) ; 第二个区域 20H-2FH 共 16 个字节除了可以作为一般的 RAM 单元读写外, 还可以对每个字节的每一位 (即 每一个抽屉中的每一个小盒子)进行操作,并且对这些位都规定了固定的位地址: 从 20H 单元的第 0 位开始到 2FH 单元的第 7 位结束共 128 位;第三个区域就是一 般的 RAM 单元,地址为 30H-7FH,共 80 个字节;第二部分从 80H-FFH 是专门用于 特殊功能寄存器(SFR)的,89C51 共用 21 个特殊功能寄存器(这些我们都将在下 一课中讲解),它们每个也都有 8 位,这部分的 128 个字节并没有全部用完。 课 第八课 单片机内部结构(六) 我们已经讲过,R7,R6 是工作寄存器,P0,P1,P2,P3 是并行口,那么单片 机中还有些什么东西,它们的结构又是怎么样的呢,这就是本课要讨论的问题。一 ( 单片机的特殊功能寄存器, 在单片机中, 除了前面介绍的 RAM, ROM, P0-P3 和 CPU 外 , 方框内的还有许多其他的东西它们被称为特殊功能寄存器,英文简写SFR ,下表例 出的就是 MCS-51 单片机中几个常用的特殊功能寄存器。这一课我们先来介绍几个: 二(几个常用的特殊功能寄存器 1.累加器 ACC 通常用 A 表示,它是一个什么东西呢,我们知道单片机在做运算时它的中间结果需 要放在某个地方,这个地方就是累加器,它的名字很特殊,功能也很特殊,几乎所 15 有的运算类指令都离不开它。 2.寄存器 B B 寄存器在做乘法时用来存放一个乘数,在做除法时用来存放一个除数,不做乘除 法时随你怎么用。 3.程序状态字 PSW 它是一个很重要的东西, 里面放了 CPU 工作时的很多状态, 知道它就可以了解 CPU 当 前的工作状态,它有点象平时看书用的目录,我们浏览它就可以了解一本书的内容 。 它是一个 8 位的寄存器,用到了其中的 7 位。其格式如下: 下面来逐位介绍它的功能: (1)CY:进位标志位 MCS-51 是一种 8 位的单片机,它的运算结果只能表示到 28(即 0-255),但我们有 时候的运算结果要超过 255 ,怎么办呢,就要用 CY 位。例如:79H+87H (01111001+01010111)=1 00000000 ,这里的“1”就进到了 CY 中去了。 (2)AC:半进位标志位 当 D3 位向 D4 位进位/借位时,AC=1,通常用于十进制调整运算中。 (3)F0:用户自定义标志位 由编程人员自行决定,什么时候用,什么时候不用。 (4) RS1、RS0:工作寄存器组选择位。 前面讲到单片机共有四个工作寄存器组(0 组-3 组),它们就是由 RS1,RS0 来控 制,这两位就在这里,它共有四种组合状态,看上面的表格:每个工作寄存器组有 8 个字节,分别记为 R0-R7 ,当然在某一时刻,CPU 只使用其中的一组。 假设 PSW 为“10”(即 00010001),那么 RS1=1,RS0=0,则用到了第 2 组寄存器 组(地址 10H-17H),RO-R7 即为 10H-17H ,用 DUBG8051 软件输入数值,看看内部 RAM 中地址为 10H-17H 中的值是不是为输入值。 (5) 0V:溢出标志位 什么时候溢出,我们讲到定时器时再研究。 (6) P:奇偶检验位 每次运算结束后若 A 中二进制数“1”的个数为奇数,则 P=1 ,否则 P=0 。例:某 运算结果是 58H (01011000),显然“1”的个数为奇数,所以 P=1。 4(DPTR(DPH,DPL):数据指针 数据指针是一个 16 位的寄存器,我们可以用它来访问外部 RAM ,也可以访问外部 ROM 中的表格,具体应用以后再讲。 5(SP:堆栈指针: 让我们先来理解一下堆栈是什么意思,你在家洗碗吗,我们洗好碗之后,是怎么放 的呢,一般总是先洗的放在下面,晚洗的放在上面,然后用的时候呢,总是晚放上 去的先用,先放上去的后用;如果你不洗碗不要紧,知道码头上仓库里堆的货物吗, 一般也是先进去的后出来,而后进去的先出来,这种符合“先进后出,后进先出” 存放规则的现象我们就把它叫做“堆栈”。(其实栈在中文中的意思就是码头)。 在单片机中,我们可以在内部 RAM 中构造出(注意?:是可以构造) 这 样一个区域,这个区域存放数据的规则就符合堆栈中“先进后出,后进先出”的原 则。为什么要有这样一个区域呢,存储器本身不也同样可以存放数据吗,是的,知 道了存储器地址确实可以读出它里面的内容,但如果我们要读出的是一批数据,每 16 一个数据都要给出一个地址就会很麻烦,为了简化操作就可以利用堆栈的存放方法 来读取数据,具体的应用我们将在十五课中结合具体实验来讲,这里只是让大家先 了解一下。那么堆栈在单片机的什么地方,也就是说把RAM 空间的哪一块区域作为 堆栈呢,这就不好定了,因为 51 系列单片机是一种通用的单片机,每个人的实际需 要各不相同,有人需要多一些堆栈,而有人则不需要那么多堆栈,所以INTEL 公司 就干脆不分了,把分的权利让给用户(编程者),也就是说我们可以根据自已的需 要来决定,所以单片机中堆栈的位置是可以变化的,而这种变化就体现在 SP 中值的 变化,看下面的图,SP 中的值等于 27H 不就相当于是一个指针指向 27H 单元吗, 这就是堆栈指针的由来。 当然在 MCS-51 单片机中,指针开始所指的位置并非就是数据存放的 位置,而是数据存放的前一个位置。例如一开始堆栈指针是指向27H 单元的,那么 第一个数据的存放位置就在 28H 单元中,而不是 27H 单元中,这一点请大家注意 。 6(电源控制寄存器 PCON 单片机在以电池供电的系统中,有时为了节电,我们需要让它尽量降低电 源的消耗,所以单片机就有多种的工作方式,其中一种就是低功耗方式,PCON 寄存 器就是用来控制单片机进入低功耗方式的。 课 第九课 单片机是如何工作的? ? ? ? 单片机共有复位、程序执行、低功耗和编程与加密四种工作方式,下面分别加 以介绍。 1(复位方式 (1)为什么要复位 大家知道,单片机执行程序时总是从地址 0000H 开始的,所以在进入系统时必须对 CPU 进行复位,也叫初始化;另外由于程序运行中的错误或操作失误使系统处于死 锁状态时,为了摆脱这种状态,也需要进行复位,就象电脑死机了要重新启动一样 。 (2)复位的原理 单片机复位的方法其实很简单, 只要在 RST 引脚 (9 脚) 上加一个持续时间为 24 个 振荡周期(即两个机器周期)的高电平就可以了。如果晶振为12M,计算一下这个 持续脉冲需要多长时间, (3)如何进行复位 复位操作有上电自动复位、按键复位和外部脉冲复位3 种方法,上电自动复位是通 过外部复位电路的电容充电来实现的, 当电源刚接通时电容 C 对下拉电阻开始充电 , 由于电容两边的电压不能突变,所以 RTS 端维持高电平,只要这个充电时间不超过 1ms,就可以实现对单片机的自动上电复位,即接通电源就完成了系统的初始化, 在 实际的工程应用中,如果没有特殊要求,一般都采用这种复位方式;按键复位的电 路如图 2 所示,它其实就是在上电复位的基础上加了 R2 和 SA,这种电路一般用在 需要经常复位的系统中;外部脉冲复位的电路如图3 所示,外部复位通常用于要求 比较高的系统,比如希望系统死锁后能自动复位。外部复位是由专门的集成电路来 实现的,也就是我们通常俗称的“看门狗”电路,这种电路有很多,它们不但能完成对 单片机的自动复位功能,而且还有管理电源、用作外部存储器等功能,比如 X25045,MAX813L 等等就是比较常用的此类芯片, 现在让我们先来看看单片机复位后,它的内部会有些什么变化呢,看下面的表: 17 (4)复位后的状态 这就是单片机复位后内部系统的状。 2(程序执行方式 程序执行是单片机的基本工作方式, 由于复位后 PC=0000 , 所以程序就从地址 0000H 开始执行,此时单片机就根据指令的要求完成一系列的操作控制,比如前面讲的让 LED 灯闪烁起来,不过在实际使用中,程序并不会从 0000H 开始执行,而总是安排 一条跳转指令,比如 LJMP START ,为什么要这样安排,我们讲到中断时再来解释。 3( 低功耗操作方式 在以电池供电的系统中,有时为了降低电池的功耗,在程序不运行时就要采用低功 耗方式,低功耗方式有两种—待机方式和掉电方式。 低功耗方式是由电源控制寄存器 PCON (上一课我们提到过的)来控制的。电源控 制寄存器是一个逐位定义的 8 位寄存器,其格式如下,其中:SMOD 为波特率倍增 位,在串行通讯时用;GF1 为通用标志位 1;GF0 为通用标志位 0;PD 为掉电方式 位,PD=1,进入掉电方式;IDL 为待机方式位,IDL=1 ,进入待机方式。也就是说 只要执行一条指令让 PD 位或 IDL 位为 1 就可以了。 那么单片机是如何进入或退出 掉电工作方式和待机工作方式的。 1 .待机方式 2 .进入待机方式 当使用指令使 PCON 寄存器的 IDL=1 , 则进入待机工作方式。 此时 CPU 停止工作 , 但时钟信号仍提供给 RAM,定时器,中断系统和串行口;同时堆栈指针 SP,程序计 数器 PC,程序状态字 PSW,累加器 ACC 以及全部的通用寄存器都被冻结起来;单 片机的消耗电流从 24mA 降为 3.7mA,这样就可以节省电源的消耗。 ? 退出待机方式 退出待机方式可以采用引入中断的方法,在中断程序中安排一条RETI 的指令就可 以了,什么是中断,我们现在还不知道,当然这没关系。其实待机方式和我们使用 电脑时的睡眠方式有异曲同工之妙。 (2)掉电方式 ?进入待机方式 当使用指令使 PCON 寄存器的 PD=1 ,则进入掉电工作方式,此时单片机的一切工 作都停止,只有内部 RAM 的数据被保持下来;掉电方式下电源可以降到 2V,耗电 仅 50uA 。此时就相当于把显示器和硬盘也关闭了。 ? 退出待机方式 退出掉电工作方式的唯一方法是复位,不过应在电源电压恢复到正常值后再进行复 位,复位时间要大于 10mS ,在进入掉电方式前,电源电压是不能降下来的,因此 可靠的单片机电路最好要有电源检测电路。显然掉电方式和待机方式是两种不同的 低功耗工作方式,前者可以在无外部事件触发时降低电源的消耗,而后者则在程序 停止运行时才使用。关于单片机的低功耗的方式就简单的讲这些,更详细的内容也 留到下册再讲解,因为那都是大虾们的作品。 4( 编程和加密方式 单片机的编程与加密是由专门的设备来完成的,这种设备称为编程器或烧录器,类 似的产品有很多,功能也不尽相同。本站的 XL2000 是集烧录、试验、编程、仿真一 18 体化的产品。 第十课 单片机寻址是如何实现的 什么是单片机的寻址,单片机有几种寻址方式, 我们已经知道,单片机的工作过程就是一条一条地从ROM 存储器中取出指令然后执 行相关的操作,那么一条指令究竟有哪几部分组成,它又包括哪些内容,一般来说 一条指令总是有操作码字段和操作数字段两部分组成,看下面两条指令,MOV R7 , #250;MOV P1,#0FFH ,这是我们以前学过的指令,在这两条指令中MOV 就是操作 码字段,R7 和 P1 就是操作数地址字段,而#0FFH 我们称为常数(也就是立即数), 单片机执行指令时就根据指令中给出的地址寻找实际的操作数,不能理解,没关系 , 继续往下看。 一(单片机的寻址 先来看下面的实验: 程序一就是我们以前做过的 LED 灯闪烁的实验,我们已经知道每次调用延时程 序的时间都是相同的 (125mS) , 如果现在提出这样的要求: 灯亮后延时时间为 125mS 灯灭,灯灭后又延时 100mS 秒灯亮,如此循环,这样的程序还能满足要求吗,显然 不能,怎么办,我们可以把它改成程序二,也就是先把一个数送入30H ,在子程序 中 R7 中的值并不固定,而是根据 30H 单元中传过来的数来确定,这样就可以满足 要求,大家自行分析一下这个程序。 从这里我们可以得出结论,在数据传递中要找到被传递的数,很多时 候,这个数并不能直接给出,而是需要变化,这就引出了一个概念:如何寻找操作 数,我们把寻找操作数所在单元地址的过程称之为寻址。在实验一中,我们直接使 用数所在单元的地址找到了操作数,所以称之为直接寻址。而在实验二中,我们是 把数先放在工作寄存器中,从工作寄存器中寻找数据,这种方式则称之为寄存器寻 址。例如:MOV R7,30H,就是把工作寄存器 30H 单元中的数送到 R7 中,这就是寄 存器寻址。 接下来提一个问题:我们知道,工作寄存器就是内存单元的一部份 , 如果我们选择工作寄存器组 0,则 R0 就是 RAM 的 00H 单元,那么这样一来,MOV A , 00H ,和 MOV A,R0 不就没什么区别了吗,为什么要加以区分呢,的确,这两条指 令执行的结果是完全相同的,都是将 00H 单元中的内容送到 A 中去,但是执行的过 程不同, 执行第 1 条指令需要 2 个周期; 而执行第 2 条则只需要 1 个周期, 第 1 条 指令变成最终的目标码要两个字节(E5H 00H),而第 2 条则只要一个字节(E8h) 就可以了。也许有朋友会问,不就差了一个周期吗,为什么怎么斤斤计较~如果是 12M 晶振的话,也就 1 个微秒,一个字节又能有多少呢,当然如果这条指令只执行 一次, 也许无所谓, 但一条指令如果执行上1000 次, 就是1 毫秒, 如果要执行1000000 次, 就是 1S 的差别, 这就很可观了, 单片机要做的就是实时控制, 所以必须如此“斤 斤计较”。再来看另一个问题,现在我们已经知道,寻找操作数可以通过直接给的 方式(立即寻址)和直接给出数所在单元地址的方式(直接寻址),这就够了吗, 看下面的问题,要求从 30H 单元开始,取 20 个数,分别送入累加器 A 中。就我们目前掌握的办法,要从 30H 单元取数,就用 MOV A,30H ,那么下一 个数呢,是 31H 单元的,怎么取呢,还是只能用 MOV A,31H ,那么 20 个数,不是 得 20 条指令才能写完吗,这里只有 20 个数,如果要送 200 个或 2000 个数,那岂 不要写上 200 条或 2000 条命令?这未免太笨了吧。为什么会出现这样的状况,因为 19 我们只会把地址写在指令中,所以就没办法了,如果我们不是把地址直接写在指令 中,而是把地址放在另外一个寄存器单元中,根据这个寄存器单元中的数值决定该 到哪个单元中取数。比如,当前这个寄存器中的值是 30H ,那么就到 30H 单元中去 取,如果是 31H 就到 31H 单元中去取,就可以解决这个问题了。怎么个解决法呢, 既然看的是寄存器中的值,那么我们就可以通过一定的方法让这里面的值发生变化 , 比如取完一个数后,将这个寄存器单元中的值加 1,还是执行同一条指令,可是取数 的对象却不一样了。 看下面的例子: MOV R7,#20 ;(1) MOV R0,#30H ;(2) LOOP:MOV A,@R0 ;(3) INC R0 ;(4) DJNZ R7,LOOP ;(5) 这个例子中的大部份指令我们是能看懂的,第 1 条,是将立即数 20 送到 R7 中,执行完后 R7 中的值应当是 20;第 2 条是将立即数 30H 送入 R0 工作寄存器 中,所以执行完后,R0 单元中的值是 30H;第 3 条,是看一下 R0 单元中是什么值 , 把这个值作为地址,取这个地址单元的内容送入A 中,此时,执行这条指令的结果 就相当于执行 MOV A,30H ;第 4 条,没学过,就是把 R0 中的值加 1,因此执行完 后,R0 中的值就是 31H 了;第 5 条,学过,将 R7 中的值减 1,看是否等于“0” , 不等于“0”,则转到标号 LOOP 处继续执行,因此,执行完这句后,将转去执行 MOV A, @R0 这一条, 此时相当于执行了 MOV A, 31H ( 因为此时的 R0 中的值已是 31H 了) ; 如此,直到 R7 中的值逐次相减等于“0”,也就是循环 20 次为止,就实现了我们 的要求:从 30H 单元开始将 20 个数据送入 A 中。这是另一种寻找数据的方法,由 于数据是间接被找到的,所以把这种寻址方式称之为寄存器间址寻址。(注意?, 在间址寻址中,只能用 R0 或 R1 来存放等待寻找的数据)。 除了以上几种寻址方法外,单片机还有变址寻址,相对寻址和位寻址共七种寻 址方式。这些您暂时可以不去深究它,我们以后会结合具体的实验再来详细介绍, 这里只是为了归类,所以才把它们例举在一起。 二(寻址方式举例 1(直接寻址 直接寻址时,指令中的地址码部分直接给出了操作数的有效地址。例如:MOVA , 4FH ;A?(4FH)可用于直接寻址的空间有内部 RAM 的低 128 字节(包括其中 的位寻址区与特殊功能寄存器) 。 2(寄存器直接寻址 寄存器寻址时,指令中地址码给出的是某一通用寄存器的编号,寄存器的内容为操 作数。 例如:MOVA,R7 ;A?(R7) 可用于寄存器寻址的空间有 R0-R7,ACC,CY(位) ,DPTR,B。 3(寄存器间接寻址 寄存器间接寻址时,指令中给出的寄存器的内容为操作数的地址,而不是操作数本 身。例如:MOVA,@R0 ;A?,(R1),可用于寄存器间接寻址的空间只能是 R0 和 R1, 用 DPTR 或 PC 可间接寻址 64K 字节外部的 RAM 或 ROM. 20 4(立即寻址 立寻址时,指令中地址码部分给出的就是操作数本身。 例如:MOVA,#0FFH ;A?0FFH 可用于立即寻址的空间有 5(变址寻址 变址寻址时,指定变址寄存器的内容与指令中给出的偏移量相加DPTR 所得的结果 作为操作数的地址。 例如:MOVCA,@A+DPTR ;A?,(A)+(DPTR), 。 无论用 DPTR 或 PC 作为基准指针,变址寻址只适用于程序存储器(即 ROM) ,通常 用于读取数据表。 6(相对寻址 相对寻址时,由程序计数器 PC 提供的基准地址与指令中提供的偏移量rel 相加, 得 到操作数的地址。例如:SJMP rel ;PC?(PC)+2+rel 7(位寻址 位寻址时,操作数是二进制数的某一位,其位地址出现在指令中。 例如:SETB bit ; (bit)?1 可用于位寻址的空间有内部 RAM 的可位寻址区和 SFR(特殊功能寄存器)中的字 节地址可以被 8 整除(即地址以 0、8、F 结尾)的寄存器空间。 课 第十一课 单片机指令(一) 指令就是编程者给单片机下的命令, 也就是我们平常所说的单片机软件, 前面我们 已经陆续地讲到了一些指令,但还远远不够,从这一课开始就要全面的讲解指令了 , 希望大家多动手实验,巩固所学的知识,说实在的,其实单片机并不难学。 为了让大家比较容易记忆,按照常规分类,我把单片机的111 条指令分成了五类 —即数据传递类指令、算术运算类指令、逻辑运算类指令、控制转移类指令和位操 作指令。这一课先来看数据传递类指令:一(数据传递类指令数据传递类指令是单 片机中用的最多的指令, 在 51 系列单片机的 111 条指令中共有 28 条是数据传递类 指令,前面我们已经学到了几条,比如 MOV R1,#250;MOVA,R6 等,那么它们 是怎么分类的呢,请往下看: 1( 以累加器为目的操作数的指令 (1)MOVA,Rn (2)MOV Rn, A (3)MOVA,direct (4)MOVA,@Ri (5)MOVA,#data 指令(1)把 Rn 中的数送入累加器 A,Rn 代表工作寄存器 R0-R7(以后我们只要 写到 Rn 都代表 R0-R7 ,这一点请大家记住了) ; 指令(2)则相反,把工作寄存器中的数送入累加器 A 中; 指令(3)是把直接地址中的数送入累加器 A 中,driect 就代表直接地址(以后也相 同) ; 指令(4)就是上一课我们讲的寄存器间接寻址,什么意思,这里再重复一遍,就是 看一下工作寄存器中是什么值, 把这个值作为地址, 把这个地址中的数送入累加器 A 中, Ri 代表什么意思呢,就是工作寄存器 R0 或者 R1 (以后如果写 Ri 都代表 R0 或 21 R1) ; 指令(5)就是把立即数(也叫常数)直接送入累加器 A 中,很显然 data 就代表立 即数(以后也相同) ,其实这个我们以前提到过,加#的数就代表送入的是这个数的 本身。 接下来举几个实例加以说明,大家可以用DUBG8051 这个软件验证一下: A(MOV R7,#250;MOVA,R7 ;将工作寄存器 R7 中的值 250 送入 A,R7 中 的值保持不变。 B(MOVA,#250;MOV R7,A;将 A 中的值 250 送入工作寄存器 R7, A 中的值 保持不变。 C(MOV 30H,#250;MOVA,30H ;将内存 30H 单元中的值 250 送入 A,30H 单 元中的值保持不变。 D(MOV 20H,#250;MOV R0,#20;MOVA,@R0 ;先看 R0 中是什么值,把这 个值作为地址,并将这个地址单元中的值送入 A 中。执行命令前 R0 中的值为 20H , 则是将 20H 单元中的值 250 送入 A 中。 E(MOVA,#250 ;将立即数 250 送入 A 中,执行完本条指令后, A 中的值是 250。 2(以寄存器 Rn 为目的操作数的指令 (1)MOV Rn, A (2)MOV Rn,direct (3)MOV Rn,#data 举几个实例大家自行分析一下: A(MOV R7, A ; B(MOV R7,30H ; C(MOV R7,#20 ; 这组指令功能是把源地址单元中的内容送入工作寄存器,源操作数不变。 3(以直接地址为目的操作数的指令 34 _ 单片机教程(MCS-51 系列) (1) MOV direct, A 例如:MOV 30H,A(将累 加器 A 中的数送入内存单元 30H) (2)MOV direct,Rn 例如:MOV 30H,R7(将 寄存器 R7 中的数送入内存单元 30H) (3) MOV direct, direct 例如: MOV 30H, 20H (将内存单元 20H 中的数送入内存单元 30H) (4) MOV direct, @Ri 例如: MOV 30H , @R0 (看一下 R0 中是什么值,把这个值作为地址,并将这个地址单元中的值送入 A 中。如执行指令前 R0 中的值为 20H,则是将 20H 单元中的值送入 A 中) 。 (5) MOV direct,#data 例如:MOV 30H,#20(将立即数 20 送入内存单元 30H) 4( 以间接地址为目的操作数的指令 (1)MOV @Ri,A (2)MOV @Ri,direct (3)MOV @Ri,#data16 这三条指令就不 介绍了,大家自行分析一下,不过有一点希望大家记住,Ri 只能用工作寄存器 R0 或者 R1。 5( 十六位数的传递指令 MOV DPTR,#data16 指令说明:这是 51 单片机中唯一的一条 16 位立即数传递指 令,大家知道 51 系列单片机是一种 8 位单片机,8 位单片机所能表示的最大数只 能是 28=0-255 。讲到这里大家应该明白了,为什么我们前面的实验中立即数不能大 于 255 。如果现在有个数是 1234H (即二进制 0001 0010 0011 0100) ,我们要把它 送入 DPTR ,该怎么办呢,当然有办法,INTEL 公司已经把 DPTR 分成了两个寄 存器, DPH 和 DPL(看一下前面的特殊功能寄存器介绍) , 我们只要把 12H( 高 8 位) 22 送入 DPH ,把 34H( 低 8 位)送入 DPL 中去就可以了,所以执行指令 MOV DPTR , #1234H 和执行指令 MOV DPH,#12H(1) ; MOV DPL,#34H(2) ;是一样的。二 ( 指令练习请写出下列每条指令的执行结果,并用 DUBG8051 软件进行验证,看结果 是否正确。 1.MOV 12H,#34H 2.MOV R0,#23H 3.MOV R7,#22H 4.MOV R1,12H 5.MOVA,@R0 6.MOV 34H,@R1 7.MOV 45H,34H 8.MOV 12H,DPH 9.MOV R0,DPL 课 第十二课 单片机的指令(二) 这一课继续讲解其他的数据类指令。提示:下面的内容我们下册中才会用到,这 里只是为了把数据传递类指令讲完,才提前把它们讲一下,您不知道也没关系。 一(数据传递类指令 (累加器 A 与片外 RAM 之间的数据传递类指令什么是片外 RAM (即片外数据存储器)呢,单片机不是有内部 RAM 吗,为什么还要片外 RAM 呢,难 道单片机的内部 RAM 还不够用吗,的确如此,当单片机的内部 RAM 不够时,我们就 要扩充 RAM 空间。那么单片机能扩充多少的外部 RAM 空间呢,89C51 单片机的片外 RAM 可以扩展到 64K, 即从 0000H-FFFFH, 那么它是怎样和累加器 A 进行数据传递的, 它们之间的传递指令共有以下四条: (1) MOVX A,@Ri (2) MOVX @Ri,A (3) MOVX A,@DPTR (4) MOVX @DPTR,A 指令说明: A(在 51 系列单片机中,与外部存储器 RAM 传递数据的只可以是累加 器 A,所有要送入或读出外部 RAM 的数据必须先送到 A 中去,在此我们可以看出内 外部 RAM 的区别了:内部 RAM 间可以直接进行数据的传递,而外部RAM 则不行。 比 如, 要将外部 RAM 中某一单元 (设为 100H 单元的数据) 送入另一个单元 (设为 200H 单元),就必须先将 100H 单元中的内容读入 A,然后再送到 200H 单元中去。 在这里有一个问题: CPU 是如何区分内、 外部 RAM 的,大家看这里的四条指令 , 其操作码都是 MOVX ,而内部 RAM 的操作码则是 MOV,CPU 就是根据不同的指令来自 动区分读写内、外部 RAM 的。 B(要读出或写入外部的 RAM ,当然还必须知道外部 RAM 的地址,在后两条指令中 , 地址是被直接放在 DPTR 中的;而前两条指令由于 Ri(即 R0 或 R1)只是一个 8 位 的寄存器,所以只能提供低 8 位的地址。不过有时我们要扩展的外部 RAM 数量比较 少(少于或等于 256 个字节),提供低 8 位的地址也就足够了。 C(使用时应当首先将要读出或写入的地址送入DPTR 或 Ri 中,然后再用读写指令 。 举例:将外部 RAM 中 100H 单元中的内容送入外部 RAM 中 200H 单元中。 MOV DPTR,#0100H MOVX A,@DPTR 23 MOV DPTR,#0200H MOVX @DPTR,A 7( 累加器 A 与片外 ROM 之间的数据传递类指令 MOVC A,A+@DPTR 前一小节讲了累加器A 与外部RAM 之间的数据传递类指令, 接下来再来讲讲片外ROM 与累加器 A 之间的数据传递类指令。 在讲解之前, 先来了解一下内部 ROM 和外部 ROM 的组成,89C51 的内部有 4K 的 FLASH ROM 空间,其地址为 000H-FFFH ,片外可以 扩展到 64K(OOOOH-FFFFH),在这 64K 的 ROM 空间中,有 4K 字节的地址是片内和 片外公用的(即 000H-FFFH),而 1000H-FFFFH 的空间是片外 ROM 专用的。 讲到这里大家就会问:既然有 4K 的地址是公用的,那么 CPU 是如何区分的 呢,不知大家是否还记得, 在第二讲单片机的硬件电路中, 有一个引脚 EA (即 31 脚) , 当 EA=1,CPU 从片内 ROM 的 4K 字节中取指令,如果地址超过了 4K(FFFH),单片 机就自动转向片外 ROM 取指令,大家注意?:这个过程是自动完成的,不需要人工 干预;而当 EA=0 时,CPU 只从片外 ROM 取指令。讲到这里,不知大家注意?没有 , 当使用外部 ROM 和外部 RAM 时,它们的寻址空间都是 0000H-FFFFH,也就是说它们 在地址上是重叠的,那么 CPU 在读取指令时又是如何来区分当前是从ROM 取指令还 是从单片机教程(MCS-51 系列) RAM 取指令呢,请大家来看第二课的 89C51 单片机 硬件电路图,29 脚是 PSEN ,当我们置位 PSEN 时(即 PSEN=1),CPU 就读取外部 ROM 指令;而要从外部 RAM 读取指令时就置位 WR(即 16 脚)或 RD(即 17 脚), 这样即使 ROM 地址和 RAM 地址是重叠的,也不会出现混乱。 这里又有一个问题了,16 脚和 17 脚不是并行口 P3.6 和 P3.7 吗,如果我们 把它当作第二功能 WR 和 RD 来使用,CPU 又是如何来区分的呢,这个问题我们前面 已经讲过了,这里再重复一遍:单片机引脚的第二功能是不需要人工干预的,也就 是说只要 CPU 执行到相应的指令,就自动转成了第二功能。了解了片外 ROM 的读取 指令原理,再来看片外 ROM 与累加器 A 之间的数据传递指令(注意?:ROM 只能读 取指令,而不能写入数据,这一点和RAM 是不同的)。 MOVC A,A+@DPTR 指令说明: A(本指令是将 ROM 中的数送入 A 中。通常称其为查表指令,常用此指令来查一个 已做好在 ROM 中的表格。 B(此条指令引出一个新的寻址方法:变址寻址。本指令是要在 ROM 的一个地址单元 中找出数据,显然必须知道这个单元的地址,这个单元的地址是这样确定的:在执 行本指令前 DPTR 中有一个数,A 中也有一个数,执行指令时,将 A 和 DPTR 中的数 加起来,就成为要查找的数的单元地址。 C(查找到的结果被放在 A 中,因此,本条指令执行前后,A 中的值不一定相同。 举 例:有一个数在 R0 中,要求用查表的方法确定它的平方值(此数取值范围是0-5) MOV DPTR,#TAB MOV A,R0 MOVC A,@A+DPTR TAB: DB 0,1,4,9,16,25 设 R0 中的值为 2 ,送入 A 中,而 DPTR 中的值则为 TAB ,则最终确定的 ROM 单元的地址就是 TAB+2 ,也就是到 TAB+2 这个单元中去取数,取到的是 4 (Db 后面的第三个数)。其它数据也可以次类推。 从这里可以看出,我们使用了标号(象TAB 等)来代替具体的 ROM 单元地 24 址,事实上,标号的真实含义就是地址的数值,在这里它就代表了TAB+0,TAB+1, TAB+25 这几个数据在 ROM 中的存放位置;而我们以前学过的如 LCALL DELAY 指令 , DELAY 代表的是以 DELAY 为标号的那段程序在 ROM 中存放的起始地址,CPU 就是根 据这个起始地址才找到指令的,无法理解是吗,没关系,让我们先来看几个符号的 含义就会明白了。 二(单片机的伪指令(注意?:伪指令不是单片机指令)我们前面简单提到过,END 是伪指令,那么到底什么是伪指令,它在单片机中有什么作用呢,接下来我们就来 讨论这个问题,伪指令是单片机中用来给寄存器定义或者赋值的特殊指令为什么要 用伪指令呢,让我们来看下面的实验: 1(DB—定义字节伪指令它的功能是从程序存储器ROM 单元的某个地址开始,存入一 组规定好的 8 位二进制常数。例如:ORG 2000H; TAB:DB 45H,48H,10;34H; 以 上指令经汇编后, 将对从 2000H 开始的若干 ROM 单元赋值, 即 (2000H) =45H, (2001H ) =48H,(2002H)=0AH,(2003H)=34H。讲到这里,有的人会问:在这些指令中, 我直接用 MOV 2000H,45H;MOV 2001H,48H ??不就得了,干吗要用 DB 指令呢,是 的,从理论上讲,两者的效果是一样的,只是因为我们现在的程序都很短,单片机 不可能只做这些简单的工作,当程序比较长时,这些指令的意义就不一样了。 除了刚刚提到的 END 和 DB 伪指令外,单片机中还有那些伪指令呢,下面简单讲解 一下: DW—定义字伪指令 在计算机中,一个字由两个字节组成,也就是说,如果一个字 节可以表示一个 8 位数的话,那么一个字就可以表示一个十六位的数(关于这方面 的问题我们留到下册中再来讨论,这里就不讲了,以免增加大家的学习难度),如 此一来,这条伪指令的功能也就清楚了,就是从指定的ROM 单元开始,定义若干个 16 位常数; 上一课我们已经讲过, 51 系列单片机要存放一个 16 位的常数就必须把这个数分 成两个 8 位数据来存放, 通常我们把一个 16 位数的高 8 位放入低地址, 而把低 8 位 放入高地址(注意?:这两个地址必须是紧挨着的)。例如:ORG 3000H; ABC:DW 2345H,0A859H;程序经汇编后,(3000H)=23H,(3001H)=45H,(3002H)=A8 , (3003H)=59H。注意?:象 0A859H 这样的数值在写法上,A 的前面一定要加上个 0。 3(DS—保留空间伪指令它的功能是从指定的地址开始,保留若干个字节的 ROM 空间 留作它用。例如:ORG 2000H; ABC:DS0 8H; LOOP:MOV A,30H;汇编以后,从 2000H 开始,将保留 8 个 ROM 单元留作它用,那么以 LOOP 为标号的指令就存放在 2008H 单元中。这里有一点请大家注意?:这几条伪指令都只能对程序存储器 (ROM ) 起作用,而不能用它们来对数据存储器(RAM)进行赋值或做其他的工作。至于它们 到底有什么作用,我们什么时候才需要用到它们,我们将在下册的实验中再作讲解 。 现在让我们通过一段程序来解释一下查表程序的使用方法,这可是一定要学会的。 例如: MOV DPTR,#100H ; MOV A,R0 ; MOVC A,@A+DPTR ; . . ORG 0100H ; DB 0,1,4,9,16,25 ; 如果 R0 中的值为“2”,则最终地址为“100H+2 ”即“102H”,到 102H 单元中找 25 到的是“4”。这个可以看懂了吧,那为什么不这样写程序,要用标号呢,不是增加 疑惑吗,如果用标号写的话,在写程序时,就必须确定这张表格在ROM 中的具体位 置。如果写完程序后,又想在这段程序前插入一段程序,那么这张表格的位置就又 要变了(要改 ORG 100H 这条指令),如果我们是经常需要修改程序的,那多麻烦 , 所以就用标号来替代,只要一编译程序,位置就自动发生变化,我们把这件事交给 计算机去做了。 8(堆栈的操作指令什么是堆栈,我们前面已经介绍过了,那么堆栈是如何进行数据 传递的呢,对堆栈的操作指令有 2 条: (1)PUSH direct (2)POP direct 第 1 条指令称之为推入,就是将 direct 中的内容送入到堆栈中;第 2 条指令称之 为弹出,就是将堆栈中的内容送回到direct 中。推入指令的执行过程是:首先将 SP 中的值加 1,然后把 SP 中的值当作地址,将 direct 中的值送进以 SP 中的值为 地址的 RAM 单元中。例如: MOV SP,#5FH ; MOV A,#100 ; MOV B,#20 ; PUSH ACC ; PUSH B ; 这段指令的执行过程是这样的:将 SP 中的值加 1,即变为 60H ,然后将 A 中的值 (#100 )送到 60H 单元中,因此执行完 PUSH ACC 这条指令后,内存 60H 单元的值 就是 100 ,同样,执行 PUSH B 时,是将 SP+1 ,即变为 61H ,然后将 B 中的值送 入到 61H 单元中,即执行完本条指令后,61H 单元中的值变为 20。这是推入,那么 弹出又是怎么样的呢,请看下面的例子: MOV SP,#5FH ; MOV A,#100 ; MOV B,#20 ; PUSH ACC ; PUSH B ; POP B ; POP ACC ; POP 指令的执行是这样的:首先将 SP 中的值作为地址,并将此地址中的数送到 POP 指令后面的那个 direct 中,然后 SP 减 1。上面程序的执行过程是:将 SP 中的值 (现在是 61H)作为地址,取 61H 单元中的数值(现在是 20),送到 B 中,所以执 行完 POP B 指令后 B 中的值是 20,然后将 SP 减 1,那么此时 SP 的值就变为 60H , 然后执行 POP ACC , 将 SP 中的值( 60H )作为地址, 从该地址中取数( 现在是 100) , 并送到 ACC 中,所以执行完本条指令后,ACC 中的值是 100。 这有什么意义呢,ACC 中的值本来就是 100,B 中的值本来就是 20,是的,在本例 中,的确没有意义,但在实际工作中,推入堆栈结束后(即执行指令PUSH B 后) 往 往要执行其他的指令,而且这些指令会把 A 中的值和 B 中的值改掉,所以在程序执 行结束后,如果我们要把 A 和 B 中的值恢复原值,那么这些指令就有意义了,具体 应用我们将在以后的课程中讲到。 这里还有一个问题,如果不用堆栈,比如说在PUSH ACC 指令处用 MOV 60H,A,在 26 PUSH B 处用指令 MOV 61H,B,然后用 MOV A,60H,MOV B,61H 来替代两条 POP 指 令,不也一样吗,是的,从结果上看是一样的,但是从过程看是不一样的,PUSH 和 POP 指令都是单字节,单周期指令,而 MOV 指令则是双字节,双周期指令。更何况 , 堆栈的作用不止于此,所以一般的单片机上都设有堆栈,而我们在编写子程序,需 要保存数据时,通常也采用堆栈的方法来实现。 9(其他的数据传递类指令 (1)XCH A,Rn (2)XCH A,direct (3)XCH A,@Ri (4)XCHD A,@Ri (5)MOVC A,A+PC 前面的 4 条指令是进行数据交换用的,第 1 条,寄存器与累加器交换;第 2 条直接 地址与累加器交换;第 3 条间接 RAM 与累加器交换;第 4 条间接 RAM 与累加器的 低 4 位交换;第 5 条是累加器与代码字节之间的数据传递类指令,这些指令作为初 学者可能暂时还用不上,所以就不介绍了,大家只要了解一下就可以了,等下册中 我们再来详细的讨论。 三(本课总结到本课为止,数据传递类指令全部讲解完了,在单片机的指令中,数 据传递类指令是使用最多的指令,因此这部分的内容是必须掌握的,如何来使用这 些指令,我们将在以后的课程中结合具体的实验加以介绍。为了加深印象,大家可 以用 DUBG8051 软件对上述指令进行反复练习,用实验结果来加深课堂知识。 课 第十三课 单片机指令(三) 算术、逻辑运算类指令也是单片机中极为重要的指令系统,在很多教科书中都把 它们归为一类,实际上它们还是有区别的,为了让大家便于记忆,这里把它们分了 开来。在单片机中,算术运算类指令有 24 条;逻辑运算类指令有 25 条。这一课我 们先来讲解算术运算类指令,下面我们分别加以讲解: 一(算术运算类指令 1。不带进位的加法指令 (1)ADD A,Rn ;例:ADD A,R7 (2)ADD A,@Ri ;例:ADD A,@R1 (3)ADD A,direct;例:ADD A,30H (4)ADD A,#data ;例:ADD A,#30H 指令说明:这些指令的意思就是把后面的值 与 A 中的值相加,结果送到 A 中去。举例:MOV A,30H ; ADD A,10H ;执行结果 A=40H 2。带进位的加法指令 (1)ADDC A,Rn ;例:ADDC A,R7 (2)ADDC A,@Ri ;例:ADDC A,@R1 (3)ADDC A,direct;例:ADDC A,30H (4)ADDC A,#data ;例:ADDC A,#30H 指令说明:这些指令的作用都是将 A 中的值和其后面的值相加,并且加上进位位 CY 中的值。为什么要这样做呢,我们知道 51 单片机是一种 8 位单片机,所以只能做 8 位的数学运算,也就是说最大运算的范围只能是 0-255 ,这在实际工作中是不够的 , 因此就要进行扩展, 怎么扩展, 就是将 2 个 8 位的数学运算合起来, 成为一个 16 位 27 的运算,这样可以表达的数的范围就能达到0-65535 。如何合并呢,其实很简单, 让我们看一个十进制数的加法例子:66+78 ,这两个数相加,我们根本不会在意它 的过程,但事实上我们是这样做的:先做 6+8 (低位),然后再做 6+7 ,这是高位 。 做了两次加法,只是我们做的时候并没有刻意分成两次加法来做罢了,或者说我们 并没有意识到我们做了两次加法,之所以要分成两次来做,是因为这两个数超过了 -9)。在做低位时产生了进位,我们通常的办法是在适当 一位数所能表达的范置(0 的位置点一下,然后在做高位加法时将这一点加进去;其实计算机中做 16 位加法时 同样如此,先做低 8 位的,如果两数相加产生了进位,也要“点一下”做个标记, 这个标记就是进位位 CY,在 PSW 中,我们前面已经讲过,在进行高位加法时将这个 CY 加进去。例如做 2 个 16 进制数相加:1067H+10A0H ,先做 67H+A0H=107H ,而 107H 显然超过了 0FFH , 因此最终保存在 A 中的是 7, 而 1 则进到了 PSW 中的 CY 位 去了,换言之,CY 位就相当于是 100H ,然后再做 10H+10H+CY ,结果是 21H ,所 以最终的结果是 2107H。 3。带借位的减法指令 (1)SUBB A,Rn ; (2)SUBB A,@Rn ; (3)SUBB A,direct; (4)SUBB A,#data ; 指令说明:没有不带借位的减法指令,如果需要做不带借位的减法指令(在做第一 次相减时),只要将 CY 清零即可。 4(乘法指令 (1)MUL AB ; 指令说明:此指令的功能是将 A 和 B 中的两个 8 位无符号数相乘,两数相乘结果一 般比较大,因此最终结果用 1 个 16 位数来表达,其中高 8 位放在 B 中,低 8 位放 在 A 中。在乘积大于 FFFFFH(65535)时,PSW 的 0V 位置“1”(溢出),否则 OV 为“0”,而 CY 位总是为“0”。 例:(A)=4EH,(B)=5DH;MUL AB ;乘积是 1C56H,所以在 B 中放的是 1CH,而 A 中放的则是 56H。 5(除法指令 (1)DIV AB(A/B) 指令说明:此指令的功能是将 A 中的 8 位无符号数除以 B 中的 8 位无符号数(什 么是无符号数,简单的说就是没有负数的数, 也就是整数, 比如 1, 2, 3, 1.2,4.5 等 等这样的数)。除法一般会出现小数,但计算机中可没法直接表达小数,它用的是 我们小学生用的商和余数的概念,如13/5 ,其商是 2,余数是 3。除了以后,商放 在 A 中, 余数放在 B 中。 CY 位和 OV 位都是“0”, 如果在做除法前 B 中的值是 00H , 也就是除数为 0,那么 0V=1。 6(加 1 指令 (1)INC A ;例如:A=20H INC A; A=21H (2)INC Rn ;例如:R7=20H INC A; R7=21H (3)INC direct;例如:30H=20H INC 30H; 30H=21H (4)INC @Ri ; (5)INC DPTR ;例如:DPTR=20H INC DPTR; DPTR=21H 28 指令说明:从结果上看 INC A 和 ADD A,#1 差不多,但 INC A 是单字节单周期指令 , 而 ADD A,#1 则是双字节双周期指令,而且 INC A 不会影响 PSW 位,如(A)=0FFH , INC A 后(A)=00H ,而 CY 依然保持不变;如果是 ADD A ,#1,则(A)=00H , 而 CY 一定是“1”。因此加 1 指令并不适合做加法,事实上它主要是用来做计数 、 地址增加等用途。另外,加法类指令都是以 A 为核心的,其中一个数必须放在 A 中 , 而运算结果也必须放在 A 中,而加 1 类指令的对象则广泛得多,可以是寄存器、内 存地址、间址寻址的地址等等。 7(减 1 指令 (1)DEC A ;例如:A=20H DEC A; A=19H (2)DEC Rn ;例如:R7=20H DEC A; R7=19H (3)DEC direct;例如:30H=20H DEC 30H; 30H=19H (4)DEC @Ri ; 指令说明:既然加 1 指令可以用于计数、定时、地址等加 1,那么有加也必然有减 , 所以减 1 指令的功能与加 1 指令类似,这里就不多说了。 8(十进制加法调整指令 DA A ;这是一条对十进制加法进行调整的指令,等下册用到时再介绍。 另外需要了解的是:在算术运算类指令中,除了加 1 和减 1 指令外,其他的算术运 算类指令都要把结果放到累加器 A 中,这与数据传递类指令有所不同。 二(逻辑运算类指令 什么是逻辑运算,相信大家不会陌生,在数字电路中我们学过“与门”、“或门” 、 “非门”等,在单片机中也有类似的运算。那么它们是如何分类的呢,接下来我们 就来一一讲解,先来看对累加器 A 的逻辑运算指令: 1。对累加器 A 的逻辑运算指令 (1)CLR A 指令说明:累加器 A 清零。效果同 MOV A,#00H 是一样的,只不过它是单周期指令 , 而 MOV A,#00H 是双周期指令。 (2)CPL A 指令说明:将累加器 A 逐位取反。相当于数字电路的“非”逻辑,例如:A=12H CPL A ;12H 化为二进制是 00010010,逻辑取反后为 11101101,即 A=EDH。 (3) RL A 指令说明:将累加器 A 的值逻辑左移。例如:A=12H RL A;化为二进制为 00010010 , 逐位左移后为 0010100 , 即 24H 。 这里把第 7 位移到了第 0, 第 0 位移到了第 1 位 , 第 1 位移到了第 2 位,其余的依次类推。 (4)RLC A 指令说明:加上进位位 CY 并逻辑左移。例如:CY=1 A=12H RLC A;加上进位位 CY 后 1 00010010 逻辑左移变为 0 00100101(即 CY=0,A=25H)。 (5)RR A 指令说明:将累加器 A 中的值逻辑右移。同 RL A 类似。 (6)RRC A 指令说明:加上进位位 CY 并逻辑右移。同 RLC A 类似。 (7)SWAP A 指令说明:将 A 中的值的高、低 4 位进行交换。 29 例如:(A)=39H,SWAP A 之后,A 中的值就是 93H 。怎么正好是这么前后交换呢, 因为这是一个十六进制数,每 1 个十六进位数代表 4 个二进制数。注意?,如果是 这样的:(A)=39D ,后面没加 H,执行 SWAP A 之后,可不是(A)=93 。要将它 化成二进制数再算: 39D 化为二进制是 10111 , 也就是 0001, 0111 高 4 位是 0001 , 低 4 位是 0111 ,交换后是 01110001,也就是 71H,即 113D。 2。两个寄存器之间 的逻辑运算指令 上面的指令都是针对累加器 A 的逻辑运算指令, 也就是说对一个寄存器的逻辑运算 , 那么如果两个寄存器之间的逻辑运算又是怎么样的呢,接着往下看: 指令说明: 什么是逻辑“与”,数字电路中我们已经学过: 就是 F=A*B , 简记为“全 1 出 1,有 0 出 0”。如果忘了,没关系,找本书再看一下,这里就不详细的阐述了 。 例如:71H 和 56H 相“与”,将两数写成二进制形式:(71H) 01110001 和(56H) 00100110 。逐位相“与”结果就是 00100000 即 20H,从上面的例子可以看出,两 个参与运算的值只要其中有一个位上是“0”,则这位的结果就是“0”,两个同是 “1”,结果才是“1”,是不是符合逻辑“与”的结果, 知道了逻辑“与”指令的功能后,逻辑“或”和逻辑“异或”的功能就很简单了。 逻辑“或”是逐位相“或”,即有 1 出 1,全 0 出 0。例:71H 和 56H 相“或”结 果就是 77H ;而“异或”则是逐位“异或”,即相同出 0,相异出 1。仍旧 71H 和 56H 相“异或”,结果是 57H。 两个寄存器之间的逻辑“或”以及逻辑“异或”的指令如下: ORL A,Rn ;A 与 Rn 中的值按位‘或',结果送入 A 中 ORL A,direct ;A 与 direct 中的值按位‘或',结果送入 A 中 ORL A,@Ri ;A 与间址寻址单元@Ri 中的值按位‘或',结果送入 A 中 ORL A,#data ;A 与立即数 data 按位‘或',结果送入 A 中 ORL direct,A ;direct 中值与 A 中的值按位‘或',结果送入 direct 中 ORL direct,#data ; direct 中的值与立即数 data 按位‘或', 结果送入 direct 中。 (3)XRL A,Rn ;A 与 Rn 中的值按位‘异或',结果送入 A 中 XRL A,direct ;A 与 direct 中的值按位‘异或',结果送入 A 中 XRL A,@Ri ;A 与间址寻址单元@Ri 中的值按位‘异或',结果送入 A 中 XRL A, #data ;A 与立即数 data 按位‘异或',结果送入 A 中 XRL direct,A ;direct 中值与 A 中的值按位‘异或',结果送入 direct 中 XRL direct,#data;direct 中的值与立即数 data 按位‘异或',结果送 direct 中。 连续好几节课将讲了许多的基本知识,大家是不是又觉得有些枯燥和无聊了,别急, 接下来让我们轻松一下,做一个实验来证明一下几节课所学的内容: START:MOV SP,#5FH ; MOV A,#80H ; LOOP:MOV P1,A ; RL A ; LCALL DELAY ; LJMP LOOP ; DELAY:MOV R7,#255 ; D1:MOV R6,#255 ; D2:NOP NOP NOP NOP 30 DJNZ R6,D2 ; DJNZ R7,D1 ; RET ; END。 好久没做实验了,大家还记得实验的步骤吗,调试?编译?下载,看到了什么,有 一个暗点在流动;想象一下,如果我们把P1.0-1.7 的 LED 换成 8 只可控硅来控制 霓虹灯,是不是就有点实用价值了。 2(程序分析: 前面的 ORG 0000H 、LJMP START 、ORG 30H 我们以后分析。 从 START 开始,MOV SP,#5FH,这是初始化堆栈,在本程序中有无此句无关紧要, 不过我们慢慢开始接触正规的编程,我也就慢慢地给大家培养习惯吧。 MOV A,#80H ,将 80H 这个数送到 A 中去。干什么呢,不知道,往下看: MOV P1,A 将 A 中的值送到 P1 端口去,此时 A 中的值是 80H,所以送出去的也就 是 80H,因此 P1 口的值是 80H,也就是二进制 10000000 ,对应 P1.7-P1.0 这 8 位 。 我们应当知道,此时 P1.7 接的 LED8 是不亮的,而其它的 LED 都是亮的,所以就形 成了一个“暗点”,继续往下看 RL A;将 A 中的值进行左移,算一下,移之后的结果是什么,对了,是01H ,也就 是二进制 00000001 ,这样,应当是接在 P1.0 上的 LED1 不亮了,而其它的都亮了 , 从现象上看就是“暗点”移到了后面; 然后是调用延时程序,这里有一条指令 NOP,它是空操作指令,也就是什么都不做 , 用于短暂的延时,其他的指令我们很熟悉了,就是让这个“暗点”暗一会儿,然后又跳 转到 LOOP 处(LJMP LOOP) ,请大家计算一下,下面该哪个灯不亮了? ? 对了, 应当是接在 P1.1 上灯不亮了,这样依次不断的循环,就形成了“暗点流动”的现象。 课 第十四课 单片机指令(四) 一(控制转移类指令 控制转移类指令共有 17 条,分为无条件转移指令、条件转移指令和返回及调用指令 三大类,下面我们分别加以学习: 1(无条件转移类指令 (1)无条件绝对转移指令:AJMP addr11 (2)无条件长转移指令:LJMP addr16 (3)无条件相对转移指令:SJMP rel 在讲解上面这三条指令之前先来认识一下三个符号: add11 、 add16 、 rel。 其中 add11 和 add16 表示外部 ROM 的 16 位和 11 位地址,前面我们已经讲过,单片机的外部 ROM 可以扩展到 64K,add16 就表示 64K 程序存储器的任何地址,换句话说 LJMP 指 令可以跳转到程序的任何地方,而 add11 则表示下一条指令的 2K 页面,也就是说 , SJMP 指令只能跳转到程序的 2K 范围之内;rel 表示 8 位的偏移量,其范围是下一 条指令第一字节的前 128 到后 127 个字节(即-128-+127B) 。介绍完了三个符号, 再看上面的三条转移类指令,如果要仔细分析的话,它们之间其实区别较大,但在 初学时, 我们可以不理会这么多, 统统把它们理解成: ( *JMP 标号 ), 比如 SJMP LOOP , 就是跳转到有 LOOP 标号处。 原则上,所有用 SJMP 或 AJMP 的地方都可以用 LJMP 来替代。因此在初 学时, 需要跳转时可以全用 LJMP 代替, 除了一个场合, 什么场合呢,先看一下 AJMP , 31 AJMP 是一条双字节指令,也就说这条指令本身占用存储器(ROM )的两个单元, 而 LJMP 则是一条三字节指令,即这条指令占用存储器(ROM )的三个单元,这就是区 别。 下面再来看第 4 条跳转指令: (4)无条件间接转移指令:JMP @A+DPTR 这条指令的用途也是跳转,跳转到什么地方去呢,这可不能由标号简单地决定了, 让我们从一个实际的例子入手吧: MOV DPTR,#TAB ;将 TAB 所代表的地址送入 DPTR MOV A,R0 ;从 R0 中取数(详见下面说明) MOV B,#2 ; MUL A,B ;A 中的值乘 2 ;(详见下面的说明) JMP A,@A+DPTR ;跳转 TAB: AJMP S1 ;跳转表格 AJMP S2 ; AJMP S3 ; 应用背景介绍:在单片机开发中,经常要用到键盘,我们的要求是:当按下功能键 A ? ? G 时去完成不同的功能,这用程序设计语言来表达的话,就是:按下不同的键 去执行不同的程序段,以完成不同的功能,怎么样来实现这个功能呢, 看图,前面的程序读入的是按键的值,如按下‘A'键后获得的键值是“0”,按 下‘B'键后获得的值是“1”等等,然后根据不同的值进行跳转,如键值为“0”就 转到 S1 处执行,如键值为“1”就转到 S2 处执行,? ? 到底如何来实现这一功能 呢, 先从程序的下面看起,是若干条 AJMP 语句,这若干条 AJMP 语句最后在存储器中是这样存放的(见图),也就是每个 AJMP 语句都占用了两个存储器的空间,并且是连 续存放的。而 AJMP S1 存放的地址是 TAB,到底 TAB 等于多少,我们不需要知道, 把它留给汇编程序来算好了。 下面我们来看这段程序的执行过程: 第 1 条 MOV DPTR, #TAB 执行完了之后, DPTR 中 的值就是 TAB ,第 2 条是 MOV A,R0,我们假设 R0 是由按键处理程序获得的键值 , 比如按下‘A’键,R0 中的值是“0”,按下‘B’键,R0 中的值是“1”? ? 以此 类推; 现在我们假设按下的是‘B’键, 则执行完第 2 条指令后, A 中的值就是“1” 。 并且按照我们的分析,按下‘B’后应当执行 S2 这段程序,让我们来看一看是否是 这样呢,第 3 条、第 4 条指令是将 A 中的值乘“2”,即执行完第 4 条指令后 A 中 的值是“2”,下面就执行 JMP @A+DPTR 了,现在 DPTR 中的值是“TAB” 而 A+DPTR 后就是“TAB+2”,因此,执行完这条程序后,将会跳到 TAB+2 这个地址处继续执行;看一看在 TAB+2 这个地址里面放的是什么,就是 AJMP S2 这条指令,因此,马上又执行 AJMP S2 这条指令,程序将跳到 S2 处往下执行 , 这与我们的要求相符合。 请大家自行分析按下键‘A’、‘C’、‘D’? ? 之后的情况。 这样我们用 JMP @A+DPTR 这条指令就实现了按下一个键跳转到相应程序段去执 行的这样一个要求。再提一个问题,为什么取得键值后要乘“2”呢,如果例程下面 的所有指令换成 LJMP ,即:LJMP S1,LJMP S2? ? 这段程序还能正确地执行吗,如 果不能,应该怎么改, 32 ,(条件转移类指令 条件转移类指令就是在满足一定的条件后进行相对转移。 1 转移指令:JZ rel 2 转移指令:JNZ rel 第,条指令的功能是:如果(A)=0 ,则转移,否则顺序执行(执行本指令的下 一条指令),转移到什么地方去呢,如果按照传统的方法,就要算偏移量,很麻烦 , 好在现在我们可以借助于机器汇编了。因此这条指令我们可以这样理解:JZ 标号 , 即转移到标号处。下面举一个例子来加以说明: L1: MOV R1,#0FFH; L2: SJMP L2 ;END 在执行上面这段程序前如果 R0 中的值是“0”的话,就转移到 L1 标号处执行,因 此最终的执行结果是 R1 中的值为 0FFH ;而如果 R0 中的值不等于“0”,则顺序执 行,也就是执行 MOV R1,#00H 指令,最终的执行结果是 R1 中的值等于“0”。把 这个例子中的 JZ 改成 JNZ 试试吧,看看程序执行的结果是什么? (,)比较转移指令 A(CJNE A,#data,rel B(CJNE A,direct,rel C(CJNE Rn,#data,rel D(CJNE @Ri,#data,rel 指令说明:第 1 条指令的功能是将 A 中的值和立即数 data 比较,如果两者相等, 就顺序执行;如果不相等,就转移。同样地,我们可以将 rel 理解成标号,即:CJNE A,#data, 标号。这样利用这条指令,我们就可以判断两数是否相等,这在很多场 合是非常有用的,但有时还想知道两数比较之后哪个大,哪个小,本条指令也具有 CY 这样的功能,如果两数不相等,则 CPU 还会反映出哪个数大,哪个数小,这是用(进位位)来实现的,如果前面的数(A 中的)大,则 CY=0 ;否则 CY=1 ,因此在 程序转移后再次利用 CY 就可判断出 A 中的数比 data 大还是小了。 例如: MOV A,R0 ; CJNE A,#10H,L1 ; MOV R1,#0FFH ; AJMP L3 ; L1: JC L2 ; MOV R1,#0AAH ; AJMP L3 ; L2: MOV R1,#0FFH ; L3: SJMP L3 ; 上面的程序中有一条指令我们还没学过,即JC,这条指令的原型是 JC rel, 作用和 上面的 JZ 类似,但是它是判 CY 是“0”还是“1”进行转移,如果 CY=1 ,则转移 到 JC 后面的标号处执行;如果 CY=0 则顺序执行。 分析一下上面的程序,如果(A)=10H ,则顺序执行,即 R1=0 ;如果(A)不等于 10H ,则转到 L1 处继续执行,在 L1 处,再次进行判断,如果(A)>10H ,则 CY=1 , 将顺序执行,(即执行 MOV R1,#0AAH 指令);而如果(A)<10H ,则将转移到 L2 33 处指行,(即执行 MOV R1,#0FFH 指令)。 因此最终结果是:本程序执行前,如果(R0)=10H ,则(R1)=00H ;如果(R0 ) >10H ,则(R1)=0AAH ;如果(R0)<10H,则(R1)=0FFH。 弄懂了这条指令,其它的几条就类似了,第 2 条是把 A 当中的值和直接地址中的值 比较,第 3 条则是将直接地址中的值和立即数比较,第 4 条是将间址寻址得到的数 和立即数比较,这里就不解释了,请大家自行分析一下。下面给出几个相应的例子 : CJNE A,10H;把 A 中的值和 10H 中的值比较(注意和上题的区别) CJNE 10H,#35H;把 10H 中的值和 35H 中的值比较 CJNE @R0,#35H;把 R0 中的值作为地址,从此地址中取数并和35H 比较 循环转移指令 A(DJNZ Rn,rel B(DJNZ direct,rel 第,条指令在前面的实验中已经有详细的分析,这里就不解释了;第,条指令,只 是将 Rn 改成直接地址,其它的也一样。 ,(调用及返回指令 在前面的实验中,我们已用过了子程序,只是我们并没有明确地介绍。子程序是干 什么用的,为什么要用子程序呢,举个例子,我们数学老师布置了10 道算术题, 经 过观察,每一道题中都包含一个(5+2)*3 的运算。我们可以有两种选择,第一种 选择,每做一道题,都把这个算式算一遍; 第二种选择,我们可以先把这个结果算出来(也就是21),放在一边,然后要 用到这个算式时就将 21 代进去,这两种方法哪种更好呢,那就不必多言了吧。设计 程序时也是这样,有时候一个功能会在程序的不同地方反复使用,我们就可以把这 个功能设计成一段程序,每次需要用到这个功能时就“调用”一下,这就是子程序 的用途所在,后面我们还会更详细地讲解子程序的用法。 主程序调用了子程序,子程序执行完之后必须再返回到主程序继续执行,不能“一 去不回头”, 那么回到什么地方呢,就是回到调用子程序的下面一条指令处继续执 行(当然啦,要是还回到这条指令,不又要再调用子程序了吗,那可就没完没了了 ? ? )。大家可以回去看一下前面的实验,是不是这样做的, 1 调用指令 2 长调用指令:LCALL addr16 3 短调用指令:ACALL addr11 上面两条指令都是在主程序中调用子程序,两者的区别大家结合前面的知识可以自 己分析一下。同样作为初学者,我们可以不必加以区分,也就是说可以用LCALL 指 令代替 ACALL。 1 返回指令 2 子程序返回:RET 3 中断返回:RETI RET 用于子程序返回,RETI 用于中断程序返回,这是有区别的,可不能用错了,至 于什么是中断返回,我们讲到中断时再来解释。如何从子程序返回呢,很简单,就 是执行 RET 指令,看一下前面的实验。 空操作指令:NOP 所谓空操作,就是什么事也不干,停一个机器周期,一般用作短时间的延时,这个我们已经讲过了。 34 原文已完。下文为附加文档,如不需要,下载后可以编辑删除,谢谢~ 村支部书记在乡镇会议上的汇报发言 各位领导,同志们: 我叫XXXX,是XXX村村支部书记。能够在今天的会议上发言,我深感荣幸,这是乡党委、政府及管理区领导对XXX村“两委”工作的肯定,也是对我们珍惜荣誉、发扬成绩、戒骄戒躁、再创佳绩的鼓励。 XXX村有6个自然村,8个村民组,1500口人,村域面积9600亩,而耕地面积仅有1370亩。与杨庄管理区大部分村一样,距XXX街较远,自然条件较差,山多地少,人均不足一亩地。 2005年,我接任村支书时,全村还有贫困人口520人,道路、水利等基础设施十分落后,也没有什么产业,村里大部分劳力外出打工,留下老弱病残,在家靠天吃饭。 为了甩掉贫穷落后的“帽子”,村两委做了很多难,也出了很大力。俗话说,要想富,先修路。不走泥巴路也是全村男女老少多年来的期盼,于是,新一届村两委班子将修路确定为全村头等大事。通过跑项目、要指标,功夫不负有心人,终于在07年修通了新东、新西、河西三个组至四柳路的1.9公里村村通道路,08年又修成石东、石西两个组的2.3公里村村通道路。截止目前,全村六个自然村全部通上水泥路,其中XXX、河西两个村民组已经达到了“户户通”。 35 修好了路,群众们走亲串友方便了,上街买东西方便了,脸上的笑容也多了,几个村干部觉得跑腿流汗都值了。但是,我们又发现了新的问题,群众腰包不鼓、兜里没钱,依然是饱一顿饥一顿,甚至有些困难户吃了上顿没下顿,咋办,经过村两委班子多次商议,一致认为要发展一个产业,要有特色,要有高效益。结合村情,我们在充分调查、论证的基础上,决定组织群众沿北部山区,大力发展以薄皮核桃种植为主的特色林果业。说了就算,想了就干,经过做群众工作,甚至是村干部带头种植,如今,全村已经发展薄皮核桃2000余亩,建成苗圃园两个、占地150多亩,成立种植专业合作社4个、养殖合作社1个,已经有一部分群众得到了实惠。 近年来,国家对农村人居环境改善相当重视,我们村两委班子也做了不少努力,村容村貌有了很大改善,虽不能与平原地区相比,但在山区农村也称得上亮点。尤其是去年以来,我们村被乡党委、政府确定为美丽乡村建设试点村,在上级的支持和全村群众的努力下,试点XXX组完成路面硬化、修补300余米,整理边沟280米,铺设道沿石100多米,种植绿化树木312棵,粉刷墙壁600余平,初步实现了污水不乱流、垃圾不乱到,村容村貌焕然一新。 可以说,一直以来,村两委班子总是在千方百计带领群众发展产业,总是在想方设法改善群众生产生活水平,也取得了一些成效,得到了上级领导和绝大部分群众的认可。我们也很知足,但并不是满足,更不会骄傲。下一步,我们还要牢记乡党委、政府的嘱托和全村群众的期望,继续发展特色产业,尤其是薄皮核桃种植,力争今年再发展 36 600亩,发动更多的群众参与,把产业做大做强,让群众得到更多的实惠。在美丽乡村建设上,进一步解决XXX组试点的污水和垃圾处理问题,加强对群众良好生活习惯的培养,将XXX组打造成居住环境优美、群众精神风貌焕然一新的“美丽乡村”。并在此基础上,逐步向其余村民组辐射,不断加大工作力度,不负领导和群众期望,让XXX村成为一个产业结构明晰、基础设施完善、村容村貌优美、社会治安良好的美丽乡村。 县委第一责任人组织落实巡视反馈意见情况报告 根据XX省委巡视统一部署,XX年4月24日至5月23日,省委县(市、区)巡视一组对XX县进行了巡视。8月18日,省委县(市、区)巡视一组向XX县委反馈了巡视意见。按照党务公开原则和巡视工作有关要求,现将巡视整改情况予以公布。 一、切实把巡视整改工作作为政治任务抓紧抓好 XX县委高度重视省委县(市、区)巡视一组反馈意见,坚决把整改工作抓严抓实抓到位,切实承担起巡视整改的主体责任。县委书记张镇城同志为第一责任人,积极主动对照反馈意见,坚持高标准、严要求,坚决把整改工作落实到位。 (一)统一思想认识,认真领会省委要求和巡视组反馈意见 省委巡视组反馈意见后,张镇城同志立即主持召开县委常委会,专题学习省委重要指示,领会把握巡视组反馈意见。通过学习,大家 37 深刻认识到省委县(市、区)巡视一组代表省委到XX开展巡视工作,对于我县巩固和扩大党的群众路线教育实践活动成果,深入开展“三严三实”专题教育活动,推进党风廉政建设和反腐败工作的深入开展,营造良好的从政环境、构建良好的政治生态,具有十分重要的意义。巡视组提出的整改要求和各项意见,明确具体,针对性、指导性、操作性都很强,完全符合XX实际,充分体现了对XX工作的关心支持,体现了对XX广大党员干部的警示和爱护,是县委总结反思、改进工作的重要契机。为此,县委要求全县各级党委(党组)和广大党员干部特别是领导干部,要以此次省委巡视组反馈意见为动力,进一步统一思想,充分认识省委对县(市、区)巡视工作的重要意义,不断增强党要管党、从严治党的政治意识和责任担当。 (二)加强组织领导,层层传导压力推动整改落实 县委对巡视整改工作负主体责任,纪委承担监督责任。整改工作在县委常委会集体领导下开展,建立牵头挂项机制,由张镇城同志总体负责整改落实工作,其他班子成员和相关领导认真履行“一岗双责”,根据职责分工相互配合抓好各项整改任务的落实。张镇城同志认真履行第一责任人的责任,亲力亲为抓部署、抓推动、抓督导,先后主持召开县委常委会议和专题会议,对落实巡视整改工作进行专题研究部署;在赴XX中央党校学习期间,还多次打电话了解整改工作进展情况;国庆长假回XX期间,专门听取整改情况汇报,召集相关领导进一步研究,督促落实跟进措施,推动整改落实。县长何德发等领导对照整改问题,牵头制定分管联系领域内问题整改推进措施,督 38 促县直部门和乡镇推动整改落实向基层延伸;全县各级党委(党组)积极对照整改任务,各负其责、抓好整改;县委办、政府办、纪委认真做好协调、推进、督办等工作,推动形成上下联动、合力整改的工作格局。 (三)明确责任分工,从严从实开展各项整改工作 县委针对巡视组反馈的党风廉政建设、落实中央八项规定精神和作风建设、执行政治纪律和政治规矩、选人用人和执行民主集中制等四方面8项内容,研究制定《关于落实省委县(市、区)巡视一组〈关于对XX县巡视情况的反馈意见〉的整改任务与分解 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 》,细化分解成19项整改任务,每项整改事项都确定了牵头领导、牵头单位和责任单位,明确了整改时限和目标要求,使责任更加明晰、措施更加具体,保证了整改事项“件件有方案、事事有人抓”。张镇城同志在统筹协调抓好整改落实各项工作同时,带头领办具体整改事项,担任3项整改事项的牵头领导,其他常委也根据各自的工作职责领办整改事项,一个问题一个问题深入研究,一个步骤一个步骤推进整改。同时,坚持把整改落实与巩固党的群众路线教育实践活动成果相结合,与开展“三严三实”专题教育相结合,以巡视反馈问题的整改推动作风持续转变。 二、省委巡视组反馈意见整改落实情况 省委县(市、区)巡视一组向我县反馈了在党风廉政建设、落实中央八项规定精神和作风建设、执行政治纪律和政治规矩、选人用人和执行民主集中制等四方面存在的问题。截止10月15日,四个方面 39 19个具体问题,已经整改完成14个,正在整改5个;移交初信初访件44件,已核查结束37件,正在办理7件;对相关责任人88人进行责任追究,涉及科级领导干部39人,其中,进行诫勉谈话、责令书面检查、辞退等57人次,立案查处31人,已给予党政纪处分26人。具体整改工作进展情况如下: (一)党风廉政建设方面 1.“两个责任”落实不到位问题 一是着力落实“两个责任”。县委深入学习领会习近平总书记关于党风廉政建设和巡视工作的重要讲话精神、省委对巡视整改工作的重要部署,制定出台《关于落实党风廉政建设党委主体责任的实施意见》、《关于落实党风廉政建设纪委监督责任的实施意见》、《XX县党风廉政建设责任追究暂行办法》等文件制度,进一步明确党委主体责任、纪委监督责任和责任追究的情形、方式、程序及结果运用,促进责任落实具体化,督促党委领导班子切实履行“一岗双责”,扎实抓好职责范围内的党风廉政建设。纪委监察机关履行监督责任,协助县委加强党风建设,推动各级党组织履行主体责任。加强纪律审查力度,进一步严明纪律,严格落实中央八项规定精神,坚决查处以招商引资为名公款吃喝、公款旅游的案件,并及时给予问责和曝光,努力形成高压态势。2015年1-9月,全县共新立案79件,办结65件,党政纪处分65人,移送司法机关追究刑事责任4人,挽回经济损失300多万元。同时,强化自身建设,建立纪检监察干部业务培训常态化机制,提升纪检监察干部履职能力和水平,今年共组织纪检监察系 40 统综合业务培训班3期培训230人次,选派县乡纪检监察干部参加中央、省、市纪检监察业务培训25人次。 二是强化干部监督管理。不断强化“全面”和“从严”意识及措施,切实加强对领导干部监督制约,为经济和社会发展提供坚强有力的纪律保障。抓常态,把严格执行和落实好党员领导干部诫勉谈话、函询、重大事项报告和个人有关事项报告等干部监督制度作为一项常态化的工作来抓,坚持把纪律挺在前面,注重抓早抓小,以良好的党风政风带民风社风。今年来共有178名拟提拔或调整的领导干部提交了个人有关事项报告表,科级干部报告婚丧喜庆等个人重大事项28人次。抓重点,加大对重点领域和关键岗位干部的监督,特别是单位“一把手”和领导班子,对他们在政治立场、民主决策、廉洁自律和班子建设等方面进行全面监督。加强对干部选拔任用工作的监督,把好选人用人关口,今年共对6批160名转任或拟提拔对象进行任前公示,组织2批15名拟提拔科级领导职务的干部参加任职前廉政法规知识测试。落实领导干部任期和离任经济责任审计制度,加大对领导干部特别是重要岗位领导遵守财经纪律等情况的监督力度,今年共 计划 项目进度计划表范例计划下载计划下载计划下载课程教学计划下载 对18个单位的主要领导进行经济责任审计,已经完成10个,在审3个。抓问责,严格执行“一案双查”制度,加大责任追究力度,坚持把责任追究作为落实党风廉政建设责任制的关键环节,今年已查处责任追究案件19起,问责科级领导干部35人,其中,立案调查17人,给予党纪处分13人,诫勉谈话9人,责令作出书面检查9人。 三是认真办理巡视组移交事项。首先,集中时间集中力量及时核 41 查省委巡视组移交的信访件和问题线索。要求纪委对巡视组交办的信访件和问题线索162件,其中:业务内信访件84件(初信初访件44件),业务外信访件78件(已转相关部门办理),建立工作台账,集中时间集中力量,由县纪委常委带队,进行调查核实。加大查办案件力度,在梳理排查问题线索的基础上,对可查性强、时机成熟的适时启动立案程序。截止10月15日,44件初信初访件中,37件已核查结束,7件正在办理。其中:查实转立案12件15人,已给予党纪处分15人;部分属实7件,已整改到位3件,建议提起诉讼1件,给予诫勉谈话1件,正在落实整改2件;失实了结15件;直接了结3件。对巡视期间,西潭乡党委副书记李南君违反中央八项规定精神,大操大办丧事,在群众中造成不良影响,县纪委及时立案调查,给予党内警告处分。其次,着力做好日常信访举报工作。及时处置新受理的信访件,做到当周签批交办,限时办结。今年1-9月,新受理检控类初信初访103件,逐件进行核实,从中发现问题线索并转立案39件,有效减少信访存量、遏制信访增量,努力做到信访件“零暂存”。 2.工程建设等重点领域存在的问题 责令相关单位、部门进行自查清理,逐个问题抓好整改落实,出台《XX县加强和 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 财政性资金对外借款行为管理意见》、《关于进一步加强和规范招标投标管理的若干意见的通知》等文件制度,加强工程建设等重点领域的廉政风险防控。 (1)关于有的BT项目建设不规范问题 ?厦深高铁XX站站前广场及道路建设BT项目。县城投公司及时 42 组织审核调查,强化整改落实。一是强化BT项目财政审核和政府项目工程审计结算工作。9月17日,县审计局已对该项目进行审计。二是站前广场及道路建设BT项目建安费下浮1.5%。三是启动追责程序,县纪委对时任城投公司总经理林光荣、副总经理林镇国分别进行党纪立案调查,县城投公司对财务部负责人许隽生进行效能告诫,并通报批评。四是建立健全制度,印发工程招投标 管理制度 档案管理制度下载食品安全管理制度下载三类维修管理制度下载财务管理制度免费下载安全设施管理制度下载 、操作流程,制定小额工程招投标管理办法,加强对业务人员招投标政策法规和BT项目知识的培训教育。 ?XX县中医院搬迁(含瑞康医院)建设BT项目。一是建安费下浮比例按3 % 进行结算。二是对未能认真把关项目建安费下浮比例等问题的相关人员进行问责,县卫计局分别给予负有领导责任的中医院副院长沈永义效能告诫、直接责任人基建科科长沈汉乾行政警告处分。 ?南湖公园片区及配套用地建设项目。加强对南湖公园片区及配套用地建设项目的监督管理,县城建局责令业主单位提交书面情况说明,并对其进行约谈和通报批评,给予相关责任人XX县房地产综合开发总公司总经理沈少山行政警告处分。同时,采取了三项整改措施:一是终止该项目土地一级开发合同条款,并终止土地挂牌出让净收益的30 % 分成的合同条款,另按合理的回报支付投资人的投资收益。二是403.69亩土地由政府方面统一收购储备挂牌出让,所得土地出让金偿还上述投资款及收益。三是对于项目未约定回购期问题,县房地产综合开发总公司正在施工方协商合同条款变更。 43 (2)关于有的工程项目以时间紧、要求高为由规避公开招投标问题 ?XX工业园区绿化项目规避招投标问题。县纪委责令XX工业园区分管建设工作的党工委委员杨云飞、土地规划建设局局长沈仕超作出书面检查。目前,工业园区已建立健全园区工程建设项目管理的决策、实施机制,规范建设项目的运作流程,建设发展公司年初按照规划提出项目盘子,制定年度投资计划,明确项目负责人和完成时限,报园区项目工作领导小组审核后再按计划、按程序实施项目,避免随意性。 ?金都工业集中区绿化项目规避招投标问题。金都工业集中区要求市政公司、招投标工程领导小组、财税管理局等多部门联动,组织人员开展工程项目清理。县纪委对时任金都工业集中区市政工程建设公司经理肖华顺进行诫勉谈话,责令作出书面检查。 ?金星乡规避招投标问题。2011年7月,乡政府将总价25万余元的办公楼主楼铝合金窗项目发包给无施工资质的个人,用现金结算并多付2万元,现已收回多付铝合金窗项目款19031.9元。关于2012年10月至2013年2月间,将总造价78.82万元的绿化配套工程分为3个项目实施,以及计生服务所业务用房大楼1台电梯工程(造价22.9万元)未经政府集中采购等问题,金星乡于8月31日召开专题会议,乡党委书记作为党风廉政建设的第一责任人对省委巡视组反馈的问题向班子会作检讨,深刻反省,并制定整改方案,具体到责任人、责任单位,形成专题会议纪要。县纪委对时任金星乡党委书记李保芳进 44 行党纪立案调查。 ?一些重点工程项目勘察、设计、监理方的选择,没有按规定进行招标,而是采用邀标或比选方式问题。加强县污水厂扩建及管道配套工程、站前广场、连站大道拓宽工程等项目的监督管理,制定工程招投标管理长效机制,确保应招标的工程项目百分之百招标,确保招投标工作的规范性和合法性。 (3)关于部分工程项目随意增加工程量、提高工程造价问题 ?县城投公司擅自同意施工方因取土点改变增加项目工程费用问题。县城投公司及时成立调查组,对巡视组反馈的问题进行调查、核实、梳理,深入分析研判。一是强化BT项目财政审核和政府项目工程审计结算工作。9月17日,县审计局已对该项目进行审计,确保国有资金不流失。二是暂停支付第二、三期70%回购款。三是施工方同意分担业主因取土点变更重新租地、赔青、坟墓迁移等费用110万元。四是对相关责任人进行问责。县纪委对时任城投公司总经理林光荣、副总经理林镇国分别进行党纪立案调查。县城投公司对项目现场负责人沈洪辉进行辞退处理;对项目现场管理人员许松琛、沈晓三、沈森鑫等3人,因现场监管不力问题,进行调离岗位处理,并通报批评。 ?县南环城路及玉峰南路道路工程项目调整中标价问题。县城投公司把该工程相关资料文件及省巡视组对该项目巡视提出的问题一并报送审计部门进行审计,由审计部门根据工程的实施情况进行核定,公司与施工单位的结算最终以审计结算价进行结算。同时,县纪 45 委对时任城投公司总经理林光荣、副总经理林镇国分别进行党纪立案调查,城投公司对该项目工程部负责人许晓东进行效能告诫,并通报批评。 (4)关于违规用大额现金支付工程款问题 ?桥东镇。2012年1月至2014年8月,桥东镇政府有14个工程项目以收款收据做账。桥东镇要求相关施工单位补开具正式发票入账,目前已补开发票的工程13项,总金额125.1015万元;未补开发票的工程1项,金额1.18万元。鉴于时任党委书记沈瑞强违纪被开除党籍,县纪委对时任镇长沈晓文给予党内警告处分,责令财务人员作出书面检查。 ?深桥镇。2011年3至2014年11月,深桥镇政府有23个2-21万元不等的工程项目以现金结算方式支付,总金额85.39万元,并以收款收据做账。深桥镇要求23个工程项目负责人补开税务发票重新登帐,已全部整改到位。县纪委已责令有关责任人作出书面检查,并将结合有关问题线索进行问责。 (5)关于违规出借国有资金、出租(售)国有资产问题 ?深桥镇违规出借公款问题。经查,深桥镇2007年1月至2014年12月间共出借国有资金32笔给9家民营企业,尚有部分资金未收回。深桥镇加大整改力度,约谈业主,制定催讨计划。县纪委已成立调查组对此问题进行调查核实,并将严肃追究责任。同时,在全县范围内开展财政性资金非公务借款清理专项行动,出台《关于进一步加强规范财政性资金对外借款行为管理意见》,规范财政资金管理。 46 ?县交通局违规出租挖掘机、交管站站房等国有资产问题。县交通局领导高度重视,立即召开会议研究并作出整改。一是现四都、三角点、太平三处交管站房结欠租金均已入库,原出租协议不再延续,交管站房原租用者已撤离。二是挖掘机原租用者已于9月3日交回机械及随机附件,租赁协议也随之解除,挖掘机结欠租金已追缴到位,挖掘机已入库管理。三是交通局日前已按规范程序向县国有资产管理部门办理交管站房等国资出租(处置)报批手续的程序。四是对时任人秘股股长沈俊光未能及时报告上述国有资产出租协议到期(或应解除协议)时间,延误单位按规范程序办理公开出租(处置)报批手续时间等问题,县纪委对沈俊光进行党纪立案调查,责令交通局局长张育纯作出书面检查。 ?XX工业园区将新城花园店面低价出售问题。经查阅相关资料,XX工业园区出售的新城花园17间店面中,时任班子成员均无购买,个别领导的亲戚、身边工作人员是否有购买正在进一步核实。 3.少数基层干部在土地征收流转中以权谋私,群众身边的“四风”和腐败问题时有发生 一是严格监督。县委、县政府把查处发生在群众身边的“四风”和腐败问题作为落实党风廉政建设主体责任的重要内容,主要领导切实担负起第一责任人的责任。同时,发挥各职能部门的主体作用,县民政、财政、人社、国土、城建、农业、卫计、税务以及基层执法、监管、公共服务等窗口行业涉及到的部门,既各负其责、主动履职,又加强联动、形成合力,着力整治行业、系统的发生在群众身边的“四 47 风”和腐败问题。二是严肃执纪。纪检监察机关把发生在群众身边的“四风”和腐败问题列入纪律审查重点,作为纪律处分的重要内容。坚持把纪律挺在前面,抓早抓小、动辄则咎,用纪律管住大多数。大力加强土地廉政风险防控,开展打击非法买卖土地专项整治行动,严肃查处非法倒卖土地行为,去年以来,查处了党员干部非法买卖土地窝串案,涉案56人,立案24人(其中科级8人),移送司法机关16人,涉案金额460多万元。同时,坚持以零容忍态度,严厉查处医疗领域、惠民资金拨付中侵害群众利益的案件,今年来,查处发生在群众身边的“四风”和腐败问题28件,党政纪立案28件,现已党纪处分25人。其中,医疗卫生领域侵害群众利益的案件4件,惠农强农资金拨付中侵害群众利益的案件10件,基层干部吃拿卡要的案件1件,查处基层行政执法乱作为案件5件。三是严加防范。相继出台《关于建立惠农资金落实情况报告制度的通知》、《关于进一步规范强农惠农资金公开公示制度》、《关于开展涉农资金专项整治行动的实施意见》等文件制度,规范惠农强农资金使用;印发《关于开展严厉打击非法买卖土地专项行动方案》,严肃查处土地流转中侵害群众利益案件。 (二)落实中央八项规定精神和作风建设方面 4.公务用车费用支出偏高问题 一是加强公务用车管理。县委办、政府办联合印发《关于进一步规范公务用车费用支出管理的通知》,严格执行公务用车配备使用管理有关规定,坚持总量控制、规范管理、厉行节约。严格控制车辆经 48 费预算支出,以前三年的平均数下调10%为基数,科学设定单位公车运行费用限额。严格执行公务用车使用管理制度,督促各单位建立健全派车制度,实行定点维修制度,严禁以收款收据报销车辆维修费用。严格落实公务用车“一车一卡”加油制度,实行定额用油、一车一卡、专卡专用制度,从源头上加强对公务用车燃油费的监控管理。二是开展燃油补贴清退工作。检查发现部分单位存在违规发放交通燃油费补贴,一定程度上导致了我县整体公务用车费用支出偏高问题。为严肃财经纪律,深化落实中央八项规定精神,经县委、县政府研究决定,由县政府办下发《关于清退违规发放交通燃油费补贴的通知》,要求全县各单位自查清退2013年7月1日以来违规发放交通燃油费补贴。截止10月15日,全县共清退违规发放的交通燃油费补贴121.44万元。三是强化公务用车的监督检查。加强对全县公务用车费用支出的全方位监督检查,县委、县政府督查室、县效能办采取巡查、暗访、督办等方式,不打招呼、不定时间、不限地点对全县公务用车油卡使用、定点停放、派车制度等情况进行监督检查。四是加大惩处力度。今年来,共查处违规使用公务用车、违规报支私车费用和违规发放交通燃油费补贴等问题7起13人,如查处了梅岭镇违规发放交通燃油费补贴问题,对梅岭镇原党委书记陈金平、原纪委书记杨立辉进行党纪立案,对时任镇长沈来龙、现任镇长陈三武进行诫勉谈话;县国土资源局秀篆国土所所长陈武元公车私用问题,给予行政警告处分;桥东镇原党委委员XX顺违规报支私车费用问题,给予XX顺党内警告处分。 49 5.公务接待管理不严、财务报支不规范问题 一是认真核实整改。针对县林业局等10个单位公务接待管理不严、财务报支不规范等问题,县纪委已组织人员进一步调查核实,督促相关单位整改到位,并对违反规定的相关责任单位和责任人严肃追究责任。?关于县林业局公务接待和招商引资接待开支票据不规范问题,经核实,县纪委对县林业局负责食堂接待的人秘财务股股长沈金辉、副股长陈镇林进行诫勉谈话,责令县林业局局长胡平忠作出书面检查。?关于县公安局公务接待和招商引资接待开支票据不规范问题,经核实,对县公安局负责公务接待工作的时任警务保障室主任李小明进行诫勉谈话,责令食堂管理员沈玉龙作出书面检查。?关于XX工业园区公务接待和招商引资接待开支票据不规范问题,经核实,县纪委对园区分管办公室的党工委副书记叶斌进行诫勉谈话,责令园区副主任王雪芳、财税局局长林荣治、经发局局长吴丽萍等7人作出书面检查,责令退缴未注明接待事由、对象、人数标准等内容的已报销票据7张金额计5250元。?关于金星乡同城接待、异地接待问题,经核实,县纪委对分管党政办的时任金星乡副乡长沈宝川进行诫勉谈话,责令金星乡党委书记陈燕贞、财政所所长陈永林、党政办副主任林炎钦等4人作出书面检查。?关于县发改局同城接待、异地接待和用公款购买土特产品问题,责令县发改局副局长许旭松、时任办公室主任叶和泉等3人作出书面检查,责令退缴违规购买土特产品金额计1.15万元。?关于交通局等单位同城接待、异地接待问题,经核实,县纪委对经办人员沈舜平给予党内警告处分、沈彩明进行约谈,责令 50 县交通局退缴“2015年1至3月异地接待开支”金额计5022元,责令交通局局长张育纯作出书面检查。?关于霞葛镇以收款收据报支接待费和公款购买土特产品问题,经核实,县纪委已责令霞葛镇进行整改,对时任镇长陈敏聪、现任镇长吕自信、时任党政办主任张文培给予党内警告处分,对党委书记沈林松进行诫勉谈话。?关于深桥镇用公款购买土特产品问题,县纪委对深桥镇时任组织委员兼党政办主任吴志斌、工作人员吴激进行约谈,案件在进一步调查中。?关于白洋乡用公款购买土特产品问题,经核实,县纪委对白洋乡时任乡长许仲岚党内严重警告处分,对纪委书记田元斌、分管公务接待工作的时任党委委员林惠丹、时任党政办主任李煜给予党内警告处分,对党委书记沈东生、乡长吕新国进行诫勉谈话,责令白洋乡党委宣传委员黄瑞麟、财政所所长许朝辉等13人作出书面检查,同时,白洋乡党委研究决定将财政所所长许朝辉降职改任财政所副所长,将总务陈志明调离党政办,给予白洋乡党政办通报批评,并撤销党政办“总务”岗位。?关于四都镇公务接待和招商引资接待开支票据不规范和大额办公用品未按规定实行政府采购问题,经核实,县纪委对四都镇分管党政办的党委组织委员沈一娟给予党内警告处分,责令时任镇长蔡祥瑞、党政办主任张文艺等7人作出书面检查。二是健全完善制度。深化落实中央八项规定精神,先后制定《关于进一步加强行政事业单位财务管理的意见》、《XX县推行财务公开工作的实施方案(试行)》、《XX县县直机关会议费管理办法》等文件,进一步规范财务报销,压缩“三公”经费支出;出台《XX县进一步规范公务接待管理意见 51 的通知》,对公务接待范围、接待标准、审批程序和报销手续作出明确规定。三是加大查处力度。在五一端午、中秋国庆期间,在全县范围内开展违反中央八项规定精神突出问题专项整治活动,由县纪委监察局领导班子带队,抽调乡镇纪委书记、县直纪检组长、财政局、公安局等部门人员,组成5个督查小组,对48个乡镇(区)、县直单位和旅游景点,开展中央八项规定精神落实情况监督检查,重点检查“三公”经费支出等情况,发现疑似线索37条,调查核实4条,转党政纪立案3件。今年来,共查处违反中央八项规定精神问题19起68人,立案调查18人、给予党政纪处分17人,诫勉谈话12人、书面检查37人、责令辞退1人,点名道姓通报4起5人。 6.干部“庸政、懒政、怠政”现象 一是强化干部思想教育。深入学习习近平总书记系列讲话精神,发挥乌山红色革命教育基地作用,加强党员干部的理想信念教育。结合“三严三实”专题教育活动,进一步坚定理想信念,强化党性原则,明确干事创业的行为准则,不断强化党员干部“忠诚、干净、担当”意识。二是深化机关效能建设。贯彻落实《XX县深化“马上就办”行动、优化发展软环境的实施方案》,围绕纪律作风开展督查,针对可能存在的一些干部纪律松懈、庸懒散拖以及群众办事“三难”等现象,综合运用经常性、随机性抽查、明察暗访等形式督查。出台《2015年度绩效考评工作方案》,促进转变作风、高效履职、优化服务。三是完善干部考核评价体系。紧盯年初确定的目标任务,结合省、市“三比一看”、“三个年活动”和“大干六个月”等活动的部署要求,抽 52 调干部到重点项目、征地拆迁一线锻炼,提高干部担当意识和执行力。修订完善《注重工作实绩推荐选拨干部考评办法》,积极探索干部“能上能下”机制,形成能者上、庸者下、劣者汰的良好用人导向。同时,把监督干部同信任干部、保护干部、激励干部统一起来,支持干部锐意改革、大胆创新,激发干部知难而进、干事创业。 (三)执行政治纪律和政治规矩方面 7.对上级的决策部署监督不力、执行不到位问题 一是抓好党性党风党纪教育,结合党的群众路线教育实践活动和“三严三实”专题教育活动,引导党员干部着力增强宗旨观念、提高实践能力、强化责任意识、树立正确政绩观和利益观、增强党纪观念。二是加强监督检查,确保政令畅通,开展上级党委、政府和县委、政府一系列决策部署贯彻落实情况的监督检查,如印发《关于2015年中秋国庆期间开展中央八项规定精神落实情况监督检查的通知》,不断巩固落实中央八项规定精神成果,严防“四风”问题反弹。三是严肃查处对上级的决策部署监督不力、执行不到位等行为,特别是未能结合本地实际制定贯彻落实中央八项规定精神的具体措施,以招商引资为名、白条开支等形式搞变通、应付等问题,加大问责力度,严肃查处了梅岭镇违规发放交通燃油费补贴问题,林业局等单位公务接待管理不严、财务报支不规范问题,白洋乡、霞葛镇等用公款购买土特产品问题。 (四)选人用人和执行民主集中制方面 8.个别单位存在“近亲繁殖”现象 53 一是摸清底数,强化整改。经摸排,县法院、公安局、市场监督管理局、交通局、林业局、农机站等6个单位,在同单位工作有亲属关系的公务员或事业(参公)干部共51人,其中违反《公务员回避规定(试行)》的16人。截止10月15日,违反回避规定的16人中,市场监督管理局县管干部存在直接上下级领导关系的1对夫妻和1对兄妹已在巡视期间分别将其中1人调离原单位,其他在同一单位双方属同一领导分管的有亲属关系的12人,均对其中一方进行适当的岗位调整。二是建章立制,源头防范。县人社局参照《公务员法》有关回避的要求,结合本县实际,出台制定岗位和工作回避规定,坚决从制度层面杜绝“近亲繁殖”现象。同时,加大对《干部选拔任用工作条例》、《公务员法》等有关干部政策法规的学习培训力度,督促各级党委和组织人事部门严格按照政策法规办事。 三、持续巩固和深化整改工作成果 经过两个月的集中整改,我县的整改工作取得了一定成效,但县委清醒地认识到,整改工作离省委的要求和干部群众的期待还有一定差距,党风廉政建设仍然任重道远。下一步,县委将严格对照巡视反馈意见要求,举一反三,标本兼治,抓常抓严抓实,坚持不懈抓好整改落实工作,以实际成效取信于民。 一是坚持问题导向抓好专项整治。坚持目标不变、力度不减,对巡视整改工作紧抓不放,督促各级党组织加强对整改工作的领导,坚持问题导向,大力发扬“钉钉子”精神,以“踏石留印、抓铁有痕”的劲头解决突出问题,坚定不移地向老大难问题开刀,做到敢碰硬、 54 啃“硬骨头”。 二是层层传导压力抓好责任落实。严格落实党委主体责任和纪委监督责任,切实督促各级党委对党风廉政建设负起全面领导责任,特别是抓牢抓实党委主要负责人第一责任人职责;班子其他成员要根据工作分工,对职责范围内的党风廉政建设负主要领导责任,切实履行“一岗双责”,凝聚形成抓整改的强大合力。支持各级纪委聚焦中心任务,加强对党风廉政建设和反腐败工作的监督,切实履行好党内监督职责,确保党风廉政建设责任制落到实处。 三是强化堵塞漏洞抓好建章立制。把显性问题整改与隐性问题查找统一起来,把立行立改与完善长效机制结合起来,以落实整改为契机,进一步建章立制,扎好制度的篱笆,坚持用制度管事管人,深入推进作风建设和反腐败工作,切实以正风肃纪、高压反腐的有力举措,逐步形成不敢腐、不能腐、不想腐的良性体制,促进全县广大干部廉洁从政,汇聚起深化改革发展、建设美丽XX的正能量。 欢迎广大干部群众对巡视整改落实情况进行监督。如有意见建议,请及时向我们反映。联系方式:电话XX;邮政信箱:XX县县委大楼四楼县纪委党风室;电子邮箱: 55
本文档为【单片机学习资料】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_266065
暂无简介~
格式:doc
大小:151KB
软件:Word
页数:0
分类:生活休闲
上传时间:2017-09-29
浏览量:19