0
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心
发布
  • 发文章

  • 发资料

  • 发帖

  • 提问

  • 发视频

创作活动
STC89C52RC-40I-PDIP40

STC89C52RC-40I-PDIP40

  • 厂商:

    STC(宏晶科技)

  • 封装:

    PDIP40_52.5X14.1MM

  • 描述:

    PDIP40 512B 3.3~5.5V 8051 40MHz

  • 数据手册
  • 价格&库存
STC89C52RC-40I-PDIP40 数据手册
STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 STC89C51RC/RD+系列单片机器件手册 STC89C51RC, STC89C52RC, STC89C53RC, STC89C54RD+, STC89C58RD+, STC89C510RD+, STC89C512RD+, STC89C514RD+, STC89C516RD+, C T S ---高速,高可靠 ---低功耗,超低价 ---强抗静电,强抗干扰 STC89LE51RC STC89LE52RC STC89LE53RC STC89LE54RD+ STC89LE58RD+ STC89LE510RD+ STC89LE512RD+ STC89LE514RD+ STC89LE516RD+ U C M . d e t i m Li 请使用采用最新第六代加密技术的STC11/10xx和STC12C5Axx系列单片 机取代全球各厂家均已被解密的89系列单片机 全部中国本土独立自主知识产权,请全体中国人民支持,您的 支持是中国本土���������� 力量前进的����� 有力保证. STC-ISP:最方便的在线升级软件 技术支持��� 网站: www.STCMCU.com Update date: 2011/10/30 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947  目录 第1章 STC89系列单片机总体介绍............................ 7 1.1 STC89C51RC/RD+系列单片机简介............................. 7 1.2 STC89C51RC/RD+系列单片机的内部结构....................... 8 1.3 STC89C51RC/RD+系列单片机管脚图........................... 9 1.3.1 STC89C51RC/RD+系列HD版本的管脚图.........................................................9 1.3.2 STC89C51RC/RD+系列90C版本的管脚图......................................................10 1.4 STC89C51RC/RD+系列单片机选型一览表...................... 1.5 STC89C51RC/RD+系列单片机最小应用系统.................... 1.6 STC89C51RC/RD+系列在系统可编程(ISP)典型应用线路图........ 1.7 STC89C51RC/RD+系列管脚说明.............................. 1.8 STC89C51RC/RD+系列单片机封装尺寸图...................... 1.9 STC89C51RC/RD+系列单片机命名规则........................ 1.10 如何识别HD版及90C版本.................................... 1.11 降低单片机时钟对外界的电磁辐射(EMI)——三大措施.......... 1.12 超低功耗——STC89C51RC/RD+ 系列单片机................... 11 12 13 14 16 20 21 22 23 第2章 省电模式及复位....................................24 2.1 STC89C51RC/RD+系列单片机的省电模式...................... 24 2.1.1 空闲模式(建议不要使用)...............................................................................25 2.1.2 掉电模式/停机模式........................................................................................25 2.2 复位...................................................... 31 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 外部RST引脚复位..........................................................................................31 软件复位........................................................................................................31 上电复位/掉电复位........................................................................................32 看门狗(WDT)复位..........................................................................................32 冷启动复位和热启动复位...............................................................................36 第3章 片内存储器和特殊功能寄存器(SFRs).....................................37 3.1 程序存储器................................................ 37 3.2 数据存储器(SRAM)................................................................................... 38 3.2.1 内部RAM.......................................................................................................38 3.2.2 内部扩展RAM(物理上是内部,逻辑上是外部,用MOVX访问)...................40 3.2.3 可外部扩展64K Bytes(字节)数据存储器........................................................50 3.3 特殊功能寄存器(SFRs).............................................................................. 51 第4章 STC89C51RC/RD+系列单片机的I/O口结构.............57 4.1 I/O口各种不同的工作模式及配置介绍.......................... 57 4.2 4.3 4.4 4.5 4.6 4.1.1 准双向口输出配置.................................................................................................. 57 4.1.2 开漏输出配置(P0口上电复位后处于开漏模式)..............................................58 头文件/新增特殊功能寄存器的声明,P4口的使用................ STC89C51RC系列单片机ALE/P4.5管脚作I/O口使用的设置........ 一种典型三极管控制电路.................................... 混合电压供电系统3V/5V器件I/O口互连........................ I/O口直接驱动LED数码管应用线路图.......................... 59 61 62 62 63 第5章 指令系统..........................................64 5.1 寻址方式.................................................. 64 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 立即寻址........................................................................................................64 直接寻址........................................................................................................64 间接寻址........................................................................................................64 寄存器寻址. ...................................................................................................65 相对寻址........................................................................................................65 变址寻址........................................................................................................65 位寻址............................................................................................................65 5.2 指令系统分类总结.......................................... 66 5.3 传统8051单片机指令定义详解(中文&English)................... 70 5.3.1 传统8051单片机指令定义详解.............................................................................. 70 5.3.2 Instruction Definitions of Traditional 8051 MCU.................................................. 110 第6章 中断系统........................................ 147 6.1 6.2 6.3 6.4 6.5 6.6 中断结构................................................. 149 中断寄存器............................................... 151 中断优先级............................................... 157 中断处理................................................. 158 外部中断................................................. 159 中断测试程序............................................. 160 6.6.1 外部中断0(INT0)的测试程序(C程序及汇编程序)........................................160 6.6.2 外部中断1(INT1)的测试程序(C程序及汇编程序)........................................164 6.6.3 外部中断2(INT2)的测试程序(C程序及汇编程序)........................................168 6.6.3 外部中断3(INT3)的测试程序(C程序及汇编程序)........................................173 第7章 定时器/计数器................................... 178 7.1 定时器/计数器0/1......................................... 178 7.1.1 定时器/计数器0和1的相关寄存器...............................................................178 7.1.2 定时器/计数器0工作模式(与传统8051单片机兼容)....................................181 7.1.2.1 7.1.2.2 7.1.2.3 7.1.2.4 模式0(13位定时器/计数器).............................................. 181 模式1(16位定时器/计数器)及其测试程序(C程序及汇编程序)................. 182 模式2(8位自动重装模式)及其测试程序(C程序及汇编程序)................... 186 模式3(两个8位计数器)......................................................................................................189 7.1.3 定时器/计数器1工作模式(与传统8051单片机兼容)....................................190 7.1.3.1 模式0(13位定时器/计数器).............................................................................................. 190 7.1.3.2 模式1(16位定时器/计数器)及其测试程序(C程序及汇编程序)................. 191 7.1.3.3 模式2(8位自动重装模式)及其测试程序(C程序及汇编程序)................... 195 7.1.4 古老Intel 8051单片机定时器0/1的应用举例..................................................198 7.2 定时器/计数器T2.................................................................................... 205 7.2.1 7.2.2 7.2.3 7.2.4 7.2.5 定时器2的捕获模式.............................................................................................. 207 定时器2的自动重装模式(递增/递减计数器).................................................... 208 定时器2作串行口波特率发生器及其测试程序(C程序及汇编程序)................ 210 定时器2作可编程时钟输出及其测试程序(C程序及汇编程序)........................ 218 定时器/计数器2作定时器的测试程序(C程序及汇编程序).............................. 221 第8章 串行口通信...................................... 225 8.1 串行口相关寄存器......................................... 225 8.2 串行口工作模式........................................... 229 8.2.1 8.2.2 8.2.3 8.2.4 8.3 8.4 8.5 8.6 串行口工作模式0:同步移位寄存器............................................................229 串行口工作模式1:8位UART,波特率可变...................................................231 串行口工作模式2:9位UART,波特率固定...................................................233 串行口工作模式3:9位UART,波特率可变...................................................235 串行通信中波特率的设置................................... 237 串行口的测试程序(C程序及汇编程序)........................ 240 双机通信............................................. 246 多机通信............................................. 257 第9章 STC89C51RC/RD+系列EEPROM的应用............. 263 9.1 IAP及EEPROM新增特殊功能寄存器介绍...................... 263 9.2 STC89C51RC/RD+系列单片机EEPROM空间大小及地址......... 266 9.3 IAP及EEPROM汇编简介.................................... 269 9.4 EEPROM测试程序(C程序及汇编程序)........................ 273 第10章 STC10系列单片机开发/编程工具说明............... 281 10.1 在系统可编程(ISP)原理,官方演示工具使用说明.............. 281 10.1.1 10.1.2 10.1.3 10.1.4 10.1.5 在系统可编程(ISP)原理使用说明. ..............................................................281 STC89C51RC/RD+系列在系统可编程(ISP)典型应用线路图.......................283 电脑端的ISP控制软件界面使用说明...........................................................285 STC-ISP(最方便的在线升级软件)下载编程工具硬件使用说明..................287 若无RS-232转换器,如何用STC的ISP下载板做RS-232通信转换...............288 10.2 编译器/汇编器,编程器,仿真器........................... 289 291 313 323 325 327 330 337 338 ——无仿真器时方便调试.................................. 338 ——自定义下载演示程序(实现不停电下载).................. 338 附录I:每日更新内容的备忘录............................ 343 附录A:汇编语言编程................................... 附录B:C语言编程...................................... 附录C:STC89C51RC/RD+系列单片机电气特性............ 附录D:内部常规256字节RAM间接寻址测试程序........... 附录E:用串口扩展I/O接口.............................. 附录F:利用STC单片机普通I/O驱动LCD显示.............. 附录G:如何利用Keil C软件减少代码长度................. 附录H:如何实现运行中自定义下载....................... STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 第1章 STC89系列单片机总体介绍 1.1 STC89C51RC/RD+系列单片机简介 STC89C51RC/RD+系列单片机是STC������������������������ 推出的��������������������� 新一代高速/低功耗/超强抗干扰的����� 单片机,指 令代码完全兼容传统������������������������������������� 8051单片机,12��������������������������� 时钟/机器周期和6时钟/机器周期可以任意选择,HD版本 和90C版本内部集成MAX810专用复位电路� 。 1. 增强型8051������������������������������������� 单片机,��������������������������������� 6时钟/机器周期������������������������� 和������������������������ 12时钟/机器周期��������������� 可任意选择���������� ,指令代码完全兼容传 统8051 2. 工作电压:5.5V - 3.3V (5V单片机) ��/ 3.8V - 2.0V (3V单片机) . d e t i m 3. 工作频率范围:0~40MHz,相当于普通8051的 0~80MHz,实际工作频率可达48MHz. 4. 用户应用程序空间� :4K / 8K / 13K / 16K / 32K / 64K字节 5. 片上集成1280字节� 或512字节RAM Li 6. 通用I/O口(35/39个),复位后为:P1/P2/P3/P4是准双向口/弱上拉(普通8051传统I/O口)� ;P0 口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。 U C M 7. ISP(在系统可编程)/ IAP(在应用可编程),无需专用编程器,无需专用仿真器 可通过串口(RxD/P3.0, TxD/P3.1)直接下载用户程序,数秒即可完成一片 8. 有EEPROM功能 9. 看门狗 C T S 10.内部集成MAX810专用复位电路(HD版本������������������������� 和90C版本������������������� 才有����������������� )���������������� ,外部晶体20M以下时,可省外部 复位电路� 。 11.共3个16位定时器/计数器,其中定时器0还可以当成2个8位定时器使用� 。 12.外部中断4路,下降沿中断或低电平触发中断� ,Power Down模式可由外部中断低电平触发中 断方式唤醒� 。 13. 通用异步串行口(UART),还可用定时器软件实现多个UART 14. 工作温度范围:-40 ~ +85℃(工业级) / 0 ~ 75℃(商业级) 15. 封装:LQFP-44,PDIP-40,PLCC-44,PQFP-44.如选择STC89系列,请优先选择LQFP-44封装. 温馨提示: 推荐优先选择采用最新第六代加密技术的STC11/10xx系列单片机取代全球各厂家均 已被解密的89系列单片机. 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947  STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 1.2 STC89C51RC/RD+系列单片机的内部结构 STC89C51RC/RD+系列单片机的内部结构框图如下图所示。STC89C51RC/RD+单片机中 包含中央处理器(CPU)、程序存储器(Flash)、数据存储器(SRAM)、定时/计数器、UART串 口、I/O接口、EEPROM、看门狗等模块。STC89C51RC/RD+系列单片机几乎包含了数据采集 和控制中所需的所有单元模块,可称得上一个片上系统。 RAM 地址 寄存器 AUX-RAM 1024字节 RAM 256字节 . d e t i m 程序存储器(Flash) B寄存器 ACC 双数据指针 TMP2 C T S TMP1 U C M PSW 定时器 2 ISP/IAP 地址生成器 串口 WDT 程序计数器(��� PC) Port 0,1,2,3,4 锁存器 Control Unit XTAL1 Li 定时器 0/1 ALU EEPROM RESET 堆栈指针 XTAL2 Port 0,1,2,3,4 驱动器 P0, P1, P2, P3, P4 STC89C51RC/RD+系列内部结构框图  南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 1.3 STC89C51RC/RD+系列������ 单片机��� 管脚图 1.3.1 STC89C51RC/RD+系列HD版本的管脚图 P0.4 P0.5 P0.6 P0.7 EA P4.1 ALE PSEN P2.7 P2.6 P2.5 33 32 31 30 29 28 27 26 25 24 23 34 35 36 37 38 39 40 41 42 43 44 LQFP-44 PQFP-44 增加了P4口 并可位寻址 P2.4 P2.3 P2.2 P2.1 P2.0 P4.0 Gnd XTAL1 XTAL2 P3.7/RD P3.6/WR 22 21 20 19 18 17 16 15 14 13 12 P1.5 P1.6 P1.7 RST RxD/P3.0 INT2/P4.3 TxD/P3.1 INT0/P3.2 INT1/P3.3 T0/P3.4 T1/P3.5 1 2 3 4 5 6 7 8 9 10 11 P0.3 P0.2 P0.1 P0.0 Vcc INT3/P4.2 T2/P1.0 T2EX/P1.1 P1.2 P1.3 P1.4 P1.4 P1.3 P1.2 P1.1/T2EX P1.0/T2 P4.2/INT3 Vcc P0.0 P0.1 P0.2 P0.3 HD版本无P4.6/P4.5/P4.4口 6 5 4 3 2 1 44 43 42 41 40 C T S PLCC-44 增加了P4口 并可位寻址 39 38 37 36 35 34 33 32 31 30 29 18 19 20 21 22 23 24 25 26 27 28 7 8 9 10 11 12 13 14 15 16 17 WR/P3.6 RD/P3.7 XTAL2 XTAL1 Gnd P4.0 P2.0 P2.1 P2.2 P2.3 P2.4 P1.5 P1.6 P1.7 RST RxD/P3.0 INT2P4.3 TxD/P3.1 INT0/P3.2 INT1/P3.3 T0/P3.4 T1/P3.5 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 . d e t i m Li Vcc P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 EA ALE PSEN P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 关于编译器/ 汇编器: 1.任何老的编译器/汇编器均可使用Keil C51 中�������������������������� :������������������������� Device选择标准的Intel8052头文件包含 标准的 2.新增特殊功能寄存器如要用到,则用“sfr” 及“sbit”声明地址即可 3 . 汇编中用“data”,或“EQU”声明地址 U C M P0.4 P0.5 P0.6 P0.7 EA P4.1 ALE PSEN P2.7 P2.6 P2.5 1 40 PDIP-40, 增加了P4口 T2/P1.0 T2EX/P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RST RxD/P3.0 TxD/P3.1 INT0/P3.2 INT1/P3.3 T0/P3.4 T1/P3.5 WR/P3.6 RD/P3.7 XTAL2 XTAL1 Gnd 关于仿真及仿真器: 1.任何老的仿真器均可使用 2.老的仿真器仿真他可仿真的基本功能 3.新增特殊功能用ISP直接下载程序看结果即可 5.其实现在大部分STC用户不用仿真器,用ISP就可 调通64K程序 关于工作电压/时钟频率:RC/RD+系列是真正的6T单片机,兼容普通的12 时钟/机器周期 内核实际6T 工作电压 5.5V - 4.5V 5.5V - 3.8V 5.5V - 3.6V 5.5V - 3.4V 现有HD版本5V单片机,单倍速工作将外部时钟频率除以2,降频工作 单倍速 双倍速 实际内核 实际内核 外部时钟 相当于 相当于 IAP/ISP可以 运行时钟 运行时钟 普通8052 普通8052 0 - 44MHz 0 - 44MHz 0 - 20MHz 0 - 80MHz 0 - 40MHz 读,编程,擦除 0 - 33MHz 0 - 33MHz 0 - 16.5MHz 0 - 66MHz 0 - 33MHz 读,编程,擦除 0 - 24MHz 0 - 24MHz 0 - 12MHz 0 - 48MHz 0 - 24MHz 读,编程,擦除 0 - 20MHz 0 - 20MHz 0 - 10MHz 0 - 40MHz 0 - 20MHz 读(不要编程/擦除) 3V: 3.8 - 2.0V(可外部24MHz,双倍速48MHz),2.3 - 1.9V时不要进行IAP擦除/编程 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947  STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 LQFP-44 PQFP-44 增加了P4口 并可位寻址 P2.4 P2.3 P2.2 P2.1 P2.0 P4.0 Gnd XTAL1 XTAL2 P3.7/RD P3.6/WR 22 21 20 19 18 17 16 15 14 13 12 P1.5 P1.6 P1.7 RST RxD/P3.0 INT2/P4.3 TxD/P3.1 INT0/P3.2 INT1/P3.3 T0/P3.4 T1/P3.5 1 2 3 4 5 6 7 8 9 10 11 34 35 36 37 38 39 40 41 42 43 44 90C版本无EA、PSEN管脚,有P4.4/P4.5/P4.6口 P1.4 P1.3 P1.2 P1.1/T2EX P1.0/T2 P4.2/INT3 Vcc P0.0 P0.1 P0.2 P0.3 90C版本ALE/P4.5管脚默认是作为ALE管脚,如需作为P4.5 口使用时,需在烧录用户程序时在STC-ISP编程器中设置 6 5 4 3 2 1 44 43 42 41 40 C T S PLCC-44 增加了P4口 并可位寻址 39 38 37 36 35 34 33 32 31 30 29 18 19 20 21 22 23 24 25 26 27 28 7 8 9 10 11 12 13 14 15 16 17 WR/P3.6 RD/P3.7 XTAL2 XTAL1 Gnd P4.0 P2.0 P2.1 P2.2 P2.3 P2.4 P1.5 P1.6 P1.7 RST RxD/P3.0 INT2P4.3 TxD/P3.1 INT0/P3.2 INT1/P3.3 T0/P3.4 T1/P3.5 U C M P0.4 P0.5 P0.6 P0.7 P4.6 P4.1 ALE/P4.5 P4.4 P2.7 P2.6 P2.5 T2/P1.0 T2EX/P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RST RxD/P3.0 TxD/P3.1 INT0/P3.2 INT1/P3.3 T0/P3.4 T1/P3.5 WR/P3.6 RD/P3.7 XTAL2 XTAL1 Gnd 1 40 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 PDIP-40, 增加了P4口 P0.3 P0.2 P0.1 P0.0 Vcc INT3/P4.2 T2/P1.0 T2EX/P1.1 P1.2 P1.3 P1.4 33 32 31 30 29 28 27 26 25 24 23 P0.4 P0.5 P0.6 P0.7 P4.6 P4.1 ALE/P4.5 /P4.4 P2.7 P2.6 P2.5 1.3.2 STC89C51RC/RD+系列90C版本的管脚图 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 . d e t i m Li Vcc P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P4.6 ALE/P4.5 P4.4 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 关于编译器/ 汇编器: 1.任何老的编译器/汇编器均可使用Keil C51 中�������������������������� :������������������������� Device选择标准的Intel8052头文件包含 标准的 2.新增特殊功能寄存器如要用到,则用“sfr” 及“sbit”声明地址即可 3 . 汇编中用“data”,或“EQU”声明地址 关于仿真及仿真器: 1.任何老的仿真器均可使用 2.老的仿真器仿真他可仿真的基本功能 3.新增特殊功能用ISP直接下载程序看结果即可 5.其实现在大部分STC用户不用仿真器,用ISP就可 调通64K程序 关于工作电压/时钟频率:RC/RD+系列是真正的6T单片机,兼容普通的12 时钟/机器周期 内核实际6T 工作电压 5.5V - 4.5V 5.5V - 3.8V 5.5V - 3.6V 5.5V - 3.4V 现有HD版本5V单片机,单倍速工作将外部时钟频率除以2,降频工作 单倍速 双倍速 实际内核 实际内核 外部时钟 相当于 相当于 IAP/ISP可以 运行时钟 运行时钟 普通8052 普通8052 0 - 44MHz 0 - 44MHz 0 - 20MHz 0 - 80MHz 0 - 40MHz 读,编程,擦除 0 - 33MHz 0 - 33MHz 0 - 16.5MHz 0 - 66MHz 0 - 33MHz 读,编程,擦除 0 - 24MHz 0 - 24MHz 0 - 12MHz 0 - 48MHz 0 - 24MHz 读,编程,擦除 0 - 20MHz 0 - 20MHz 0 - 10MHz 0 - 40MHz 0 - 20MHz 读(不要编程/擦除) 3V: 3.8 - 2.0V(可外部24MHz,双倍速48MHz),2.3 - 1.9V时不要进行IAP擦除/编程 10 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 1.4 STC89C51RC/RD+系列单片机选型一览表 型号 最高时钟频率 Flash D Hz EEP 看 工作 定 中 UART P 程序 SRAM ROM 门 A/D 断 电压 时 存储器 字节 串口 T (V) 器 (字节) 狗 源 5V 3V R (字节) 中 支持 断 掉电 内置 封装 优 I/O 唤醒 封装44-Pin 复位 40-Pin 先 外部 级 中断 STC89C/LE51RC系列单片机选型一览 STC89C51RC 5.5 - 3.3 0-80M 4K 512 3 1个 2 4K 有 - 8 4 35/39 4个 有 PDIP LQFP/PLCC STC89C52RC STC89C53RC 5.5 - 3.3 0-80M 8K 512 3 1个 2 4K 有 - 8 4 35/39 4个 有 PDIP LQFP/PLCC 5.5 - 3.3 0-80M 13K 512 3 1个 2 - 有 - 8 4 35/39 4个 有 STC89LE51RC 3.6 - 2.0 PDIP LQFP/PLCC 0-80M 4K 512 3 1个 2 4K 有 - 8 4 35/39 4个 有 STC89LE52RC PDIP LQFP/PLCC 3.6 - 2.0 0-80M 8K 512 3 1个 2 4K 有 - 8 4 35/39 4个 有 PDIP LQFP/PLCC STC89LE53RC 3.6 - 2.0 0-80M 13K 512 3 1个 2 - 有 - 8 4 35/39 4个 有 PDIP LQFP/PLCC . d e t i m STC89C/LE51RD+系列单片机选型一览 STC89C54RD+ 5.5 - 3.3 0-80M 16K 1280 3 1个 2 45K 有 - 8 4 35/39 4个 有 PDIP LQFP/PLCC STC89C58RD+ 5.5 - 3.3 0-80M 32K 1280 3 1个 2 29K 有 - 8 4 35/39 4个 有 PDIP LQFP/PLCC STC89C516RD+ 5.5 - 3.3 0-80M 64K 1280 3 1个 2 - 有 - 8 4 35/39 4个 有 PDIP LQFP/PLCC STC89LE54RD+ 3.6 - 2.0 0-80M 16K 1280 3 1个 2 45K 有 - 8 4 35/39 4个 有 PDIP LQFP/PLCC STC89LE58RD+ 3.6 - 2.0 0-80M 32K 1280 3 1个 2 29K 有 - 8 4 35/39 4个 有 PDIP LQFP/PLCC STC89LE516RD+ 3.6 - 2.0 0-80M 64K 1280 3 1个 2 - 有 - 8 4 35/39 4个 有 PDIP LQFP/PLCC C T S U C M Li STC89C51RC/RD+系列单片机44-pin的封装除LQFP44和PLCC44外,还有PFQP44,但是不推荐 使用PLCC44和PFQP44封装,建议选用LQFP44的封装。 选用STC单片机的理由:降低成本,提升性能,原有程序直接使用,硬件无需改动。STC公司鼓 励您放心大胆选用LQFP44小型封装单片机,使您的产品更小,更轻,功耗更低。 用STC提供的STC-ISP.exe 工具将您的2进制代码或16进制代码下载进STC相关的单片机即可。 RC/RD+系列为真正的看门狗,缺省为关闭(冷启动),启动后无法关闭,可放心省去外部看门狗�. 内部Flash擦写次数为10����� 万���� 次以上。 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 11 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 1.5 STC89C51RC/RD+系列��������� 单片机最小应用系统 10μF + 10K C1 R1 Vcc 40 2 T2EX/P1.1 P0.0 39 3 P1.2 P0.1 38 4 P1.3 P0.2 37 5 P1.4 P0.3 36 6 P1.5 P0.4 35 7 P1.6 P0.5 34 8 P1.7 P0.6 33 9 RST Vin Power On SW1 C6 104 31 11 TxD/P3.1 ALE/P4.5 30 12 INT0/P3.2 PSEN/P4.4 29 13 INT1/P3.3 P2.7/A15 28 14 T0/P3.4 P2.6/A14 27 15 T1/P3.5 P2.5/A13 26 16 WR/P3.6 P2.4/A12 25 17 RD/P3.7 P2.3/A11 24 18 XTAL2 P2.2/A10 23 P2.1/A9 22 P2.0/A8 21 19 XTAL1 20 Gnd C T S C5 10μF 1.如外部不加上拉,或外部上拉到Vcc,上 电复位后单片机从内部开始执行程序; . d e t i m 2.如外部下拉到地,上电复位后单片机从 外部开始执行程序 Li CU M + 系统电源/5V/3V 关于EA(EA管脚已内部上拉到Vcc): P0.7 32 EA/P4.6 R2 C3 60H. sets the carry flag and branches to the instruction at label NOT-EQ. By testing the carry flag, this instruction determines whether R7 is greater or less than 60H. If the data being presented to Port 1 is also 34H, then the instruction, WAIT: CJNE A,P1,WAIT clears the carry flag and continues with the next instruction in sequence, since the Accumulator does equal the data read from P1. (If some other value was being input on Pl, the program will loop at this point until the P1 data changes to 34H.) CJNE A,direct,rel Bytes: 3 Cycles: 2 Encoding: Operation: 1 0 1 1 0 1 0 1 direct address rel. address (PC) �� ←��������� �������� (PC) + 3 IF (A) < > (direct) THEN (PC) �� ←�������� ������� (PC) + relative offset IF (A) < (direct) THEN (C) �� ←�� �1 ELSE (C) �� ←�� �0 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 115 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 CJNE A,#data,rel Bytes: 3 Cycles: 2 Encoding: Operation: 1 0 1 1 0 1 0 1 immediata data (PC) �� ←��������� �������� (PC) + 3 IF (A) < > (data) THEN (PC) �� ←�������� ������� (PC) + relative offset IF (A) < (data) THEN (C) �� ←�� �1 ELSE (C) �� ←�� �0 rel. address . d e t i m CJNE Rn,#data,rel Bytes: 3 Cycles: 2 Encoding: Operation: 1 0 1 1 U C M 1 r r r (PC) �� ←��������� �������� (PC) + 3 IF (Rn) < > (data) THEN (PC) �� ←�������� ������� (PC) + relative offset IF (Rn) < (data) THEN (C) �� ←�� �1 ELSE (C) �� ←�� �0 C T S Li immediata data rel. address CJNE @Ri,#data,rel Bytes: 3 Cycles: 2 Encoding: Operation: 116 1 0 1 1 0 1 1 i immediate data rel. address (PC) �� ←��������� �������� (PC) + 3 IF ((Ri)) < > (data) THEN (PC) �� ←�������� ������� (PC) + relative offset IF ((Ri)) < (data) THEN (C) �� ←�� �1 ELSE (C) �� ←�� �0 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 CLR A Function: Description: Example: Clear Accumulator The Aecunmlator is cleared (all bits set on zero). No flags are affected. The Accumulator contains 5CH (01011100B). The instruction, CLR A will leave the Accumulator set to 00H (00000000B). Bytes: 1 Cycles: 1 Encoding: Operation: 1 1 1 0 0 1 0 0 CLR (A)�� ←�� �0 . d e t i m CLR bit Function: Description: Example: Clear bit The indicated bit is cleared (reset to zero). No other flags are affected. CLR can operate on the carry flag or any directly addressable bit. Li Port 1 has previously been written with 5DH (01011101B). The instruction, CLR P1.2 U C M will leave the port set to 59H (01011001B). CLR C Bytes: 1 Cycles: 1 C T S Encoding: 1 1 Operation: CLR (C) �� ←�� �0 0 0 0 0 1 1 CLR bit Bytes: 2 Cycles: 1 Encoding: Operation: 1 1 0 0 0 0 1 0 bit address CLR (bit) ← � �� 0� 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 117 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 CPL A Function: Description: Example: Complement Accumulator Each bit of the Accumulator is logically complemented (one’s complement). Bits which previously contained a one are changed to a zero and vice-versa. No flags are affected. The Accumulator contains 5CH(01011100B). The instruction, CPL A will leave the Accumulator set to 0A3H (101000011B). Bytes: 1 Cycles: 1 Encoding: Operation: 1 1 1 1 0 1 0 0 CPL bit Function: Description: Example: . d e t i m CPL (A)�� ←� (A) Li Complement bit The bit variable specified is complemented. A bit which had been a one is changed to zero and vice-versa. No other flags are affected. CLR can operate on the carry or any directly addressable bit. U C M Note:When this instruction is used to modify an output pin, the value used as the original data will be read from the output data latch, not the input pin. Port 1 has previously been written with 5DH (01011101B). The instruction, C T S CLR P1.1 CLR P1.2 will leave the port set to 59H (01011001B). CPL C Bytes: 1 Cycles: 1 Encoding: Operation: CPL bit 1 0 Bytes: 2 1 Operation: 1 0 0 1 1 CPL (C) �� ←� (C) Cycles: Encoding: 1 1 0 1 1 0 0 1 0 bit address CPL (bit) ← �� (bit) 118 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com DA 临时技术支持:13922829991 研发顾问:13922809991 A Function: Description: Decimal-adjust Accumulator for Addition DA A adjusts the eight-bit value in the Accumulator resulting from the earlier addition of two variables (each in packed-BCD format), producing two four-bit digits.Any ADD or ADDC instruction may have been used to perform the addition. If Accumulator bits 3-0 are greater than nine (xxxx1010-xxxx1111), or if the AC flag is one, six is added to the Accumulator producing the proper BCD digit in the low-order nibble. This internal addition would set the carry flag if a carry-out of the low-order four-bit field propagated through all high-order bits, but it would not clear the carry flag otherwise. If the carry flag is now set or if the four high-order bits now exceed nine(1010xxxx111xxxx), these high-order bits are incremented by six, producing the proper BCD digit in the high-order nibble. Again, this would set the carry flag if there was a carry-out of the high-order bits, but wouldn’t clear the carry. The carry flag thus indicates if the sum of the original two BCD variables is greater than 100, allowing multiple precision decimal addition. OV is not affected. . d e t i m Li All of this occurs during the one instruction cycle. Essentially, this instruction performs the decimal conversion by adding 00H, 06H, 60H, or 66H to the Accumulator, depending on initial Accumulator and PSW conditions. U C M Note: DA A cannot simply convert a hexadecimal number in the Accumulator to BCD notation, nor does DA A apply to decimal subtraction. Example: C T S The Accumulator holds the value 56H(01010110B) representing the packed BCD digits of the decimal number 56. Register 3 contains the value 67H (01100111B) representing the packed BCD digits of the decimal number 67.The carry flag is set. The instruction sequence. ADDC A,R3 DA A will first perform a standard twos-complement binary addition, resulting in the value 0BEH (10111110) in the Accumulator. The carry and auxiliary carry flags will be cleared. The Decimal Adjust instruction will then alter the Accumulator to the value 24H (00100100B), indicating the packed BCD digits of the decimal number 24, the low-order two digits of the decimal sum of 56,67, and the carry-in. The carry flag will be set by the Decimal Adjust instruction, indicating that a decimal overflow occurred. The true sum 56, 67, and 1 is 124. BCD variables can be incremented or decremented by adding 01H or 99H. If the Accumulator initially holds 30H (representing the digits of 30 decimal), then the instruction sequence, ADD DA A,#99H A will leave the carry set and 29H in the Accumulator, since 30+99=129. The low-order byte of the sum can be interpreted to mean 30 – 1 = 29. 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 119 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 Bytes: 1 Cycles: 1 Encoding: 1 1 0 1 0 1 0 0 Operation: DA -contents of Accumulator are BCD IF [[(A3-0) > 9] V [(AC) = 1]] THEN(A3-0) �� ←��� �� (A3-0) + 6 AND IF [[(A7-4) > 9] V [(C) = 1]] THEN (A7-4) �� ←��� �� (A7-4) + 6 DEC byte Function: Description: Example: Decrement The variable indicated is decremented by 1. An original value of 00H will underflow to 0FFH. No flags are affected. Four operand addressing modes are allowed: accumulator, register, direct, or register-indirect. Note: When this instruction is used to modify an output port, the value used as the original port data will be read from the output data latch, not the input pins. U C M . d e t i m Li Register 0 contains 7FH (01111111B). Internal RAM locations 7EH and 7FH contain 00H and 40H, respectively. The instruction sequence, C T S DEC @R0 DEC R0 DEC @R0 will leave register 0 set to 7EH and internal RAM locations 7EH and 7FH set to 0FFH and 3FH. DEC A Bytes: 1 Cycles: 1 Encoding: Operation: DEC 120 0 0 0 1 0 1 0 0 DEC (A)����� ←���� (A) -1 Rn Bytes: 1 Cycles: 1 Encoding: 0 0 0 1 Operation: DEC (Rn)������ ←����� (Rn) ��- �1 南通国芯微电子有限公司 1 r r r 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com DEC direct Bytes: 2 Cycles: 1 Encoding: Operation: DEC 临时技术支持:13922829991 研发顾问:13922809991 0 0 0 1 0 1 0 1 direct address DEC (direct)���������� ←��������� (direct) -1 @Ri Bytes: 1 Cycles: 1 Encoding: 0 0 0 1 Operation: DEC ((Ri))�������� ←������� ((Ri)) ��- �1 0 1 1 i DIV AB Function: Description: . d e t i m Li Divide DIV AB divides the unsigned eight-bit integer in the Accumulator by the unsigned eight-bit integer in register B. The Accumulator receives the integer part of the quotient; register B receives the integer remainder. The carry and OV flags will be cleared. U C M Exception: if B had originally contained 00H, the values returned in the Accumulator and B-register will be undefined and the overflow flag will be set. The carry flag is cleared in any case. Example: DIV Bytes: Cycles: Encoding: Operation: C T S The Accumulator contains 251(OFBH or 11111011B) and B contains 18(12H or 00010010B). The instruction, AB will leave 13 in the Accumulator (0DH or 00001101B) and the value 17 (11H or 00010010B) in B, since 251 = (13×18) + 17. Carry and OV will both be cleared. 1 4 1 0 0 0 0 1 0 0 DIV (A)15-8 (A)/(B) (B)7-0 ←�������� 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 121 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 DJNZ , Function: Description: Decrement and Jump if Not Zero DJNZ decrements the location indicated by 1, and branches to the address indicated by the second operand if the resulting value is not zero. An original value of 00H will underflow to 0FFH. No flags are afected. The branch destination would be computed by adding the signed relative-displacement value in the last instruction byte to the PC, after incrementing the PC to the first byte of the following instruction. The location decremented may be a register or directly addressed byte. Note: When this instruction is used to modify an output port, the value used as the original port data will be read from the output data latch, not the input pins. Example: Internal RAM locations 40H, 50H, and 60H contain the values 01H, 70H, and 15H, respectively. The instruction sequence, DJNZ 40H, LABEL_1 DJNZ 50H, LABEL_2 DJNZ 60H, LABEL_3 . d e t i m Li will cause a jump to the instruction at label LABEL_2 with the values 00H, 6FH, and 15H in the three RAM locations. The first jump was not taken because the result was zero. This instruction provides a simple way of executing a program loop a given number of times, or for adding a moderate time delay (from 2 to 512 machine cycles) with a single instruction The instruction sequence, MOV CPL DJNZ C T S TOOOLE: U C M R2,#8 P1.7 R2, TOOGLE will toggle P1.7 eight times, causing four output pulses to appear at bit 7 of output Port 1. Each pulse will last three machine cycles; two for DJNZ and one to alter the pin. DJNZ Rn,rel Bytes: 2 Cycles: 2 Encoding: Operation: DJNZ 1 r r r rel. address DJNZ (PC) �� ← ������� ������� (PC) + �2 (Rn) �� ← ����� ����� (Rn) ��– �1 IF (Rn) > 0 or (Rn) < 0 THEN (PC) �� ←������� ������ (PC)+ ��� rel direct, rel Bytes: 3 Cycles: 2 Encoding: 122 1 1 0 1 1 1 0 1 南通国芯微电子有限公司 0 1 0 1 direct address 总机:0513-5501 2928 / 2929 / 2966 rel. address 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com Operation: INC 临时技术支持:13922829991 研发顾问:13922809991 DJNZ (PC) �� ←�������� ������� (PC) + �2 (direct) ←���������� �� ��������� (direct) ��– �1 IF (direct) > 0 or (direct) < 0 THEN (PC) �� ← ������� ������� (PC) + ��� rel Function: Description: Increment INC increments the indicated variable by 1. An original value of 0FFH will overflow to 00H.No flags are affected. Three addressing modes are allowed: register, direct, or registerindirect. Note: When this instruction is used to modify an output port, the value used as the original port data will be read from the output data latch, not the input pins. Example: INC INC INC INC A Bytes: 1 Cycles: 1 Operation: C T S 0 0 U C M Li 0 0 0 1 0 0 INC (A) �� ← (A)+1 ����� Rn Bytes: 1 Cycles: 1 Encoding: Operation: INC @R0 R0 @R0 will leave register 0 set to 7FH and internal RAM locations 7EH and 7FH holding (respectively) 00H and 41H. Encoding: INC . d e t i m Register 0 contains 7EH (011111110B). Internal RAM locations 7EH and 7FH contain 0FFH and 40H, respectively. The instruction sequence, 0 0 0 0 1 r r r INC (Rn) �� ← (Rn)+1 ������ direct Bytes: 2 Cycles: 1 Encoding: Operation: 0 0 0 0 0 1 0 1 direct address INC (direct)���������� ←��������� (direct) + 1 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 123 STC89C51RC/RD+系列单片机指南 INC Bytes: 1 Cycles: 1 Operation: 0 0 0 0 Example: INC ((Ri))����������� ←���������� ((Ri)) + 1 Increment Data Pointer Increment the 16-bit data pointer by 1. A 16-bit increment (modulo 216) is performed; an overflow of the low-order byte of the data pointer (DPL) from 0FFH to 00H will increment the high-order-byte (DPH). No flags are affected. This is the only 16-bit register which can be incremented. Bytes: 1 Cycles: 2 Operation: C T S 1 0 Example: U C M 0 0 1 1 The data present at input port 1 is 11001010B. The Accumulator holds 56 (01010110B). The instruction sequence, JB P1.2, LABEL1 JB ACC.2, LABEL2 will cause program execution to branch to the instruction at label LABEL2. Bytes: 3 2 Operation: 0 Li Jump if Bit set If the indicated bit is a one, jump to the address indicated; otherwise proceed with the next instruction. The branch destination is computed by adding the signed relative-displacement in the third instruction byte to the PC, after incrementing the PC to the first byte of the next instruction. The bit tested is not modified. No flags are affected. Cycles: Encoding: 1 INC (DPTR) �� ← (DPTR)+1 �������� bit, rel Function: Description: . d e t i m Register DPH and DPL contains 12H and 0FEH,respectively. The instruction sequence, INC DPTR INC DPTR INC DPTR will change DPH and DPL to 13H and 01H. Encoding: 124 0 1 1 i DPTR Function: Description: JB 临时技术支持:13922829991 研发顾问:13922809991 @Ri Encoding: INC 技术支持网站:www.STCMCU.com 0 0 1 0 0 0 0 0 bit address rel. address JB (PC) �� ← ������� ������� (PC)+ 3 IF (bit) = 1 THEN (PC) �� ←�������� ������� (PC) + ��� rel 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com JBC bit, rel Function: Description: Example: Jump if Bit is set and Clear bit If the indicated bit is one,branch to the address indicated;otherwise proceed with the next instruction.The bit wili not be cleared if it is already a zero. The branch destination is computed by adding the signed relative-displacement in the third instruction byte to the PC, after incrementing the PC to the first byte of the next instruction. No flags are affected. Note: When this instruction is used to test an output pin, the value used as the original data will be read from the output data latch, not the input pin. The Accumulator holds 56H (01010110B). The instruction sequence, JBC JBC Bytes: Cycles: Operation: 2 0 0 0 1 Example: Bytes: C T S U C M . d e t i m Li rel. address The carry flag is cleared. The instruction sequence, LABEL1 C LABEL2s will set the carry and cause program execution to continue at the instruction identified by the label LABEL2. 2 2 Encoding: Operation: bit address Jump if Carry is set If the carry flag is set, branch to the address indicated; otherwise proceed with the next instruction. The branch destination is computed by adding the signed relative-displacement in the second instruction byte to the PC, after incrementing the PC twice.No flags are affected. JC CPL JC Cycles: 0 0 0 0 JBC (PC) �� ← ������� ������� (PC)+ 3 IF (bit) = 1 THEN (bit) ← 0 �� � (PC) �� ←�������� ������� (PC) + ��� rel rel Function: Description: ACC.3, LABEL1 ACC.2, LABEL2 will cause program execution to continue at the instruction identified by the label LABEL2, with the Accumulator modified to 52H (01010010B). 3 Encoding: JC 临时技术支持:13922829991 研发顾问:13922809991 0 1 0 0 0 0 0 0 rel. address JC (PC) �� ← ������ ������ (PC)+ �2 IF (C) = 1 THEN (PC) �� ←�������� ������� (PC) + ��� rel 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 125 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 JMP @A+DPTR Function: Description: Example: Jump indirect Add the eight-bit unsigned contents of the Accumulator with the sixteen-bit data pointer, and load the resulting sum to the program counter. This will be the address for subsequent instruction fetches. Sixteen-bit addition is performed (modulo 216): a carry-out from the loworder eight bits propagates through the higher-order bits. Neither the Accumulator nor the Data Pointer is altered. No flags are affected. An even number from 0 to 6 is in the Accumulator. The following sequence of instructions will branch to one of four AJMP instructions in a jump table starting at JMP_TBL: JMP-TBL: MOV JMP AJMP AJMP AJMP AJMP DPTR, #JMP_TBL @A+DPTR LABEL0 LABEL1 LABEL2 LABEL3 . d e t i m If the Accumulator equals 04H when starting this sequence, execution will jump to label LABEL2. Remember that AJMP is a two-byte instruction, so the jump instructions start at every other address. Bytes: 1 Cycles: 2 Encoding: Operation: 0 1 1 1 JMP (PC) �� ← ������������ ������������ (A) + (DPTR) C T S JNB bit, rel Function: Description: Example: U C M 0 0 1 1 Li Jump if Bit is not set If the indicated bit is a zero, branch to the indicated address; otherwise proceed with the next instruction. The branch destination is computed by adding the signed relative-displacement in the third instruction byte to the PC, after incrementing the PC to the first byte of the next instruction. The bit tested is not modified. No flags are affected. The data present at input port 1 is 11001010B. The Accumulator holds 56H (01010110B). The instruction sequence, JNB JNB P1.3, LABEL1 ACC.3, LABEL2 will cause program execution to continue at the instruction at label LABEL2 Bytes: 3 Cycles: 2 Encoding: Operation: 126 0 0 1 1 0 0 0 0 bit address rel. address JNB (PC) �� ← ������� ������� (PC)+ 3 IF (bit) = 0 THEN (PC) �� ←�������� ������� (PC) + ��� rel 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com JNC 临时技术支持:13922829991 研发顾问:13922809991 rel Function: Description: Example: Jump if Carry not set If the carry flag is a zero, branch to the address indicated; otherwise proceed with the next instruction. The branch destination is computed by adding the signed relative-displacement in the second instruction byte to the PC, after incrementing the PC twice to point to the next instruction. The carry flag is not modified The carry flag is set. The instruction sequence, JNC LABEL1 CPL C JNC LABEL2 will clear the carry and cause program execution to continue at the instruction identified by the label LABEL2. Bytes: 2 Cycles: 2 Encoding: Operation: JNZ 0 1 0 1 Description: Example: rel. address JNC (PC) �� ← ������ ������ (PC)+ �2 IF (C) = 0 THEN (PC) �� ←�������� ������� (PC) + ��� rel C T S rel Function: 0 0 0 0 U C M . d e t i m Li Jump if Accumulator Not Zero If any bit of the Accumulator is a one, branch to the indicated address; otherwise proceed with the next instruction. The branch destination is computed by adding the signed relativedisplacement in the second instruction byte to the PC, after incrementing the PC twice. The Accumulator is not modified. No flags are affected. The Accumulator originally holds 00H. The instruction sequence, JNZ INC JNZ LABEL1 A LAEEL2 will set the Accumulator to 01H and continue at label LABEL2. Bytes: 2 Cycles: 2 Encoding: Operation: 0 1 1 1 0 0 0 0 rel. address JNZ (PC) �� ← ������ ������ (PC)+ �2 IF (A) ≠ 0 THEN (PC) �� ←�������� ������� (PC) + ��� rel 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 127 STC89C51RC/RD+系列单片机指南 JZ 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 rel Function: Description: Example: Bytes: Cycles: Jump if Accumulator Zero If all bits of the Accumulator are zero, branch to the address indicated; otherwise proceed with the next instruction. The branch destination is computed by adding the signed relativedisplacement in the second instruction byte to the PC, after incrementing the PC twice. The Accumulator is not modified. No flags are affected. The Accumulator originally contains 01H. The instruction sequence, JZ LABEL1 DEC A JZ LAEEL2 will change the Accumulator to 00H and cause program execution to continue at the instruction identified by the label LABEL2. 2 Encoding: Operation: . d e t i m 2 0 1 1 0 0 0 0 0 rel. address JZ (PC) �� ← ������ ������ (PC)+ �2 IF (A) = 0 THEN (PC) �� ←�������� ������� (PC) + ��� rel U C M LCALL addr16 Li Function: Description: Long call LCALL calls a subroutine loated at the indicated address. The instruction adds three to the program counter to generate the address of the next instruction and then pushes the 16-bit result onto the stack (low byte first), incrementing the Stack Pointer by two. The high-order and low-order bytes of the PC are then loaded, respectively, with the second and third bytes of the LCALL instruction. Program execution continues with the instruction at this address. The subroutine may therefore begin anywhere in the full 64K-byte program memory address space. No flags are affected. Example: Initially the Stack Pointer equals 07H. The label “SUBRTN” is assigned to program memory location 1234H. After executing the instruction, C T S LCALL SUBRTN Bytes: Cycles: Encoding: Operation: 128 at location 0123H, the Stack Pointer will contain 09H, internal RAM locations 08H and 09H will contain 26H and 01H, and the PC will contain 1234H. 3 2 0 0 0 1 0 0 1 0 addr15-addr8 addr7-addr0 LCALL (PC) �� ←��������� �������� (PC) + 3 (SP) �� ←��������� �������� (SP) + 1 ((SP)) �� ←���� ��� (PC7-0) (SP) �� ←��������� �������� (SP) + 1 ((SP)) �� ←���� ��� (PC15-8) (PC) �� ←� ���� addr15-0 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 LJMP addr16 Function: Description: Example: Long Jump LJMP causes an unconditional branch to the indicated address, by loading the high-order and low-order bytes of the PC (respectively) with the second and third instruction bytes. The destination may therefore be anywhere in the full 64K program memory address space. No flags are affected. The label “JMPADR” is assigned to the instruction at program memory location 1234H. The instruction, LJMP JMPADR at location 0123H will load the program counter with 1234H. Bytes: 3 Cycles: 2 Encoding: 0 0 0 0 Operation: LJMP (PC) �� ←� ���� addr15-0 0 0 1 0 MOV , Function: Description: addr15-addr8 U C M . d e t i m Li addr7-addr0 Move byte variable The byte variable indicated by the second operand is copied into the location specified by the first operand. The source byte is not affected. No other register or flag is affected. C T S This is by far the most flexible operation. Fifteen combinations of source and destination addressing modes are allowed. Example: Internal RAM location 30H holds 40H. The value of RAM location 40H is 10H. The data present at input port 1 is 11001010B (0CAH). MOV R0, #30H ;R0< = 30H MOV A, @R0 ;A < = 40H MOV R1, A ;R1 < = 40H MOV B, @Rl ;B < = 10H MOV @Rl, Pl ;RAM (40H) < = 0CAH MOV P2, P1 ;P2 #0CAH leaves the value 30H in register 0,40H in both the Accumulator and register 1,10H in register B, and 0CAH(11001010B) both in RAM location 40H and output on port 2. MOV A,Rn Bytes: 1 Cycles: 1 Encoding: Operation: 1 1 1 0 1 r r r MOV (A) �� ←����� ���� (Rn) 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 129 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 *MOV A,direct Bytes: 2 Cycles: 1 Encoding: Operation: 1 1 1 0 0 1 0 1 direct address MOV (A)�� ←��������� �������� (direct) *MOV A, ACC is not a valid instruction MOV A,@Ri Bytes: 1 Cycles: 1 Encoding: Operation: 1 1 1 0 0 1 1 i MOV A,#data Bytes: 2 Cycles: 1 Encoding: 0 1 1 1 Operation: MOV (A)�� ←� ����� #data MOV Rn, A Bytes: 1 Cycles: 1 Encoding: Operation: . d e t i m MOV (A) �� ←������� ������ ((Ri)) C T S 1 1 1 1 U C M 0 1 0 0 immediate data Li 1 r r r MOV (Rn)���� ←��� (A) MOV Rn,direct Bytes: 2 Cycles: 2 Encoding: Operation: 1 0 1 0 1 r r r direct addr. 1 r r r immediate data MOV (Rn)��������� ←�������� (direct) MOV Rn,#data Bytes: 2 Cycles: 1 Encoding: Operation: 130 0 1 1 1 MOV (Rn) �� ←� ����� #data 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 MOV direct, A Bytes: 2 Cycles: 1 Encoding: 1 1 1 1 Operation: MOV (direct) ←���� �� ��� (A) MOV direct, Rn Bytes: 2 Cycles: 2 Encoding: 1 0 0 0 Operation: MOV (direct) ←����� �� ���� (Rn) 0 1 0 1 direct address 1 r r r direct address MOV direct, direct Bytes: 3 Cycles: 2 Encoding: Operation: 1 0 0 0 MOV (direct)�� ←��������� �������� (direct) C T S MOV direct, @Ri Bytes: 2 Cycles: 2 Encoding: 1 0 0 0 Operation: MOV (direct)������� ←������ ((Ri)) U C M 0 1 0 1 0 1 1 i dir.addr. (src) . d e t i m Li direct addr. MOV direct,#data Bytes: 3 Cycles: 2 Encoding: Operation: 0 1 1 1 0 1 0 1 direct address MOV (direct) ← ����� �� ����� #data MOV @Ri, A Bytes: 1 Cycles: 1 Encoding: 1 1 1 1 Operation: MOV ((Ri)) ←���� �� (A) ��� 南通国芯微电子有限公司 0 1 1 i 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 131 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 MOV @Ri, direct Bytes: 2 Cycles: 2 Encoding: 1 0 1 0 0 1 1 i direct addr. 0 1 1 i immediate data Operation: MOV ((Ri)) ←��������� �� (direct) �������� MOV @Ri, #data Bytes: 2 Cycles: 1 Encoding: 0 1 1 1 Operation: MOV ((Ri)) ←� �� ����� #data MOV , Function: Description: Example: . d e t i m Li Move bit data The Boolean variable indicated by the second operand is copied into the location specified by the first operand. One of the operands must be the carry flag; the other may be any directly addressable bit. No other register or flag is affected. U C M The carry flag is originally set. The data present at input Port 3 is 11000101B. The data previously written to output Port 1 is 35H (00110101B). C T S MOV MOV MOV P1.3, C C, P3.3 P1.2, C will leave the carry cleared and change Port 1 to 39H (00111001B). MOV C,bit Bytes: 2 Cycles: 1 Encoding: Operation: 1 0 1 0 0 0 1 1 bit address 1 0 0 1 0 bit address MOV (C) �� ←������ ����� (bit) MOV bit,C Bytes: 2 Cycles: 2 Encoding: Operation: 132 1 0 0 MOV (bit)�� ←���� (C) ��� 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 MOV DPTR , #data 16 Function: Description: Example: Bytes: Cycles: Encoding: Operation: Load Data Pointer with a 16-bit constant The Data Pointer is loaded with the 16-bit constant indicated.The 16-bit constant is loaded into the second and third bytes of the instruction. The second byte (DPH) is the high-order byte, while the third byte (DPL) holds the low-order byte. No flags are affected. This is the only instruction which moves 16 bits of data at once. The instruction, MOV DPTR, #1234H will load the value 1234H into the Data Pointer: DPH will hold 12H and DPL will hold 34H. 3 2 1 0 0 1 0 0 0 0 immediate data 15-8 MOV (DPTR) �� ←� ����� #data15-0 DPH DPL ← #data �� �����15-8 #data7-0 MOVC A , @A+ Function: Description: Example: . d e t i m Li Move Code byte The MOVC instructions load the Accumulator with a code byte, or constant from program memory. The address of the byte fetched is the sum of the original unsigned eight-bit. Accumulator contents and the contents of a sixteen-bit base register, which may be either the Data Pointer or the PC. In the latter case, the PC is incremented to the address of the following instruction before being added with the Accumulator; otherwise the base register is not altered. Sixteen-bit addition is performed so a carry-out from the low-order eight bits may propagate through higher-order bits. No flags are affected. C T S U C M A value between 0 and 3 is in the Accumulator. The following instructions will translate the value in the Accumulator to one of four values defimed by the DB (define byte) directive. REL-PC: INC A MOVC A, @A+PC RET DB 66H DB 77H DB 88H DB 99H If the subroutine is called with the Accumulator equal to 01H, it will return with 77H in the Accumulator. The INC A before the MOVC instruction is needed to “get around” the RET instruction above the table. If several bytes of code separated the MOVC from the table, the corresponding number would be added to the Accumulator instead. MOVC A,@A+DPTR Bytes: 1 Cycles: 2 Encoding: Operation: 1 0 0 1 0 0 1 1 MOVC (A) �� ←������������� ������������ ((A)+(DPTR)) 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 133 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 MOVC A,@A+PC Bytes: 1 Cycles: 2 Encoding: Operation: MOVX 1 0 0 0 0 0 1 1 MOVC (PC) �� ← (PC)+1 ������ (A) �� ←����������� ���������� ((A)+(PC)) , Function: Description: Move External The MOVX instructions transfer data between the Accumulator and a byte of external data memory, hence the “X” appended to MOV. There are two types of instructions, differing in whether they provide an eight-bit or sixteen-bit indirect address to the external data RAM. . d e t i m In the first type, the contents of R0 or R1 in the current register bank provide an eight-bit address multiplexed with data on P0. Eight bits are sufficient for external I/O expansion decoding or for a relatively small RAM array. For somewhat larger arrays, any output port pins can be used to output higher-order address bits. These pins would be controlled by an output instruction preceding the MOVX. U C M Li In the second type of MOVX instruction, the Data Pointer generates a sixteen-bit address. P2 outputs the high-order eight address bits (the contents of DPH) while P0 multiplexes the low-order eight bits (DPL) with data. The P2 Special Function Register retains its previous contents while the P2 output buffers are emitting the contents of DPH. This form is faster and more efficient when accessing very large data arrays (up to 64K bytes), since no additional instructions are needed to set up the output ports. C T S It is possible in some situations to mix the two MOVX types. A large RAM array with its high-order address lines driven by P2 can be addressed via the Data Pointer, or with code to output high-order address bits to P2 followed by a MOVX instruction using R0 or R1. Example: An external 256 byte RAM using multiplexed address/data lines (e.g., an Intel 8155 RAM/ I/O/Timer) is connected to the 8051 Port 0. Port 3 provides control lines for the external RAM. Ports 1 and 2 are used for normal I/O. Registers 0 and 1 contain 12H and 34H. Location 34H of the external RAM holds the value 56H. The instruction sequence, MOVX MOVX A, @R1 @R0, A copies the value 56H into both the Accumulator and external RAM location 12H. MOVX A,@Ri Bytes: 1 Cycles: 2 Encoding: Operation: 134 1 1 1 0 0 0 1 i MOVX (A) �� ←������� ������ ((Ri)) 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 MOVX A,@DPTR Bytes: 1 Cycles: 2 Encoding: 1 1 1 0 Operation: MOVX (A) �� ←��������� �������� ((DPTR)) MOVX 0 0 0 0 @Ri, A Bytes: 1 Cycles: 2 Encoding: 1 1 1 1 Operation: MOVX ((Ri))�� ←���� (A) ��� MOVX 0 0 1 i @DPTR, A Bytes: 1 Cycles: 2 Encoding: Operation: 1 1 1 1 MOVX (DPTR)���� ←��� (A) C T S MUL AB Function: Description: Example: U C M 0 0 0 0 . d e t i m Li Multiply MUL AB multiplies the unsigned eight-bit integers in the Accumulator and register B. The low-order byte of the sixteen-bit product is left in the Accumulator, and the high-order byte in B. If the product is greater than 255 (0FFH) the overflow flag is set; otherwise it is cleared. The carry flag is always cleared Originally the Accumulator holds the value 80 (50H). Register B holds the value 160 (0A0H). The instruction, MUL AB will give the product 12,800 (3200H), so B is changed to 32H (00110010B) and the Accumulator is cleared. The overflow flag is set, carry is cleared. Bytes: 1 Cycles: 4 Encoding: Operation: 1 0 1 0 0 1 0 0 MUL (A)7-0 ←�������� (A)×(B) (B)15-8 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 135 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 NOP Function: Description: Example: No Operation Execution continues at the following instruction. Other than the PC, no registers or flags are affected. It is desired to produce a low-going output pulse on bit 7 of Port 2 lasting exactly 5 cycles. A simple SETB/CLR sequence would generate a one-cycle pulse, so four additional cycles must be inserted. This may be done (assuming no interrupts are enabled) with the instruction sequence. CLR NOP NOP NOP NOP SETB Bytes: 1 Cycles: 1 Encoding: Operation: 0 0 P2.7 0 0 NOP (PC) ←������� (PC)+1 ORL , Function: Description: . d e t i m P2.7 C T S 0 0 0 0 U C M Li Logical-OR for byte variables ORL performs the bitwise logical-OR operation between the indicated variables, storing the results in the destination byte. No flags are affected. The two operands allow six addressing mode combinations. When the destination is the Accumulator, the source can use register, direct, register-indirect, or immediate addressing; when the destination is a direct address, the source can be the Accumulator or immediate data. Note: When this instruction is used to modify an output port, the value used as the original port data will be read from the output data latch, not the input pins. Example: If the Accumulator holds 0C3H (11000011B) and R0 holds 55H (01010101B) then the instruction, ORL A, R0 will leave the Accumulator holding the value 0D7H (11010111B). When the destination is a directly addressed byte, the instruction can set combinations of bits in any RAM location or hardware register. The pattern of bits to be set is determined by a mask byte, which may be either a constant data value in the instruction or a variable computed in the Accumulator at run-time.The instruction, ORL P1, #00110010B will set bits 5,4, and 1of output Port 1. 136 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 ORL A,Rn Bytes: 1 Cycles: 1 Encoding: Operation: 0 1 0 0 1 r r r 1 0 1 ORL (A) �� ←���� ��� (A)∨(Rn) ORL A,direct Bytes: 2 Cycles: 1 Encoding: Operation: 0 1 0 0 0 direct address ORL (A)�� ←���� ��� (A)∨(direct) ORL A,@Ri Bytes: Cycles: 1 1 Encoding: Operation: 0 0 0 0 1 1 1 0 ORL (A)�� ←���� ��� (A)∨((Ri)) ORL A,#data Bytes: 2 Cycles: 1 Encoding: Operation: 1 0 C T S 1 0 0 0 U C M i 0 . d e t i m Li immediate data ORL (A)�� ←���� ��� (A)∨ #data ORL direct, A Bytes: 2 Cycles: 1 Encoding: Operation: 0 1 0 0 0 0 1 0 direct address 1 direct address ORL (direct)�� ←��������� �������� (direct)∨(A) ORL direct, #data Bytes: 3 Cycles: 2 Encoding: Operation: 0 1 0 0 0 0 1 immediate data ORL (direct) ←��������� �� �������� (direct)∨#data 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 137 STC89C51RC/RD+系列单片机指南 ORL 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 C, Function: Description: Example: Logical-OR for bit variables Set the carry flag if the Boolean value is a logical 1; leave the carry in its current state otherwise. A slash (“ / ”) preceding the operand in the assembly language indicates that the logical complement of the addressed bit is used as the source value, but the source bit itself is not affected. No other flags are affected. Set the carry flag if and only if P1.0 = 1, ACC. 7 = 1, or OV = 0: MOV C, P1.0 ;LOAD CARRY WITH INPUT PIN P10 ORL C, ACC.7 ;OR CARRY WITH THE ACC.BIT 7 ORL C, /OV ;OR CARRY WITH THE INVERSE OF OV ORL C, bit Bytes: 2 Cycles: 2 Encoding: Operation: 0 2 Cycles: 2 Encoding: 1 Function: Example: Bytes: Cycles: Encoding: Operation: 138 1 0 0 0 1 0 C T S 0 1 0 0 ORL (C) �� ←���� ��� (C)∨(bit) POP direct Description: 1 1 0 U C M 0 0 . d e t i m bit address ORL (C) �� ←���� ��� (C)∨(bit) ORL C, /bit Bytes: Operation: 1 Li bit address Pop from stack The contents of the internal RAM location addressed by the Stack Pointer is read, and the Stack Pointer is decremented by one. The value read is then transferred to the directly addressed byte indicated. No flags are affected. The Stack Pointer originally contains the value 32H, and internal RAM locations 30H through 32H contain the values 20H, 23H, and 01H, respectively. The instruction sequence, POP DPH POP DPL will leave the Stack Pointer equal to the value 30H and the Data Pointer set to 0123H. At this point the instruction, POP SP will leave the Stack Pointer set to 20H. Note that in this special case the Stack Pointer was decremented to 2FH before being loaded with the value popped (20H). 2 2 1 0 1 0 0 0 direct address POP (diect) ←������� ((SP)) (SP) �� ←������ ����� (SP) ��- �1 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 PUSH direct Function: Description: Example: Push onto stack The Stack Pointer is incremented by one. The contents of the indicated variableis then copied into the internal RAM location addressed by the Stack Pointer. Otherwise no flags are affected. On entering interrupt routine the Stack Pointer contains 09H. The Data Pointer holds the value 0123H. The instruction sequence, PUSH PUSH DPL DPH will leave the Stack Pointer set to 0BH and store 23H and 01H in internal RAM locations 0AH and 0BH, respectively. Bytes: 2 Cycles: Encoding: 2 Operation: 1 1 0 0 0 0 0 PUSH (SP) �� ←��������� �������� (SP) + 1 ((SP)) �� ←��������� �������� (direct) RET Function: Return from subroutine C T S 0 direct address U C M . d e t i m Li Description: RET pops the high-and low-order bytes of the PC successively from the stack, decrementing the Stack Pointer by two. Program execution continues at the resulting address, generally the instruction immediately following an ACALL or LCALL. No flags are affected. Example: The Stack Pointer originally contains the value 0BH. Internal RAM locations 0AH and 0BH contain the values 23H and 01H, respectively. The instruction, RET will leave the Stack Pointer equal to the value 09H. Program execution will continue at location 0123H. Bytes: 1 Cycles: Encoding: 2 Operation: 0 0 1 0 0 0 1 0 RET (PC15-8) �� ←������� ������ ((SP)) (SP) �� ←�������� ������� (SP) -1 (PC7-0) �� ←������� ������ ((SP)) (SP) �� ←�������� ������� (SP) -1 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 139 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 RETI Function: Description: Example: Return from interrupt RETI pops the high- and low-order bytes of the PC successively from the stack, and restores the interrupt logic to accept additional interrupts at the same priority level as the one just processed. The Stack Pointer is left decremented by two. No other registers are affected; the PSW is not automatically restored to its pre-interrupt status. Program execution continues at the resulting address, which is generally the instruction immediately after the point at which the interrupt request was detected. If a lower- or same-level interrupt had been pending when the RETI instruction is executed, that one instruction will be executed before the pending interrupt is processed. The Stack Pointer originally contains the value 0BH. An interrupt was detected during the instruction ending at location 0122H. Internal RAM locations 0AH and 0BH contain the values 23H and 01H, respectively. The instruction, . d e t i m RETI will leave the Stack Pointer equal to 09H and return program execution to location 0123H. Bytes: 1 Cycles: Encoding: 2 Operation: 0 Function: Example: 1 1 0 U C M 0 1 RETI (PC15-8) �� ←������� ������ ((SP)) (SP) �� ←�������� ������� (SP) -1 (PC7-0) �� ←������� ������ ((SP)) (SP) �� ←�������� ������� (SP) -1 C T S RL A Description: 0 0 Li Rotate Accumulator Left The eight bits in the Accumulator are rotated one bit to the left. Bit 7 is rotated into the bit 0 position. No flags are affected. The Accumulator holds the value 0C5H (11000101B). The instruction, RL A leaves the Accumulator holding the value 8BH (10001011B) with the carry unaffected. Bytes: 1 Cycles: Encoding: 1 Operation: 140 0 0 1 0 RL (An+1) �� ←��� �� (An) (A0) ←��� �� (A ��7) 南通国芯微电子有限公司 0 0 1 1 n = 0-6 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 RLC A Function: Description: Example: Bytes: Cycles: Rotate Accumulator Left through the Carry flag The eight bits in the Accumulator and the carry flag are together rotated one bit to the left. Bit 7 moves into the carry flag; the original state of the carry flag moves into the bit 0 position. No other flags are affected. The Accumulator holds the value 0C5H (11000101B), and the carry is zero. The instruction, RLC A leaves the Accumulator holding the value 8BH (10001011B) with the carry set. 1 1 Encoding: Operation: 0 0 1 1 0 RLC (An+1) �� ←��� �� (An) (A0) �� ←���� ��� (C) (C) �� ←��� �� (A7) 0 1 1 RR A Function: Description: Example: Bytes: Cycles: Encoding: Operation: RRC A Function: Description: Example: Bytes: Cycles: Rotate Accumulator Right Li The eight bits in the Accumulator are rotated one bit to the right. Bit 0 is rotated into the bit 7 position. No flags are affected. The Accumulator holds the value 0C5H (11000101B). The instruction, RR A leaves the Accumulator holding the value 0E2H (11100010B) with the carry unaffected. 1 1 0 U C M C T S 0 0 0 RR (An) �� ←��� �� (An+1) (A7) �� ←��� �� (A0) 0 0 1 1 n=0-6 Rotate Accumulator Right through the Carry flag The eight bits in the Accumulator and the carry flag are together rotated one bit to the right. Bit 0 moves into the carry flag; the original value of the carry flag moves into the bit 7 position.No other flags are affected. The Accumulator holds the value 0C5H (11000101B), and the carry is zero. The instruction, RRC A leaves the Accumulator holding the value 62H (01100010B) with the carry set. 1 1 Encoding: Operation: . d e t i m n = 0-6 0 0 0 1 RRC (An+1) �� ←��� �� (An) (A7) �� ←���� ��� (C) (C) �� ←��� �� (A0) 南通国芯微电子有限公司 0 0 1 1 n = 0-6 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 141 STC89C51RC/RD+系列单片机指南 SETB Function: Example: Set bit SETB sets the indicated bit to one. SETB can operate on the carry flag or any directly addressable bit. No other flags are affected The carry flag is cleared. Output Port 1 has been written with the value 34H (00110100B). The instructions, SETB C SETB P1.0 will leave the carry flag set to 1 and change the data output on Port 1 to 35H (00110101B). C Bytes: 1 Cycles: 1 Encoding: Operation: SETB 1 2 Cycles: 1 Encoding: 0 1 0 0 1 1 0 1 0 0 SETB (bit) ←�� �� 1� C T S SJMP rel Function: 1 1 U C M 1 . d e t i m 1 SETB (C) �� ←�� �1 bit Bytes: Operation: 0 bit address Li Short Jump Description: Program control branches unconditionally to the address indicated. The branch destination is computed by adding the signed displacement in the second instruction byte to the PC, after incrementing the PC twice. Therefore, the range of destinations allowed is from 128bytes preceding this instruction to 127 bytes following it. Example: The label “RELADR” is assigned to an instruction at program memory location 0123H. The instruction, SJMP RELADR will assemble into location 0100H. After the instruction is executed, the PC will contain the value 0123H. (Note: Under the above conditions the instruction following SJMP will be at 102H.Therefore, the displacement byte of the instruction will be the relative offset (0123H - 0102H) = 21H. Put another way, an SJMP with a displacement of 0FEH would be an one-instruction infinite loop). Bytes: 2 Cycles: 2 Encoding: Operation: 142 临时技术支持:13922829991 研发顾问:13922809991 Description: SETB 技术支持网站:www.STCMCU.com 1 0 0 0 0 0 0 0 rel. address SJMP (PC) �� ←������� ������ (PC)+2 (PC) �� ←��������� �������� (PC)+rel 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 SUBB A, Function: Description: Subtract with borrow SUBB subtracts the indicated variable and the carry flag together from the Accumulator, leaving the result in the Accumulator. SUBB sets the carry (borrow)flag if a borrow is needed for bit 7, and clears C otherwise.(If C was set before executing a SUBB instruction, this indicates that a borrow was needed for the previous step in a multiple precision subtraction, so the carry is subtracted from the Accumulator along with the source operand).AC is set if a borrow is needed for bit 3, and cleared otherwise. OV is set if a borrow is needed into bit 6, but not into bit 7, or into bit 7, but not bit 6. When subtracting signed integers OV indicates a negative number produced when a negative value is subtracted from a positive value, or a positive result when a positive number is subtracted from a negative number. The source operand allows four addressing modes: register, direct, register-indirect, or immediate. Example: . d e t i m The Accumulator holds 0C9H (11001001B), register 2 holds 54H (01010100B), and the carry flag is set. The instruction, SUBB A, R2 U C M Li will leave the value 74H (01110100B) in the accumulator, with the carry flag and AC cleared but OV set. Notice that 0C9H minus 54H is 75H. The difference between this and the above result is due to the carry (borrow) flag being set before the operation. If the state of the carry is not known before starting a single or multiple-precision subtraction, it should be explicitly cleared by a CLR C instruction. C T S SUBB A, Rn Bytes: Cycles: Encoding: Operation: 1 1 1 0 0 1 1 r r r SUBB (A) �� ←����� ���� (A) ��- ���� (C) ��- ���� (Rn) SUBB A, direct Bytes: 2 Cycles: 1 Encoding: 1 0 0 1 0 1 0 1 Operation: SUBB (A) �� ←����� ���� (A) ��- ���� (C) ��- �������� (direct) direct address SUBB A, @Ri Bytes: Cycles: Encoding: Operation: 1 1 1 0 0 1 0 1 1 i SUBB (A) �� ←����� ���� (A) ��- ���� (C) ��- ������ ((Ri)) 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 143 STC89C51RC/RD+系列单片机指南 SUBB A, #data Bytes: Cycles: Encoding: Operation: 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 2 1 1 0 0 1 0 1 0 0 immediate data SUBB (A) �� ←����� ���� (A) ��- ���� (C) ��- ����� #data SWAP A Function: Description: Example: Swap nibbles within the Accumulator SWAP A interchanges the low- and high-order nibbles (four-bit fields) of the Accumulator (bits 3-0 and bits 7-4). The operation can also be thought of as a four-bit rotate instruction. No flags are affected. The Accumulator holds the value 0C5H (11000101B). The instruction, SWAP Bytes: Cycles: 1 Encoding: 1 Operation: SWAP (A3-0) XCH A, 1 0 0 0 (A7-4) C T S 1 0 0 U C M Li Function: Description: Exchange Accumulator with byte variable XCH loads the Accumulator with the contents of the indicated variable, at the same time writing the original Accumulator contents to the indicated variable. The source/destination operand can use register, direct, or register-indirect addressing. Example: R0 contains the address 20H. The Accumulator holds the value 3FH (00111111B). Internal RAM location 20H holds the value 75H (01110101B). The instruction, XCH XCH A, Rn Bytes: Cycles: Encoding: Operation: XCH A, direct Bytes: Cycles: Encoding: Operation: 144 . d e t i m A leaves the Accumulator holding the value 5CH (01011100B). 1 A, @R0 will leave RAM location 20H holding the values 3FH (00111111B) and 75H (01110101B) in the accumulator. 1 1 1 1 XCH (A) 0 0 1 r r r (Rn) 2 1 1 1 0 0 XCH (A) 0 1 0 1 direct address (direct) 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 XCH A, @Ri Bytes: Cycles: Encoding: Operation: 1 1 1 1 0 0 XCH (A) 0 1 1 i ((Ri)) XCHD A, @Ri Function: Description: Example: Exchange Digit XCHD exchanges the low-order nibble of the Accumulator (bits 3-0), generally representing a hexadecimal or BCD digit, with that of the internal RAM location indirectly addressed by the specified register. The high-order nibbles (bits 7-4) of each register are not affected. No flags are affected. . d e t i m R0 contains the address 20H. The Accumulator holds the value 36H (00110110B). Internal RAM location 20H holds the value 75H (01110101B). The instruction, XCHD A, @R0 Li will leave RAM location 20H holding the value 76H (01110110B) and 35H (00110101B) in the accumulator. Bytes: Cycles: Encoding: Operation: 1 1 1 1 0 1 0 1 1 i C T S XCHD (A3-0) (Ri3-0) U C M XRL , Function: Description: Logical Exclusive-OR for byte variables XRL performs the bitwise logical Exclusive-OR operation between the indicated variables, storing the results in the destination. No flags are affected. The two operands allow six addressing mode combinations.When the destination is the Accumulator, the source can use register, direct, register-indirect, or immediate addressing; when the destination is a direct address,the source can be the Accumulator or immediate data. (Note: When this instruction is used to modify an output port, the value used as the original port data will be read from the output data latch, not the input pins.) Example: If the Accumulator holds 0C3H (11000011B) and register 0 holds 0AAH (10101010B) then the instruction, XRL A, R0 will leave the Accumulator holding the vatue 69H (01101001B). When the destination is a directly addressed byte, this instruction can complement combinnation of bits in any RAM location or hardware register. The pattern of bits to be complemented is then determined by a mask byte, either a constant contained in the instruction or a variable computed in the Accumulator at run-time. The instruction, XRL P1, #00110001B will complement bits 5,4 and 0 of outpue Port 1. 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 145 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 XRL A, Rn Bytes: Cycles: Encoding: Operation: 1 1 0 1 1 0 XRL (A) �� ← (A)� ���� 1 r r r (Rn) XRL A, direct Bytes: 2 Cycles: 1 Encoding: Operation: 0 1 1 0 0 1 0 1 XRL (A) �� ← (A)� ���� direct address . d e t i m (direct) XRL A, @Ri Bytes: 1 Cycles: 1 Encoding: Operation: 0 1 0 XRL (A) �� ← (A)� ���� XRL A, #data Bytes: 2 Cycles: 1 Encoding: Operation: 1 0 1 1 i ((Ri)) C T S 0 1 1 0 XRL (A) �� ← (A)� ���� U C M 0 1 0 0 Li immediate data #data XRL direct, A Bytes: 2 Cycles: 1 Encoding: Operation: 0 1 1 0 0 0 1 0 XRL (direct) ← (direct)� �� ��������� direct address (A) XRL direct, #data Bytes: 3 Cycles: 2 Encoding: Operation: 146 0 1 1 0 0 0 1 1 XRL (direct) ← (direct)� �� ��������� 南通国芯微电子有限公司 direct address immediate data # data 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 第6章 中断系统 中断系统是为使CPU具有对外界���������������� 紧急�������������� 事件的����������� 实时��������� 处理能力而设置的。 当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前 的工作,转而去处理这个紧急事件������������������������� ,������������������������ 处理完以后,再回到原来被中断的地方,继续原来的工 作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中 断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它 服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排 队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响 应������������ 优先���������� 级别最高的中断请求。 . d e t i m 当CPU正在处理一个中断源请求的时候(执行相应的��������������� 中断������������� 服务程序),发生了另外一个 优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的������������ 服务���������� 程序,转而去处理优先 级更高的中断请求源,处理完以后,再回到原低级中断����������������� 服务��������������� 程序,这样的过程称为中断嵌套。 这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。 Li STC89C51RC/RD+系列单片机提供了8个中断请求源,它们分别是:外部中断0(INT0)、 定时器0中断、外部中断1(INT1)、定时器1中断、串口(UART)中断、定时器2中断、外部中断 2(INT2)、外部中断3(INT3)。所有的中断都具有4个中断优先级。用户可以用关总中断允许位 (EA/IE.7)或相应中断的允许位来屏蔽所有的中断请求,也可以用打开相应的中断允许位来使 CPU响应相应的中断申请;每一个中断源可以用软件独立地控制为开中断或关中断状态;每一 个中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断,反之,低 优先级的中断请求不可以打断高优先级及同优先级的中断。当两个相同优先级的中断同时产生 时,将由查询次序来决定系统先响应哪个中断。STC89C51RC/RD+系列单片机的各个中断查询 C T S U C M 次序如下表6-1所示: 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 147 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 表6-1 中断查询次序 中断源 中断 中断优先级 相同优先级内 优先级0 优先 优先 优先级3 向量 设置 中断请求标志位 的查询次序 (最低) 级1 级2 (最高) (IPH,IP) 地址 INT0 0003H (外部中断 0) Timer 0 0 (highest) PX0H, PX0 中断允许控制位 0, 0 0, 1 1, 0 1, 1 IE0 EX0/EA 000BH 1 PT0H, PT0 0, 0 0, 1 1, 0 1, 1 TF0 ET0/EA INT1 0013H (外部中断1) 2 PX1H, PX1 0, 0 0, 1 1, 0 1, 1 IE1 EX1/EA ET1/EA Timer1 001BH 3 PT1H, PT1 0, 0 0, 1 1, 0 1, 1 TF1 UART 0023H 4 PSH, PS 0, 0 0, 1 1, 0 1, 1 RI+TI Timer2 002BH 5 PT2H, PT2 0, 0 0, 1 1, 0 1, 1 TF2 + EXF2 (ET2)/EA INT2 0033H (外部中断2) 6 PX2H, PX2 0, 0 0, 1 1, 0 1, 1 IE2 EX2/EA 7 (lowest) PX3H, PX3 0, 0 0, 1 1, 0 IE3 EX3/EA INT3 003BH (外部中断3) U C M . d e t i m Li 1, 1 通过设置新增加的特殊功能寄存器IPH中的相应位,可将中断优先级设为四级,如果只设 置IP或XICON,那么中断优先级就只有两级,与传统8051单片机两级中断优先级完全兼容。 C T S 如果使用C语言编程,中断查询次序号就是中断号,例如: 148 void void void void void void void void Int0_Routine(void) Timer0_Rountine(void) Int1_Routine(void) Timer1_Rountine(void) UART_Routine(void) Timer2_Routine(void) Int2_Routine(void) Int3_Routine(void) 南通国芯微电子有限公司 interrupt 0; interrupt 1; interrupt 2; interrupt 3; interrupt 4; interrupt 5; interrupt 6; interrupt 7; 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 6.1 中断结构 STC89C51RC/RD+系列单片机的中断系统结构示意图如图6-1所示 中断允许控 制寄存器 中断优先级 控制寄存器 最低优先级中断 IP, XICON, IPH IE, XICON寄存器 寄存器 TCON.0/IT0=0 INT0 EX0 IE0 EA TCON.0/IT0=1 TCON.2/IT1=0 INT1 IE1 ET1 Timer1 / TF1 Timer2 TF2 EXF2 C T S XICON.0/IT2=0 INT2 IE2 PX1H, PX1 EX1 TCON.2/IT1=1 UART RI TI PT0H, PT0 ET0 Timer0 / TF0 ES ET2 PX0H, PX0 U C M PT1H, PT1 PSH, PS PT2H, PT2 PX2H, PX2 EX2 0,0 0,0 0,0 0,0 0,0 0,0 0,0 最高优先级中断 0,1 1,0 Li 0,1 0,1 0,1 0,1 high . d e t i m 0,1 0,1 1,1 1,0 1,0 1,0 1,0 1,0 1,0 1,1 1,1 1,1 1,1 中断 查询 次序 1,1 1,1 XICON.0/IT2=1 XICON.4/IT3=0 INT3 IE3 PX3H, PX3 EX3 0,0 0,1 1,0 1,1 XICON.4/IT3=1 low EA Global Enable EA 图6-1 STC89C51RC/RD+系列中断系统结构图 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 149 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 外部中断0(INT0)、外部中断1(INT1)、外部中断2(INT2)和外部中断3( INT3 )既可低电平 触发,也下降沿触发。请求四个外部中断的标志位是位于寄存器TCON中的IE0/TCON.1、 IE1/TCON.3、IE2/XICON.2和IE3/XICON.5。当外部中断服务程序被响应后,中断请求标志位 IE0、IE1、IE2和IE3会自动被清0。TCON寄存器中的IT0/TCON.0、IT1/TCON.2、IT2/XICON.0 和IT3/XICON.4决定了外部中断0、1、2和3是低电平触发方式还是下降沿触发方式。如果ITx = 0(x = 0,1,2,3),那么系统在INTx(x = 0,1,2,3)脚探测到低电平后可产生外部中断。如果ITx = 1(x = 0,1,2,3),那么系统在INTx( x= 0,1,2,3)脚探测下降沿后可产生外部中断。外部中断0(INT0)、 外部中断1(INT1)、外部中断2(INT2)和外部中断3(INT3)还可以用于将单片机从掉电模式唤醒。 定时器0和1的中断请求标志位是TF0和TF1。当定时器寄存器THx/TLx(x = 0,1)溢出时,溢 出标志位TFx(x = 0,1)会被置位,定时器中断发生。当单片机转去执行该定时器中断时,定时器 的溢出标志位TFx(x = 0,1)会被硬件清除。 . d e t i m 当串行口接收中断请求标志位RI和串行口1发送中断请求标志位TI中的任何一个被置为1 后,串行口中断都会产生。。 定时器2的中断请求标志位是TF2和EXF2。当定时器寄存器TH2/TL2溢出时,溢出标志位 TF2会被置位,定时器中断发生。当单片机转去执行该定时器中断时,定时器的溢出标志位 TF2会被硬件清除。当EXEN2=1且T2EX的负跳变产生捕获或重装时,EXF2置位。定时器2中断 使能时,EXF2=1也将使CPU从中断向量处执行定时器2中断子程序。 U C M Li 各个中断触发行为总结如下表6-2所示: 中断源 INT0 (外部中断0) Timer 0 INT1 (外部中断1) 150 C T S 表6-2 中断触发 触发行为 (IT0/TCON.0 = 1): 下降沿 (IT0/TCON.0 = 0): 低电平 定时器0溢出 (IT1/TCON.2 = 1): 下降沿 Timer1 定时器1溢出 UART 发送或接受完成 Timer2 定时器2溢出 (IT1/TCON.2 = 0): 低电平 INT2 (外部中断2) (IT2/XICON.0 = 1): 下降沿 (IT2/XICON.0 = 0): 低电平 INT3 (外部中断3) (IT3/XICON.4 = 1): 下降沿 (IT3/XICON.4 = 0): 低电平 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 6.2 中断寄存器 位地址及符号 符号 描述 地址 IE Interrupt Enable Interrupt Priority Low Interrupt Priority High Timer/Counter 0 and 1 Control A8H EA B8H - - PT2 B7H PX3H PX2H PT2H 88H TF1 TR1 TF0 TR0 IE1 IT1 Serial Control 98H SM0/FE SM1 SM2 REN TB8 RB8 IP IPH TCON SCON T2CON XICON Timer/Counter 2 Control Auxiliary Interupt Control MSB C8H LSB - ET2 ES PS ET1 EX1 ET0 EX0 0x00 0000B PT1 PX1 PT0 PX0 xx00 0000B PX0H 0000,0000B IE0 IT0 0000 0000B TI RI 0000 0000B PSH PT1H PX1H PT0H . d e t i m TF2 EXF2 RCLK TCLK EXEN2 C0H PX3 EX3 IE3 IT3 复位值 PX2 TR2 C/T2 CP/RL2 EX2 IE2 IT2 Li 0000 0000B 0000 0000B 上表中列出了与STC89C51RC/RD+系列单片机中断相关的所有寄存器,下面逐一地对上述 寄存器进行介绍。 U C M 1. 中断允许寄存器IE和XICON STC89C51RC/RD+系列单片机CPU对中断源的开放或屏蔽,每一个中断源是否被允许中 断,是由内部的中断允许寄存器IE(地址为A8H)和XICON(地址为C0H)控制的。寄存器IE 的格式如下: C T S IE : 中断允许寄存器 (可位寻址) SFR name IE Address A8H bit name B7 EA B6 - B5 ET2 B4 ES B3 ET1 B2 EX1 B1 ET0 B0 EX0 EA : CPU的总中断允许控制位,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。 EA的作用是使中断允许形成两级控制。即各中断源首先受EA控制;其次还受各中断源自 己的中断允许控制位控制。 ET2: 定时/计数器T2的溢出中断允许位。ET2=1,允许T2中断;ET2=0,禁止T2中断。 ES : 串行口1中断允许位。ES=1,允许串行口1中断;ES=0,禁止串行口1中断。 ET1 : 定时/计数器T1的溢出中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。 EX1 : 外部中断1中断允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。 ET0 : T0的溢出中断允许位。ET0=1,允许T0中断;ET0=0禁止T0中断。 EX0 : 外部中断0中断允许位。EX0=1,允许中断;EX0=0禁止中断。 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 151 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 寄存器XICON的格式如下: XICON : 辅助中断控制寄存器 (可位寻址) SFR name XICON Address C0H bit name B7 PX3 B6 EX3 B5 IE3 B4 IT3 B3 PX2 B2 EX2 B1 IE2 B0 IT2 PX3: 置位表明外部中断3的优先级为高,优先级最终由[PX3H,PX3]=[0,0];[0,1];[1,0]; [1,1]来决定。 EX3 : 如被设置成1,允许外部中断3中断;如被清成0,禁止外部中断3中断。 IE3 : 外部中断3中断请求标志位,中断条件成立后,IE3=1,可由硬件自动清零。 IT3 : 当此位由软件置位时,外部中断3为下降沿触发中断;当此位由软件清零时,为低电平触发 中断。 . d e t i m PX2: 置位表明外部中断2的优先级为高,优先级最终由[PX2H,PX2]=[0,0];[0,1];[1,0]; [1,1]来决定。 Li EX2 : 如被设置成1,允许外部中断2中断;如被清成0,禁止外部中断2中断。 U C M IE2 : 外部中断2中断请求标志位,中断条件成立后,IE2=1,可由硬件自动清零。 IT2 : 当此位由软件置位时,外部中断2为下降沿触发中断;当此位由软件清零时,为低电平触发 中断。 C T S STC89C51RC/RD+系列单片机复位以后,IE和XICON被清0,由用户程序置“1”或清 “0”IE和XICON相应的位,实现允许或禁止各中断源的中断申请,若使某一个中断源允许 中断必须同时使CPU开放中断。更新IE和XICON的内容可由位操作指令来实现(SETB BIT; CLR BIT),也可用字节操作指令实现(即MOV IE,#DATA,ANL IE,#DATA;ORL IE, #DATA;MOV IE,A等)。 152 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 2. 中断优先级控制寄存器IP/XICON和IPH 传统8051单片机具有两个中断优先级,即高优先级和低优先级,可以实现两级中断嵌套。 STC89C51RC/RD+系列单片机通过设置新增加的特殊功能寄存器(IPH/XICON)中的相应位,可 将中断优先级设置为4个中断优先级;如果只设置IP,那么中断优先级只有两级,与传统8051 单片机两级中断优先级完全兼容。 一个正在执行的低优先级中断能被高优先级中断所中断,但不能被另一个低优先级中断所 中断,一直执行到结束,遇到返回指令RETI,返回主程序后再执行一条指令才能响应新的中 断申请。以上所述可归纳为下面两条基本规则: ⒈ 低优先级中断可被高优先级中断所中断,反之不能。 ⒉ 任何一种中断(不管是高级还是低级),一旦得到响应,不会再被它的同级中断所中断 . d e t i m STC89C51RC/RD+系列单片机的片内各优先级控制寄存器的格式如下: IPH: 中断优先级控制寄存器高(不可位寻址) SFR name Address IPH B7H bit B7 B6 name PX3H PX2H B5 B4 PT2 PSH U C M Li B3 Address C0H bit name C T S B7 PX3 B6 EX3 B5 IE3 B1 B0 PT1H PX1H PT0H PX0H XICON : 辅助中断控制寄存器 (可位寻址) SFR name XICON B2 B4 IT3 B3 PX2 B2 EX2 B1 IE2 B0 IT2 IP : 中断优先级控制寄存器低 (可位寻址) SFR name Address IP B8H bit B7 B6 B5 B4 B3 B2 B1 B0 name - - PT2 PS PT1 PX1 PT0 PX0 PX3H, PX3: 外部中断3优先级控制位。 当PX3H=0且PX3=0时,外部中断3为最低优先级中断(优先级0) 当PX3H=0且PX3=1时,外部中断3为较低优先级中断(优先级1) 当PX3H=1且PX3=0时,外部中断3为较高优先级中断(优先级2) 当PX3H=1且PX3=1时,外部中断3为最高优先级中断(优先级3) PX2H, PX2: 外部中断2优先级控制位。 当PX2H=0且PX2=0时,外部中断2为最低优先级中断(优先级0) 当PX2H=0且PX2=1时,外部中断2为较低优先级中断(优先级1) 当PX2H=1且PX2=0时,外部中断2为较高优先级中断(优先级2) 当PX2H=1且PX2=1时,外部中断2为最高优先级中断(优先级3) 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 153 STC89C51RC/RD+系列单片机指南 PT2H, PT2: PSH, PS: 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 定时器2中断优先级控制位。 当PT2H=0且PT2=0时,定时器2中断为最低优先级中断(优先级0) 当PT2H=0且PT2=1时,定时器2中断为较低优先级中断(优先级1) 当PT2H=1且PT2=0时,定时器2中断为较高优先级中断(优先级2) 当PT2H=1且PT2=1时,定时器2中断为最高优先级中断(优先级3) 串口1中断优先级控制位。 当PSH=0且PS=0时,串口1中断为最低优先级中断(优先级0) 当PSH=0且PS=1时,串口1中断为较低优先级中断(优先级1) 当PSH=1且PS=0时,串口1中断为较高优先级中断(优先级2) 当PSH=1且PS=1时,串口1中断为最高优先级中断(优先级3) PT1H, PT1: . d e t i m 定时器1中断优先级控制位。 当PT1H=0且PT1=0时,定时器1中断为最低优先级中断(优先级0) 当PT1H=0且PT1=1时,定时器1中断为较低优先级中断(优先级1) 当PT1H=1且PT1=0时,定时器1中断为较高优先级中断(优先级2) 当PT1H=1且PT1=1时,定时器1中断为最高优先级中断(优先级3) U C M Li PX1H, PX1: 外部中断1优先级控制位。 当PX1H=0且PX1=0时,外部中断1为最低优先级中断(优先级0) 当PX1H=0且PX1=1时,外部中断1为较低优先级中断(优先级1) 当PX1H=1且PX1=0时,外部中断1为较高优先级中断(优先级2) 当PX1H=1且PX1=1时,外部中断1为最高优先级中断(优先级3) PT0H, PT0: C T S 定时器0中断优先级控制位。 当PT0H=0且PT0=0时,定时器0中断为最低优先级中断(优先级0) 当PT0H=0且PT0=1时,定时器0中断为较低优先级中断(优先级1) 当PT0H=1且PT0=0时,定时器0中断为较高优先级中断(优先级2) 当PT0H=1且PT0=1时,定时器0中断为最高优先级中断(优先级3) PX0H, PX0: 外部中断0优先级控制位。 当PX0H=0且PX0=0时,外部中断0为最低优先级中断(优先级0) 当PX0H=0且PX0=1时,外部中断0为较低优先级中断(优先级1) 当PX0H=1且PX0=0时,外部中断0为较高优先级中断(优先级2) 当PX0H=1且PX0=1时,外部中断0为最高优先级中断(优先级3) 中断优先级控制寄存器IP和IPH的各位都由可用户程序置“1”和清“0”。但IP寄存器可 位操作,所以可用位操作指令或字节操作指令更新IP的内容。而IPH寄存器的内容只能用字节 操作指令来更新。STC89C51RC/RD+系列单片机复位后IP和IPH均为00H,各个中断源均为低 优先级中断。 154 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 3. 定时器/计数器0/1控制寄存器TCON TCON为定时器/计数器T0、T1的控制寄存器,同时也锁存T0、T1溢出中断源和外部请求 中断源等,TCON格式如下: TCON : 定时器/计数器中断控制寄存器 (可位寻址) SFR name TCON Address 88H bit name B7 TF1 B6 TR1 B5 TF0 B4 TR0 B3 IE1 B2 IT1 B1 IE0 B0 IT0 TF1: T1溢出中断标志。T1被允许计数以后,从初值开始加1计数。当产生溢出时由硬件置 “1”TF1,向CPU请求中断,一直保持到CPU响应中断时,才由硬件清“0”(也可由 查询软件清“0”)。 TR1: 定时器1的运行控制位。 TF0:T0溢出中断标志。T0被允许计数以后,从初值开始加1计数,当产生溢出时,由硬件置 “1”TF0,向CPU请求中断,一直保持CPU响应该中断时,才由硬件清0(也可由查询 软件清0)。 TR0: 定时器0的运行控制位。 . d e t i m Li IE1:外部中断1请求源(INT1/P3.3)标志。IE1=1,外部中断向CPU请求中断,当CPU响应该 中断时由硬件清“0”IE1。 U C M IT1:外部中断1中断源类型选择位。IT1=0,INT1/P3.3引脚上的低电平信号可触发外部中断 1。IT1=1,外部中断1为下降沿触发方式。 C T S IE0:外部中断0请求源(INT0/P3.2)标志。IE0=1外部中断0向CPU请求中断,当CPU响应外 部中断时,由硬件清“0”IE0(边沿触发方式)。 IT0:外部中断0中断源类型选择位。IT0=0,INT0/P3.2引脚上的低电平可触发外部中断0。 IT0=1,外部中断0为下降沿触发方式。 4. 串行口控制寄存器SCON SCON为串行口控制寄存器,SCON格式如下: SCON : 串行口控制寄存器 (可位寻址) SFR name SCON Address 98H bit name B7 SM0/FE B6 SM1 B5 SM2 B4 REN B3 TB8 B2 RB8 B1 TI B0 RI RI: 串行口1接收中断标志。若串行口1允许接收且以方式0工作,则每当接收到第8位数据时 置1;若以方式1、2、3工作且SM2=0时,则每当接收到停止位的中间时置1;当串行口以 方式2或方式3工作且SM2=1时,则仅当接收到的第9位数据RB8为1后,同时还要接收到停 止位的中间时置1。RI为1表示串行口1正向CPU申请中断(接收中断),RI必须由用户的中 断服务程序清零。 TI: 串行口1发送中断标志。串行口1以方式0发送时,每当发送完8位数据,由硬件置1;若以 方式1、方式2或方式3发送时,在发送停止位的开始时置1。TI=1表示串行口1正在向CPU 申请中断(发送中断)。值得注意的是,CPU响应发送中断请求,转向执行中断服务程序 时并不将TI清零,TI必须由用户在中断服务程序中清零。 SCON寄存器的其他位与中断无关,在此不作介绍。 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 155 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 3. 定时器/计数器2控制寄存器T2CON TCON为定时器/计数器T0、T1的控制寄存器,同时也锁存T0、T1溢出中断源和外部请求 中断源等,TCON格式如下: TCON : 定时器/计数器中断控制寄存器 (可位寻址) SFR name T2CON Address C8H bit name B7 TF2 B6 EXF2 B5 B4 B3 B2 RCLK TCLK EXEN2 TR2 B1 B0 C/T2 CP/RL2 TF2:����������������������������������������������� 定时器2 溢出标志。定时器2溢出时置位,必须由软件清除。当RCLK或TCLK=1 时,TF2 将不会置位 EXF2������������������������������������������������ :����������������������������������������������� 定时器2外部标志。当EXEN2=1且T2EX的负跳变产生捕获或重装时,EXF2置位。定时器2 中断使能时,EXF2=1将使CPU从中断向量处执行定时器2 中断子程序。EXF2位必须用软 件清零。在递增/递减计数器模式(DCEN=1)中,EXF2不会引起中断 RCLK����������������������������������������� :���������������������������������������� 接收时钟标志。RCLK置位时,定时器2的溢出脉冲作为串行口模式1和模式3的接收时 钟。RCLK=0时,将定时器1的溢出脉冲作为接收时钟 TCLK����������������������������������������� :���������������������������������������� 发送时钟标志。TCLK置位时,定时器2的溢出脉冲作为串行口模式1和模式3的发送时 钟。TCLK=0时,将定时器1的溢出脉冲作为发送时钟 EXEN2����������������������������������������� :���������������������������������������� 定时器2外部使能标志。当其置位且定时器2未作为串行口时钟时,允许T2EX的负跳变 产生捕获或重装。EXEN2=0 时,T2EX的跳变对定时器2无效 TR2���������������������� :��������������������� 定时器2启动/停止控制位。置1时启动定时器 C T S U C M . d e t i m Li C/T2:����������������� 定时器/ 计数器选择。(定时器2) 0= 内部定时器(OSC/12 或OSC/6) 1 = 外部事件计数器(下降沿触发) CP/RL2:������������������������������������������������ 捕获/ 重装标志。置位:EXEN2=1 时,T2EX 的负跳变产生捕获。 清零:EXEN2=0 时,定时器2溢出或T2EX 的负跳变都可使定时器自动重装。当RCLK=1 或TCLK=1时, 该位无效且定时器强制为溢出时自动重装 156 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 6.3 中断优先级 STC89C51RC/RD+系列单片机的所有的中断都具有4个中断优先级,对于这些中断请求源 可编程为高优先级中断或低优先级中断,可实现两级中断服务程序嵌套。��������� 一个正在执行的低优 先级中断能被高优先级中断所中断,但不能被另一个低优先级中断所中断,一直执行到结束, 遇到返回指令RETI,返回主程序后再执行一条指令才能响应新的中断申请。以上所述可归纳 为下面两条基本规则: ⒈ 低优先级中断可被高优先级中断所中断,反之不能。 ⒉ 任何一种中断(不管是高级还是低级),一旦得到响应,不会再被它的同级中断所中断 当同时收到几个同一优先级的中断要求时,哪一个要求得到服务,取决于内部的查询次 序。这相当于在每个优先级内,还同时存在另一个辅助优先级结构,STC89C51RC/RD+系列单 片机各中断优先查询次序如下: 0. 1. 2. 3. 4. 5. 6. 7. 中断源 INT0 Timer 0 INT1 Timer 1 UART Timer 1 INT1 INT1 查询次序 (highest) C T S U C M . d e t i m Li (lowest) 如果使用C语言编程,中断查询次序号就是中断号,例如: void Int0_Routine(void) interrupt 0; void Timer0_Rountine(void) interrupt 1; void Int1_Routine(void) interrupt 2; void Timer1_Rountine(void) interrupt 3; void UART_Routine(void) interrupt 4; void Timer2_Routine(void) interrupt 5; void Int2_Routine(void) interrupt 6; void Int3_Routine(void) interrupt 7; 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 157 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 6.4 中断处理 当某中断产生而且被CPU响应,主程序被中断,接下来将执行如下操作: 1. 当前正被执行的指令全部执行完毕; 2. PC值被压入栈; 3. 现场保护; 4. 阻止同级别其他中断; 5. 将中断向量地址装载到程序计数器PC; 6. 执行相应的中断服务程序。 中断服务程序ISR完成和该中断相应的一些操作。ISR以RETI(中断返回)指令结束,将PC值 从栈中取回,并恢复原来的中断设置,之后从主程序的断点处继续执行。 . d e t i m 当某中断被响应时,被装载到程序计数器PC中的数值称为中断向量,是同该中断源相对应 的中断服务程序的起始地址。各中断源服务程序的入口地址(即中断向量)为: C T S Li 中断源 中断向量 External Interrupt 0 Timer 0 External Interrupt 1 Timer 1 UART Timer 2 External Interrupt 2 External Interrupt 3 0003H 000BH 0013H 001BH 0023H 002BH 0033H 003BH U C M 当“转去执行中断”时,引起中断的标志位将被硬件自动清零。由于中断向量入口地址位于 程序存储器的开始部分,所以主程序的第1条指令通常为跳转指令,越过中断向量区(LJMP MAIN)。 注意:不能用RET指令代替RETI指令 RET指令虽然也能控制PC返回到原来中断的地方,但RET指令没有清零中断优先级状态触 发器的功能,中断控制系统会认为中断仍在进行,其后果是与此同级或低级的中断请求将不被 响应。 若用户在中断服务程序中进行了入栈操作,则在RETI指令执行前应进行相应的出栈操 作,即在中断服务程序中PUSH指令与POP指令必须成对使用,否则不能正确返回断点。 158 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 6.5 外部中断 外部中断0(INT0)、外部中断1(INT1)、外部中断2(INT2)和外部中断3( INT3)有两种触发方 式,下降沿触发方式和低电平触发方式。 请求四个外部中断的标志位是位于寄存器TCON中的IE0/TCON.1、IE1/TCON.3、IE2/XICON.2和IE3/XICON.5。当外部中断服务程序被响应后,中断请求标志位IE0、IE1、IE2和IE3 会自动被清0。TCON寄存器中的IT0/TCON.0、IT1/TCON.2、IT2/XICON.0和IT3/XICON.4决定 了外部中断0、1、2和3是低电平触发方式还是下降沿触发方式。如果ITx = 0(x = 0,1,2,3),那么 系统在INTx(x = 0,1,2,3)脚探测到低电平后可产生外部中断。如果ITx = 1(x = 0,1,2,3),那么系统 在INTx( x= 0,1,2,3)脚探测下降沿后可产生外部中断。外部中断0(INT0)、外部中断1(INT1)、外 部中断2(INT2)和外部中断3(INT3)还可以用于将单片机从掉电模式唤醒。 . d e t i m 由于系统每个时钟对外部中断引脚采样1次,所以为了确保被检测到,输入信号应该至少 维持2个系统时钟。如果外部中断是仅下降沿触发,要求必须在相应的引脚维持高电平至少1个 系统时钟,而且低电平也要持续至少一个系统时钟,才能确保该下降沿被CPU检测到。同样, 如果外部中断是低电平可触发,则要求必须在相应的引脚维持低电平至少2个系统时钟,这样 才能确保CPU能够检测到该低电平信号。 C T S 南通国芯微电子有限公司 U C M 总机:0513-5501 2928 / 2929 / 2966 Li 传真:0513-5501 2969 / 2956 / 2947 159 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 6.6 中断测试程序 6.6.1 外部中断0(INT0)的测试程序(C程序及汇编程序) 1. 程序1——演示外部中断0的下降沿中断 C程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机外部中断0�(下降沿) -----------------------*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ #include "reg51.h" //External interrupt0 service routine void exint0() interrupt 0 { P0++; } void main() { IT0 = 1; EX0 = 1; EA = 1; C T S U C M . d e t i m Li //INT0, interrupt 0 (location at 0003H) //set INT0 interrupt type (1:Falling 0:Low level) //enable INT0 interrupt //open global interrupt switch while (1); } 160 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 汇编程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机外部中断0�(下降沿) ----------------------*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -------------------------------------------- --*/ /* 如果要在程序中使用或在文章中引用该程序, ----------------------*/ /* 请在程序中或文章中注明使用了STC的资料及程序 ----------*/ /*------------------------------------------------------------------------------------*/ ;----------------------------------------;interrupt vector table ORG 0000H LJMP MAIN ORG 0003H LJMP EXINT0 ;---------------------------------------- MAIN: ORG C T S 0100H MOV SP, SETB IT0 SETB EX0 SETB EA SJMP $ #7FH U C M . d e t i m Li ;INT0, interrupt 0 (location at 0003H) ;initial SP ;set INT0 interrupt type (1:Falling 0:Low level) ;enable INT0 interrupt ;open global interrupt switch ;----------------------------------------;External interrupt0 service routine EXINT0: CPL RETI P0.0 ;---------------------------------------- END 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 161 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 2. 程序2——演示外部中断0的下降沿中断唤醒掉电模式 C程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机外部中断0�(下降沿)唤醒掉电模式 ----*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ #include "reg51.h" #include "intrins.h" //External interrupt0 service routine void exint0( ) interrupt 0 { } void main() { IT0 = 1; EX0 = 1; EA = 1; while (1) { } U C M . d e t i m Li //INT0, interrupt 0 (location at 0003H) C T S //set INT0 interrupt type (1:Falling 0:Low level) //enable INT0 interrupt //open global interrupt switch INT0 = 1; while (!INT0); _nop_(); _nop_(); PCON = 0x02; _nop_(); _nop_(); P1++; //ready read INT0 port //check INT0 //MCU power down } 162 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 汇编程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机外部中断0�(下降沿)唤醒掉电模式 ----*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -------------------------------------------- --*/ /* 如果要在程序中使用或在文章中引用该程序, ----------------------*/ /* 请在程序中或文章中注明使用了STC的资料及程序 ----------*/ /*------------------------------------------------------------------------------------*/ ;----------------------------------------;interrupt vector table ORG 0000H LJMP MAIN ORG 0003H LJMP EXINT0 ;---------------------------------------- MAIN: LOOP: ORG 0100H MOV SETB SETB SETB SP, IT0 EX0 EA C T S #7FH SETB INT0 JNB INT0, $ NOP NOP MOV PCON, #02H NOP NOP CPL P1.0 SJMP LOOP . d e t i m Li ;INT0, interrupt 0 (location at 0003H) U C M ;initial SP ;set INT0 interrupt type (1:Falling 0:Low level) ;enable INT0 interrupt ;open global interrupt switch ;ready read INT0 port ;check INT0 ;MCU power down ;----------------------------------------;External interrupt0 service routine EXINT0: RETI ;---------------------------------------- END 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 163 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 6.6.2 外部中断1(INT1)的测试程序(C程序及汇编程序) 1. 程序1——演示外部中断1的下降沿中断 C程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机外部中断1�(下降沿) -----------------------*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ #include "reg51.h" //External interrupt1 service routine void exint1() interrupt 2 { P0++; } void main() { IT1 = 1; EX1 = 1; EA = 1; C T S U C M . d e t i m Li //INT1, interrupt 2 (location at 0013H) //set INT1 interrupt type (1:Falling only 0:Low level) //enable INT1 interrupt //open global interrupt switch while (1); } 164 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 汇编程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机外部中断1�(下降沿) ----------------------*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ . d e t i m ;----------------------------------------;interrupt vector table ORG 0000H LJMP MAIN ORG 0013H LJMP EXINT1 C T S ;---------------------------------------- MAIN: ORG 0100H MOV SP, SETB IT1 SETB EX1 SETB EA SJMP $ #7FH U C M Li ;INT1, interrupt 2 (location at 0013H) ;initial SP ;set INT1 interrupt type (1:Falling 0:Low level) ;enable INT1 interrupt ;open global interrupt switch ;----------------------------------------;External interrupt1 service routine EXINT1: CPL RETI P0.0 ;---------------------------------------- END 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 165 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 2. 程序2——演示外部中断1的下降沿中断唤醒掉电模式 C程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机外部中断1�(下降沿)唤醒掉电模式 -----*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ #include "reg51.h" #include "intrins.h" //External interrupt0 service routine void exint1( ) interrupt 2 { } void main() { IT1 = 1; EX1 = 1; EA = 1; while (1) { } U C M . d e t i m Li //INT1, interrupt 2 (location at 0013H) C T S //set INT1 interrupt type (1:Falling 0:Low level) //enable INT1 interrupt //open global interrupt switch INT1 = 1; while (!INT1); _nop_(); _nop_(); PCON = 0x02; _nop_(); _nop_(); P1++; //ready read INT1 port //check INT1 //MCU power down } 166 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 汇编程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机外部中断1�(下降沿)唤醒掉电模式 ----*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ ;----------------------------------------;interrupt vector table ORG 0000H LJMP MAIN ORG 0013H LJMP EXINT1 ORG 0100H MOV SETB SETB SETB SP, IT1 EX1 EA C T S #7FH Li ;INT1, interrupt 2 (location at 0013H) ;---------------------------------------- MAIN: LOOP: . d e t i m SETB INT1 JNB INT1 ,$ NOP NOP MOV PCON, #02H NOP NOP CPL P1.0 SJMP LOOP U C M ;initial SP ;set INT1 interrupt type (1:Falling 0:Low level) ;enable INT1 interrupt ;open global interrupt switch ;ready read INT1 port ;check INT1 ;MCU power down ;----------------------------------------;External interrupt1 service routine EXINT1: RETI ;---------------------------------------- END 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 167 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 6.6.3 外部中断2(INT2)的测试程序(C程序及汇编程序) 1. 程序1——演示外部中断2的下降沿中断 C程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机外部中断2�(下降沿) -----------------------*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ #include "reg51.h" sfr P4 = 0xe8; sbit INT2 = P4^3; sbit INT3 = P4^2; sfr XICON = 0xc0; sbit PX3 = XICON^7; sbit EX3 = XICON^6; sbit IE3 = XICON^5; sbit IT3 = XICON^4; sbit PX2 = XICON^3; sbit EX2 = XICON^2; sbit IE2 = XICON^1; sbit IT2 = XICON^0; . d e t i m Li //for 90C58AD series, location at 0C0H C T S U C M //for 90C58AD series, location at 0E8H //External interrupt2 service routine void exint2() interrupt 6 //INT2, interrupt 6 (location at 0033H) { P0++; } void main() { IT2 = 1; EX2 = 1; EA = 1; //set INT2 interrupt type (1:Falling only 0:Low level) //enable INT2 interrupt //open global interrupt switch while (1); } 168 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 汇编程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机外部中断2�(下降沿) -----------------------*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ P4 EQU 0E8H ;for 90C58AD series, location at 0C0H INT2 BIT P4.3 INT3 BIT P4.2 XICON EQU 0C0H PX3 BIT XICON.7 EX3 BIT XICON.6 IE3 BIT XICON.5 IT3 BIT XICON.4 PX2 BIT XICON.3 EX2 BIT XICON.2 IE2 BIT XICON.1 IT2 BIT XICON.0 ;----------------------------------------;interrupt vector table C T S . d e t i m ;for 90C58AD series, location at 0E8H U C M Li ORG 0000H LJMP MAIN ORG 0033H LJMP EXINT2 ;---------------------------------------- ORG 0100H MAIN: MOV SP, #7FH SETB IT2 SETB EX2 SETB EA SJMP $ ;----------------------------------------;External interrupt2 service routine EXINT2: CPL P0.0 RETI ;---------------------------------------- END 南通国芯微电子有限公司 ;INT2, interrupt 6 (location at 0033H) ;initial SP ;set INT2 interrupt type (1:Falling 0:Low level) ;enable INT2 interrupt ;open global interrupt switch 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 169 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 2. 程序2——演示外部中断2的下降沿中断唤醒掉电模式 C程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机外部中断2�(下降沿)唤醒掉电模式 -----*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ #include "reg51.h" #include "intrins.h" sfr P4 = 0xe8; sbit INT2 = P4^3; sbit INT3 = P4^2; sfr XICON sbit PX3 sbit EX3 sbit IE3 sbit IT3 sbit PX2 sbit EX2 sbit IE2 sbit IT2 C T S //External interrupt2 service routine void exint2() interrupt 6 { } 170 南通国芯微电子有限公司 Li //for 90C58AD series, location at 0C0H = 0xc0; = XICON^7; = XICON^6; = XICON^5; = XICON^4; = XICON^3; = XICON^2; = XICON^1; = XICON^0; void main() { IT2 = 1; EX2 = 1; EA = 1; . d e t i m U C M //for 90C58AD series, location at 0E8H //INT2, interrupt 6 (location at 0033H) //set INT2 interrupt type (1:Falling 0:Low level) //enable INT2 interrupt //open global interrupt switch 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com while (1) { } 临时技术支持:13922829991 研发顾问:13922809991 INT2 = 1; while (!INT2); _nop_(); _nop_(); PCON = 0x02; _nop_(); _nop_(); P1++; //ready read INT2 port //check INT2 //MCU power down } . d e t i m 汇编程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机外部中断2�(下降沿)唤醒掉电模式 -----*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ C T S U C M Li P4 EQU 0E8H INT2 BIT P4.3 INT3 BIT P4.2 ;for 90C58AD series, location at 0C0H XICON PX3 EX3 IE3 IT3 PX2 EX2 IE2 IT2 ;for 90C58AD series, location at 0E8H EQU BIT BIT BIT BIT BIT BIT BIT BIT 0C0H XICON.7 XICON.6 XICON.5 XICON.4 XICON.3 XICON.2 XICON.1 XICON.0 ;----------------------------------------;interrupt vector table ORG 0000H LJMP MAIN 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 171 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com ORG 0033H LJMP EXINT2 ;---------------------------------------- MAIN: LOOP: ORG 0100H MOV SETB SETB SETB SP, IT2 EX2 EA ;INT2, interrupt 6 (location at 0033H) #7FH ;initial SP ;set INT2 interrupt type (1:Falling 0:Low level) ;enable INT2 interrupt ;open global interrupt switch SETB INT2 JNB INT2, $ NOP NOP MOV PCON, #02H NOP NOP CPL P1.0 SJMP LOOP ;----------------------------------------;External interrupt2 service routine EXINT2: RETI C T S 临时技术支持:13922829991 研发顾问:13922809991 ;ready read INT2 port ;check INT2 ;MCU power down U C M . d e t i m Li ;---------------------------------------- 172 END 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 6.6.3 外部中断3(INT3)的测试程序(C程序及汇编程序) 1. 程序1——演示外部中断3的下降沿中断 C程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机外部中断3�(下降沿) -----------------------*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ #include "reg51.h" sfr P4 = 0xe8; sbit INT2 = P4^3; sbit INT3 = P4^2; sfr XICON = 0xc0; sbit PX3 = XICON^7; sbit EX3 = XICON^6; sbit IE3 = XICON^5; sbit IT3 = XICON^4; sbit PX2 = XICON^3; sbit EX2 = XICON^2; sbit IE2 = XICON^1; sbit IT2 = XICON^0; . d e t i m Li //for 90C58AD series, location at 0C0H C T S U C M //for 90C58AD series, location at 0E8H //External interrupt3 service routine void exint3() interrupt 7 //INT3, interrupt 7 (location at 003BH) { P0++; } void main() { IT3 = 1; EX3 = 1; EA = 1; //set INT3 interrupt type (1:Falling only 0:Low level) //enable INT3 interrupt //open global interrupt switch while (1); } 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 173 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 汇编程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机外部中断3�(下降沿) -----------------------*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ P4 EQU 0E8H ;for 90C58AD series, location at 0C0H INT2 BIT P4.3 INT3 BIT P4.2 XICON EQU 0C0H ;for 90C58AD series, location at 0E8H PX3 BIT XICON.7 EX3 BIT XICON.6 IE3 BIT XICON.5 IT3 BIT XICON.4 PX2 BIT XICON.3 EX2 BIT XICON.2 IE2 BIT XICON.1 IT2 BIT XICON.0 ;----------------------------------------;interrupt vector table U C M C T S ORG 0000H LJMP MAIN ORG 003BH LJMP EXINT3 . d e t i m Li ;INT3, interrupt 7 (location at 003BH) ;---------------------------------------- ORG 0100H MAIN: MOV SP,#7FH SETB IT3 SETB EX3 SETB EA SJMP $ ;----------------------------------------;External interrupt3 service routine ;initial SP ;set INT3 interrupt type (1:Falling 0:Low level) ;enable INT3 interrupt ;open global interrupt switch EXINT3: CPL P0.0 RETI ;---------------------------------------- END 174 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 2. 程序2——演示外部中断3的下降沿中断唤醒掉电模式 C程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机外部中断3�(下降沿)唤醒掉电模式 -----*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ #include "reg51.h" #include "intrins.h" sfr P4 = 0xe8; sbit INT2 = P4^3; sbit INT3 = P4^2; //for 90C58AD series, location at 0C0H sfr XICON = 0xc0; sbit PX3 = XICON^7; sbit EX3 = XICON^6; sbit IE3 = XICON^5; sbit IT3 = XICON^4; sbit PX2 = XICON^3; sbit EX2 = XICON^2; sbit IE2 = XICON^1; sbit IT2 = XICON^0; U C M . d e t i m Li //for 90C58AD series, location at 0E8H C T S //External interrupt3 service routine void exint3() interrupt 7 //INT3, interrupt 7 (location at 003BH) { } void main() { IT3 = 1; EX3 = 1; EA = 1; 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 //set INT3 interrupt type (1:Falling 0:Low level) //enable INT3 interrupt //open global interrupt switch 传真:0513-5501 2969 / 2956 / 2947 175 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com while (1) { INT3 = 1; } while (!INT3); _nop_(); _nop_(); PCON = 0x02; _nop_(); _nop_(); P1++; 临时技术支持:13922829991 研发顾问:13922809991 //ready read INT3 port //check INT3 //MCU power down } 汇编程序: C T S XICON PX3 EX3 IE3 IT3 PX2 EX2 IE2 IT2 EQU BIT BIT BIT BIT BIT BIT BIT BIT 0C0H XICON.7 XICON.6 XICON.5 XICON.4 XICON.3 XICON.2 XICON.1 XICON.0 U C M . d e t i m Li /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机外部中断3�(下降沿)唤醒掉电模式 -----*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ P4 EQU 0E8H ;for 90C58AD series, location at 0C0H INT2 BIT P4.3 INT3 BIT P4.2 ;for 90C58AD series, location at 0E8H ;----------------------------------------;interrupt vector table 176 ORG 0000H LJMP MAIN 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com ORG 003BH LJMP EXINT3 临时技术支持:13922829991 研发顾问:13922809991 ;INT3, interrupt 7 (location at 003BH) ;---------------------------------------- MAIN: LOOP: ORG 0100H MOV SETB SETB SETB SP, IT3 EX3 EA #7FH SETB INT3 JNB INT3, $ NOP NOP MOV PCON,#02H NOP NOP CPL P1.0 SJMP LOOP C T S ;----------------------------------------;External interrupt3 service routine EXINT3: RETI ;initial SP ;set INT3 interrupt type (1:Falling 0:Low level) ;enable INT3 interrupt ;open global interrupt switch ;ready read INT3 port ;check INT3 ;MCU power down U C M . d e t i m Li ;---------------------------------------- END 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 177 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 第7章 定时器/计数器 7.1 定时器/计数器0/1 STC89C51RC/RD+系列�������������������������������� 单片机的定时器0和定时器1,与传统8051的定时器完全兼容,当在 定时器1做波特率发生器时,定时器0可以当两个8位定时器用。 STC89C51RC/RD+系列�������������������������������� 单片机内部设置的两个16位定时器/计数器T0和T1都具有计数方式 和定时方式两种工作方式。对每个定时器/计数器(T0和T1),在特殊功能寄存器TMOD中都有一 控制位— C/T来选择T0或T1为定时器还是计数器。定时器/计数器的核心部件是一个加法(也有 减法)的计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统 时钟,则为定时方式,此时定时器/计数器每12个时钟或者每6个时钟得到一个计数脉冲,计数 值加1;如果计数脉冲来自单片机外部引脚(T0为P3.4,T1为P3.5),则为计数方式,每来一个脉 冲加1。 . d e t i m Li 当定时器/计数器工作在定时模式时,可在烧录用户程序时在STC-ISP编程器中设置(如下 图所示)是系统时钟/12还是系统时钟/6后让T0和T1进行计数。当定时器/计数器工作在计数模 式时,对外部脉冲计数不分频。 U C M C T S 定时器/计数器0有4种工作模式:模式0(13位定时器/计数器),模式1(16位定时器/计数器 模式),模式2(8位自动重装模式),模式3(两个8位定时器/计数器)。定时器/计数器1除模式3 外,其他工作模式与定时器/计数器0相同,T1在模式3时无效,停止计数。 7.1.1 定时器/计数器0和1的相关寄存器 符号 描述 地址 TCON 定时器控制寄存器 88H TMOD TL0 TL1 TH0 TH1 定时器模式寄存器 Timer Low 0 Timer Low 1 Timer High 0 Timer High 1 178 南通国芯微电子有限公司 89H 8AH 8BH 8CH 8DH 位地址及其符号 MSB LSB 复位值 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 0000 0000B GATE C/T M1 M0 GATE C/T M1 M0 0000 0000B 0000 0000B 0000 0000B 0000 0000B 0000 0000B 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 1. 定时器/计数器控制寄存器TCON TCON为定时器/计数器T0、T1的控制寄存器,同时也锁存T0、T1溢出中断源和外部请求 中断源等,TCON格式如下: TCON : 定时器/计数器中断控制寄存器 (可位寻址) SFR name TCON Address 88H bit name B7 TF1 B6 TR1 B5 TF0 B4 TR0 B3 IE1 B2 IT1 B1 IE0 B0 IT0 TF1: 定时器/计数器T1溢出标志。T1被允许计数以后,从初值开始加1计数。当最高位产生溢 出时由硬件置“1”TF1,向CPU请求中断,一直保持到CPU响应中断时,才由硬件清 “0”TF1(TF1也可由程序查询清“0”)。 TR1: 定时器T1的运行控制位。该位由软件置位和清零。当GATE(TMOD.7)=0,TR1=1时就 允许T1开始计数,TR1=0时禁止T1计数。当GATE(TMOD.7)=1,TR1=1且INT1 输入 高电平时,才允许T1计数。 . d e t i m TF0:定时器/计数器T0溢出中断标志。T0被允许计数以后,从初值开始加1计数,当最高位产 生溢出时,由硬件置“1”TF0,向CPU请求中断,一直保持CPU响应该中断时,才由硬 件清“0”TF0( TF0也可由程序查询清“0”)。 U C M Li TR0: 定时器T0的运行控制位。该位由软件置位和清零。当GATE(TMOD.3)=0,TR0=1时就 允许T0开始计数,TR0=0时禁止T0计数。当GATE(TMOD.3)=1,TR1=0且INT0 输入 高电平时,才允许T0计数。 C T S IE1:外部中断1请求源(INT1 /P3.3)标志。IE1=1,外部中断向CPU请求中断,当CPU响应该 中断时由硬件清“0”IE1。 IT1:外部中断1触发方式控制位。IT1=0时,外部中断1为低电平触发方式,当INT1(P3.3) 输入低电平时,置位IE1 。采用低电平触发方式时,外部中断源(输入到INT1)必须保 持低电平有效,直到该中断被CPU 响应,同时在该中断服务程序执行完之前,外部中断 源必须被清除(P3.3要变高),否则将产生另一次中断。当IT1=1时,则外部中断1(INT1 ) 端口由“1”→“0”下降沿跳变,激活中断请求标志位IE1 ,向主机请求中断处理。 IE0:外部中断0请求源(INT0/P3.2)标志。IE0=1外部中断0向CPU请求中断,当CPU响应外 部中断时,由硬件清“0”IE0(边沿触发方式)。 IT0:外部中断0触发方式控制位。IT0=0时,外部中断0为低电平触发方式,当INT0(P3.2) 输入低电平时,置位IE0。采用低电平触发方式时,外部中断源(输入到INT0)必须保 持低电平有效,直到该中断被CPU响应,同时在该中断服务程序执行完之前,外部中断源 必须被清除(P3.2要变高),否则将产生另一次中断。当IT0=1时,则外部中断0�(INT0) 端口由“1”→“0”下降沿跳变,激活中断请求标志位IE1 ,向主机请求中断处理。 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 179 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 2. 定时器����������� /���������� 计数器工作模式寄存器TMOD 定时和计数功能由特殊功能寄存器TMOD的控制位C/T进行选择,TMOD寄存器的各位信 息如下表所列。可以看出,2个定时/计数器有4种操作模式,通过TMOD的M1和M0选择。2个 定时/计数器的模式0、1和2都相同,模式3不同,各模式下的功能如下所述。 寄存器TMOD各位的功能描述 TMOD 地址:89H 不可位寻址 7 复位值:00H 6 GATE 5 C/T M1 4 3 M0 GATE TMOD.7/ TMOD.3/ GATE TMOD.3控制定时器0,置1时只有在INT0脚为高及TR0控制位置1 时才可打开定时器/计数器0。 C T S TMOD.2/ C/T 0 0 0 1 1 0 1 1 TMOD.1/TMOD.0 M1、M0 0 180 0 0 1 1 0 1 1 U C M Li TMOD.6控制定时器1用作定时器或计数器,清零则用作定时器 (从内部系统时钟输入),置1用作计数器(从T1/P3.5脚输入) TMOD.2控制定时器0用作定时器或计数器,清零则用作定时器 (从内部系统时钟输入),置1用作计数器(从T0/P3.4脚输入) TMOD.5/TMOD.4 M1、M0 . d e t i m 功能 TMOD.7控制定时器1,置1时只有在INT1脚为高及TR1控制位置1 时才可打开定时器/计数器1。 C/T M0 符号 GATE TMOD.6/ M1 C/T 0 定时器0 定时器1 位 2 1 南通国芯微电子有限公司 定时器定时器/计数器1模式选择 13位定时器/计数器,兼容8048定时模式,TL1只用低5位参与 分频,TH1整个8位全用。 16位定时器/计数器,TL1、TH1全用 8位自动重装载定时器,当溢出时将TH1存放的值自动重装入TL1. 定时器/计数器1此时无效(停止计数)。 定时器/计数器0模式选择 13位定时器/计数器,兼容8048定时模式,TL0只用低5位参与 分频,TH0整个8位全用。 16位定时器/计数器,TL0、TH0全用 8位自动重装载定时器,当溢出时将TH0存放的值自动重装入TL0 定时器0此时作为双8位定时器/计数器。TL0作为一个8位定时 器/计数器,通过标准定时器0的控制位控制。TH0仅作为一个 8位定时器,由定时器1的控制位控制。 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 7.1.2 定时器/计数器0工作模式(与传统8051单片机兼容) 通过对寄存器TMOD中的M1(TMOD.1)、M0(TMOD.0)的设置,定时器/计数器0有4种不同的 工作模式 7.1.2.1 模式0(13位定时器/计数器) 将定时器设置成模式0时类似8048定时器,即8位计数器带32分频的预分频器。下图所示 为�������������������������������������������� 定时器����������������������������������������� /���������������������������������������� 计数器的������������������������������������ 模式0工作方式。此模式下,定时器0配置为13位的计数器,由TL0的低5位 和TH0的8位所构成。TL0低5位溢出向TH0进位,TH0计数溢出置位TCON中的溢出标志位TF0。 GATE(TMOD.3)=0 时,如TR0=1,则定时器计数。GATE=1 时,允许由外部输入INT1控制定时器 1,INT0控制定时器0,这样可实现脉宽测量。TR0为TCON寄存器内的控制位,TCON寄存器各位 的具体功能描述见TCON寄存器各位的具体功能描述表。 . d e t i m 在模式0下定时器������������������������ /����������������������� 计数器�������������������� 0������������������� 作为����������������� 13��������������� 位定时器/计数器,如下图所示。 MCU in 12T mode ÷12 SYSclk ÷6 MCU in 6T mode T0 Pin C T S GATE INT0 U C M C/T=0 C/T=1 TR0 Li TL0 (5 bits) TH0 (8 bits) TF0 Interrupt control 定时器/计数器0的模式 0: 13位定时器/计数器 当C/T=0时,多路开关连接到系统时钟的分频输出,T0对时钟周期计数,T0工作在定时方 式。当C/T=1时,多路开关连接到外部脉冲输入P3.4/T0,即T0工作在计数方式。 STC89C51RC/RD+����������������������������������� 系列单片机的定时器有两种计数速率:一种是��������������� 12T������������ 模式,每�������� 12������ 个时钟加�� 1� , 与传统�������������������������������������������� 8051���������������������������������������� 单片机相同;另外一种是����������������������������� 6T��������������������������� 模式,每6个时钟加������������������ 1����������������� ,速度是传统����������� 8051������� 单片机的��� 2�� 倍。 T0�������������������������� 的速率在烧录用户程序时在STC-ISP编程器中设置。 该��������������������������������������������� 模式下的����������������������������������������� 13位寄存器包含TH0全部8个位及TL0的低5位。TL0的高3位不定,可将其忽略。 置位运行标志(TR0)不能清零此寄存器。模式0的操作对于定时器0及定时器1都是相同的。2 个不同的GATE位(TMOD.7和TMOD.3)分别分配给定时器1及定时器0。 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 181 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 7.1.2.2 模式1(16位定时器/计数器)及其测试程序(C程序及汇编程序) 模式1除了使用了TH0及TL0全部16位外,其他与模式0完全相同。� 即此模式下定时器��� /�� 计数 器�������������������� 0������������������� 作为����������������� 16��������������� 位定时器/计数器,如下图所示。 ÷12 MCU in 12T mode SYSclk ÷6 MCU in 6T mode C/T=0 C/T=1 T0 Pin TR0 TL0 TH0 (8 Bits) (8 bits) TF0 Interrupt control GATE . d e t i m INT0 定时器/计数器0的模式 1: 16位定时器/计数器 Li 此模式下,定时器配置为����������������������������������� 16��������������������������������� 位定时器/计数器,由����������������������� TL0�������������������� 的������������������� 8������������������ 位和���������������� TH0������������� 的������������ 8����������� 位所构成。������ TL0��� 的8位 溢出向������������������������������ TH0��������������������������� 进位,������������������������ TH0��������������������� 计数溢出置位��������������� TCON����������� 中的溢出标志位���� TF0� 。 U C M 当������� GATE=0(TMOD.3)时,如TR0=1,则定时器计数。GATE=1时,允许由外部输入INT0控制定 时器0,这样可实现脉宽测量。TR0为TCON寄存器内的控制位,TCON寄存器各位的具体功能描述 见上节����������� TCON寄存器���� 的介绍� 。 C T S 当C/T=0时,多路开关连接到系统时钟的分频输出,T0对时钟周期计数,T0工作在定时方 式。当C/T=1时,多路开关连接到外部脉冲输入P3.4/T0,即T0工作在计数方式。 STC89C51RC/RD+系列单片机的定时器有两种计数速率:一种是������������� 12T���������� 模式,每������ 12���� 个时钟加 1���������������������������������������������� ,与传统������������������������������������������ 8051�������������������������������������� 单片机相同;另外一种是��������������������������� 6T������������������������� 模式,每6个时钟加���������������� 1��������������� ,速度是传统��������� 8051����� 单片机的� 2 倍。����� T0��� 的速率在烧录用户程序时在STC-ISP编程器中设置。 182 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 定时器0工作在16位定时器/计数器模式的测试程序 1. C程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机定时器0的16位定时器/计数器模式 --*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ #include "reg51.h" typedef unsigned char BYTE; typedef unsigned int WORD; //----------------------------------------------/* define constants */ #define FOSC 18432000L U C M . d e t i m Li #define T1MS (65536-FOSC/12/1000) //1ms timer calculation method in 12T mode /* define SFR */ sbit TEST_LED = P1^0; //work LED, flash once per second /* define variables */ WORD count; C T S //1000 times counter //----------------------------------------------/* Timer0 interrupt routine */ void tm0_isr() interrupt 1 using 1 { TL0 = T1MS; TH0 = T1MS >> 8; if (count-- == 0) { count = 1000; TEST_LED = ! TEST_LED; } } //reload timer0 low byte //reload timer0 high byte //1ms * 1000 -> 1s //reset counter //work LED flash //----------------------------------------------- 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 183 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com /* main program */ void main() { TMOD = 0x01; TL0 = T1MS; TH0 = T1MS >> 8; TR0 = 1; ET0 = 1; EA = 1; count = 0; //set timer0 as mode1 (16-bit) //initial timer0 low byte //initial timer0 high byte //timer0 start running //enable timer0 interrupt //open global interrupt switch //initial counter //loop } while (1); 2. 汇编程序: 临时技术支持:13922829991 研发顾问:13922809991 . d e t i m Li /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机定时器0的16位定时器/计数器模式 ---*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ ;/* define constants */ T1MS EQU 0FA00H ;1ms timer calculation method in 12T mode is (65536-18432000/12/1000) C T S ;/* define SFR */ TEST_LED BIT P1.0 ;/* define variables */ COUNT DATA 20H U C M ;work LED, flash once per second ;1000 times counter (2 bytes) ;---------------------------------------------- ORG LJMP ORG LJMP 0000H MAIN 000BH TM0_ISR ;----------------------------------------------- 184 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com ;/* main program */ MAIN: MOV TMOD,#01H MOV TL0,#LOW T1MS MOV TH0,#HIGH T1MS SETB TR0 SETB ET0 SETB EA CLR A MOV COUNT,A MOV COUNT+1,A SJMP $ 临时技术支持:13922829991 研发顾问:13922809991 ;set timer0 as mode1 (16-bit) ;initial timer0 low byte ;initial timer0 high byte ;timer0 start running ;enable timer0 interrupt ;open global interrupt switch ;initial counter . d e t i m ;----------------------------------------------;/* Timer0 interrupt routine */ TM0_ISR: PUSH ACC PUSH PSW MOV TL0, #LOW T1MS MOV TH0, #HIGH T1MS MOV A, COUNT ORL A, COUNT+1 JNZ SKIP MOV COUNT, #LOW 1000 MOV COUNT+1, #HIGH 1000 CPL TEST_LED SKIP: CLR C MOV A, COUNT SUBB A, #1 MOV COUNT, A MOV A, COUNT+1 SUBB A, #0 MOV COUNT+1,A POP PSW POP ACC RETI C T S U C M Li ;reload timer0 low byte ;reload timer0 high byte ;check whether count(2byte) is equal to 0 ;1ms * 1000 -> 1s ;work LED flash ;count-- ;---------------------------------------------- END 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 185 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 7.1.2.3 模式2(8位自动重装模式)及其测试程序(C程序及汇编程序) 此模式下定时器�������������������������� /������������������������� 计数器���������������������� 0��������������������� 作为可自动重装载的������������ 8����������� 位计数器,如下图所示。 MCU in 12T mode ÷12 SYSclk ÷6 MCU in 6T mode C/T=0 TL0 (8 Bits) C/T=1 T0 Pin TR0 TF0 Interrupt control GATE TH0 (8 Bits) INT0 . d e t i m 定时器/计数器0的模式 2: 8位自动重装 Li TL0��������������������������������������������� 的溢出不仅置位�������������������������������������� TF0����������������������������������� ,而且将������������������������������� TH0���������������������������� 内容重新装入���������������������� TL0������������������� ,������������������ TH0��������������� 内容由软件预置,重装时���� TH0� 内 容不变。 U C M ;定时器0中断的测试程序,定时器0工作在8位自动重装模式 1. C程序: C T S /*---------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ------------------------------------*/ /* --- STC89-90xx Series MCU T0(Falling edge) Demo ---------------*/ /* --- Mobile: (86)13922809991 -------------------------------------------*/ /* --- Fax: 86-755-82905966 -----------------------------------------------*/ /* --- Tel: 86-755-82948412 -----------------------------------------------*/ /* --- Web: www.STCMCU.com ------------------------------------------*/ /* If you want to use the program or the program referenced in the */ /* article, please specify in which data and procedures from STC */ /*------------------------------------------------------------------------------*/ #include "reg51.h" //T0 interrupt service routine void t0int() interrupt 1 //T0 interrupt (location at 000BH) { P0++; } 186 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com void main() { TMOD = 0x06; TL0 = TH0 = 0xff; TR0 = 1; ET0 = 1; EA = 1; 临时技术支持:13922829991 研发顾问:13922809991 //set timer0 as counter mode2 (8-bit auto-reload) //fill with 0xff to count one time //timer0 start run //enable T0 interrupt //open global interrupt switch while (1); } 2. 汇编程序: U C M Li ;/*----------------------------------------------------------------------------------*/ ;/* --- STC MCU Limited ---------------- -------------------------------------*/ ;/* --- STC89-90xx Series MCU T0(Falling edge) Demo -----------------*/ ;/* --- Mobile: (86)13922809991 ---------------------------------------------*/ ;/* --- Fax: 86-755-82905966 -------------------------------------------------*/ ;/* --- Tel: 86-755-82948412 --------------------------------------------------*/ ;/* --- Web: www.STCMCU.com ---------------------------------------------*/ ;/* If you want to use the program or the program referenced in the ---*/ ;/* article, please specify in which data and procedures from STC ----*/ ;/*----------------------------------------------------------------------------------*/ C T S . d e t i m ;----------------------------------------;interrupt vector table ORG 0000H LJMP MAIN ORG 000BH LJMP T0INT ;T0 interrupt (location at 000BH) ;----------------------------------------ORG 0100H 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 187 STC89C51RC/RD+系列单片机指南 MAIN: MOV SP, MOV TMOD, MOV A, MOV TL0, MOV TH0, SETB TR0 SETB ET0 SETB EA SJMP $ 技术支持网站:www.STCMCU.com #7FH #06H #0FFH A A 临时技术支持:13922829991 研发顾问:13922809991 ;initial SP ;set timer0 as counter mode2 (8-bit auto-reload) ;fill with 0xff to count one time ;timer0 start run ;enable T0 interrupt ;open global interrupt switch ;----------------------------------------;T0 interrupt service routine T0INT: CPL P0.0 RETI ;---------------------------------------- 188 END C T S 南通国芯微电子有限公司 U C M . d e t i m Li 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 7.1.2.4 模式3(两个8位计数器) 对定时器1,在模式3时,定时器1停止计数,效果与将TR1设置为0相同。 对定时器0,此模式下定时器0的TL0及TH0作为2个独立的8位计数器。下图为模式3时的定 时器0逻辑图。TL0占用定时器0的控制位:C/T、GATE、TR0、INT0及TF0。TH0限定为定时器功 能(计数器周期),占用定时器1的TR1及TF1。此时,TH0控制定时器1中断。 模式��������������������������������������� 3�������������������������������������� 是为了增加一个附加的���������������������������� 8��������������������������� 位定时器����������������������� /���������������������� 计数器而提供的,使单片机具有三个定时器��� /�� 计数 器。模式������������������������������������������� 3������������������������������������������ 只适用于定时器����������������������������������� /���������������������������������� 计数器������������������������������� 0������������������������������ ,定时器�������������������������� T1������������������������ 处于模式�������������������� 3������������������� 时相当于��������������� TR1=0���������� ,停止计数,而��� T0� 可 作为两个定时器用。 ÷12 MCU in 12T mode . d e t i m SYSclk ÷6 MCU in 6T mode TL0 (8 bit) C/T=1 T0 Pin TR0 GATE INT0 ÷12 SYSclk C/T=0 U C M Li Interrupt MCU in 12T mode C T S ÷6 control TF0 MCU in 6T mode TR1 TH0 (8 Bits) TF1 Interrupt control 定时/计数器0 模式3: 两个8位计数器 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 189 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 7.1.3 定时器/计数器1工作模式(与传统8051单片机兼容) 通过对寄存器TMOD中的M1(TMOD.5)、M0(TMOD.4)的设置,定时器/计数器1有3种不同的 工作模式。 7.1.3.1 模式0(13位定时器/计数器) 此模式下定时器�������������������������������������� /������������������������������������� 计数器���������������������������������� 1��������������������������������� 作为������������������������������� 13����������������������������� 位定时器/计数器,有������������������� TL1���������������� 的低�������������� 5������������� 位和����������� TH1�������� 的������� 8������ 位所构成,如 下图所示。模式0的操作对于定时器1���������� 和��������� 定时器0是相同的。 MCU in 12T mode ÷12 SYSclk ÷6 MCU in 6T mode C/T=0 TH1 (8 bits) C/T=1 T1 Pin TR1 control GATE INT1 U C M TL1 (8 bits) . d te i m Li TF1 Interrupt 定时器/计数器1的模式 0: 13位定时器/计数器 C T S 当������� GATE=0(TMOD.7)时,如TR1=1,则定时器计数。GATE=1时,允许由外部输入INT1控制定 时器1,这样可实现脉宽测量。TR1为TCON寄存器内的控制位,TCON寄存器各位的具体功能描述 见上节����������� TCON寄存器���� 的介绍� 。 当C/T=0时,多路开关连接到系统时钟的分频输出,T1对时钟周期计数,T1工作在定时方 式。当C/T=1时,多路开关连接到外部脉冲输入P3.5/T1,即T1工作在计数方式。 STC89C51RC/RD+系列单片机的定时器有两种计数速率:一种是������������� 12T���������� 模式,每������ 12���� 个时钟加 1���������������������������������������������� ,与传统������������������������������������������ 8051�������������������������������������� 单片机相同;另外一种是��������������������������� 6T������������������������� 模式,每6个时钟加���������������� 1��������������� ,速度是传统��������� 8051����� 单片机的� 2 倍。����� T1��� 的速率在烧录用户程序时在STC-ISP编程器中设置。 190 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 7.1.3.2 模式1(16位定时器/计数器)及其测试程序(C程序及汇编程序) 此模式下定时器������������������������ /����������������������� 计数器�������������������� 1������������������� 作为����������������� 16��������������� 位定时器/计数器,如下图所示。 ÷12 MCU in 12T mode SYSclk ÷6 MCU in 6T mode C/T=0 C/T=1 T1 Pin TR1 TL1 TH1 (8 Bits) (8 bits) TF1 Interrupt control GATE INT1 . d e t i m 定时器/计数器1的模式 1: 16位定时器/计数器 此模式下,定时器1配置为����������������������������������� 16��������������������������������� 位定时器/计数器,由����������������������� TL1�������������������� 的������������������� 8������������������ 位和���������������� TH1������������� 的������������ 8����������� 位所构成。������ TL1��� 的8位 溢出向������������������������������ TH1��������������������������� 进位,������������������������ TH1��������������������� 计数溢出置位��������������� TCON����������� 中的溢出标志位���� TF1� 。 U C M Li 当������� GATE=0(TMOD.7)时,如TR1=1,则定时器计数。GATE=1时,允许由外部输入INT1控制定 时器1,这样可实现脉宽测量。TR1为TCON寄存器内的控制位,TCON寄存器各位的具体功能描述 见上节����������� TCON寄存器���� 的介绍� 。 C T S 当C/T=0时,多路开关连接到系统时钟的分频输出,T1对时钟周期计数,T1工作在定时方 式。当C/T=1时,多路开关连接到外部脉冲输入P3.5/T1,即T1工作在计数方式。 STC89C51RC/RD+系列单片机的定时器有两种计数速率:一种是������������� 12T���������� 模式,每������ 12���� 个时钟加 1���������������������������������������������� ,与传统������������������������������������������ 8051�������������������������������������� 单片机相同;另外一种是��������������������������� 6T������������������������� 模式,每6个时钟加���������������� 1��������������� ,速度是传统��������� 8051����� 单片机的� 2 倍。����� T1��� 的速率在烧录用户程序时在STC-ISP编程器中设置。 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 191 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 定时器1工作在16位定时器/计数器模式的测试程序 1. C程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机定时器1的16位定时器/计数器模式 --*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ #include "reg51.h" typedef unsigned char typedef unsigned int BYTE; WORD; //----------------------------------------------/* define constants */ #define FOSC 18432000L C T S U C M . d e t i m Li #define T1MS (65536-FOSC/12/1000) //1ms timer calculation method in 12T mode /* define SFR */ sbit TEST_LED = P1^0; //work LED, flash once per second /* define variables */ WORD count; //1000 times counter //----------------------------------------------/* Timer0 interrupt routine */ void tm1_isr() interrupt 3 using 1 { TL1 = T1MS; TH1 = T1MS >> 8; if (count-- == 0) { count = 1000; TEST_LED = ! TEST_LED; } } //----------------------------------------------- 192 南通国芯微电子有限公司 //reload timer1 low byte //reload timer1 high byte //1ms * 1000 -> 1s //reset counter //work LED flash 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com /* main program */ void main() { TMOD = 0x10; TL1 = T1MS; TH1 = T1MS >> 8; TR1 = 1; ET1 = 1; EA = 1; count = 0; while (1); 临时技术支持:13922829991 研发顾问:13922809991 //set timer1 as mode1 (16-bit) //initial timer1 low byte //initial timer1 high byte //timer1 start running //enable timer1 interrupt //open global interrupt switch //initial counter //loop } 2. 汇编程序: . d e t i m Li /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机定时器1的16位定时器/计数器模式 --*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ ;/* define constants */ T1MS EQU 0FA00H ;1ms timer calculation method in 12T mode is (65536-18432000/12/1000) C T S ;/* define SFR */ TEST_LED BIT P1.0 ;/* define variables */ COUNT DATA 20H U C M ;work LED, flash once per second ;1000 times counter (2 bytes) ;---------------------------------------------- ORG 0000H LJMP MAIN ORG 001BH LJMP TM1_ISR ;----------------------------------------------南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 193 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com ;/* main program */ MAIN: MOV TMOD, #10H MOV TL1, #LOW T1MS MOV TH1 ,#HIGH T1MS SETB TR1 SETB ET1 SETB EA CLR A MOV COUNT, A MOV COUNT+1, A SJMP $ 临时技术支持:13922829991 研发顾问:13922809991 ;set timer1 as mode1 (16-bit) ;initial timer1 low byte ;initial timer1 high byte ;timer1 start running ;enable timer1 interrupt ;open global interrupt switch ;initial counter . d e t i m ;----------------------------------------------;/* Timer1 interrupt routine */ TM1_ISR: PUSH ACC PUSH PSW MOV TL1, #LOW T1MS MOV TH1, #HIGH T1MS MOV A, COUNT ORL A, COUNT+1 JNZ SKIP MOV COUNT, #LOW 1000 MOV COUNT+1,#HIGH 1000 CPL TEST_LED SKIP: CLR C MOV A, COUNT SUBB A, #1 MOV COUNT,A MOV A,COUNT+1 SUBB A,#0 MOV COUNT+1,A POP PSW POP ACC RETI C T S U C M Li ;reload timer1 low byte ;reload timer1 high byte ;check whether count(2byte) is equal to 0 ;1ms * 1000 -> 1s ;work LED flash ;count-- ;---------------------------------------------- 194 END 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 7.1.3.3 模式2(8位自动重装模式)及其测试程序(C程序及汇编程序) 此模式下定时器�������������������������� /������������������������� 计数器���������������������� 1��������������������� 作为可自动重装载的������������ 8����������� 位计数器,如下图所示。 MCU in 12T mode ÷12 SYSclk ÷6 MCU in 6T mode T1 Pin TR1 C/T=0 C/T=1 TL1 (8 Bits) TF1 Interrupt control GATE TH1 (8 Bits) INT1 . d e t i m 定时器/计数器1的模式 2: 8位自动重装 Li TL1��������������������������������������������� 的溢出不仅置位�������������������������������������� TF1����������������������������������� ,而且将������������������������������� TH1���������������������������� 内容重新装入���������������������� TL1������������������� ,������������������ TH1��������������� 内容由软件预置,重装时���� TH1� 内 容不变。 U C M ;定时器1中断的测试程序,定时器1工作在8位自动重装模式 1. C程序: C T S /*-----------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- --------------------------------------*/ /* --- STC89-90xx Series MCU T1(Falling edge) Demo -----------------*/ /* --- Mobile: (86)13922809991 ---------------------------------------------*/ /* --- Fax: 86-755-82905966 -------------------------------------------------*/ /* --- Tel: 86-755-82948412 --------------------------------------------------*/ /* --- Web: www.STCMCU.com ---------------------------------------------*/ /* If you want to use the program or the program referenced in the */ /* article, please specify in which data and procedures from STC */ /*----------------------------------------------------------------------------------*/ #include "reg51.h" //T1 interrupt service routine void t1int() interrupt 3 //T1 interrupt (location at 001BH) { P0++; } 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 195 STC89C51RC/RD+系列单片机指南 void main() { TMOD = 0x60; TL1 = TH1 = 0xff; TR1 = 1; ET1 = 1; EA = 1; 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 //set timer1 as counter mode2 (8-bit auto-reload) //fill with 0xff to count one time //timer1 start run //enable T1 interrupt //open global interrupt switch while (1); } 2. 汇编程序: U C M Li ;/*----------------------------------------------------------------------------------*/ ;/* --- STC MCU Limited ---------------- -------------------------------------*/ ;/* --- STC89-90xx Series MCU T1(Falling edge) Demo -----------------*/ ;/* --- Mobile: (86)13922809991 ---------------------------------------------*/ ;/* --- Fax: 86-755-82905966 -------------------------------------------------*/ ;/* --- Tel: 86-755-82948412 --------------------------------------------------*/ ;/* --- Web: www.STCMCU.com ---------------------------------------------*/ ;/* If you want to use the program or the program referenced in the */ ;/* article, please specify in which data and procedures from STC */ ;/*---------------------------------------------------------------------------------*/ ;----------------------------------------;interrupt vector table C T S . d e t i m ORG 0000H LJMP MAIN ORG 001BH LJMP T1INT ;T1 interrupt (location at 001BH) ;----------------------------------------- 196 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com MAIN: ORG 临时技术支持:13922829991 研发顾问:13922809991 0100H MOV SP, MOV TMOD, MOV A, MOV TL1, MOV TH1, SETB TR1 SETB ET1 SETB EA SJMP #7FH #60H #0FFH A A ;initial SP ;set timer1 as counter mode2 (8-bit auto-reload) ;fill with 0xff to count one time ;timer1 start run ;enable T1 interrupt ;open global interrupt switch . d e t i m ;----------------------------------------;T1 interrupt service routine T1INT: CPL P0.0 RETI ;---------------------------------------- END 南通国芯微电子有限公司 C T S U C M 总机:0513-5501 2928 / 2929 / 2966 Li 传真:0513-5501 2969 / 2956 / 2947 197 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 7.1.4 古老Intel 8051单片机定时器0/1的应用举例 【例1】 定时/计数器编程,定时/计数器的应用编程主要需考虑:根据应用要求,通过程序初 始化,正确设置控制字,正确计算和计算计数初值,编写中断服务程序,适时设置控制位等。 通常情况下,设置顺序大致如下: 1)工作方式控制字(TMOD、T2CON)的设置; 2)计数初值的计算并装入THx、TLx、RCAP2H、RCAP2L; 3)中断允许位ETx、EA的设置,使主机开放中断; 4) 启/停位TRx的设置等。 现以定时/计数器0或1为例作一简要介绍。 8051系列单片机的定时器/计数器0或1是以不断加1进行计数的,即属加1计数器,因此,就 不能直接将实际的计数值作为计数初值送入计数寄存器THx、TLx中去,而必须将实际计数值以 28、213、216为模求补,以其补码作为计数初值设置THx和TLx。 . d e t i m Li 设:实际计数值为X,计数器长度为n(n=8、13、16),则应装入计数器THx、TLx中的计 数初值为2n-x,式中2n为取模值。例如,工作方式0的计数长度为13位,则n=13,以213为模, 工作方式1的计数长度为16,则n=16,以216为模等等。所以,计数初值为(x)= 2n-x。 U C M 对于定时模式,是对机器周期计数,而机器周期与选定的主频密切相关。因此,需根据应 C T S 用系统所选定的主频计算出机器周期值。现以主频6MHz为例,则机器周期为: 一个机器周期= 12 主振频率 = 12 6×106 μs = 2μs 实际定时时间Tc = x·Tp 式中Tp为机器周期,Tc为所需定时时间,x为所需计数次数。Tp和Tp一般为已知值,在求出 Tp后即可求得所需计数值x,再将x求补码,即求得定时计数初值。即 (x)补= 2n - x 例如,设定时时间Tc = 5ms,机器周期TP = 2μs,可求得定时计数次数 5ms x = = 2500次 2μs 设选用工作方式1,则n=16,则应设置的定时时间计数初值为: (x)补= 216 - x=65536-2500=63036,还需将它分解成两个8位十六进制数,分别求得低8 位为3CH装入TLx,高8位为F6H装入THx中。 工作方式0、1、2的最大计数次数分别为8192、65536和256。 对外部事件计数模式,只需根据实际计数次数求补后变换成两个十六进制码即可。 198 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 【例2】 定时/计数器应用编程,设某应用系统,选择定时/计数器1定时模式,定时时间Tc = 10ms,主频频率为12MHz,每10ms向主机请求处理。选定工作方式1。计算得计数初值:低8 位初值为F0H,高8位初值为D8H。 (1)初始化程序 … 所谓初始化,一般在主程序中根据应用要求对定时/计数器进行功能选择及参数设定等预置 程序,本例初始化程序如下: START: ;���� 主程序段 MOV SP,#60H ;设置堆栈区域 MOV TMOD,#10H ;选择T1、定时模式,工作方式1 MOV TH1,#0D8H ;设置高字节计数初值 MOV TL1,#0F0H ;设置低字节计数初值 SETB EA SETB ET1 C T S SETB TR1 (2)中断服务程序 INTT1: PUSH U C M ; 开中断 � ;其他初始化程序 ;启动T1开始计时 ;������ 继续主程序 … … . d e t i } Lim ; A ; PUSH DPL PUSH DPH MOV TL1,#0F0H MOV TH1,#0D8H POP DPH POP DPL POP A } RETI ;返回 } ; 现场保护 … … ; 南通国芯微电子有限公司 ; } ; 重新置初值 ;中断处理主体程序 ; 总机:0513-5501 2928 / 2929 / 2966 ; 现场恢复 ; 传真:0513-5501 2969 / 2956 / 2947 199 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 这里展示了中断服务子程序的基本格式。STC89C51RC/RD+系列单片机的中断属于矢量中 断,每一个矢量中断源只留有8个字节单元,一般是不够用的,常需用转移指令转到真正的中 断服务子程序区去执行。 【例3】 对外部正脉冲测宽。选择定时/计数器2进行脉宽测试较方便,但也可选用定时/计 数器0或定时/计数器1进行测宽操作。本例选用定时/计数器0(T0)以定时模式,工作方式1对 INT0引脚上的正脉冲进行脉宽测试。 INT0 引脚 T0计数 启动 . d e t i m 停止 设置GATE为1,机器周期TP为1μs。本例程序段编制如下: INTT0: MOV TMOD,#09H MOV TL0,#00H MOV TH0,#00H CLR EX0 ;关INT0中断 LOP1: JB P3.2,LOP1 ;等待INT0引低电平 LOP2: JNB P3.2,LOP2 ;等待INT0引脚高电平 SETB TR0 ;启动T0开始计数 LOP3: JB P3.2,LOP3 ;等待INT0低电平 CLR TR0 ;停止T0计数 MOV A,TL0 ;低字节计数值送A MOV B,TH0 ;高字节计数值送B … ;计算脉宽和处理 200 C T S 南通国芯微电子有限公司 L}i U C M ;设T0为定时方式1,GATE为1 ; ; 总机:0513-5501 2928 / 2929 / 2966 TH0,TL0清0 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 【例4】 利用定时/计数器0或定时/计数器1的Tx端口改造成外部中断源输入端口的应用设计。 在某些应用系统中常会出现原有的两个外部中断源INT0和INT1不够用,而定时/计数器有 多余,则可将Tx用于增加的外部中断源。现选择定时/计数器1为对外部事件计数模式工作方式 2(自动再装入),设置计数初值为FFH,则T1端口输入一个负跳变脉冲,计数器即回0溢出, 置位对应的中断请求标志位TF1为1,向主机请求中断处理,从而达到了增加一个外部中断源的 目的。应用定时/计数器1(T1)的中断矢量转入中断服务程序处理。其程序示例如下: (1)主程序段: ORG 0000H AJMP MAIN ;转主程序 ORG 001BH LJMP INTER ;转T1中断服务程序 ORG 0100 … … MAIN: … C T S U C M ;主程序入口 . d e t i m Li MOV SP,#60H MOV TMOD,#60H ;设置定时/计数器1,计数方式2 MOV TL1,#0FFH ;设置计数常数 MOV TH1,#0FFH SETB EA ;开中断 SETB ET1 ;开定时/计数器1中断 SETB TR1 ;启动定时/计数器1计数 … ;设置堆栈区 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 201 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 ORG 1000H INTER: PUSH A ; PUSH DPL ; PUSH DPH ; … … … (2)中断服务程序(具体处理程序略) ; 中断处理主体程序 ;� �� POP DPH ; POP DPL POP A RETI 这是中断服务程序的基本格式。 U C M } 现场入栈保护 } }ited. ; 现场出栈复原 Lim ; ;返回 【例5】 某应用系统需通过P1.0和P1.1分别输出周期为200μ s和400μ s的方波。为此,系统 C T S 选用定时器/计数器0(T0),定时方式3,主频为6M H z,T P=2μ s,经计算得定时常数为9C H和 本例程序段编制如下: (1)初始化程序段 PLT0: MOV TMOD,#03H ;设置T0定时方式3 MOV TL0,#9CH ;设置TL0初值 MOV TH0,#38H ;设置TH0初值 SETB EA ; SETB ET0 SETB ET1 } SETB TR0 ;启动 SETB TR1 ;启动 202 … … 38H。 南通国芯微电子有限公司 ; 开中断 ; 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 (2)中断服务程序段 1) INT0P: MOV CPL RETI 2) INT1P MOV TH0,#38H CPL P1.1 RETI 在实际应用中应注意的问题如下。 (1)定时/计数器的实时性 定时/计数器启动计数后,当计满回0溢出向主机请求中断处理,由内部硬件自动进 TL0,#9CH P1.0 ;重新设置初值 ;对P1.0输出信号取反 ;返回 … … … … … … C T S U C M . d e t i m Li ;重新设置初值 ;对P1.1输出信号取反 ;返回 行。但从回0溢出请求中断到主机响应中断并作出处理存在时间延迟,且这种延时随中断请求 时的现场环境的不同而不同,一般需延时3个机器周期以上,这就给实时处理带来误差。大多 数应用场合可忽略不计,但对某些要求实时性苛刻的场合,应采用补偿措施。 这种由中断响应引起的时间延时,对定时/计数器工作于方式0或1而言有两种含义:一 是由于中断响应延时而引起的实时处理的误差;二是如需多次且连续不间断地定时/计数,由 于中断响应延时,则在中断服务程序中再置计数初值时已延误了若干个计数值而引起误差,特 别是用于定时就更明显。 例如选用定时方式1设置系统时钟,由于上述原因就会产生实时误差。这种场合应采用 动态补偿办法以减少系统始终误差。所谓动态补偿,即在中断服务程序中对THx、TLx重新置计 数初值时,应将THx、TLx从回0溢出又重新从0开始继续计数的值读出,并补偿到原计数初值中 去进行重新设置。可考虑如下补偿方法: 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 203 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 CLR EA ;禁止中断 MOV A,TLx ;读TLx中已计数值 ADD A,#LOW ;LOW为原低字节计数初值 MOV TLx,A ;设置低字节计数初值 MOV A,#HIGH ;原高字节计数初值送A ADDC A,THx ;高字节计数初值补偿 MOV THx,A ;置高字节计数初值 SETB EA ;开中断 … . d e t i m … (2)动态读取运行中的计数值 U C M Li 在动态读取运行中的定时/计数器的计数值时,如果不加注意,就可能出错。这是因为不 可能在同一时刻同时读取THx和TLx中的计数值。比如,先读TLx后读THx,因为定时/计数器处 于运行状态,在读TLx时尚未产生向THx进位,而在读THx前已产生进位,这时读得的THx就不对 C T S 了;同样,先读THx后读TLx也可能出错。 一种可避免读错的方法是:先读THx,后读TLx,将两次读得的THx进行比较;若两次读得 的值相等,则可确定读的值是正确的,否则重复上述过程,重复读得的值一般不会再错。此法 的软件编程如下: RDTM: MOV A,THx ;读取THx存A中 MOV R0,TLx ;读取TLx存R0中 CJNE A,THx,RDTM ;比较两次THx值,若相等,则读得的 ;值正确,程序往下执行,否则重读 MOV R1,A ;将THx存于R1中 204 … 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 7.2 定时器/计数器T2 定时器2是一个16位定时/计数器。通过设置特殊功能寄存器T2CON中的C/T2位,可将其作为定 时器或计数器(特殊功能寄存器T2CON的描述如����� 下所示�� )。 定时器/计数器2的相关寄存器表: 位地址及其符号 符号 描述 T2CON 定时器2控制寄存器 C8H TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2 0000 0000B T2MOD 定时器2模式寄存器 C9H 地址 Timer / Counter 2 RCAP2L Reload/Capture Low Byte Timer / Counter 2 RCAP2H Reload/Capture High Byte TL2 Timer / Counter 2 Low Byte Timer/Counter 2 High Byte TH2 MSB - LSB - - - 6 DECN CCH CDH 5 C T S xxxx xx00B 0000 0000B U C M 4 3 TF2 EXF2 RCLK TCLK EXEN2 TR2 位 T2OE . d te CBH T2CON 地址:0C8H 7 - CAH 寄存器T2CON(定时器2的控制寄存器)各位的功能描述 可位寻址 - 复位值 i m Li 2 1 C/T2 0000 0000B 0000 0000B 0000 0000B 复位值:00H 0 CP/RL2 符号 TF2 功能 定时器2溢出标志。定时器2溢出时置位,必须由软件清除。 当RCLK或TCLK=1 时,TF2将不会置位 T2CON.6/ EXF2 定时器2外部标志。当EXEN2=1且T2EX的负跳变产生捕获或重 装时,EXF2置位。定时器2中断使能时,EXF2=1将使CPU从中 断向量处执行定时器2中断子程序。EXF2位必须用软件清零。 在递增/递减计数器模式(DCEN=1)中,EXF2不会引起中断 T2CON.5/ RCLK 接收时钟标志。RCLK置位时,定时器2的溢出脉冲作为串行口 模式1和模式3的接收时钟。RCLK=0时,将定时器1的溢出脉冲 作为��������������� 串行口模式1和模式3的���� 接收时钟 T2CON.7/ T2CON.4/ TCLK T2CON.3/ EXEN2 南通国芯微电子有限公司 发送时钟标志。TCLK置位时,定时器2的溢出脉冲作为串行口 模式1和模式3的发送时钟。TCLK=0时,将定时器1的溢出脉冲 作为�������������� 串行口模式1和模式3���� 发送时钟 定时器2外部使能标志。当其置位且定时器2未作为串行口时 钟时,允许T2EX的负跳变产生捕获或重装。EXEN2=0时,T2EX 的跳变对定时器2无效 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 205 STC89C51RC/RD+系列单片机指南 位 符号 T2CON.2/ TR2 T2CON.1/ C/T2 T2CON.0/ CP/RL2 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 功能 定时器2 启动/停止控制位。置1 时启动定时器 定时器/ 计数器选择。(定时器2 ) 0 = 内部定时器(SYSclk/12 或SYSclk/6) 1 = 外部事件计数器(下降沿触发) 捕获/重装标志。置位:������� EXEN2=1时,T2EX的负跳变产生捕获. 清零:EXEN2=0时,定时器2溢出或T2EX的负跳变都可使定时 器自动重装。当RCLK=1 或TCLK=1 时,该位无效且定时器强 制为溢出时自动重装 定时器2有3种操作模式:捕获、自动重新装载(递增或递减计数)和波特率发生器����� 。���� 这3种模 式由T2CON中的位进行选择(如������ 下����� 表所列)。 RCLK+TCLK 0 0 1 x C T S . d e t i m 定时器2的工作方式 TR2 模式 CP/RL2 0 1 16位自动重装 1 1 16位捕获 x 1 波特率发生器 x 0 (关闭) U C M Li T2MOD : 定时器/计数器2模式控制寄存器 (不可位寻址) SFR name Address bit B7 B6 B5 B4 B3 T2MOD 0C9H name - B2 - B1 T2OE B0 DCEN T2OE: 定时器2 输出使能位 DECN: 向下计数使能位。定时器2 可配置成向上/ 向下计数器 206 * 用户勿将其置1。这些位在将来80C51 系列产品中用来实现新的特性。在这种情况 下,以后用到保留位,复位时或非有效状态时,它的值应为0;而这些位为有效状态 时,它的值为1。从保留位读到的值是不确定的。 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 7.2.1 定时器2的捕获模式 在捕获模式中,通过T2CON中的EXEN2设置2个选项。如果EXEN2=0,定时器2作为一个16位 定时器或计数器(由T2CON中C/T2位选择),溢出时置位TF2(定时器2溢出标志位)。该位可 用于产生中断(通过使能IE寄存器中的定时器2中断使能位ET2)。如果EXEN2=1,与以上描述 相同,但增加了一个特性,即外部输入T2EX由1变零时,将定时器2中TL2和TH2的当前值各自捕 获到RCAP2L和RCAP2H。另外,T2EX的负跳变使T2CON中的EXF2置位,EXF2也像TF2一样能够产生 中断(其向量与定时器2溢出中断地址相同,定时器2中断服务程序通过查询TF2和EXF2来确定 引起中断的事件),捕获模式如�������������������������������� 下������������������������������� 图所示。在该模式中,TL2和TH2无重新装载值,甚至当T2EX 产����������������������������������������������� 生捕获事件时,计数器仍以T2EX 的负跳变或振荡频率的1/12(12时钟模式)或1/6(6时钟 模式)计数。 ÷12 SYSclk ÷6 . d e t i m MCU in 12T mode MCU in 6T mode T2 Pin 跳变检测 C T S T2EX Pin C/T2=0 C/T2=1 M CU control control TR2 TL2 (8 Bits) capture Li TH2 (8 Bits) TF2 定时器2 中断 RCAP2L RCAP2H EXF2 EXEN2 图1 定时器2捕获模式 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 207 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 7.2.2 定时器2的自动重装模式(递增/递减计数器) 16位自动重装模式中,定时器2 可通过C/T2配置为定时器/计数器,编程控制递增/递减计 数。计数的方向是由DCEN(递减计数使能位)确定的,DCEN位于T2MOD寄存器中,T2MOD寄存器 各位的功能描述如表3 所示。当DCEN=0 时,定时器2 默认为向上计数;当DCEN=1 时,定时 器2 可通过T2EX 确定递增或递减计数。图2 显示了当DCEN=0 时,定时器2 自动递增计数。在 该模式中,通过设置EXEN2位进行选择。如果EXEN2=0,定时器2 递增计数到0FFFFH,并在溢 出后将TF2置位,然后将RCAP2L和RCAP2H 中的16位值作为重新装载值装入定时器2。RCAP2L和 RCAP2H的值是通过软件预设的。 如果EXEN2=1,16位重新装载可通过溢出或T2EX从1������������������� 到������������������ 0的负跳变实现。此负跳变同时EXF2 置位。如果定时器2中断被使能,则当TF2或EXF2置1时产生中断。在图3中,DCEN=1时,定时 器2可增或递减计数。此模式允许T2EX 控制计数的方向。当T2EX 置1 时,定时器2 递增计 数,计数到0FFFFH后溢出并置位TF2,还将产生中断(如果中断被使能)。定时器2的溢出将使 RCAP2L 和RCAP2H中的16 位值作为重新装载值放入TL2和TH2。 . d e t i m 当T2EX置零时,将使定时器2递减计数。当TL2和TH2计数到等于RCAP2L和RCAP2H时,定时 器产���� 生中断。 MCU in 12T mode ÷12 SYSclk ÷6 MCU in 6T mode C T S T2 Pin C/T2=0 C/T2=1 U C M control TH2 (8 Bits) reload TR2 跳变检测 TL2 (8 Bits) Li RCAP2L RCAP2H T2EX Pin TF2 定时器2 中断 EXF2 control EXEN2 图2 定时器2的自动重装模式 (DCEN=0) ÷12 Down Counting Reload Value MCU in 12T mode FFH Toggle FFH EXF2 SYSclk ÷6 MCU in 6T mode T2 Pin C/T2=0 C/T2=1 control TL2 (8 Bits) Overflow TH2 (8 Bits) TF2 Count Direction 1=UP 0=DOWN TR2 RCAP2L RCAP2H Up Counting Reload Value 定时器2 中断 T2EX Pin 图3 定时器2的自动重装模式 (DCEN=1) 208 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 位地址及其符号 符号 描述 T2CON 定时器2控制寄存器 C8H TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2 0000 0000B T2MOD 定时器2模式寄存器 C9H 地址 MSB - LSB - - - - - T2OE DECN 复位值 xxxx xx00B 除了波特率发生器模式,T2CON不包括TR2位的设置,TR2位需单独设置来启动定时器。如� 下 表列出了T2作为定时器和计数器的具体设置方法。 T2作定时器T2CON的设置 T2CON 内部控制 外部控制 16位重装 0000 0000B / 00H 0000 1000B / 08H 16位捕获 0000 0001B / 01H 0000 1001B / 09H 0011 0110B / 36H 波特率发生器接收和发送相同波特率 0011 0100B / 34H 0010 0100B / 24H 0010 0110B / 26H 只接收 0001 0100B / 14H 0001 0110B / 16H 只发送 模式 T2作计数器T2MOD的设置 模式 16位 自动重装 C T S U C M . d e t i m Li T2MOD 内部控制 外部控制 0000 0010B / 02H 0000 1010B / 0AH 0000 0011B / 03H 0000 1011B / 0BH (1)内部控制:���������������� 仅当定时器溢出时进行捕获和重装。 (2)外部控制:��������������������������������������� 当定时/计数器溢出并且T2EX(P1.1)发生电平负跳变时产生捕获和重装(定时 器2用于波特率发生器模式时除外)。 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 209 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 7.2.3 定时器2作串行口波特率发生器及其测试程序(C程序及汇编程序) 寄存器T2CON 的位TCLK和(或)RCLK允许从定时器1或定时器2获得串行口发送和接收的波 特率。当TCLK=0时,定时器1作为串行口发送波特率发生器;当TCLK=1时,定时器2作为串行口 发送波特率发生器。RCLK对串行口接收波特率有同样的作用。通过这2位,串行口能得到不同 的接收和发送波特率,一个通过定时器1产生,另一个通过定时器2产生。如图4所示为定时器 2工作在波特率发生器模式。与自动重装模式相似,当TH2溢出时,波特率发生器模式使定时器 2寄存器重新装载来自寄存器RCAP2H 和RCAP2L的16位的值,寄存器RCAP2H和RCAP2L的值由软件 预置。当工作于模式1和模式3时,波特率由下面给出的公式所决定: 模式1 和模式3 的波特率=������������� (定时器2溢出速率)/16 Timer 1 Overflow ÷12 SYSclk ÷6 . d e t i m MCU in 12T mode MCU in 6T mode T2 Pin C/T2=0 C/T2=1 C T S CU M 跳变检测 T2EX Pin control control TR2 EXF2 TL2 (8 Bits) Li TH2 (8 Bits) Reload ÷2 '0' '1' '1' '1' '0' '0' ÷16 SMOD RCLK RX Clock TCLK RCAP2L RCAP2H ÷16 TX Clock 定时器2 中断 EXEN2 图4 定时器2的独立波特率发生器模式 定时器可配置成“定时”或“计数”方式,在许多应用上,定时器被设置在“定时”方式 (C/T2=0)。当定时器2作为定时器时,它的操作不同于波特率发生器。通常定时器2作为定时 器,它会在每个机器周期递增(1/6 或1/12 振荡频率)。当定时器2 作为波特率发生器时, 它在6 时钟模式下,以振荡器频率递增(12时钟模式时为1/12振荡频率)。 这时的波特率公式如下: 模式1和模式3的波特率 = 振荡器频率 n×[65536-(RCAP2H,RCAP2L)] 式中:n=16(6时钟模式)或32(12时钟模式);[RCAP2H,RCAP2L]是RCAP2H和RCAP2L的 内容,为16 位无符号整数。 如图4所示,定时器2是作为波特率发生器,仅当寄存器T2CON中的RCLK和(或)TCLK=1 时,定时器2作为波特率发生器才有效。注意:TH2溢出并不置位TF2,也不产生中断。这样当 定时器2 作为波特率发生器时,定时器2中断不必被禁止。如果EXEN2(T2外部使能标志)被置 位,在T2EX中由1 到0 的转换会置位EXF2(T2 外部标志位),但并不导致(TH2,TL2)重新 装载(RCAP2H,RCAP2L)。 210 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 当定时器2用作波特率发生器时,如果需要,T2EX可用做附加的外部中断。当计时器工作 在波特率发生器模式下,则不要对TH2和TL2 进行读/ 写,每隔一个状态时间(fosc/2)或由 T2 进入的异步信号,定时器2 将加1。在此情况下对TH2 和TH1 进行读/ 写是不准确的;可对 RCAP2寄存器进行读,但不要进行写,否则将导致自动重装错误。当对定时器2或寄存器RCAP进 行访问时,应关闭定时器(清零TR2)。表4列出了常用的波特率和如何用定时器2得到这些波 特率。 波特率公式汇总 定时器2工作在波特率发生器模式,外部时钟信号由T2脚进入,这时的波特率公式如下: 模式1和模式3的波特率=������������� (定时器2溢出速率)/16 . d e t i m 如果定时器2采用内部时钟信号,则波特率公式如下: 波特率 = SYSclk n×[65536-(RCAP2H,RCAP2L)] Li 式中:n=32(12时钟模式)或16(6 时钟模式),SYSclk= 振荡器频率。 自动重装值可由下式得到: RCAP2H,RCAP2L= 65536 —[SYSclk/(n ×波特率)] C T S 南通国芯微电子有限公司 U C M 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 211 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 定时器2作串行口波特率发生器的测试程序(C程序及汇编程序) 1. C程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机定时器2作波特率发生器测试程序---*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ #include "reg51.h" #include "intrins.h" sfr T2CON = 0xC8; sfr RCAP2L = 0xCA; sfr RCAP2H = 0xCB; sfr TL2 = 0xCC; sfr TH2 = 0xCD; C T S typedef unsigned char BYTE; typedef unsigned int WORD; Li //timer2 control register U C M . d e t i m #define FOSC 18432000L #define BAUD 115200 //System frequency //UART baudrate /*Define UART parity mode*/ #define NONE_PARITY 0 #define ODD_PARITY 1 #define EVEN_PARITY 2 #define MARK_PARITY 3 #define SPACE_PARITY 4 //None parity //Odd parity //Even parity //Mark parity //Space parity #define PARITYBIT EVEN_PARITY //Testing even parity sbit bit9 = P2^2; bit busy; //P2.2 show UART data bit9 void SendData(BYTE dat); void SendString(char *s); 212 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 void main() { #if (PARITYBIT == NONE_PARITY) SCON = 0x50; //8-bit variable UART #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY) SCON = 0xda; //9-bit variable UART, parity bit initial to 1 #elif (PARITYBIT == SPACE_PARITY) SCON = 0xd2; //9-bit variable UART, parity bit initial to 0 #endif TL2 = RCAP2L = (65536-(FOSC/32/BAUD)); //Set auto-reload vaule TH2 = RCAP2H = (65536-(FOSC/32/BAUD)) >> 8; T2CON = 0x34; //Timer2 start run ES = 1; //Enable UART interrupt EA = 1; //Open master interrupt switch SendString("STC89-90xx\r\nUart Test !\r\n"); while(1); } /*---------------------------UART interrupt service routine ----------------------------*/ void Uart_Isr() interrupt 4 using 1 { if (RI) { RI = 0; P0 = SBUF; bit9 = RB8; } if (TI) { TI = 0; busy = 0; } } C T S U C M . d e t i m Li //Clear receive interrupt flag //P0 show UART data //P2.2 show parity bit //Clear transmit interrupt flag //Clear transmit busy flag /*---------------------------Send a byte data to UART Input: dat (data to be sent) Output:None ----------------------------*/ 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 213 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 void SendData(BYTE dat) { while (busy); //Wait for the completion of the previous data is sent ACC = dat; //Calculate the even parity bit P (PSW.0) if (P) //Set the parity bit according to P { #if (PARITYBIT == ODD_PARITY) TB8 = 0; //Set parity bit to 0 #elif (PARITYBIT == EVEN_PARITY) TB8 = 1; //Set parity bit to 1 #endif } else { #if (PARITYBIT == ODD_PARITY) TB8 = 1; //Set parity bit to 1 #elif (PARITYBIT == EVEN_PARITY) TB8 = 0; //Set parity bit to 0 #endif } busy = 1; SBUF = ACC; //Send data to UART buffer } C T S /*---------------------------Send a string to UART Input: s (address of string) Output:None ----------------------------*/ void SendString(char *s) { while (*s) { SendData(*s++); } } 214 南通国芯微电子有限公司 U C M . d e t i m Li //Check the end of the string //Send current char and increment string ptr 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 2. 汇编程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机定时器2作波特率发生器测试程序---*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ T2CON TR2 EQU BIT 0C8H T2CON.2 ;timer2 control register T2MOD RCAP2L RCAP2H TL2 TH2 EQU EQU EQU EQU EQU 0C9H 0CAH 0CBH 0CCH 0CDH ;timer2 mode register ;/*Define UART parity mode*/ #define NONE_PARITY 0 #define ODD_PARITY 1 #define EVEN_PARITY 2 #define MARK_PARITY 3 #define SPACE_PARITY 4 C T S U C M . d e t i m Li //None parity //Odd parity //Even parity //Mark parity //Space parity #define PARITYBIT EVEN_PARITY //Testing even parity ;----------------------------------------BUSY BIT 20H.0 ;transmit busy flag ;---------------------------------------- ORG 0000H LJMP MAIN ORG 0023H LJMP UART_ISR ;---------------------------------------- ORG 0100H MAIN: CLR BUSY CLR EA MOV SP, #3FH 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 215 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 #if (PARITYBIT == NONE_PARITY) MOV SCON, #50H ;8-bit variable UART #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY) MOV SCON, #0DAH ;9-bit variable UART, parity bit initial to 1 #elif (PARITYBIT == SPACE_PARITY) MOV SCON, #0D2H ;9-bit variable UART, parity bit initial to 0 #endif ;------------------------------ MOV A, #0FBH ;65536-18432000/32/115200 = 0xfffb MOV TL2, A MOV RCAP2L, A MOV A, #0FFH MOV TH2, A ;Set auto-reload vaule MOV RCAP2H, A MOV T2CON ,#34H ;Timer2 start run SETB ES ;Enable UART interrupt SETB EA ;Open master interrupt switch ;------------------------------ MOV DPTR, #TESTSTR ;Load string address to DPTR LCALL SENDSTRING ;Send string ;------------------------------ SJMP $ ;----------------------------------------TESTSTR: ;Test string DB "STC89-90xx Uart Test !",0DH,0AH,0 C T S U C M ;/*---------------------------;UART2 interrupt service routine ;----------------------------*/ UART_ISR: PUSH ACC PUSH PSW JNB RI,CHECKTI CLR RI MOV P0,SBUF MOV C,RB8 MOV P2.2,C CHECKTI: JNB TI,ISR_EXIT CLR TI CLR BUSY ISR_EXIT: POP PSW POP ACC RETI 216 南通国芯微电子有限公司 . d e t i m Li ;Check RI bit ;Clear RI bit ;P0 show UART data ;P2.2 show parity bit ;Check S2TI bit ;Clear S2TI bit ;Clear transmit busy flag 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com ;/*---------------------------;Send a byte data to UART ;Input: ACC (data to be sent) ;Output:None ;----------------------------*/ SENDDATA: JB BUSY,$ MOV ACC,A JNB P, EVEN1INACC ODD1INACC: #if (PARITYBIT == ODD_PARITY) CLR TB8 #elif (PARITYBIT == EVEN_PARITY) SETB TB8 #endif SJMP PARITYBITOK EVEN1INACC: #if (PARITYBIT == ODD_PARITY) SETB TB8 #elif (PARITYBIT == EVEN_PARITY) CLR TB8 #endif PARITYBITOK: ;Parity bit set completed SETB BUSY MOV SBUF, A RET C T S ;/*---------------------------;Send a string to UART ;Input: DPTR (address of string) ;Output:None ;----------------------------*/ SENDSTRING: CLR A MOVC A, @A+DPTR JZ STRINGEND INC DPTR LCALL SENDDATA SJMP SENDSTRING STRINGEND: RET ;---------------------------------------- END 南通国芯微电子有限公司 临时技术支持:13922829991 研发顾问:13922809991 ;Wait for the completion of the previous data is sent ;Calculate the even parity bit P (PSW.0) ;Set the parity bit according to P ;Set parity bit to 0 . d e t i m ;Set parity bit to 1 U C M Li ;Set parity bit to 1 ;Set parity bit to 0 ;Send data to UART buffer ;Get current char ;Check the end of the string ;increment string ptr ;Send current char ;Check next 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 217 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 7.2.4 定时器2作可编程时钟输出及其测试程序(C程序及汇编程序) STC89C51RC/RD+ 系列单片机,可设定定时/计数器2,通过P1.0输出时钟。P1.0除作通用 I/O口外还有两个功能可供选用:用于定时/ 计数器2 的外部计数输入和定时/计数器2 时钟信 号输出。图5 为时钟输出和外部事件计数方式示意图。 ÷12 MCU in 12T mode SYSclk ÷6 control MCU in 6T mode TL2 (8 Bits) TH2 (8 Bits) TR2 RCAP2L RCAP2H C/T2 . d e t i m ÷2 T2 Pin (P1.0) T2OE Transition Detector T2EX Pin (P1.1) EXF2 U C M control EXEN2 Li Timer 2 Interrupt 图5 定时器2的可编程时钟输出模式 C T S 通过软件对T2CON.1位C/T2复位为0,对T2MOD.1位T2OE置1就可将定时/计数器2选定为时钟 信号发生器,而T2CON.2位TR2控制时钟信号输出开始或结束(TR2为启/停控制位). 由主振频 率(SYSclk)和定时/计数器2定时、自动再装入方式的计数初值决定时钟信号的输出频率。其 设置公式如下: 模式1和模式3的波特率 = SYSclk n×[65536-(RCAP2H,RCAP2L)] * n=2,6时钟/机器周期;n=4,12时钟/机器周期 从公式可见,在主振频率(SYSclk)设定后,时钟信号输出频率就取决于定时计数初值的 设定。 在时钟输出模式下,计数器回0 溢出不会产生中断请求。这种功能相当于定时/计数器2用 作波特率发生器,同时又可以作时钟发生器。但必须注意,无论如何波特率发生器和时钟发生 器不能单独确定各自不同的频率。原因是两者都用同一个陷阱寄存器RCAP2H、RCAP2L,不可能 出现两个计数初值。 218 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 定时器2作可编程时钟输出演示程序 1、C程序清单: /*--------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- -----------------------------------*/ /* --- STC89-90xx Series Programmable Clock Output Demo -------*/ /* --- Mobile: (86)13922809991 ------------------------------------------*/ /* --- Fax: 86-755-82905966 ----------------------------------------------*/ /* --- Tel: 86-755-82948412 -----------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------*/ /* If you want to use the program or the program referenced in the */ /* article, please specify in which data and procedures from STC */ /*-------------------------------------------------------------------------------*/ . d e t i m #include "reg51.h" typedef unsigned char BYTE; typedef unsigned int WORD; //----------------------------------------------/* define constants */ #define FOSC 18432000L #define F38_4KHz U C M (65536-18432000/4/38400) /* define SFR */ sfr T2CON = 0xc8; sbit TF2 = T2CON^7; sbit TR2 = T2CON^2; sfr T2MOD = 0xc9; sfr RCAP2L = 0xca; sfr RCAP2H = 0xcb; sfr TL2 = 0xcc; sfr TH2 = 0xcd; C T S Li //timer2 control register //timer2 mode register sbit T2 = P1^0; //Clock Output pin //----------------------------------------------/* main program */ void main() { T2MOD = 0x02; //enable timer2 output clock RCAP2L = TL2 = F38_4KHz; //initial timer2 low byte RCAP2H = TH2 = F38_4KHz >> 8; //initial timer2 high byte TR2 = 1; //timer2 start running EA = 1; //open global interrupt switch } while (1); 南通国芯微电子有限公司 //loop 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 219 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 2、汇编程序清单: /*--------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- -----------------------------------*/ /* --- STC89-90xx Series Programmable Clock Output Demo -------*/ /* --- Mobile: (86)13922809991 ------------------------------------------*/ /* --- Fax: 86-755-82905966 ----------------------------------------------*/ /* --- Tel: 86-755-82948412 -----------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------*/ /* If you want to use the program or the program referenced in the */ /* article, please specify in which data and procedures from STC */ /*-------------------------------------------------------------------------------*/ ;/* define constants */ F38_4KHz EQU 0FF88H ;38.4KHz frequency calculation method of 12T mode (65536-18432000/4/38400) . d e t i m ;/* define SFR */ T2CON EQU TF2 BIT TR2 BIT 0C8H T2CON.7 T2CON.2 T2MOD RCAP2L RCAP2H TL2 TH2 EQU EQU EQU EQU EQU 0C9H 0CAH 0CBH 0CCH 0CDH C T S Li ;timer2 control register U C M ;timer2 mode register T2 BIT P1.0 ;Clock Output pin ;---------------------------------------------- ORG 0000H LJMP MAIN ;----------------------------------------------;/* main program */ MAIN: MOV T2MOD, #02H ;enable timer2 output clock MOV T2CON, #00H ;timer2 stop MOV TL2, #00H ;initial timer2 low byte MOV TH2, #00H ;initial timer2 high byte MOV RCAP2L, #LOW F38_4KHz ;initial timer2 reload low byte MOV RCAP2H, #HIGH F38_4KHz ;initial timer2 reload high byte SETB TR2 ;timer2 start running SJMP $ ;---------------------------------------------- END 220 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 7.2.5 定时器/计数器2作定时器的测试程序(C程序及汇编程序) 1、C程序清单: /*--------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- -----------------------------------*/ /* --- STC89-90xx Series 16-bit Timer Demo ---------------------------*/ /* --- Mobile: (86)13922809991 ------------------------------------------*/ /* --- Fax: 86-755-82905966 ----------------------------------------------*/ /* --- Tel: 86-755-82948412 -----------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------*/ /* If you want to use the program or the program referenced in the */ /* article, please specify in which data and procedures from STC */ /*-------------------------------------------------------------------------------*/ #include "reg51.h" typedef unsigned char BYTE; typedef unsigned int WORD; //----------------------------------------------/* define constants */ #define FOSC 18432000L C T S #define T1MS (65536-FOSC/12/1000) /* define SFR */ sbit ET2 = IE^5; sfr T2CON = 0xc8; sbit TF2 = T2CON^7; sbit TR2 = T2CON^2; sfr T2MOD = 0xc9; sfr RCAP2L = 0xca; sfr RCAP2H = 0xcb; sfr TL2 = 0xcc; sfr TH2 = 0xcd; sbit TEST_LED = P1^0; /* define variables */ WORD count; U C M . d e t i m Li //1ms timer calculation method in 12T mode //timer2 control register //timer2 mode register //work LED, flash once per second //1000 times counter //----------------------------------------------南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 221 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com /* Timer2 interrupt routine */ void tm2_isr() interrupt 5 using 1 { TF2 = 0; if (count-- == 0) { count = 1000; TEST_LED = ! TEST_LED; } } //----------------------------------------------/* main program */ void main() { RCAP2L = TL2 = T1MS; RCAP2H = TH2 = T1MS >> 8; TR2 = 1; ET2 = 1; EA = 1; count = 0; while (1); } C T S 临时技术支持:13922829991 研发顾问:13922809991 //1ms * 1000 -> 1s //reset counter //work LED flash . d e t i m Li //initial timer2 low byte //initial timer2 high byte //timer2 start running //enable timer2 interrupt //open global interrupt switch //initial counter U C M //loop 2、汇编程序清单: /*--------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- -----------------------------------*/ /* --- STC89-90xx Series 16-bit Timer Demo ---------------------------*/ /* --- Mobile: (86)13922809991 ------------------------------------------*/ /* --- Fax: 86-755-82905966 ----------------------------------------------*/ /* --- Tel: 86-755-82948412 -----------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------*/ /* If you want to use the program or the program referenced in the */ /* article, please specify in which data and procedures from STC */ /*-------------------------------------------------------------------------------*/ ;/* define constants */ T1MS EQU 0FA00H ;1ms(1000Hz) timer (65536-18432000/12/1000) ;/* define SFR */ ET2 222 BIT IE.5 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com T2CON EQU TF2 BIT TR2 BIT 0C8H T2CON.7 T2CON.2 ;timer2 control register T2MOD EQU RCAP2L EQU RCAP2H EQU TL2 EQU TH2 EQU 0C9H 0CAH 0CBH 0CCH 0CDH ;timer2 mode register TEST_LED BIT P1.0 ;/* define variables */ COUNT DATA 30H ;work LED, flash once per second . d e t i m ;1000 times counter (2 bytes) ;----------------------------------------------ORG LJMP ORG LJMP 临时技术支持:13922829991 研发顾问:13922809991 0000H MAIN 002BH TM2_ISR C T S ;----------------------------------------------- U C M ;/* main program */ MAIN: MOV T2MOD,#00H MOV T2CON,#00H MOV TL2,#00H MOV TH2,#00H MOV RCAP2L,#LOW T1MS MOV RCAP2H,#HIGH T1MS SETB TR2 SETB ET2 SETB EA CLR A MOV COUNT,A MOV COUNT+1,A SJMP $ Li ;initial timer2 mode ;timer2 stop ;initial timer2 low byte ;initial timer2 high byte ;initial timer2 reload low byte ;initial timer2 reload high byte ;timer2 start running ;enable timer2 interrupt ;open global interrupt switch ;initial counter ;----------------------------------------------- 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 223 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com ;/* Timer2 interrupt routine */ TM2_ISR: PUSH ACC PUSH PSW CLR TF2 MOV A, COUNT ORL A, COUNT+1 JNZ SKIP MOV COUNT, #LOW 1000 MOV COUNT+1, #HIGH 1000 CPL TEST_LED SKIP: CLR C MOV A, COUNT SUBB A, #1 MOV COUNT, A MOV A, COUNT+1 SUBB A, #0 MOV COUNT+1,A POP PSW POP ACC RETI ;---------------------------------------------- 224 END C T S 南通国芯微电子有限公司 临时技术支持:13922829991 研发顾问:13922809991 ;check whether count(2byte) is equal to 0 ;1ms * 1000 -> 1s ;work LED flash . d e t i m ;count-- U C M Li 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 第8章 串行口通信 STC89C51RC/RD+系列单片机内部集成有一个功能很强的全双工串行通信口,与传统8051 单片机的串口完全兼容。设有���������������������������� 2��������������������������� 个互相独立的接收、发送缓冲器,可以同时发送和接收数据。 发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,,因而两个缓冲器可以共 用一个地址码(���������������������������� 99H������������������������� )。两个缓冲器统称串行通信特殊功能寄存器����� SBUF� 。 串行通信设有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不 同应用场合选用。波特率由内部定时器/计数器产生,用软件设置不同的波特率和选择不同的 工作方式。主机可通过查询或中断方式对接收/发送进行程序处理,使用十分灵活。 STC89C51RC/RD+系列单片机串行口对应的硬件部分对应的管脚是P3.0/RxD和P3.1/TxD。 STC89C51RC/RD+系列单片机的串行通信口,除用于数据通信外,还可方便地构成一个或 多个并行I/O口,或作串���������������� —��������������� 并转换,或用于扩展串行外设等。 8.1 串行口相关寄存器 U C M 符号 描述 地址 SCON Serial Control 98H SBUF Serial Buffer 99H PCON Power Control 87H IE Interrupt Enable A8H EA - IPH 中断优先级寄存 器高 中断优先级寄存 器低 Slave Address Mask Slave Address B7H - - B8H - IP SADEN SADDR C T S 南通国芯微电子有限公司 . d e t i m Li 位地址及符号 MSB SM0/FE SM1 SM2 SMOD SMOD0 ET2 LSB REN TB8 POF GF1 RB8 TI RI PD IDL PT2 0000 0000B xxxx xxxxB ES ET1 GF0 EX1 ET0 EX0 PT2H PSH PT1H PX1H PT0H PX0H - 复位值 PS PT1 PX1 PT0 PX0 00x1 0000B 0x00 0000B xx00 0000B xx00 0000B B9H 0000 0000B A9H 0000 0000B 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 225 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 1. 串行口控制寄存器SCON和PCON STC89C51RC/RD+系列单片机的串行口设有两个控制寄存器:串行控制寄存器SCON和波 特率选择特殊功能寄存器PCON。 串行控制寄存器SCON用于选择串行通信的工作方式和某些控制功能。其格式如下: SCON : 串行控制寄存器 (可位寻址) SFR name SCON Address 98H bit name B7 SM0/FE B6 SM1 B5 SM2 B4 REN B3 TB8 B2 RB8 B1 TI B0 RI SM0/FE:当PCON寄存器中的SMOD0/PCON.6位为1时,该位用于帧错误检测。当检测到一个 无效停止位时,通过UART接收器设置该位。它必须由软件清零。 当PCON寄存器中的SMOD0/PCON.6位为0时,该位和SM1一起指定串行通信的工作 方式,如下表所示。 . d e t i m 其中SM0、SM1按下列组合确定串行口的工作方式: SM0 SM1 工作方式 0 0 方式0 0 1 方式1 1 0 方式2 1 1 方式3 Li 功能说明 波特率 同步移位串行 方式:移位寄 波特率是SYSclk/12, 存器 8位UART, ( 2SMOD/32 )×(定时器1的溢出率�) 波特率可变 9位UART ( 2SMOD / 64) x SYSclk系统工作时钟频率 C T S U C M 9位UART, (2SMOD/32 )x(定时器1的溢出率�) 波特率可变 当������ 单片机工作在12T模式���������� 时��������� ,定时器����� 1的溢出率 = SYSclk/12/( 256 - T H1); 当������ 单片机工作在6T模式������������ 时, �������� 定时器����� 1的溢出率 = SYSclk / 6 / ( 256 - T H1) SM2:允许方式2或方式3多机通信控制位。在方式2或方式3时,如SM2位为1,REN位为1,则 从机处于只有接收到RB8位为1(地址帧)时才激活中断请求标志位RI为1,并向主机请 求中断处理。被确认为寻址的丛机则复位SM2位为0,从而才接收RB8为0的数据帧。 在方式1时,如果SM2位为1,则只有在接收到有效的停止位时才置位中断请求标志位RI 为1;在方式0时,SM2 应为0。 REN:允许/禁止串行接收控制位。由软件置位REN,即REN=1为允许串行接收状态,可启动 串行接收器RxD,开始接收信息。软件复位REN,即REN=0,则禁止接收。 TB8: 在方式2或方式3,它为要发送的第9位数据,按需要由软件置位或清0。例如,可用作数 据的校验位或多机通信中表示地址帧/数据帧的标志位。 RB8: 在方式2或方式3,是接收到的第9位数据。在方式1,若SM2=0,则RB8是接收到的停止 位。方式0不用RB8。 TI: 发送中断请求中断标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动 置位,即TI=1,向主机请求中断,响应中断后必须用软件复位,即TI=0。在其他方式 中,则在停止位开始发送时由内部硬件置位,必须用软件复位。 226 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 RI: 接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1, 向主机请求中断,响应中断后必须用软件复位,即RI=0。在其他方式中,串行接收到 停止位的中间时刻由内部硬件置位,即RI=1(例外情况见SM2说明),必须由软件复 位,即RI=0。 SCON的所有位可通过整机复位信号复位为全� “ 0”� 。 SCON的字节地址尾98H,可位寻 址,各位地址为98H~~9FH,可用软件实现位设置。当用指令改变SCON的有关内容时,其改 变的状态将在下一条指令的第一个机器周期的S1P1状态发生作用。如果一次串行发送已经开 始,则输出TB8将是原先的值,不是新改变的值。 串行通信的中断请求:当一帧发送完成,内部硬件自动置位TI,即TI=1,请求中断处理; 当接收完一帧信息时,内部硬件自动置位RI,即RI=1,请求中断处理。由于TI和RI以��� “�� 或逻 辑��������������������������� ”�������������������������� 关系向主机请求中断,所以主机响应中断时事先并不知道是TI还是RI请求的中断,必须在 中断服务程序中查询TI和RI进行判别,然后分别处理。因此,两个中断请求标志位均不能由硬 件自动置位,必须通过软件清0,否则将出现一次请求多次响应的错误。 . d e t i m 电源控制寄存器PCON中的SMOD/PCON.7用于设置方式1、方式2、方式3的波特率是否加 倍。 电源控制寄存器PCON格式如下: PCON : 电源控制寄存器 (不可位寻址) SFR name Address bit B7 B6 B5 B4 B3 B2 B1 B0 PCON 87H name SMOD SMOD0 POF GF1 GF0 PD IDL C T S U C M Li SMOD:波特率选择位。当用软件置位SMOD,即SMOD=1,则使串行通信方式1、2、3的波 特率加倍;SMOD=0,则各工作方式的波特率加倍。复位时SMOD=0。 SMOD0:帧错误检测有效控制位。当SMOD0=1,SCON寄存器中的SM0/FE位用于FE(帧错误 检测)功能;当SMOD0=0,SCON寄存器中的SM0/FE位用于SM0功能,和SM1一起指 定串行口的工作方式。复位时SMOD0=0 2. 串行口数据缓冲寄存器SBUF STC89xx系列单片机的串行口缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF 的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分别对应两个 不同的寄存器,1个是只写寄存器,1个是只读寄存器。 串行通道内设有数据寄存器。在所有的串行通信方式中,在写入SBUF信号的控制下,把 数据装入相同的9位移位寄存器,前面8位为数据字节,其最低位为移位寄存器的输出位。根据 不同的工作方式会自动将� “1”� 或TB8的值装入移位寄存器的第9位,并进行发送。 串行通道的接收寄存器是一个输入移位寄存器。在方式0时它的字长为8位,其他方式时为 9位。当一帧接收完毕,移位寄存器中的数据字节装入串行数据缓冲器SBUF中,其第9位则装 入SCON寄存器中的RB8位。如果由于SM2使得已接收到的数据无效时,RB8和SBUF中内容不 变。 由于接收通道内设有输入移位寄存器和SBUF缓冲器,从而能使一帧接收完将数据由移位 寄存器装入SBUF后,可立即开始接收下一帧信息,主机应在该帧接收结束前从SBUF缓冲器中 将数据取走,否则前一帧数据将丢失。SBUF以并行方式送往内部数据总线。 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 227 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 3. 从机地址控制寄存器SADEN和SADDR 为了方便多机通信,STC89C51RC/RD+系列单片机设置了从机地址控制寄存器SADEN和 SADDR。其中SADEN是从机地址掩模寄存器(地址为B9H,复位值为00H),SADDR是从机地址寄存 器(地址为A9H,复位值为00H)。 4. 与串行口中断相关的寄存器IE和IPH、IP 串行口中断允许位ES位于中断允许寄存器IE中,中断允许寄存器的格式如下: IE : 中断允许寄存器 (可位寻址) SFR name Address bit B7 B6 B5 B4 B3 B2 IE A8H name EA - ET2 ES ET1 EX1 . d te i m Li B1 B0 ET0 EX0 EA : CPU的总中断允许控制位,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。 EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受各中断源自 己的中断允许控制位控制。 U C M ES : 串行口中断允许位,ES=1,允许串行口中断,ES=0,禁止串行口中断。 串行口中断优先级控制位PS/PSH位于中断优先级控制寄存器IP/IPH中,中断优先级控制寄 存器的格式如下: C T S IPH: 中断优先级控制寄存器高(不可位寻址) SFR name Address IPH B7H bit B7 B6 name PX3H PX2H B5 B4 PT2H PSH B3 B2 B1 B0 PT1H PX1H PT0H PX0H IP : 中断优先级控制寄存器低 (可位寻址) SFR name Address bit B7 B6 B5 B4 B3 B2 B1 B0 IP B8H name - - PT2 PS PT1 PX1 PT0 PX0 PSH, PS: 228 串口1中断优先级控制位。 当PSH=0且PS=0时,串口1中断为最低优先级中断(优先级0) 当PSH=0且PS=1时,串口1中断为较低优先级中断(优先级1) 当PSH=1且PS=0时,串口1中断为较高优先级中断(优先级2) 当PSH=1且PS=1时,串口1中断为最高优先级中断(优先级3) 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 8.2 串行口工作模式 STC89C51RC/RD+系列单片机的串行通信有4种工作模式,可通过软件编程对SCON中的 SM0、SM1的设置进行选择。其中模式1、模式2和模式3为异步通信,每个发送和接收的字符 都带有1个启动位和1个停止位。在模式0中,串行口被作为1个简单的移位寄存器使用。 8.2.1 串行口工作模式0:同步移位寄存器 在模式0状态,串行通信工作在同步移位寄存器模式,当当单片机工作在6T模式时,其 波特率固定为SYSclk/6。当单片机工作在12T时,其波特率固定为SYSclk/12。串行口数据由 RxD(RxD/P3.0)端输入,同步移位脉冲(SHIFTCLOCK)由TxD(TxD/P3.1)输出,发送、接收 的是8位数据,低位在先。 . d e t i m 模式0的发送过程:当主机执行将数据写入发送缓冲器SBUF指令时启动发送,串行口即将 8位数据以SYSclk/12或SYSclk/6的波特率从RxD管脚输出(从低位到高位),发送完中断标志TI 置"1",TxD管脚输出同步移位脉冲(SHIFTCLOCK)。波形如图8-1中“发送”所示。 U C M Li 当写信号有效后,相隔一个时钟,发送控制端SEND有效(高电平),允许RxD发送数据,同 时允许TxD输出同步移位脉冲。一帧(8位)数据发送完毕时,各控制端均恢复原状态,只有TI保 持高电平,呈中断申请状态。在再次发送数据前,必须用软件将TI清0。 C T S 模式0接收过程:模式0接收时,复位接收中断请求标志RI,即RI=0,置位允许接收控制 位REN=1时启动串行模式0接收过程。启动接收过程后,RxD为串行输入端,TxD为同步脉冲 输出端。串行接收的波特率为SYSclk/12或SYSclk/6。其时序图如图8-1中“接收”所示。 当接收完成一帧数据(8位)后,控制信号复位,中断标志RI被置"1",呈中断申请状态。当 再次接收时,必须通过软件将RI清0 工作于模式0时,必须清0多机通信控制位SM2,使不影响TB8位和RB8位。由于波特率固 定为SYSclk/12或SYSclk/6,无需定时器提供,直接由单片机的时钟作为同步移位脉冲。 串行口工作模式0的示意图如图8-1所示 由示意图中可见,由TX和RX控制单元分别产生中断请求信号并置位TI=1或RI =1,经�� “� 或 门������������������������� “������������������������ 送主机请求中断,所以主机响应中断后必须软件判别是TI还是RI请求中断,必须软件清0 中断请求标志位TI或RI。 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 229 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 INTERNAL BUS WRITE TO SBUF DS Q CL RxD OUTPUT FUNCTION SBUF ZERO DETECTOR SYSclk/12 SYSclk/6 START 0 TX CONTROL SERIAL PORT INTERRUPT 1 在烧录用户程序时在 STC-ISP编程器中设置 REN RI TX CLOCK TI RX CLOCK RI START SHIFT SHIFT SEND RX CONTROL SHIFT 1 1 1 1 1 1 1 0 INPUT SHIFT REG. U C M LOAD SBUF C T S TxD OUTPUT FUNCTION SHIFT CLOCK RECEIVE SHIFT . d e t i m Li RxD INPUT FUNCTION SBUF READ SBUF INTERNAL BUS WRITE TO SBUF SEND SHIFT TRANSMIT RXD(DATA OUT) D0 D1 D2 D3 D4 D5 D6 D7 TXD(SHIFT CLOCK) TI WRITE TO SCON(CLEAR RI) RI RECEIVE RECEIVE SHIFT RXD(DATA IN) D0 D1 D2 D3 D4 D5 D6 D7 TXD(SHIFT CLOCK) 图8-1 串行口模式0功能结构及时序示意图 230 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 8.2.2 串行口工作模式1:8位UART,波特率可变 当软件设置SCON的SM0、SM1为� “ 01”���������� 时,串行通信则以模式1工作。此模式为8位 UART格式,一帧信息为10位:1位起始位,8位数据位(低位在先)和1位停止位。波特率可 变,即可根据需要进行设置。TxD(TxD/P3.1)为发送信息,RxD(RxD/P3.0)为接收端接收信息, 串行口为全双工接受/发送串行口。 图8-2为串行模式1的功能结构示意图及接收/发送时序图 模式1的发送过程:串行通信模式发送时,数据由串行发送端TxD输出。当主机执行一条 写� “SBUF“���������������� 的指令就启动串行通信的发送,写� “SBUF”����� 信号还把� “1”��������� 装入发送移位寄存器 的第9位,并通知TX控制单元开始发送。发送各位的定时是由16分频计数器同步。 移位寄存器将数据不断右移送TxD端口发送,在数据的左边不断移入� “ 0”����� 作补充。当 数据的最高位移到移位寄存器的输出位置,紧跟其后的是第9位� “1”���������� ,在它的左边各位全为 “0”��������� ,这个状态条件,使TX控制单元作最后一次移位输出,然后使允许发送信号� “SEND” 失效,完成一帧信息的发送,并置位中断请求位TI,即TI=1,向主机请求中断处理。 . d e t i m Li 模式1的接收过程:当软件置位接收允许标志位REN,即REN=1时,接收器便以选定波特 率的16分频的速率采样串行接收端口RxD,当检测到RxD端口从� “1”�� →� “0”������� 的负跳变时就启 动接收器准备接收数据,并立即复位16分频计数器,将1FFH植装入移位寄存器。复位16分频 计数器是使它与输入位时间同步。 U C M 16分频计数器的16个状态是将1波特率(每位接收时间)均为16等份,在每位时间的7、 8、9状态由检测器对RxD端口进行采样,所接收的值是这次采样直经���������� “��������� 三中取二����� ”���� 的值,即3 次采样至少2次相同的值,以此消除干扰影响,提高可靠性。在起始位,如果接收到的值不为 “0”�������������������������� (低电平),则起始位无效,复位接收电路,并重新检测�"1"�� →�"0"��������� 的跳变。如果接收到 的起始位有效,则将它输入移位寄存器,并接收本帧的其余信息。 C T S 接收的数据从接收移位寄存器的右边移入,已装入的1FFH向左边移出,当起始位�"0"�� 移到 移位寄存器的最左边时,使RX控制器作最后一次移位,完成一帧的接收。若同时满足以下两 个条件: ·RI=0; ·SM2=0或接收到的停止位为1。 则接收到的数据有效,实现装载入SBUF,停止位进入RB8,置位RI,即RI=1,向主机请 求中断,若上述两条件不能同时满足,则接收到的数据作废并丢失,无论条件满足与否,接收 器重又检测RxD端口上的�"1"�� →� "0"�������������������������� 的跳变,继续下一帧的接收。接收有效,在响应中断后,必 须由软件清0,即RI=0。通常情况下,串行通信工作于模式1时,SM2设置为�"0"� 。 串行通信模式1的波特率是可变的,可变的波特由定时器/计数器1或独立波特率发生器产 生。 串行通信模式1的波特率=2SMOD/32×(定时器/计数器1溢出率) 当������ 单片机工作在12T模式���������� 时��������� ,定时器����� 1的溢出率 = SYSclk/12/( 256 - TH1); 当������ 单片机工作在6T模式����������� 时���������� , 定时器����� 1的溢出率 = SYSclk /6/ ( 256 - TH1) 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 231 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 INTERNAL BUS TB8 Timer 1 Overflow WRITE TO SBUF ÷2 DS Q CL TxD ZERO DETECTOR SMOD =1 SMOD =0 SBUF SHIFT START TX CONTROL ÷16 TX CLOCK SERIAL PORT INTERRUPT SAMPLE TI SEND RI LOAD SBUF . d e t i m ÷16 RX CLOCK START 1-TO-0 TRANSITION DETECTOR DATA Li RX CONTROL SHIFT 1FFH CU BIT DETECTOR M RxD C T S INPUT SHIFT REG. (9 BITS) SHIFT LOAD SBUF SBUF READ SBUF INTERNAL BUS TX CLOCK WRITE TO SBUF SEND TRANSMIT DATA SHIFT D0 TXD START BIT TI D1 D2 D3 D4 D5 D6 D7 START BIT D0 D1 D2 D3 D4 D5 STOP BIT RX CLOCK RXD RECEIVE BIT DETECTOR SAMPLE TIMES SHIFT D6 D7 STOP BIT RI 图8-2 串行口模式1功能结构示意图及接收/发送时序图 232 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 8.2.3 串行口工作模式2:9位UART,波特率固定 当SM0、SM1两位为10时,串行口工作在模式2。串行口工作模式2为9位数据异步通信 UART模式,其一帧的信息由11位组成:1位起始位,8位数据位(低位在先),1位可编程位(第 9位数据)和1位停止位。发送时可编程位(第9位数据)由SCON中的TB8提供,可软件设置为1或 0,或者可将PSW中的奇/偶校验位P值装入TB8(TB8既可作为多机通信中的地址数据标志位, 又可作为数据的奇偶校验位)。接收时第9位数据装入SCON的RB8。TxD为发送端口,RxD为 接收端口,以全双工模式进行接收/发送。 模式2的波特率为: 串行通信模式2波特率=2SMOD/64×(SYSclk系统工作时钟频率) 上述波特率可通过软件对PCON中的SMOD位进行设置,当SMOD=1时,选择1/32(SYSclk) ;当SMOD=0时,选择1/64(SYSclk) ,故而称SMOD为波特率加倍位。可见,模式2的波特率基 本上是固定的。 . d e t i m Li 图8-3为串行通信模式2的功能结构示意图及其接收/发送时序图。 由图8-3可知,模式2和模式1相比,除波特率发生源略有不同,发送时由TB8提供给移位寄 存器第9数据位不同外,其余功能结构均基本相同,其接收/发送操作过程及时序也基本相同。 U C M 当接收器接收完一帧信息后必须同时满足下列条件: ·RI=0 C T S ·SM2=0或者SM2=1,并且接收到的第9数据位RB8=1。 当上述两条件同时满足时,才将接收到的移位寄存器的数据装入SBUF和RB8中,并置位 RI=1,向主机请求中断处理。如果上述条件有一个不满足,则刚接收到移位寄存器中的数据无 效而丢失,也不置位RI。无论上述条件满足与否,接收器又重新开始检测RxD输入端口的跳变 信息,接收下一帧的输入信息。 在模式2中,接收到的停止位与SBUF、RB8和RI无关。 通过软件对SCON中的SM2、TB8的设置以及通信协议的约定,为多机通信提供了方便。 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 233 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 INTERNAL BUS TB8 WRITE TO SBUF DS Q CL SBUF TxD ZERO DETECTOR SYSclk/2 STOP BIT START GEN. MODE 2 ÷16 ÷2 TX CLOCK TI SERIAL PORT INTERRUPT SMOD=1 SMOD=0 DATA SEND . d e t i m ÷16 SAMPLE (SMOD IS PCON.7) SHIFT TX CONTROL 1-TO-0 TRANSITION DETECTOR START RX RI CLOCK LOAD SBUF Li RX CONTROL SHIFT 1FFH CU BIT DETECTOR M RxD C T S INPUT SHIFT REG. (9 BITS) SHIFT LOAD SBUF SBUF READ SBUF INTERNAL BUS TX CLOCK WRITE TO SBUF SEND TRANSMIT DATA SHIFT D0 TXD START BIT TI D1 D2 D3 D4 D5 D6 D7 TB8 STOP BIT START BIT D0 D1 D2 D3 D4 D5 D6 D7 STOP BIT GEN RX CLOCK RECEIVE RXD RB8 STOP BIT BIT DETECTOR SAMPLE TIMES SHIFT RI 图8-3 串行口模式2功能结构示意图及接收/发送时序图 234 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 8.2.4 串行口工作模式3:9位UART,波特率可变 当SM0、SM1两位为11时,串行口工作在模式3。������ 串行通信�� 模式3为9位数据异步通信UART 模式�������� ,������� 其一帧的信息由11位组成:1位起始位,8位数据位(低位在先),1位可编程位(第9位数 据)和1位停止位。发送时可编程位(第9位数据)由SCON中的TB8提供,可软件设置为1或0,或 者可将PSW中的奇/偶校验位P值装入TB8(TB8既可作为多机通信中的地址数据标志位,又可作 为数据的奇偶校验位)。接收时第9位数据装入SCON的RB8。TxD为发送端口,RxD为接收端 口,以全双工模式进行接收/发送。 模式3的波特率为: 串行通信模式3波特率=2SMOD/32×(定时器/计数器1的溢出率) 当������ 单片机工作在12T模式���������� 时��������� ,定时器����� 1的溢出率 = SYSclk/12/( 256 - TH1); 当������ 单片机工作在6T模式����������� 时���������� , 定时器����� 1的溢出率 = SYSclk /6/ ( 256 - TH1) . d e t i m 可见,模式3和模式1一样,其波特率可通过软件对定时器/计数器1或独立波特率发生器的 设置进行波特率的选择,是可变的。 Li 图8-4为串行口工作模式3的功能结构示意图及其接收/发送时序图。 由图8-4可知,模式3和模式1相比,除发送时由TB8提供给移位寄存器第9数据位不同外, 其余功能结构均基本相同,其接收���������������� ‘��������������� 发送操作过程及时序也基本相同。 U C M 当接收器接收完一帧信息后必须同时满足下列条件: ·RI=0 C T S ·SM2=0或者SM2=1,并且接收到的第9数据位RB8=1。 当上述两条件同时满足时,才将接收到的移位寄存器的数据装入SBUF和RB8中,并置位 RI=1,向主机请求中断处理。如果上述条件有一个不满足,则刚接收到移位寄存器中的数据无 效而丢失,也不置位RI。无论上述条件满足与否,接收器又重新开始检测RxD输入端口的跳变 信息,接收下一帧的输入信息。 在模式3中,接收到的停止位与SBUF、RB8和RI无关。 通过软件对SCON中的SM2、TB8的设置以及通信协议的约定,为多机通信提供了方便。 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 235 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 INTERNAL BUS TB8 TIMER 1 OVERFLOW WRITE TO SBUF DS Q CL ÷2 SBUF TxD ZERO DETECTOR SMOD =0 SMOD =1 SHIFT START TX CONTROL ÷16 TX CLOCK SERIAL PORT INTERRUPT TI SEND RI LOAD SBUF RX CLOCK START Li RX CONTROL SHIFT 1FFH CU BIT DETECTOR M RxD C T S . d e t i m ÷16 SAMPLE 1-TO-0 TRANSITION DETECTOR DATA INPUT SHIFT REG. (9 BITS) SHIFT LOAD SBUF SBUF READ SBUF INTERNAL BUS TX CLOCK WRITE TO SBUF SEND TRANSMIT DATA SHIFT D1 D0 TXD START BIT TI D2 D3 D4 D5 D6 D7 TB8 STOP BIT D1 D2 D3 D4 D5 D6 D7 STOP BIT GEN RECEIVE RX CLOCK ÷16 RESET RXD START BIT D0 RB8 STOP BIT BIT DETECTOR SAMPLE TIMES SHIFT RI 图8-4 串行口模式3功能结构示意图及接收/发送时序图 236 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 8.3 串行通信中波特率的设置 STC89C51RC/RD+系列单片机串行通信的波特率随所选工作模式的不同而异,对于工作模 式0和模式2,其波特率与系统时钟频率SYSclk和PCON中的波特率选择位SMOD有关,而模式 1和模式3的波特率除与SYSclk和PCON位有关外,还与定时器/计数器1或BRT独立波特率发生器 设置有关。通过对定时器/计数器1或BRT独立波特率发生器的设置,可选择不同的波特率,所 以这种波特率是可变的。 串行通信模式0,其波特率与系统时钟频率SYSclk有关 。 当用户在烧录用户程序时在STC-ISP编程器中设置单片机为6T/双倍速时,其波特率 = SYSclk/12。 当用户在烧录用户程序时在STC-ISP编程器中设置单片机为12T/单倍速时,其波特率 = SYSclk/2。 . d e t i m 一旦SYSclk选定且单片机在烧录用户程序时在STC-ISP编程器设置好,则串行通信工作模 式0的波特率固定不变。 U C M Li 串行通信工作模式2,其波特率除与SYSclk有关外,还与SMOD位有关。 其基本表达式为:串行通信模式2波特率=2SMOD/64×(SYSclk系统工作时钟频率) 当SMOD=1时,波特率=2/64(SYSclk)=1/32(SYSclk); C T S 当SMOD=0时,波特率=1/64(SYSclk)。 当SYSclk选定后,通过软件设置PCON中的SMOD位,可选择两种波特率。所以,这种模 式的波特率基本固定。 串行通信模式1和3,其波特率是可变的: 模式1、3波特率=2SMOD/32×(��� 定时器/计数器1的溢出率或���������������� BRT������������� 独立波特率发生器的溢出率�) 当������ 单片机工作在12T模式���������� 时��������� ,定时器����� 1的溢出率 = SYSclk/12/( 256 - TH1); 当������ 单片机工作在6T模式����������� 时���������� , 定时器����� 1的溢出率 = SYSclk /6/ ( 256 - TH1) 通过对定时器/计数器1和BRT独立波特率发生器的设置,可灵活地选择不同的波特率。在 实际应用中多半选用串行模式1或串行模式3。显然,为选择波特率,关键在于定时器/计数器1 和BRT独立波特率发生器的溢出率的计算。SMOD的选择,只需根据需要执行下列指令就可实 现SMOD=0或1; MOV MOV PCON,#00H PCON,#80H ;使SMOD=0 ;使SMOD=1 SMOD只占用电源控制寄存器PCON的最高一位,其他各位的具体设置应根据实际情况而 定。 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 237 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 为选择波特率,关键在于定时器/计数器1的溢出率。下面介绍如何计算定时器/计数器1的 溢出率。 定时器/计数器1的溢出率定义为:单位时间(秒)内定时器/计数器1回0溢出的次数,即定 时器/计数器1的溢出率=定时器/计数器1的溢出次数/秒。 STC89C51RC/RD+系列单片机设有两个定时器/计数器,因定时器/计数器1具有4种工作方 式,而常选用定时器/计数器1的工作方式2(8位自动重装)作为波特率的溢出率。 设置定时器/计数器1工作于定时模式的工作方式2(8位自动重装),TL1的计数输入来自 于SYSclk经12分频或不分频的脉冲。当单片机工作在12T模式,TL1的计数输入来自于SYSclk经 12分频的脉冲;当单片机工作在6T模式,TL1的计数输入来自于SYSclk经6分频的脉冲。可见, 定时器/计数器1的溢出率与SYSclk和自动重装值N有关,SYSclk越大,特别是N越大,溢出率 也就越高。对于一般情况下, . d e t i m 当单片机工作在12T模式时时,定时器/计数器1溢出一次所需的时间为: (28—N)×12时钟=(28—N)×12× Li 1 SYSclk 当单片机工作在6T模式时,定时器/计数器1溢出一次所需的时间为: U C M (28—N)×6时钟=(28—N)×6× 1 SYSclk 于是得定时器/计数器每秒溢出的次数,即 C T S 当单片机工作在12T模式时,定时器/计数器1的溢出率=SYSclk/12×(28-N) (次/秒) 当单片机工作在6T模式时, 定时器/计数器1的溢出率=SYSclk×6×(28-N) (次/秒) 式中SYSclk为系统时钟频率,N为再装入时间常数。 显然,选用定时器/计数器0作波特率的溢出率也一样。选用不同工作方式所获得波特率的 范围不同。因为不同方式的计数位数不同,N取值范围不同,且计数方式较复杂。 238 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 下表给出各种常用波特率与定时器/计数器1各参数之间的关系。 常用波特率与定时器/计数器1各参数关系(T1x12/AUXR.6=0) 常用波特率 系统时钟频率 (MHz) SMOD 方式0 MAX:1M 12 × 方式2 MAX:375K 62.5K 方式1和3 19.2K 9.6K 4.8K 2.4K 1.2K 137.5 110 110 12 12 11.059 11.059 11.059 11.059 11.059 11.986 6 12 MOV MOV MOV SETB MOV MOV C T S × 方式 × 重新装入值 × 1 1 1 0 0 0 0 0 0 × 0 0 0 0 0 0 0 0 × 2 2 2 2 2 2 2 2 × FFH FDH FDH FAH F4H F8H 1DH 72H 0 0 1 FFFBH U C M TMOD, #20H TH1, #××H TL1, #××H TR1 PCON, #80H SCON, #50H C/T . d e t i m Li ;设置定时器/计数器1定时、工作方式2 ; 设置定时常数N ; ;启动定时器/计数器1 ;设置SMOD=1 ;设置串行通信方式1 … … 设置波特率的初始化程序段如下: 定时器1 执行上述程序段后,即可完成对定时器/计数器1的操作方式及串行通信的工作方式和波特 率的设置。 由于用其他工作方式设置波特率计算方法较复杂,一般应用较少,故不一一论述。 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 239 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 8.4 串行口的测试程序(C程序及汇编程序) 1. C程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机串行口功能 (8-bit/9-bit) ----------------*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ #include "reg51.h" #include "intrins.h" typedef unsigned char BYTE; typedef unsigned int WORD; #define FOSC 18432000L #define BAUD 9600 /*Define UART parity mode*/ #define NONE_PARITY 0 #define ODD_PARITY 1 #define EVEN_PARITY 2 #define MARK_PARITY 3 #define SPACE_PARITY 4 C T S U C M . d e t i m Li //System frequency //UART baudrate //None parity //Odd parity //Even parity //Mark parity //Space parity #define PARITYBIT EVEN_PARITY //Testing even parity sbit bit9 = P2^2; bit busy; //P2.2 show UART data bit9 void SendData(BYTE dat); void SendString(char *s); void main() { #if (PARITYBIT == NONE_PARITY) SCON = 0x50; //8-bit variable UART #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY) SCON = 0xda; //9-bit variable UART, parity bit initial to 1 #elif (PARITYBIT == SPACE_PARITY) SCON = 0xd2; //9-bit variable UART, parity bit initial to 0 #endif 240 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com TMOD = 0x20; TH1 = TL1 = -(FOSC/12/32/BAUD); TR1 = 1; ES = 1; EA = 1; SendString("STC89-90xx\r\nUart Test !\r\n"); while(1); 临时技术支持:13922829991 研发顾问:13922809991 //Set Timer1 as 8-bit auto reload mode //Set auto-reload vaule //Timer1 start run //Enable UART interrupt //Open master interrupt switch } /*---------------------------UART interrupt service routine ----------------------------*/ void Uart_Isr() interrupt 4 using 1 { if (RI) { RI = 0; P0 = SBUF; bit9 = RB8; } if (TI) { TI = 0; busy = 0; } } //Clear receive interrupt flag //P0 show UART data //P2.2 show parity bit /*---------------------------Send a byte data to UART Input: dat (data to be sent) Output:None ----------------------------*/ void SendData(BYTE dat) { while (busy); ACC = dat; if (P) { #if (PARITYBIT == ODD_PARITY) TB8 = 0; #elif (PARITYBIT == EVEN_PARITY) TB8 = 1; #endif } //Wait for the completion of the previous data is sent //Calculate the even parity bit P (PSW.0) //Set the parity bit according to P C T S 南通国芯微电子有限公司 U C M . d e t i m Li //Clear transmit interrupt flag //Clear transmit busy flag //Set parity bit to 0 //Set parity bit to 1 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 241 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 else { #if (PARITYBIT == ODD_PARITY) TB8 = 1; //Set parity bit to 1 #elif (PARITYBIT == EVEN_PARITY) TB8 = 0; //Set parity bit to 0 #endif } busy = 1; SBUF = ACC; //Send data to UART buffer } /*---------------------------Send a string to UART Input: s (address of string) Output:None ----------------------------*/ void SendString(char *s) { while (*s) { SendData(*s++); } } C T S 242 南通国芯微电子有限公司 U C M . d e t i m Li //Check the end of the string //Send current char and increment string ptr 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 2. 汇编程序: /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机串行口功能 (8-bit/9-bit) ----------------*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ ;/*Define UART parity mode*/ #define NONE_PARITY 0 #define ODD_PARITY 1 #define EVEN_PARITY 2 #define MARK_PARITY 3 #define SPACE_PARITY 4 #define PARITYBIT EVEN_PARITY ;---------------------------------------- BUSY BIT 20H.0 ;---------------------------------------- ORG 0000H LJMP MAIN C T S //None parity //Odd parity //Even parity //Mark parity //Space parity U C M . d e t i m Li //Testing even parity ;transmit busy flag ORG 0023H LJMP UART_ISR ;---------------------------------------- ORG 0100H MAIN: CLR BUSY CLR EA MOV SP, #3FH #if (PARITYBIT == NONE_PARITY) MOV SCON, #50H ;8-bit variable UART #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY) MOV SCON, #0DAH ;9-bit variable UART, parity bit initial to 1 #elif (PARITYBIT == SPACE_PARITY) MOV SCON, #0D2H ;9-bit variable UART, parity bit initial to 0 #endif ;------------------------------- 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 243 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com MOV TMOD, #20H MOV A, #0FBH MOV TH1, A MOV TL1, A SETB TR1 SETB ES SETB EA ;------------------------------ MOV DPTR, #TESTSTR LCALL SENDSTRING ;------------------------------ SJMP $ ;----------------------------------------TESTSTR: DB "STC89-90xx Uart Test !",0DH,0AH,0 ;/*---------------------------;UART2 interrupt service routine ;----------------------------*/ UART_ISR: PUSH ACC PUSH PSW JNB RI, CHECKTI CLR RI MOV P0, SBUF MOV C, RB8 MOV P2.2, C CHECKTI: JNB TI, ISR_EXIT CLR TI CLR BUSY ISR_EXIT: POP PSW POP ACC RETI C T S 临时技术支持:13922829991 研发顾问:13922809991 ;Set Timer1 as 8-bit auto reload mode ;256-18432000/12/32/9600 ;Set auto-reload vaule ;Timer1 start run ;Enable UART interrupt ;Open master interrupt switch ;Load string address to DPTR ;Send string . d e t i m ;Test string U C M Li ;Check RI bit ;Clear RI bit ;P0 show UART data ;P2.2 show parity bit ;Check S2TI bit ;Clear S2TI bit ;Clear transmit busy flag ;/*---------------------------;Send a byte data to UART ;Input: ACC (data to be sent) ;Output:None ;----------------------------*/ 244 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com SENDDATA: JB BUSY, $ MOV ACC, A JNB P, EVEN1INACC ODD1INACC: #if (PARITYBIT == ODD_PARITY) CLR TB8 #elif (PARITYBIT == EVEN_PARITY) SETB TB8 #endif SJMP PARITYBITOK EVEN1INACC: #if (PARITYBIT == ODD_PARITY) SETB TB8 #elif (PARITYBIT == EVEN_PARITY) CLR TB8 #endif PARITYBITOK: SETB BUSY MOV SBUF, A RET C T S 南通国芯微电子有限公司 ;Wait for the completion of the previous data is sent ;Calculate the even parity bit P (PSW.0) ;Set the parity bit according to P ;Set parity bit to 0 ;Set parity bit to 1 . d e t i m ;Set parity bit to 1 Li ;Set parity bit to 0 ;Parity bit set completed CU M ;/*---------------------------;Send a string to UART ;Input: DPTR (address of string) ;Output:None ;----------------------------*/ SENDSTRING: CLR A MOVC A, @A+DPTR JZ STRINGEND INC DPTR LCALL SENDDATA SJMP SENDSTRING STRINGEND: RET ;---------------------------------------- END 临时技术支持:13922829991 研发顾问:13922809991 ;Send data to UART buffer ;Get current char ;Check the end of the string ;increment string ptr ;Send current char ;Check next 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 245 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 8.5 双机通信 STC89C51RC/RD+系列单片机的串行通信根据其应用可分为双机通信和多机通信两种。下 面先介绍双机通信。 如果两个8051应用系统相距很近,可将它们的串行端口直接相连(TXD—RXD,RXD— TXD,GND—GND—������������������������������� 地),即可实现双机通信。为了增加通信距离,减少通道及电源干扰, 可采用RS—232C或RS—422、RS—485标准进行双机通信,两通信系统之间采用光����� —���� 电隔离技 术,以减少通道及电源的干扰,提高通信可靠性。 8051 TxD RxD RxD TxD GND GND U C M . d e t i m 8051 Li 为确保通信成功,通信双方必须在软件上有系列的约定通常称为软件通信������� “������ 协议���� ”��� 。现举 例简介双机异步通信软件������� “������ 协议���� ”��� 如下: C T S 通信双方均选用2400波特的传输速率,设系统的主频SYSclk=6MHz,甲机发送数据,乙机 接收数据。在双机开始通信时,先由甲机发送一个呼叫信号(例如� “06H”�������� ),以询问乙机是 否可以接收数据;乙机接收到呼叫信号后,若同意接收数据,则发回� “00H”������� 作为应答信号, 否则发� “05H”��������������������������� 表示暂不能接收数据,;甲机只有在接收到乙机的应答信号� “00H”���� 后才可将 存储在外部数据存储器中的内容逐一发送给乙机,否则继续向乙机发呼叫信号,直到乙机同意 接收。其发送数据格式如下: 字节数n 数据1 数据2 数据3 … 数据n 累加校验和 字节数n:甲机向乙机发送的数据个数; 数据1~数据n:甲机将向乙机发送的n帧数据; 累加校验和:为字节数n、数据1、���� …��� 、数据n,这(n+1)个字节内容的算术累加和. 乙机根据接收到的������������ “����������� 校验和�������� ”������� 判断已接收到的n个数据是否正确。若接收正确,向甲机回发 “0FH”信号,否则回发“F0H”信号。甲机只有在接收到乙机发回的� “0FH”��������� 信号才算完成发送任 务,返回被调用的程序,否则继续呼叫,重发数据。 不同的通信要求,软件����������������������������� “���������������������������� 协议�������������������������� ”������������������������� 内容也不一样,有关需甲、乙双方共同遵守的约定应尽量 完善,以防止通信不能正确判别而失败。 STC89C51RC/RD+系列单片机的串行通信,可直接采用查询法,也可采用自动中断法。 246 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 (1)������������ 查询方式双机通信软件举例 ①�������� 甲机发送子程序段 下图为甲机发送子程序流程图。 开始 定时器,串行口初始化 发送数据 地址指针DPTR,长度计数器 R7,校验寄存器R6置初值 发送完否? N Y . d e t i m 发送校验和 发送呼叫信号06H Li 等待乙机回答 CU 等待乙机回答 N 是00H? C T S Y 发字节长度数 M N 传送正确吗? Y 返回 甲机发送程序设置: (a) �������������������������������������������� 波特率设置:选用定时器��������������������������������� /�������������������������������� 计数器����������������������������� 1���������������������������� 定时模式、工作方式������������������� 2������������������ ,计数常数������������� F3H���������� ,��������� SMOD=1��� 。波 特率为���������� 2400������ (位���� /��� 秒); (b) �������������������� 串行通信设置:异步通信方式������� 1������ ,允许接收; (c) �������������������������������������������� 内部������������������������������������������ RAM��������������������������������������� 和工作寄存器设置:������������������������������ 31H��������������������������� 和�������������������������� 30H����������������������� 单元存放发送的数据块首地址;��������� 2FH������ 单元存放 发送的数据块个数;���������� R6�������� 为累加和寄存器。 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 247 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 甲机发送子程序清单: START: MOV MOV MOV MOV MOV SETB ST-RAM: MOV MOV MOV MOV TX-ACK: MOV MOV WAIT1: JBC SJMP RX-YES: JBC SJMP NEXT1: MOV CJNE TX-BYT: MOV TMOD,#20H TH1, #0F3H TL1, #0F3H SCON, #50H PCON, #80H TR1 ;设置定时器/计数器1定时、工作方式2 ;设置定时计数常数 ; ;串口初始化 ;设置SMOD=1 ;启动定时 DPH, DPL, R7, R6, 31H 30H 2FH #00H ;设置外部RAM数据指针 ;DPTR初值 ;发送数据块数送R7 ;累加和寄存器R6清0 A, #06H ; SBUF, A ; T1, WAIT1 ;等待发送完呼叫信号 ;未发送完转WATI1 RX – YES RI, NEXT1 RX-YES C T S . d e t i m Li 发送呼叫信号“06H” U C M ;判断乙机回答信号 ;未收到回答信号,则等待 A, A, SBUF ;接收回答信号送A #00H, TX-ACK ;判断是否“00H”,否则重发呼叫信号 A, R7 ; MOV SBUF, ADD A, MOV R6, WAIT2: JBC TI, A R6 A ; 发送数据块数n TX-NES ; JMP TX-NES: MOVX MOV ADD MOV INC WAIT2 ; 等待发送完 A, SBUF, A, R6, DPTR @DPTR A R6 A ;从外部RAM取发送数据 ;发送数据块 248 南通国芯微电子有限公司 ;DPTR指针加1 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com WAIT3: JBC SJMP NEXT2: DJNZ TX-SUM: MOV MOV WAIT4: JBC TI, TI, WAIT3 NEXT2 ;判断一数据块发送完否 ;等待发送完 R7, TX-NES ;判断发送全部结束否 A, R6 SBUF, A ;发送累加和给乙机 RX-0FH ; SJMP RX-0FH: JBC WAIT4 ; 等待发送完 SJMP IF-0FH: MOV RX-0FH CJNE RET 临时技术支持:13922829991 研发顾问:13922809991 RI, A, A, IF-0FH SBUF; . d e t i m ; ; 等待接收乙机回答信号 ; Li #0FH, ST-RAM ; 判断传输是否正确,否则重新发送 ;返回 C T S U C M 乙机接收子程序段 接收程序段的设置: (a) ��������������� 波特率设置初始化:同发送程序; (b) �������������� 串行通信初始化:同发送程序; (c) ������ 寄存器设置: 内部RAM 31H、30H单元存放接收数据缓冲区首地址。 R7——数据块个数寄存器。 R6——累加和寄存器。 (d) ��������� 向甲机回答信号:“0FH”为接收正确,“F0H”为传送出错,“00H”为同意接收数 据,“05H”为暂不接收。 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 249 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 下图为双机通信查询方式乙机接收子程序流程图。 开始 定时器,串行口初始化 接收数据并存入RAM 地址指针DPTR赋值, 校验寄存器清0 地址指针DPTR加1 数据接收完否? N Y . d e t i m 接收呼叫信号 接收校验和 是06H? Y N 向甲机回送15H 向甲机回送00H C T S 接收数据块长度 Li 传送正确吗? U C M Y N 向甲机回送F0H 向甲机回送0FH 返回 接收子程序清单: TART: MOV MOV ; TL1, #0F3H TR1 SCON, #50H ; 定时器/计数器1设置 ;启动定时器/计数器1 ; 置串行通信方式1,允许接收 MOV ST-RAM: MOV PCON, #80H ; SMOD置位 DPH, 31H ; DPL, 30H R6, #00H ; 设置DPTR首地址 ;校验和寄存器清0 250 MOV SETB MOV TMOD, #20H TH1, #0F3H MOV MOV 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 RX-ACK: JBC RI, IF-06H SJMP RX-ACK MOV A, CJNEA #06H, TX-05H ;判断接收呼叫信号 ;等待接收呼叫信号 IF-06H: SBUF ;呼叫信号送A ;判断呼叫信号正确否? TX-00H: MOV A, #00H MOV WAIT1: SBUF, A JBC TI, SJMP WAIT1 ; ; RX-BYS 向甲机发送“00H”,同意接收 ;等待应答信号发送完 TX-05H: MOV A, #05H MOV SBUF, A ;不正确信号 WAIT2:  JBC TI, HAVE1 C T S LJMP RX-ACK RX-BYS: JBC SJMP WAIT2 HAVE1:  RI, Li U C M ;等待发送完 ;因呼叫错,返回重新接收呼叫 HAVE2 SJMP RX-BYS . d e t i m ;向甲机发送“05H”呼叫 ;等待接收数据块个数 ; HAVE2: MOV A, SBUF ; MOV R7, A ;数据块个数帧送R7,R6 MOV R6, A ; RX-NES: JBC RI, HAVE3 SJMP RX-NES HAVE3: A, ; MOV MOVX @DPTR,A INC DPTR ADD A, R6 MOV DJNZ R6, R7, A RX-NES 南通国芯微电子有限公司 ; SBUF 接收数据帧 ; ;接收到的数据存入外部RAM ; ; ; 形成累加和 ;判断数据是否接收完 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 251 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 RX-SUM: JBC RI, HAVE4 SJMP RX-SUM HAVE4: ; ; MOV A, SBUF CJNE TX-RIT: A, R6, MOV A, #0FH MOV WAIT3: JBC SJMP TX-ERR: MOV A, MOV SBUF, A JBC TI, ; ; ; #0F0H LJMP GOOD: AGAIN SJMP WAIT4 AGAIN: RET C T S ST-RAM ; WAIT4: ; GOOD WAIT3 TX-ERR ; SBUF, A TI, 判断传输是否正确 向甲机发送接收正确信息 . d e t i m 等待发送结束 Li ;向甲机发送传输有误信号 U C M 等待接收校验和 ;等待发送完 ;返回重新开始接收 ;传输正确返回 (2)中断方式双机通信软件举例 在很多应用场合,双机通信的双方或一方采用中断方式以提高通信效率。由于STC89C51RC/RD+系列单片机的串行通信是双工的,且中断系统只提供一个中断矢量入口地址, 所以实际上是中断和查询必须相结合,即接收/发送均可各自请求中断,响应中断时主机并不 知道是谁请求中断,统一转入同一个中断矢量入口,必须由中断服务程序查询确定并转入对应 的服务程序进行处理。 这里,任以上述协议为例,甲方(发送方)任以查询方式通信(从略),乙方(接收方) 则改用中断���������� —��������� 查询方式进行通信。 在中断接收服务程序中,需设置三个标志位来判断所接收的信息是呼叫信号还是数据块个 数,是数据还是校验和。增设寄存器:内部RAM32H单元为数据块个数寄存器,33H单元为校 验和寄存器,位地址7FH、7EH、7DH为标志位。 252 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 乙机接收中断服务程序清单 采用中断方式时,应在主程序中安排定时器/计数器、串行通信等初始化程序。通信接收的数据存放在外 部RAM的首地址也需在主程序中确定。 主程序: ORG AJMP START ORG 0023H LIMP SERVE 0000H ;转至主程序起始处 ;转中断服务程序处 · · · . d e t i m START: MOV TMOD, #20H MOV TH1, #0F3H MOV MOV TL1, #0F3H SCON, #50H MOV PCON, #80H SETB TR1 SETB 7FH SETB 7EH SETB 7DH MOV 31H,#10H MOV MOV SETB SETB 30H,#00H 33H,#00H EA ES C T S ;定义定时器/计数器1定时、工作方式2 ; Li ; 设置波特率为2400位/秒 ;设置串行通信方式1,允许接收 U C M ;设置SMOD=1 ;启动定时器 ; ;设置标志位为1 ; ; 规定接收的数据存储于外部RAM的 ; 起始地址1000H ;累加和单元清0 ; ; 开中断 · · · 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 253 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 中断服务程序: SERVE: CLR EA ;关中断 CLR RI ;清除接收中断请求标志 PUSH DPH ; PUSH DPL ; 现场保护 PUSH A JB 7FH, RXACK ;判断是否是呼叫信号 JB 7EH, RXBYS ;判断是否是数据块数据 JB 7DH, RXDATA ;判断是否是接收数据帧 MOV A, ;接收到的校验和 CJNE A, 33H, TXERR :判断传输是否正确 MOV A, ; ; RXSUM: SBUF TXRI: MOV WAIT1: #0FH SBUF, A JNB TI, WAITI CLR TI SJMP AGAIN TXERR: MOV MOV WAIT2: C T S A, SBUF, A JNB TI, CLR TI SJMP AGAIN ;等待发送完毕 ;转结束处理 ; ; WAIT2 Li 向甲机发送接收正确信号“0FH” ;清除发送中断请求标志位 #0F0H U C M ; . d e t i m 向甲机发送接收出错信号“F0H” ;等待发送完毕 ;清除发送中断请求标志 ;转结束处理 RXACK: MOV A, SBUF ;判断是否是呼叫信号“06H” XRL A, #06H ;异或逻辑处理 JZ TXREE ;是呼叫,则转TXREE TXNACK: 254 MOV A, #05H MOV SBUF, A 南通国芯微电子有限公司 ;接收到的不是呼叫信号,则向甲机发送 ;“05H”,要求重发呼叫 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 WAIT3: JNB TI, CLR TI SJMP RETURN WAIT3 ; 等待发送结束 ;转恢复现场处理 TXREE: MOV A, MOV SBUF, A #00H JNB TI, CLR TI CLR 7FH SJMP RETURN ;接收到的是呼叫信号,发送“00H” ;接收到的是呼叫信号,发送“00H” WAIT4: WAIT4 ;等待发送完毕 ;清除TI标志 ;清除呼叫标志 MOV A, MOV 32H, A ADD A, MOV CLR 33H, A 7EH SJMP RETURN SBUF 33H U C M ; Li ; 形成累加和 ;清除数据块数标志 ;转恢复现场处理 MOV DPH, 31H MOV MOV DPL, 30H A, SBUF ;接收到数据块数 ;存入32H单元 C T S RXDATA: ; MOVX @DPTR, A INC DPTR MOV 31H, DPH MOV ADD 30H, DPL A, 33H MOV DJNZ 33H, A 32H, RETURN ; 形成累加和 ;判断数据接收完否 CLR 7DH ;清数据接收完标志 SJMP RETURN 南通国芯微电子有限公司 ; 设置存储数据地址指针 ;读取数据帧 ;将数据存外部RAM . d e t i m ;转恢复现场处理 RXBYS: ;地址指针加1 ; ; ; 保存地址指针值 ;转恢复现场处理 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 255 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 AGAIN: SETB 7FH ; SETB 7EH ;恢复标志位 SETB 7DH ; MOV 33H, #00H ;累加和单元清0 MOV 31H, #10H ; 30H, ; ; MOV RETURN: POP A POP DPL POP DPH SETB EA RET1 #00H 恢复接收数据缓冲区首地址 ;恢复现场 ; . d e t i m ;开中断 ;返回 U C M Li 上述程序清单中,ORG为程序段说明伪指令,在程序汇编时,它向汇编程序说明该程序段 的起始地址。 在实际应用中情况多种多样,而且是两台独立的计算机之间进行信息传输。因此,应周密 考虑通信协议,以保证通信的正确性和成功率 C T S 256 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 8.6 多机通信 在很多实际应用系统中,需要多台微计算机协调工作。STC89C51RC/RD+系列单片机的 串行通信方式2和方式3具有多机通信功能,可构成各种分布式通信系统。下图为全双工主从 式多机通信系统的连接框图。 TxD 8051 RxD TxD RxD 8051 TxD 8051 U C M . d e t i m Li RxD TxD … RxD 8051 上图为一台主机和几台从机组成的全双工多机通信系统。主机可与任一台从机通信,而从 机之间的通信必须通过知己转发。 C T S (1)��������� 多机通信的基本原理 在多机通信系统中,为保证主机(发送)与多台从机(接收)之间能可靠通信,串行通 信必须具备识别能力。����������������������������������� MCS-51����������������������������� 系列单片机的串行通信控制寄存器�������������� SCON���������� 中设有多机通信选择位 SM2�������������������������������������������� 。当程序设置�������������������������������������� SM2=1��������������������������������� ,串行通信工作于方式����������������������� 2���������������������� 或方式������������������� 8������������������ ,发送端通过对����������� TB8�������� 的设置以区别于发 送的是地址帧(������������������������������������������� TB8=1�������������������������������������� )还是数据帧(������������������������������� TB8=0�������������������������� ),接收端通过对接收到��������������� RB8������������ 进行识别:当������ SM2=1� , 若接收到��������������������������������������������� RB8=1���������������������������������������� ,则被确认为呼叫地址帧,将该帧内容装入��������������������� SBUF����������������� 中,并置位������������ RI=1�������� ,向������ CPU��� 请求中 断,进行地址呼叫处理;若���������������������������������� RB8=0����������������������������� 为数据帧,将不予理睬,接收的信息被丢弃。若�������� SM2=0��� ,则无 论是地址帧还是数据帧均接收,并置位����������������������������� RI=1������������������������� ,向����������������������� CPU�������������������� 请求中断,将该帧内容装入�������� SBUF���� 。据此原 理,可实现多机通信。 对于上图的从机式多机通信系统,从机的地址为�������������������� 0������������������� ,������������������ 1����������������� ,���������������� 2��������������� ,�������������� …������������� ,������������ n����������� 。实现多机通信的过程如 下: ① 置全部从机的����������������� ����������������������� SM2=1������������ ,处于只接收地址帧状态。 ② 主机首先发送呼叫地址帧信息,将���������������������� ������������������������������������� TB8������������������� 设置为���������������� 1��������������� ,以表示发送的是������� ������ 呼叫地址帧。 ③ 所有从机接收到呼叫地址帧后,各自将接收到的主机呼叫的地址与本机的地址相比 ������������������������������������ 较:若比较结果相等,则为被寻址从机,清除����������������������� SM2=0������������������ ,准备接收从主机发送的数据帧,直至全 部数据传输完;若比较不相等,则为非寻址从机,任维持������������������ SM2=1������������� 不变,对其后发来的数据帧不 予理睬,即接收到的数据帧内容不装入���������������������������� SBUF������������������������ ,不置位,������������������� RI=0��������������� ,不会产生中断请求,直至被寻址 为止。 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 257 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 ④ 主机在发送完呼叫地址帧后,接着发送一连串的数据帧,其中的� ����������������������������� TB8=0�������������� ,以表示为数据帧。����� ⑤ 当主机改变从机通信时间则再发呼叫地址帧,寻呼其他从机,原先 ����������������������������� 被寻址的从机经分析得知主机在寻呼其他从机时,恢复其���������������� SM2=1����������� ,对其后主机发送的数据 帧不予理睬。 上述过程均在软件控制下实现。 (2)�������� 多机通信协议简述 ����������������������������� 由于串行通信是在二台或多台各自完全独立的系统之间进行信息传 输这就需要根据时间通信要求制定某些约定,作为通信规范遵照执行,协议要求严格、完 善,不同的通信要求,协议的内容也不相同。在多机通信系统中要考虑的问题较多,协议内容 比较复杂。这里仅例举几条作一说明。 . d e t i m Li 上图的主从式多机通信系统,允许配置���������������� 255������������� 台从机,各从机的地址分别为00H~FEH。 ① 约定地址�������������������������������������� ������������������������������������������ FFH����������������������������������� 为全部从机的控制命令,命令各从机恢复����������������� SM2=1������������ 状态,准备接收主机的地 址呼叫。 ② 主机和从机的联络过程约定:主机首先发送地址呼叫帧,被寻址的从机回送本机地址 �������������������������������������� 给主机,经验证地址相符后主机再向被寻址的从机发送命令字,被寻址的从机根据命 令字要求回送本机的状态,若主机判断状态正常,主机即开始发送或接收数据帧,发 送或接收的第一帧为传输数据块长度。 U C M C T S ③ 约定主机发送的命令字为: ������������ 00H����������� :要求从机接收数据块; 01H����������� :要求从机发送数据块; · · · 其他:非法命令。 ④ 从机的状态字格式约定为: ������������ B7 B6 B5 B4 B3 B2 B1 B0 ERR 0 0 0 0 0 TRDY RRDY 定义: ��������������������� 若���������������� ERR=1����������� ,从机接收到非法命令; 若���������������� ����������������� TRDY=1���������� ,从机发送准备就绪; 若���������������� ����������������� RRDY=1���������� ,从机接收准备就绪; ⑤ 其他:如传输出错措施等。 ������������ 258 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 (3)���� 程序举例 �������������������������������������� 在实际应用中如传输波特率不太高,系统实时性有一定要求以及希望提高通信效率,则 多半采用中断控制方式,但程序调试较困难,这就要求提高程序编制的正确性。采用查询方 式,则程序调试较方便。这里仅以中断控制方式为例简单介绍主������������� —������������ 从机之间一对一通信软件。 ① 主机发送程序 ������ 该主机要发送的数据存放在内部����������������������������� RAM�������������������������� 中,数据块的首地址为���������������� 51H������������� ,数据块长度存放做���� 50H� 单 元中,有关发送前的初始化、参数设置等采用子程序格式,所有信息发送均由中断服务程序完 成。当主机需要发送时,在完成发送子程序的调用之后,随即返回主程序继续执行。以后只需 查询��������������������������� PSW·5���������������������� 的��������������������� F0������������������� 标志位的状态即可知道数据是否发送完毕。 要求主机向��������������������� #5������������������� 从机发送数据,中断服务程序选用工作寄存存器区1的R0~R7。 . d e t i m 主机发送程序清单: ORG AJMP MAIN ORG 0023H ;发送中断服务程序入口 LJMP SERVE ;转中断服务程序 0000H Li . . . MAIN: ... C T S ... . . . ORG 1000H TXCALL: ;转主程序 U C M ;主程序 ;发送子程序入口 MOV TMOD, #20H MOV TH1, #0F3H ;设置波特率为2400位/秒 MOV TL1, #0F3H ;置位SMOD ;设置定时器/计数器1定时、方式2 MOV PCON, #80H SETB TR1 MOV SCON, #0D8H SETB EA ;开中断总控制位 CLR ES ;禁止串行通信中断 ; ;启动定时器/计数器1 ;串行方式8,允许接收,TB8=1 TXADDR: MOV SBUF, #05H JNB TI, CLR TI ;发送呼叫从机地址 WAIT1: 南通国芯微电子有限公司 WAIT1 ;等待发送完毕 ;复位发送中断请求标志 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 259 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 RXADDR: JNB RI, CLR TI MOV A, SBUF CJNE A, #05H, TXADDR CLR TB8 CLR PSW.5 RXADDR ;等待从机回答本机地址 ;复位接收中断请求标志 ;读取从机回答的本机地址 ;判断呼叫地址符否,否则重发 ;地址相符,复位TB8=0,准备发数据 ;复位F0=0标志位 MOV 08H, #50H ;发送数据地址指针送R0 MOV 0CH, 50H ;数据块长度送R4 INC 0CH SETB ES RET ;数据块长度加1 ;允许串行通信中断 SERVE: CLR TI U C M PUSH PSW PUSH A CLR RS1 Li ;中断服务程序段,清中断请求标志TI ; ; ; ; C T S . d e t i m ;返回主程序 . . . 现场入栈保护 SETB TXDATA: RS0 MOV SBUF, @R0 JNB TI, CLR TI ;复位TI=0 INC R0 ;地址指针加1 DJNZ R4, SETB PSW.5 ;已发送完毕置位F0=1 CLR ES ;关闭串行中断 WAIT2: WAIT2 RETURN 选择工作寄存器区1 ;发送数据块长度及数据 ;等待发送完毕 ;数据块未发送完,转返回 RETURN: POP A POP RETI PSW 260 南通国芯微电子有限公司 ; ; 恢复现场 ;返回 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 ②������ 从机接收程序 主机发送的地址呼叫帧,所有的从机均接收,若不是呼叫本机地址即从中断返回;若是 本机地址,则回送本机地址给主机作为应答,并开始接收主机发送来的数据块长度帧,并存放 于内部RAM的60H单元中,紧接着接收的数据帧存放于61H为首地址的内部RAM单元中,程序 中还选用20·0H、20·1H位作标志位,用来判断接收的是地址、数据块长度还是数据,选用了 2FH、2EH两个字节单元用于存放数据字节数和存储数据指针。#5从机的接收程序如下,供参 考。 #5从机接收程序清单: ORG AJMP START 0000H ORG 0023H LJMP SERVE ORG 0100H ;转主程序段 ;从中断入口转中断服务程序 START: MOV TMOD, #20H MOV TH1, #0F3H MOV TL1, #0F3H MOV PCON, #80H C T S MOV SCON, #0F0H SETB TR1 SETB U C M . d e t i m Li ;主程序段:初始化程序,设置定时 ;器/计数器1定时、工作方式2,设 ;置波特率为2400位/秒的有关初值 ;置位SMOD ;设置串行方式3,允许接收,SM2=1 ;启动定时器/计数器1 20·0 ; SETB SETB 20·1 EA ; ; 置标志位为1 SETB . . . ES ; 开中断 ORG 1000H ;清接收请求中断标志RI=0 ; SERVE: CLR RI PUSH A PUSH PSW CLR RS1 SETB JB RS0 20·0H, ISADDR ; 选择工作寄存器区1 ;判断是否是地址帧 JB 20·1H, ISBYTE ;判断是否是数据块长度帧 南通国芯微电子有限公司 ; ; 现场保护 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 261 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 ISDATA: MOV R0, 2EH MOV A, SBUF MOV @R0, A INC 2EH DJNZ 2FH, RETURN SETB 20·0H ; SETB 20·1H ;恢复标志位 SETB SM2 SJMP RETURN ;数据指针送R0 ;接收数据 ;数据指针加1 ;判断数据接收完否? ; ;转入恢复现场,返回 ISADDR: MOV A, SBUF CJNE MOV A, #05H, RETURN SBUF, #01H JNB TI, CLR TI CLR 20·0H CLR SM2 SJMP RETURN . d e t i m ; 是地址呼叫,判断与本机地址 WAIT: U C M Li ;等待发送结束 ;清0TI,20·0,SM2 ;清0TI,20·0,SM2 ;清0TI,20·0,SM2 C T S ISBYTES: WAIT ; 相符否,不符则转返回 ;相符,发回答信号“01H” ;转返回 MOV A, SBUF MOV R0, #60H MOV @R0, A ;将数据块长度存入内部RAM MOV 2FH, A ;60H单元及2FH单元 MOV 2EH, #61H CLR 20·1H ;接收数据块长度帧 ; ;置首地址61H于2EH单元 ;清20·1H标志,表示以后接收的为数据 RETURN: POP PSW POP RETI A ; ; 恢复现场 ;返回 多机通信方式可多种多样,上例仅以最简单的住一从式作了简单介绍,仅供参考。 对于串行通信工作方式0的同步方式,常用于通过移位寄存器进行扩展并行I/O口,或配 置某些串行通信接口的外部设备。例如,串行打印机、显示器等。这里就不一一举例了。 262 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 第9章 STC89C51RC/RD+系列EEPROM的应用 STC89C51RC/RD+�������������������������������������� 系列单片机内部集成了的EEPROM是与程序空间是分开的,利用ISP/IAP技 术可将内部Data Flash当EEPROM,擦写次数在10万次以上。EEPROM可分为若干个扇区,每个扇 区包含512字节。使用时,建议同一次修改的数据放在同一个扇区,不是同一次修改的数据放 在不同的扇区,不一定要用满。数据存储器的擦除操作是按扇区进行的。 EEPROM可用于保存一些需要在应用过程中修改并且掉电不丢失的参数数据。在用户程序 中,可以对EEPROM进行字节读/字节编程/扇区擦除操作。����������������� 在工作电压Vcc偏低时,建议不要进 行EEPROM/IAP操作。 9.1 IAP及EEPROM新增特殊功能寄存器介绍 符号 描述 地址 ISP/IAP Flash Data Register ISP/IAP Flash AdISP_ADDRH dress High ISP/IAP Flash AdISP_ADDRL dress Low ISP/IAP Flash ComISP_CMD mand Register ISP/IAP Flash ComISP_TRIG mand Trigger ISP/IAP Control ISP_CONTR Register ISP_DATA E3H E4H E5H U C M - - - LSB Li E2H C T S 南通国芯微电子有限公司 . d e t i m 位地址及符号 MSB 1111 1111B 0000 0000B 0000 0000B - - - MS1 MS0 E6H E7H 复位值 xxxx xx00B xxxx xxxxB ISPEN SWBS SWRST 总机:0513-5501 2928 / 2929 / 2966 - - WT2 WT1 WT0 000x x000B 传真:0513-5501 2969 / 2956 / 2947 263 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 1. ISP/IAP数据寄存器ISP_DATA ISP_DATA : ISP/IAP操作时的数据寄存器。 ISP/IAP 从Flash读出的数据放在此处,向Flash写的数据也需放在此处 2. ISP/IAP地址寄存器ISP_ADDRH和ISP_ADDRL ISP_ADDRH : ISP/IAP 操作时的地址寄存器高八位。������� 该寄存器地址为E3H,复位后值为00H. ISP_ADDRL : ISP/IAP 操作时的地址寄存器低八位。������� 该寄存器地址为E4H,复位后值为00H. 3. ISP/IAP命令寄存器ISP_CMD ISP/IAP命令寄存器IAP_CMD格式如下: SFR name Address bit B7 B6 B5 B4 B3 ISP_CMD E5H name - - - - - B2 B1 . d e t i m - MS1 B0 MS0 MS2 MS1 MS0 0 0 0 命令 / 操作 模式选择 Standby 待机模式,无ISP操作 0 0 1 从用户的应用程序区对"Data Flash/EEPROM区"进行字节读 0 1 0 从用户的应用程序区对"Data Flash/EEPROM区"进行字节编程 0 1 1 从用户的应用程序区对"Data Flash/EEPROM区"进行扇区擦除 U C M Li 程序在系统ISP程序区时可以对用户应用程序区/数据Flash区(EEPROM)进行字节读/字节编程 /扇区擦除;程序在用户应用程序区时,仅可以对数据Flash 区(EEPROM)进行字节读/字节编程 /扇区擦除。已经固化有ISP引导码,并设置为上电复位进入ISP C T S 4. ISP/IA命令触发寄存器ISP_TRIG ISP_TRIG: ISP/IAP 操作时的命令触发寄存器。 在ISPEN(ISP_CONTR.7) = 1 时,对ISP_TRIG先写入46h,再写入B9h,ISP/IAP 命令才会生效。 ISP/IAP操作完成后,ISP地址高八位寄存器ISP_ADDRH、ISP地址低八位寄存器ISP_ADDRL 和ISP命令寄存器ISP_CMD的内容不变。如果接下来要对下一个地址的数据进行ISP/IAP操作, 需手动将该地址的高8位和低8位分别写入ISP_ADDRH和ISP_ADDRL寄存器。 每次ISP操作时,都要对ISP_TRIG先写入46H,再写入B9H,ISP/IAP命令才会生效。 264 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 5. ISP/IAP命令寄存器ISP_CONTR ISP/IAP控制寄存器IAP_CONTR格式如下: SFR name Address IAP_CONTR E7H bit B7 B6 B5 name ISPEN SWBS SWRST B4 B3 B2 B1 B0 - - WT2 WT2 WT0 ISPEN: ISP/IAP功能允许位。0:禁止IAP/ISP读/写��� /�� 擦除Data Flash/EEPROM 1: 允许IAP/ISP读/写��� /�� 擦除Data Flash/EEPROM SWBS: 软件选择从用户应用程序区启动(送0),还是从������������ 系统���������� ISP������� 监控����� 程序区启动(送1)。 要与SWRST直接配合才可以实现 SWRST: 0: 不操作; 1: 产生软件系统复位,硬件自动��� 复位� 。 ;在用户应用程序区(AP区)软件复位并从系统ISP监控程序区开始执行程序 MOV ISP_CONTR, #01100000B ;SWBS = 1(选择ISP区), SWRST = 1(软复位) ;在系统ISP监控程序区软件复位并从用户应用程序区(AP 区)开始执行程序 MOV ISP_CONTR, #00100000B ;SWBS = 0(选择AP 区), SWRST = 1(软复位) 设置等待时间 WT2 WT1 WT0 0 0 0 0 1 1 0 0 1 0 1 0 . d e t i m Li CPU等待时间(机器周期),(1个机器周期=12个CPU工作时钟 ) Sector Erase Recommended System Clock Program/编程 Read/读 扇区擦除 跟等待参数对应的推荐系统 (=72uS) (=13.1304ms) 时钟 5MHz 6个机器周期 30个机器周期 5471个机器周期 10MHz 11个机器周期 60个机器周期 10942个机器周期 20MHz 22个机器周期 120个机器周期 21885个机器周期 40MHz 43个机器周期 240个机器周期 43769个机器周期 南通国芯微电子有限公司 C T S U C M 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 265 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 9.2 STC89C51RC/RD+系列单片机EEPROM空间大小及地址 STC89C51RC/RD+系列单片机内部可用EEPROM的地址与程序空间是分开的:程序在用户应用 程序区时,可以对EEPROM 进行IAP/ISP操作。 具体某个型号单片机内部EEPROM大小及详细地址请参阅: 1. STC89C51RC/RD+系列单片机内部EEPROM详细地址表 2. STC89C51RC/RD+系列单片机内部EEPROM空间大小选型一览表 STC89C51RC/RD+系列单片机内部EEPROM选型一览表 EEPROM字节数 扇区数 起始扇区首地址 结束扇区末尾地址 型号 STC89C51RC STC89LE51RC STC89C52RC STC89LE52RC STC89C54RD+ STC89LE54RD+ STC89C58RD+ STC89LE58RD+ STC89C510RD+ STC89LE510RD+ STC89C512RD+ STC89LE512RD+ STC89C514RD+ STC89LE514RD+ 4K 8 2000h 2FFFh 4K 8 2000h 2FFFh 45K 90 29K 58 C T S 13K 5K Li F3FFh 8000h F3FFh A000h F3FFh 26 C000h F3FFh 10 E000h F3FFh CU M 21K . d e t i m 4000h 42 STC89C51RC系列单片机内部EEPROM详细地址表 具体某型号有多少扇区的EEPROM,参照前面的EEPROM空间大小选型一览表, 每个扇区0.5 K字节 第一扇区 第二扇区 第三扇区 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 2000h 21FFh 2200h 23FFh 2400h 25FFh 第五扇区 第六扇区 第七扇区 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 2800h 29FFh 2A00h 2BFFh 2C00h 2DFFh 266 南通国芯微电子有限公司 第四扇区 起始地址 结束地址 每个扇区 512字节 建议同一次修改的 数据放在同一扇 第八扇区 区,不是同一次 起始地址 结束地址 修改的数据放在不 同的扇区,不必用 满, 当然可全用 2E00h 2FFFh 总机:0513-5501 2928 / 2929 / 2966 2600h 27FFH 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 STC89C58RD+系列单片机内部EEPROM详细地址表 具体某型号有多少扇区的EEPROM,参照前面的EEPROM空间大小选型一览表, 每个扇区0.5 K字节 第一扇区 第二扇区 第三扇区 第四扇区 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 8000h 81FFh 8200h 83FFh 8400h 85FFh 8600h 87FFh 第五扇区 第六扇区 第七扇区 第八扇区 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 8800h 89FFh 8A00h 8BFFh 8C00h 8DFFh 8E00h 8FFFh 第九扇区 第十扇区 第十一扇区 第十二扇区 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 9000h 91FFh 9200h 93FFh 9400h 95FFh 9600h 97FFh 第十三扇区 第十四扇区 第十五扇区 第十六扇区 . d e t i m 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 9800h 99FFh 1A00h 9BFFh 9C00h 9DFFh 9E00h 9FFFh 第十七扇区 第十八扇区 第十九扇区 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 A000h A1FFh A200h A3FFh A400h A5FFh 第二十一扇区 第二十二扇区 U C M 第二十三扇区 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 A800h A9FFh AA00h ABFFh AC00h ADFFh 第二十五扇区 起始地址 结束地址 B000h B1FFh 第二十九扇区 起始地址 结束地址 B800h B9FFh 第三十三扇区 C T S 第二十六扇区 第二十七扇区 Li 第二十扇区 起始地址 结束地址 A600h A7FFh 第二十四扇区 起始地址 结束地址 AE00h AFFFH 第二十八扇区 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 B200h B3FFh B400h B5FFh B600h B7FFH 第三十扇区 第三十一扇区 第三十二扇区 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 BA00h BBFFh BC00h BDFFh BE00h BFFFH 第三十四扇区 第三十五扇区 第三十六扇区 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 C000h C1FFh C200h C3FFh C400h C5FFh C600h C7FFH 第三十七扇区 第三十八扇区 第三十九扇区 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 C800h C9FFh CA00h CBFFh CC00h CDFFh CE00h CFFFH 第四十二扇区 第四十三扇区 第四十四扇区 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 D000h D1FFh D200h D3FFh D400h D5FFh D600h D7FFH 第四十五扇区 第四十六扇区 第四十七扇区 第四十八扇区 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 D800h D9FFh DA00h DBFFh DC00h DDFFh DE00h DFFFH 第四十九扇区 第五十扇区 第五十一扇区 第五十二扇区 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 E000h E1FFh E200h E3FFh E400h E5FFh E600h E7FFH 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 建议同一次修 改的数据放在 同一扇区,不 是同一次修改 的数据放在不 同的扇区,不 必用满, 当 然可全用 第四十扇区 起始地址 第四十一扇区 每个扇区 512字节 传真:0513-5501 2969 / 2956 / 2947 267 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 STC89C58RD+系列单片机内部EEPROM详细地址表 具体某型号有多少扇区的EEPROM,参照前面的EEPROM空间大小选型一览表, 每个扇区0.5 K字节 第五十三扇区 第五十四扇区 第五十五扇区 第五十六扇区 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 E800h E9FFh EA00h EBFFh EC00h EDFFh EE00h EFFFH 第五十七扇区 结束地址 起始地址 结束地址 F000h F1FFh F200h F3FFh C T S 268 建议同一次修改 的数据放在同一 扇区,不是同一 次修改的数据放 在不同的扇区, 不必用满, 当然 可全用 第五十八扇区 起始地址 南通国芯微电子有限公司 U C M 每个扇区 512字节 . d e t i m Li 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 9.3 IAP及EEPROM汇编简介 ;用DATA还是EQU声明新增特殊功能寄存器地址要看你用的汇编器/编译器 IAP_DATA DATA 0E2h; IAP_DATA EQU 0E2h IAP_ADDRH DATA 0E3h; 或 IAP_ADDRH EQU 0E3h IAP_ADDRL DATA 0E4h; 或 IAP_ADDRL EQU 0E4h IAP_CMD DATA 0E5h; 或 IAP_CMD EQU 0E5h IAP_TRIG DATA 0E6h; 或 IAP_TRIG EQU 0E6h IAP_CONTR DATA 0E7h; 或 IAP_CONTR EQU 0E7h 或 . d e t i m ;定义ISP/IAP命令及等待时间 ISP_IAP_BYTE_READ EQU 1 ;字节读 ISP_IAP_BYTE_PROGRAM EQU 2 ;字节编程,前提是该字节是空,0FFh ISP_IAP_SECTOR_ERASE EQU 3 ;扇区擦除,要某字节为空,要擦一扇区 WAIT_TIME 0 ;设置等待时间,30MHz以下0,24M以下1, ;20MHz以下2,12M以下3,6M以下4,3M以下5,2M以下6,1M以下7, MOV IAP_ADDRH, #BYTE_ADDR_HIGH ;送地址高字节 MOV IAP_ADDRL, #BYTE_ADDR_LOW ;送地址低字节 MOV IAP_CONTR, #WAIT_TIME ;设置等待时间 ORL IAP_CONTR, #10000000B ;允许ISP/IAP操作 MOV IAP_CMD, #ISP_IAP_BYTE_READ EQU C T S ;字节读 U C M Li 地址需要改变时 才需重新送地址 此两句可以合成一句, 并且只送一次就够了 ;送字节读命令,命令不需改变时,不需重新送命令 ����������������������� MOV IAP_TRIG, #46h ;先送46h,再送B9h到ISP/IAP触发寄存器,每次都需如此 MOV IAP_TRIG, #0B9h ;送完B9h后,ISP/IAP命令立即被触发起动 ;CPU等待IAP动作完成后,才会继续执行程序。 NOP A, ISP_DATA MOV 南通国芯微电子有限公司 ;数据读出到IAP_DATA寄存器后,CPU继续执行程序 ;将读出的数据送往Acc 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 269 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 ;以下语句可不用,只是出于安全考虑而已 MOV IAP_CONTR, #00000000B ;禁止ISP/IAP操作 MOV IAP_CMD, #00000000B ;去除ISP/IAP命令 ;MOV IAP_TRIG, #00000000B ;防止ISP/IAP命令误触发 ;MOV IAP_ADDRH, #0FFh ;送地址高字节单元为00,指向非EEPROM区 ;MOV IAP_ADDRL, #0FFh ;送地址低字节单元为00,防止误操作 ;字节编程,该字节为FFh/空时,可对其编程,否则不行,要先执行扇区擦除 MOV IAP_DATA, #ONE_DATA ;送字节编程数据到IAP_DATA, ;只有数据改变时才需重新送 MOV IAP_ADDRH, #BYTE_ADDR_HIGH MOV IAP_ADDRL, #BYTE_ADDR_LOW MOV IAP_CONTR, #WAIT_TIME ORL IAP_CONTR, #10000000B MOV IAP_CMD, #ISP_IAP_BYTE_PROGRAM ;送字节编程命令 MOV IAP_TRIG, #46h MOV IAP_TRIG, #0B9h ;送完B9h后,ISP/IAP命令立即被触发起动 C T S U C M . d e t i m ;送地址高字节 Li ;送地址低字节 地址需要改变时 才需重新送地址 ;设置等待时间 ;允许ISP/IAP操作 此两句可合成 一句,并且只 送一次就够了 ;先送46h,再送B9h到ISP/IAP触发寄存器,每次都需如此 ;CPU等待IAP动作完成后,才会继续执行程序. NOP ;字节编程成功后,CPU继续执行程序 ;以下语句可不用,只是出于安全考虑而已 MOV IAP_CONTR, #00000000B ;禁止ISP/IAP操作 MOV IAP_CMD, #00000000B ;去除ISP/IAP命令 ;MOV IAP_TRIG, #00000000B ;防止ISP/IAP命令误触发 ;MOV IAP_ADDRH, #0FFh ;送地址高字节单元为00,;指向非EEPROM区,防止误操作 ;MOV IAP_ADDRL, #0FFh ;送地址低字节单元为00,指向非EEPROM区,防止误操作 270 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 ;扇区擦除,没有字节擦除,只有扇区擦除,512字节/扇区,每个扇区用得越少越方便 ;如果要对某个扇区进行擦除,而其中有些字节的内容需要保留,则需将其先读到单片机 ;内部的RAM中保存,再将该扇区擦除,然后将须保留的数据写回该扇区,所以每个扇区 ;中用的字节数越少越好,操作起来越灵活越快. ;扇区中任意一个字节的地址都是该扇区的地址,无需求出首地址. MOV IAP_ADDRH, #SECTOR_FIRST_BYTE_ADDR_HIGH ;送扇区起始地址高字节 MOV IAP_ADDRL, #SECTOR_FIRST_BYTE_ADDR_LOW ;送扇区起始地址低字节 MOV IAP_CONTR, ORL ;地址需要改变时才需重新送地址 #WAIT_TIME ;设置等待时间 IAP_CONTR, #10000000B ;允许ISP/IAP MOV IAP_CMD, #ISP_IAP_SECTOR_ERASE . d e t i m Li 此两句可以合 成一句,并且只 送一次就够了 ;送扇区擦除命令,命令不需改变时,不需重新送命令 U C M MOV IAP_TRIG, #46h ;先送46h,再送B9h到ISP/IAP触发寄存器,每次都需如此 MOV C T S IAP_TRIG, #0B9h ;送完B9h后,ISP/IAP命令立即被触发起动 ;CPU等待IAP动作完成后,才会继续执行程序. NOP ;扇区擦除成功后,CPU继续执行程序 ;以下语句可不用,只是出于安全考虑而已 MOV IAP_CONTR, #00000000B ;禁止ISP/IAP操作 MOV IAP_CMD, #00000000B ;去除ISP/IAP命令 ;MOV IAP_TRIG, #00000000B ;防止ISP/IAP命令误触发 ;MOV IAP_ADDRH, #0FFh ;送地址高字节单元为00,指向非EEPROM区 ;MOV IAP_ADDRL, #0FFh ;送地址低字节单元为00,防止误操作 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 271 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 小常识: (STC单片机的Data Flash 当EEPROM功能使用) 3个基本命令----字节读,字节编程,扇区擦除 字节编程:将“1”����������������������������������� 写成“1”或����������������������������� “0”,������������������������� 将������������������������ “0”��������������������� 写成“0”。��������������� 如果������������� 某������������ 字节是FFH,����� 才���� 可��� 对其进 如果该字节������������������������������� 不是F F H�������������������������� ,则须先将整个扇区擦除,因为只有“扇区擦除”才可以将 行字节编程。������������������������������������ “0”变为“1”。 扇区擦除:只有“扇区擦除”才可能将“0”擦除为“1”。 大建议: . d e t i m 1.同一次修改的数据放在同一扇区中,不是同一次修改的数据放在另外的扇区,就不须读出保 护。 Li 2.如果一个扇区只用一个字节,那就是真正的EEPROM,STC单片机的Data Flash比外部EEPROM要 快很多,读一个字节/编程一个字节大概是10uS/60uS/10mS。 U C M 3.如果在一个扇区中存放了大量的数据,某次只需要修改其中的一个字节或一部分字节时,则 另外的不需要修改的数据须先读出放在STC单片机的RAM中,然后擦除整个扇区,再将需要保留 的数据和需修改的数据�������������������������������� 按字节逐字节�������������������������� 写回该扇区中(������������������� 只有字节写命令,无连续字节写命令��� )。这 时每个扇区使用的字节数是使用的越少越方便(不需读出一大堆需保留数据)。 C T S 常问的问题: 1:IAP指令完成后,地址是否会自动“加1”或“减1”? 答:不会 2:送46和B9触发后,下一次IAP命令是否还需要送46和B9触发? 答:是,一定要。 272 南通国芯微电子有限公司 总机:0513-5501 2928 / 2929 / 2966 传真:0513-5501 2969 / 2956 / 2947 STC89C51RC/RD+系列单片机指南 技术支持网站:www.STCMCU.com 临时技术支持:13922829991 研发顾问:13922809991 9.4 EEPROM测试程序(C程序及汇编程序) 1. C程序: ;STC89C51RC/RD+系列单片机EEPROM/IAP 功能测试程序演示 /*------------------------------------------------------------------------------------*/ /* --- STC MCU Limited ---------------- ---------------------------------------*/ /* --- 演示STC89xx系列单片机 EEPROM/IAP功能--------------------*/ /* --- Mobile: (86)13922809991 -----------------------------------------------*/ /* --- Fax: 86-755-82905966 ---------------------------------------------------*/ /* --- Tel: 86-755-82948412 ----------------------------------------------------*/ /* --- Web: www.STCMCU.com -----------------------------------------------*/ /* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/ /* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/ /*-------------------------------------------------------------------------------------*/ #include "reg51.h" #include "intrins.h" typedef unsigned char BYTE; typedef unsigned int WORD; U C M /*Declare SFR associated with the IAP */ sfr IAP_DATA = 0xE2; //Flash data register sfr IAP_ADDRH = 0xE3; //Flash address HIGH sfr IAP_ADDRL = 0xE4; //Flash address LOW sfr IAP_CMD = 0xE5; //Flash command register sfr IAP_TRIG = 0xE6; //Flash command trigger sfr IAP_CONTR = 0xE7; //Flash control register C T S . d e t i m Li /*Define ISP/IAP/EEPROM command*/ #define CMD_IDLE 0 //Stand-By #define CMD_READ 1 //Byte-Read #define CMD_PROGRAM 2 //Byte-Program #define CMD_ERASE 3 //Sector-Erase /*Define ISP/IAP/EEPROM operation const for IAP_CONTR*/ //#define ENABLE_IAP 0x80 //if SYSCLK
STC89C52RC-40I-PDIP40 价格&库存

很抱歉,暂时无法提供与“STC89C52RC-40I-PDIP40”相匹配的价格&库存,您可以联系我们找货

免费人工找货
STC89C52RC-40I-PDIP40
  •  国内价格
  • 1+5.19884
  • 10+4.79884
  • 30+4.71884
  • 100+4.47884

库存:967

STC89C52RC-40I-PDIP40
    •  国内价格
    • 1+9.04370
    • 10+8.15430
    • 33+6.90690
    • 99+6.28320
    • 528+6.02910
    • 1056+5.91360

    库存:0

    STC89C52RC-40I-PDIP40
      •  国内价格
      • 1+5.07150

      库存:0

      STC89C52RC-40I-PDIP40
        •  国内价格
        • 15+6.96355

        库存:0