STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
STC15F204EA系列单片机器件手册
---1个时钟/机器周期8051
---�����
超强加密,第八代加密技术
---超低功耗,超低价
---高速,高可靠
---强抗静电,强抗干扰
STC15F201EA
STC15F202EA
STC15F203EA
STC15F204EA
STC15F205EA
IAP15F206A
C
T
S
U
C
M
.
d
e
t
i
m
STC15F201A
STC15F202A
STC15F203A
STC15F204A
STC15F205A
Li
全部中国本土独立自主知识产权,请全体中国人民支持,您的
支持是中国本土�����������
力量前进的������
有力保证.
请同行不要再抄袭我们的规格和管脚排列,再抄袭就很无耻了
STC-ISP:最方便的在线升级软件
封装后,全部175oC八小时高温烘烤,高品质封装保证
采用STC第八代加密技术,现悬赏
10万元人民币请专家帮忙查找加密有无漏洞
Update date: 2011/10/30
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
目录
第1章 STC15F204EA系列单片机总体介绍............................. 7
1.1 STC15F204EA系列单片机简介..................................7
1.2 STC15F204EA系列单片机的内部结构............................8
1.3 STC15系列单片机管脚图.......................................9
1.3.1 STC15F204EA系列单片机管脚图...................................... 9
1.3.2 STC15F100系列单片机管脚图........................................ 10
1.4 STC15系列单片机选型一览表........................................ 11
1.4.1 STC15F204EA系列单片机选型一览表................................. 11
1.4.2 STC15F100系列单片机选型一览表.................................... 12
1.4.3 STC15S204EA系列单片机选型一览表................................. 13
1.5
1.6
1.7
1.8
STC15F204EA系列单片机最小应用系统............................. 14
STC15F204EA系列在系统可编程(ISP)典型应用线路图............... 15
STC15F204EA系列管脚说明......................................... 16
STC15系列单片机封装尺寸图........................................ 18
1.8.1 STC15F204EA系列封装尺寸图....................................... 18
1.8.2 STC15F101E系列封装尺寸图........................................ 20
1.8.3 STC15S204EA系列封装尺寸图....................................... 22
1.9 STC15系列单片机命名规则.......................................... 24
1.9.1 STC15F204EA系列单片机命名规则................................... 24
1.9.2 STC15F100系列单片机命名规则...................................... 25
1.10 每个单片机具有全球唯一身份证号码(ID号)........................ 26
第2章 STC15F204EA系列的时钟,省电模式及复位................ 30
2.1 STC15F204EA系列单片机的内部可配置时钟......................... 30
2.2
2.1.1 内部时钟分频和分频寄存器......................................... 31
2.1.2 可编程时钟输出................................................... 33
STC15F204EA系列单片机的省电模式................................ 36
2.2.1 低速模式......................................................... 38
2.2.2 空闲模式......................................................... 39
2.2.3 掉电模式/停机模式及测试程序(C程序和汇编程序)..................... 39
2.2.4 掉电模式/停机模式可由内部掉电唤醒专用定时器唤醒(测试程序)........ 45
2.3 复位.................................................................. 49
2.3.1 外部RST引脚复位.................................................. 49
2.3.2
2.3.3
2.3.4
2.3.5
2.3.6
2.3.7
软件复位......................................................... 49
掉电复位/上电复位................................................ 50
MAX810专用复位电路复位.......................................... 50
内部低压检测复位................................................. 50
看门狗(WDT)复位.................................................. 54
冷启动复位和热启动复位........................................... 59
第3章 片内存储器和特殊功能寄存器(SFRs)......................... 60
3.1 程序存储器........................................................... 60
3.2 数据存储器(SRAM).................................................. 61
3.3 特殊功能寄存器(SFRs)............................................... 63
第4章 STC15F204EA系列单片机的I/O口结构....................... 67
4.1 I/O口各种不同的工作模式及配置介绍................................ 67
4.2 新增特殊功能寄存器地址声明........................................ 69
4.3 I/O口各种不同的工作模式结构框图.................................. 71
4.3.1
4.3.2
4.3.3
4.3.4
准双向口输出配置................................................. 71
强推挽输出配置................................................... 72
仅为输入(高阻)配置............................................. 72
开漏输出配置(若外加上拉电阻,也可读)............................. 72
4.4 一种典型三极管控制电路............................................ 74
4.5 典型发光二极管控制电路............................................ 74
4.6 混合电压供电系统3V/5V器件I/O口互连.............................. 74
4.7 如何让I/O口上电复位时为低电平.................................... 75
4.8 I/O口直接驱动LED数码管应用线路图................................ 76
4.9 I/O口直接驱动LCD应用线路图....................................... 77
4.10 A/D做按键扫描应用线路图......................................... 78
第5章 指令系统........................................................... 79
5.1 寻址方式............................................................. 79
5.1.1
5.1.2
5.1.3
5.1.4
5.1.5
5.1.6
5.1.7
立即寻址......................................................... 79
直接寻址......................................................... 79
间接寻址......................................................... 79
寄存器寻址....................................................... 80
相对寻址......................................................... 80
变址寻址......................................................... 80
位寻址........................................................... 80
5.2 指令系统分类总结.................................................... 81
5.3 传统8051单片机指令定义详解(中文&English)........................ 88
5.3.1 传统8051单片机指令定义详解....................................... 88
5.3.2 Instruction Definitions of Traditional 8051 MCU......................... 128
第6章 中断系统.......................................................... 165
6.1
6.2
6.3
6.4
6.5
6.6
中断结构............................................................167
中断寄存器..........................................................169
中断优先级..........................................................175
中断处理............................................................176
外部中断............................................................177
外部中断的测试程序(C程序和汇编程序)............................178
6.6.1
6.6.2
6.6.3
6.6.4
6.6.5
外部中断0(INT0)的测试程序(可支持上升沿或下降沿中断)..............
外部中断1(INT1)的测试程序(可支持上升沿或下降沿中断)..............
外部中断2(INT2)的测试程序(下降沿中断)............................
外部中断3(INT3)的测试程序(下降沿中断)............................
外部中断4(INT4)的测试程序(下降沿中断)............................
178
180
182
184
186
第7章 定时器/计数器................................................... 188
7.1 定时器/计数器的相关寄存器.......................................188
7.2 定时器/计数器0工作模式...........................................193
7.2.1
7.2.2
7.2.3
7.2.4
7.3
模式0(16位自动重装)及测试程序,建议只学习此模式足矣.............. 193
模式1(16位定时器),不建议学习.................................... 197
模式2(8位自动重装模式),不建议学习............................... 198
模式3(两个8位计数器),不建议学习................................. 199
定时器/计数器1工作模式...........................................200
7.3.1 模式0(16位自动重装)及测试程序,建议只学习此模式足矣.............. 200
7.3.2 模式1(16位定时器),不建议学习.................................... 204
7.3.3 模式2(8位自动重装模式),不建议学习............................... 205
7.4 可编程时钟输出.....................................................206
7.5
7.4.1 内部R/C时钟输出的测试程序(C程序和汇编程序)...................... 208
7.4.2 定时器0的可编程时钟输出的测试程序(C程序和汇编程序).............. 210
7.4.3 定时器1的可编程时钟输出的测试程序(C程序和汇编程序).............. 212
古老的Intel 8051单片机定时器0/1应用举例..........................214
第8章 模拟串口的实现程序............................................ 219
8.1 利用定时器0实现模拟串口的测试程序(C程序和汇编程序)..........219
8.2 利用定时器1实现模拟串口的测试程序(C程序和汇编程序)..........228
第9章 STC15F204EA系列单片机的A/D转换器..................... 237
9.1
9.2
9.3
9.4
9.5
9.6
A/D转换器的结构...................................................237
与A/D转换相关的寄存器............................................238
A/D转换典型应用线路..............................................242
A/D做按键扫描应用线路图..........................................243
A/D转换模块的参考电压源..........................................244
A/D转换测试程序(C程序和汇编程序)...............................245
9.6.1 A/D转换测试程序(ADC中断方式)................................... 245
9.6.2 A/D转换测试程序(ADC查询方式)................................... 256
第10章 STC15F204EA系列单片机EEPROM的应用............... 267
10.1
10.2
10.3
10.4
10.5
IAP及EEPROM新增特殊功能寄存器介绍..........................267
STC15F204EA系列单片机EEPROM空间大小及地址...............271
IAP及EEPROM汇编简介...........................................272
EEPROM测试程序(不使用模拟串口)..............................276
EEPROM测试程序(使用模拟串口送出显示).......................284
第11章 STC15系列单片机开发/编程工具说明...................... 298
11.1 在系统可编程(ISP)原理,官方演示工具使用说明..................298
11.1.1
11.1.2
11.1.3
11.1.4
11.1.6
在系统可编程(ISP)原理使用说明................................... 298
STC15F204EA系列在系统可编程(ISP)典型应用线路图................. 299
电脑端的STC-ISP控制软件界面使用说明............................ 301
STC-ISP(最方便的在线升级软件)下载编程工具硬件使用说明.......... 305
若无RS-232转换器,如何用STC的ISP下载板做RS-232通信转换......... 306
编译器/汇编器,编程器,仿真器..................................307
11.2
11.3 自定义下载演示程序(实现不停电下载)............................308
附录A
附录B
附录C
附录D
附录E
附录F
附录G
汇编语言编程.................................................... 311
C语言编程....................................................... 333
STC15F204EA系列单片机电气特性......................... 343
STC15xx系列单片机取代传统8051注意事项............... 344
STC15F204EA系列单片机选型一览表....................... 347
如何采购.......................................................... 348
A版本设计错误特别声明,将在B版本中修正.............. 349
——B版本将在2012年4月后开始送样,现A版本小批量供货........... 349
G.1
G.2
G.3
G.4
G.5
G.6
A版本的外部中断有时会异常,B版本的外部中断可正常使用.....349
B版本的内部IRC可编程时钟输出修改.........................349
CLKOUT0和CLKOUT1设计错误更正.........................351
内部系统时钟分频设计错误更正.............................352
EEPROM/IAP功能使用注意事项.............................353
A版本的寄存器PCON中无上电复位标志POF位,而B版本中有......354
附录H STC15F204EA系列B版本对指令系统的提升............... 355
附录I STC15F204EA系列B版本新增加了掉电唤醒专用定时器.. 361
附录J:如何利用Keil C软件减少代码长度.......................... 365
附录K:每日更新内容的备忘录....................................... 366
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
第1章 STC15F204EA系列单片机总体介绍
1.1 STC15F204EA系列单片机简介
STC15F204EA系列单片机是STC生产的单时钟/机器周期(1T)的单片机,是高速/���
高可靠
/低功耗����������
/超强抗干扰的新一代8051单片机,���������������������
采用第八代加密技术,加密性超强,�����
指令代码完
全兼容传统8051,但速度快6-12倍。�������
内部集成高精度R/C时钟,±1%温飘,常温下温飘5‰,
5MHz~35MHz宽范围可设置,可彻底省掉外部昂贵的晶振。8路高速10位A/D转换(30万次/秒),
针对电机控制,强干扰场合。
1. 增强型 8051 CPU,1T,单时钟/机器周期,速度比普通8051快6-12倍
2. 工作电压:
STC15F204EA 系列工作电压:5.5V - 3.8V(5V 单片机)
STC15L204EA 系列工作电压:3.6V - 2.4V(3V 单片机)
3��. 内部高可靠复位,8级可选复位门槛电压,彻底省掉外部复位电路
�����������������������������
4 . 内 部 高 精 度 R / C 时 钟 , ± 1 % 温 飘 ( - 4 0 oC ~ + 8 5 oC ) , 常 温 下 温 飘 5 ‰ , 内 部 时 钟 从
5MHz~35MHz可选(5.5296MHz / 11.0592MHz / 22.1184MHz / 33.1776MHz)
5. 工作频率范围:5MHz ~ 35MHz,相当于普通8051的60MHz~420MHz
6��. 低功耗设计:低速模式,空闲模式,掉电模式(可由外部中断唤醒)
������������������������������
7. 支持掉电唤醒的管脚:INT0/P3.2, INT1/P3.3, INT2, INT3, INT4
8. 1K/2K/3K/4K/5K字节片内Flash�������
程序�����
存储器, 擦写次数10万次以上
����������
9. 片上集成 256 字节 RAM
10.有EEPROM 功能�����������
,擦写次数10万次以上
11.ISP/IAP,在系统可编程/在应用可编程,无需编程器/仿真器
12.8������������������������������������������
通道,10位高速ADC,速度可达30万次/秒,2路定时器还可当2路PWM或D/A使用
13.2个16位可重装载定时器,兼容普通8051的定时器T0/T1,并可实现时钟输出和PWM功能
14.可编程时钟输出功能,T0在P3.5输出时钟,T1在P3.4输出时钟,在P0.0口输出内部高精
度R/C时钟IRC_CLK(也可2分频输出IRC_CLK/2)。
15.硬件���
看门狗(WDT)
C
T
S
U
C
M
.
d
e
t
i
m
Li
16.串口功能可由[P3.0/INT4,P3.1]结合定时器实现
17.先进的指令集结构,兼容普通8051指令集,有硬件乘法/除法指令
18.26���������������������������������������
个��������������������������������������
通用I/O口,复位后为: 准双向口/弱上拉(普通8051传统I/O口)
可设置成四种模式:准双向口/弱上拉,�����
强����
推挽/ 强上拉,仅为输入/
�����������������
高阻,开漏
每个I/O 口驱动能力均可达到20mA,但整个芯片最大不要超过90mA
19����
.封装:SOP-28, SKDIP-28
20.全部175oC 八小时高温烘烤,高品质制造保证
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.2 STC15F204EA系列单片机的内部结构
STC15F204EA系列单片机的内部结构框图如下图所示。STC15F204EA系列单片机中包含
中央处理器(CPU)、程序存储器(Flash)、数据存储器(SRAM)、定时器、I/O口、高速A/D转
换、看门狗、片内高精度R/C振荡时钟及高可靠复位等模块。
RAM
256 字节
B寄存器
ACC
.
d
e
t
i
m
堆栈指针
TMP2
TMP1
Li
定时器/计数器 0
定时器/计数器 1
U
C
M
ALU
内部
高可靠复位
(8级可选复位门槛电压)
C
T
S
控制单元
PSW
看门狗
(WDT)
程序存储器(Flash)
1-6K
ISP/IAP
地址生成器
程序计数器(���
PC)
Port 0,2,3
锁存器
Port1 锁存器
ADC
内部高精度R/C振荡器, Port 1 驱动器
8
±1%温飘(-40oC~+85oC),
P1.0 ~ P1.7
常温下温飘5‰
P1.0 ~ P1.7
Port 0,2,3
驱动器
P0,P2,P3
STC15F204EA系列内部结构框图
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.3 STC15系列������
单片机���
管脚图
1.3.1 STC15F204EA系列单片机管脚图
中国大陆本土STC姚永平独立创新设计:
请不要再抄袭我们的规格和管脚排列,
再抄袭就很无耻了。
所有封装形式均满足欧盟RoHS要求,
强烈推荐选择SOP-28/20/8贴片封装,传统的插件SKDIP/DIP封装稳定供货
STC15F204EA系列管脚图
STC15F系列B版本将在2012年4月后开始送样.
P2.5
27
P2.4
ADC0/P1.0
3
26
P2.3
ADC1/P1.1
4
25
P2.2
ADC2/P1.2
5
24
P2.1
ADC3/P1.3
6
23
P2.0/RSTOUT_LOW
ADC4/P1.4
7
22
P3.7/INT3
ADC5/P1.5
8
21
P3.6/INT2
ADC6/P1.6
9
20
P3.5/T1/CLKOUT0
ADC7/P1.7
10
19
P3.4/T0/CLKOUT1
IRC_CLKO/RST/P5.4
11
18
P3.3/INT1
Vcc
12
17
P3.2/INT0
P5.5
13
16
P3.1
Gnd
14
15
P3.0/INT4
ISP/IAP
C
T
S
SOP-28/SKDIP-28
ADC2/P1.2
CU
i
m
i
ADC0/P1.0
18
P3.7/INT3
17
P3.6/INT2
16
P3.5/T1/CLKOUT0
15
P3.4/T0/CLKOUT1
14
P3.3/INT1
13
P3.2/INT0
9
12
P3.1
10
11
P3.0/INT4
ADC4/P1.4
3
ADC5/P1.5
4
ADC6/P1.6
5
ADC7/P1.7
6
IRC_CLKO/RST/P5.4
7
Vcc
8
P5.5
Gnd
L
ADC1/P1.1
19
2
M
.
d
te
20
1
ADC3/P1.3
ISP/IAP
28
2
18 I/O Ports
1
P2.7
26 I/O Ports
P2.6
SOP-20/DIP-20
以上为STC15F204EA系列B版本管脚图
特别声明:A版本和B版本管脚图中有两个管脚有差别
B版本中为
P5.4/RST/IRC_CLKO P5.5
A版本中为
P0.0/RST/IRC_CLKO P0.1
以下为STC15F204EA系列A版本管脚图
P2.5
27
P2.4
ADC0/P1.0
3
26
P2.3
ADC1/P1.1
4
25
P2.2
ADC2/P1.2
5
24
P2.1
ADC3/P1.3
6
23
P2.0/RSTOUT_LOW
ADC4/P1.4
7
22
P3.7/INT3
ADC5/P1.5
8
21
P3.6/INT2
ADC6/P1.6
9
20
P3.5/T1/CLKOUT0
ADC7/P1.7
10
19
P3.4/T0/CLKOUT1
IRC_CLKO/RST/P0.0
11
18
P3.3/INT1
Vcc
12
17
P3.2/INT0
P0.1
13
16
P3.1
Gnd
14
15
P3.0/INT4
ISP/IAP
ADC2/P1.2
1
20
ADC1/P1.1
ADC3/P1.3
2
19
ADC0/P1.0
ADC4/P1.4
3
18
P3.7/INT3
ADC5/P1.5
4
17
P3.6/INT2
ADC6/P1.6
5
16
P3.5/T1/CLKOUT0
ADC7/P1.7
6
15
P3.4/T0/CLKOUT1
IRC_CLKO/RST/P0.0
7
14
P3.3/INT1
Vcc
8
13
P3.2/INT0
P0.1
9
12
P3.1
Gnd
10
11
P3.0/INT4
ISP/IAP
28
2
18 I/O Ports
1
P2.7
26 I/O Ports
P2.6
SOP-20/DIP-20
SOP-28/SKDIP-28
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.3.2 STC15F100系列单片机管脚图
中国大陆本土STC姚永平独立创新设计:
请不要再抄袭我们的规格和管脚排列,
再抄袭就很无耻了。
2
INT3/CLKOUT0/T1/P3.5
3
Gnd
4
ISP/IAP
1
Vcc
6 I/O Ports
IRC_CLKO/INT2/CLKOUT1/T0/RST/P3.4
8
P3.3/INT1/RSTOUT_LOW
7
P3.2/INT0
6
P3.1
5
P3.0/INT4
SOP-8/DIP-8
STC15F系列B版本将在2012年4月后开始送样.
C
T
S
10
南通国芯微电子有限公司
U
C
M
.
d
e
t
i
m
Li
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.4 STC15系列单片机选型一览表
1.4.1 STC15F204EA系列单片机选型一览表
STC15F201A
STC15F201EA
STC15F202A
STC15F202EA
STC15F203A
STC15F203EA
STC15F204A
STC15F204EA
内
Flash
部
内部 支持
程序
内
低
工作
定
可选 掉电
A/D 看门狗 置 EEP 压
存储 SRAM
电压
时
复位 唤醒
8路 (WDT) 复 ROM 检
器
字节
(V)
器
门槛 外部
(字节
位
测
电压 中断
byte)
中
断
STC15F204EA系列单片机选型一览
5.5-3.8 1K
256 2 10位 有 有 5
有 8级
5.5-3.8 1K
256 2 10位 有 有 2K 有 8级
5
5.5-3.8 2K
256 2 10位 有 有 5
有 8级
5.5-3.8 2K
256 2 10位 有 有 2K 有 8级
5
5.5-3.8 3K
256 2 10位 有 有 5
有 8级
5.5-3.8 3K
256 2 10位 有 有 2K 有 8级
5
5.5-3.8 4K
256 2 10位 有 有 5
有 8级
5.5-3.8 4K
256 2 10位 有 有 1K 有 8级
5
IAP15F205A
5.5-3.8
STC15L201A
STC15L201EA
STC15L202A
STC15L202EA
STC15L203A
STC15L203EA
STC15L204A
STC15L204EA
3.6-2.4
3.6-2.4
3.6-2.4
3.6-2.4
3.6-2.4
3.6-2.4
3.6-2.4
3.6-2.4
IAP15L205A
3.6-2.4
型号
5K
256
掉电
唤醒
专用
定时
SOP-28 SKDIP-28
器
-
.
d
e
t
i
m
Li
U
C
M
8级
5
-
1K
1K
2K
2K
3K
3K
4K
4K
STC15L204EA系列单片机选型一览表
256 2 10位 有 有 有 8级
256 2 10位 有 有 2K 有 8级
256 2 10位 有 有 有 8级
256 2 10位 有 有 2K 有 8级
256 2 10位 有 有 有 8级
256 2 10位 有 有 2K 有 8级
256 2 10位 有 有 有 8级
256 2 10位 有 有 1K 有 8级
5
5
5
5
5
5
5
5
-
5K
256
5
-
C
T
S
提供客制化IC设计服务
2 10位
封装28-Pin
(26个I/O口)
价格(RMB ¥)
2 10位
有
有
有 IAP
有 IAP
有
有
8级
¥2.35
¥2.55
¥2.40
¥2.60
¥2.45
¥2.65
¥2.50
¥2.70
用户可在程序区
直接修改程序
¥2.35
¥2.55
¥2.40
¥2.60
¥2.45
¥2.65
¥2.50
¥2.70
用户可在程序区
直接修改程序
以上单价为200K起订
量小每片需加0.3元-1元
以上价格运费由客户承担,零售1片起
如对价格不满,可来电要求降价
STC15系列B版本部分型号有内部掉电唤醒专用定时器
因为程序区的最后7个字节单元被强制性的放入全球唯一ID号的内容,所以用
户实际可以使用的程序空间大小要比选型表中的大小少7个字节。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
11
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.4.2 STC15F100系列单片机选型一览表
STC15F100
STC15F101
STC15F101E
STC15F102
STC15F102E
STC15F103
STC15F103E
STC15F104
STC15F104E
Flash
程序
内
内部
工作
定
A/D 看门狗 置 EEP 低压
存储 SRAM
电压
时
8路 (WDT) 复 ROM 检测
器
字节
(V)
器
(字节
位
中断
byte)
STC15F100系列单片机选型一览
5.5-3.8 512
128 2
有 有 有
5.5-3.8 1K
128 2
有 有 有
5.5-3.8 1K
128 2
有 有 2K
有
5.5-3.8 2K
128 2
有 有 有
5.5-3.8 2K
128 2
有 有 2K
有
5.5-3.8 3K
128 2
有 有 有
5.5-3.8 3K
128 2
有 有 2K
有
5.5-3.8 4K
128 2
有 有 有
5.5-3.8 4K
128 2
有 有 1K
有
IAP15F105
5.5-3.8
5K
128
STC15F102EW 5.5-3.8
STC15F103EW 5.5-3.8
STC15F104EW 5.5-3.8
2K
3K
4K
8级
8级
8级
5
5
5
有
有
有
¥1.85
¥1.95
¥2.05
¥2.05
¥2.15
¥2.25
8级
8级
8级
8级
8级
8级
8级
8级
8级
5
5
5
5
5
5
5
5
5
-
¥0.99
¥1.20
¥1.25
¥1.30
¥1.35
¥1.40
¥1.45
¥1.50
¥1.75
¥1.19
¥1.40
¥1.45
¥1.50
¥1.55
¥1.60
¥1.65
¥1.70
¥1.95
型号
2
-
有
U
C
M
有
支持
掉电
唤醒
外部
中断
8级
8级
8级
8级
8级
8级
8级
8级
8级
5
5
5
5
5
5
5
5
5
-
¥0.99
¥1.20
¥1.25
¥1.30
¥1.35
¥1.40
¥1.45
¥1.50
¥1.55
8级
5
-
用户可在程序区
直接修改程序
.
d
e
t
i
m
Li
有 IAP
封装8-Pin
掉电
(6个I/O口)
唤醒
价格(RMB ¥)
专用
定时
SOP-8 DIP-8
器
内部
可选
复位
门槛
电压
¥1.19
¥1.40
¥1.45
¥1.50
¥1.55
¥1.60
¥1.65
¥1.70
¥1.75
STC15L100
STC15L101
STC15L101E
STC15L102
STC15L102E
STC15L103
STC15L103E
STC15L104
STC15L104E
3.6-2.4 512
3.6-2.4 1K
3.6-2.4 1K
3.6-2.4 2K
3.6-2.4 2K
3.6-2.4 3K
3.6-2.4 3K
3.6-2.4 4K
3.6-2.4 4K
128 2
有 有 2K
有
128 2
有 有 2K
有
128 2
有 有 1K
有
STC15L100系列单片机选型一览表
128 2
有 有 有
128 2
有 有 有
128 2
有 有 2K
有
128 2
有 有 有
128 2
有 有 2K
有
128 2
有 有 有
128 2
有 有 2K
有
128 2
有 有 有
128 2
有 有 1K
有
IAP15L105
3.6-2.4
5K
128
2
-
有
有 IAP
有
8级
5
-
用户可在程序区
直接修改程序
STC15L102EW 3.6-2.4
STC15L103EW 3.6-2.4
STC15L104EW 3.6-2.4
2K
3K
4K
128
128
128
2
2
2
-
有
有
有
有 2K
有 2K
有 1K
有
有
有
8级
8级
8级
5
5
5
有
有
有
¥1.85
¥1.95
¥2.05
C
T
S
¥2.05
¥2.15
¥2.25
以上单价为200K起订,量小每片需加0.3元-1元,以上价格运费由客户承担,零售1片起
因为程序区的最后7个字节单元被强制性的放入全球唯一ID号的内容,所以用户实际可以使用
的程序空间大小要比选型表中的大小少7个字节。
12
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.4.3 STC15S204EA系列单片机选型一览表
型号
STC15S201A
STC15S201EA
STC15S202A
STC15S202EA
STC15S203A
STC15S203EA
STC15S204A
STC15S204EA
STC15S205A
STC15S205EA
IAP15S206A
STC15V201A
STC15V201EA
STC15V202A
STC15V202EA
STC15V203A
STC15V203EA
STC15V204A
STC15V204EA
STC15V205A
STC15V205EA
IAP15V206A
内
Flash
部
内部 支持
程序
内
低
工作
定
可选 掉电
A/D 看门狗 置 EEP 压
存储 SRAM
电压
时
复位 唤醒
8路 (WDT) 复 ROM 检
器
字节
(V)
器
门槛 外部
(字节
位
测
电压 中断
byte)
中
断
STC15S204EA系列单片机选型一览
5.5-3.8 1K
256 2 10位 有 有 5
有 8级
5.5-3.8 1K
256 2 10位 有 有 2K 有 8级
5
5.5-3.8 2K
256 2 10位 有 有 5
有 8级
5.5-3.8 2K
256 2 10位 有 有 2K 有 8级
5
5.5-3.8 3K
256 2 10位 有 有 5
有 8级
5.5-3.8 3K
256 2 10位 有 有 2K 有 8级
5
5.5-3.8 4K
256 2 10位 有 有 5
有 8级
5.5-3.8 4K
256 2 10位 有 有 1K 有 8级
5
5.5-3.8 5K
256 2 10位 有 有 5
有 8级
5.5-3.8 5K
256 2 10位 有 有 1K 有 8级
5
5.5-3.8 6K
256 2 10位 有 有 IAP 有 8级
5
STC15V204EA列单片机选型一览表
3.6-2.4 1K
256 2 10位 有 有 5
有 8级
3.6-2.4 1K
256 2 10位 有 有 2K 有 8级
5
3.6-2.4 2K
256 2 10位 有 有 5
有 8级
3.6-2.4 2K
256 2 10位 有 有 2K 有 8级
5
3.6-2.4 3K
256 2 10位 有 有 5
有 8级
3.6-2.4 3K
256 2 10位 有 有 2K 有 8级
5
3.6-2.4 4K
256 2 10位 有 有 5
有 8级
3.6-2.4 4K
256 2 10位 有 有 1K 有 8级
5
3.6-2.4 5K
256 2 10位 有 有 5
有 8级
3.6-2.4 5K
256 2 10位 有 有 1K 有 8级
5
3.6-2.4 6K
256 2 10位 有 有 IAP 有 8级
5
C
T
S
U
C
M
提供客制化IC设计服务
封装20-Pin
(18个I/O口)
价格(RMB ¥)
掉电
唤醒
专用
定时
SOP-20
器
DIP-20
-
.
d
e
t
i
m
Li
-
以上单价为200K起订
量小每片需加0.3元-1元
以上价格运费由客户承担,零售1片起
如对价格不满,可来电要求降价
STC15S204EA系列是STC15F204EA系列的特殊版本
因为程序区的最后7个字节单元被强制性的放入全球唯一ID号的内容,所以用
户实际可以使用的程序空间大小要比选型表中的大小少7个字节。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
13
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.5 STC15F204EA系列���������
单片机最小应用系统
系统电源/5V/3.3V
Vin
1
P2.6
P2.5 28
2
P2.7
P2.4 27
3
P1.0/ADC0
P2.3 26
4
P1.0/ADC1
P2.2 25
5
P1.2/ADC2
P2.1 24
6
P1.3/ADC3
RSTOUT_LOW/P2.0 23
INT3/P3.7 22
7
P1.4/ADC4
Power On
8
P1.5/ADC5
INT2/P3.6 21
SW1
9
P1.6/ADC6
CLKOUT0/T1/P3.5 20
10 P1.7/ADC7
CLKOUT1/T0/P3.4 19
Vcc
C1
10μF
C2
0.1μF
C
T
S
11 P0.0/RST/IRC_CLKO
INT1/P3.3 18
12 Vcc
INT0/P3.2 17
13 P0.1
P3.1 16
14 Gnd
INT4/P3.0 15
U
C
M
.
d
e
t
i
m
Li
内部高可靠复位,不需要外部复位电路
P0.0/RST/IRC_CLKO脚出厂时默认为I/O口,可以通过 STC-ISP 编程器将其设置为RST复位脚.
内部高精度R/C振荡器,温飘±1%(-400C~+850C),常温下温飘5‰, 不需要昂贵的外部晶振
建议加上电容C1(10μF), C2(0.1μF), 可去除电源噪声,提高抗干扰能力
14
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.6 STC15F204EA系列������
在系统可编程(ISP)典型应用线路图
系统电源/USB +5V(可从电脑USB取电)
Vin
Power On
SW1
Vcc
C1
10μF
C2
0.1μF
1
P2.6
P2.5 28
2
P2.7
P2.4 27
3
P1.0/ADC0
P2.3 26
4
P1.0/ADC1
P2.2 25
5
P1.2/ADC2
P2.1 24
6
P1.3/ADC3
RSTOUT_LOW/P2.0 23
7
P1.4/ADC4
INT3/P3.7 22
8
P1.5/ADC5
INT2/P3.6 21
9
P1.6/ADC6
CLKOUT0/T1/P3.5 20
10 P1.7/ADC7
CLKOUT1/T0/P3.4 19
11 P0.0/RST/IRC_CLKO
INT1/P3.3 18
12 Vcc
INT0/P3.2 17
13 P0.1
P3.1 16
14 Gnd
INT4/P3.0 15
U
C
M
此部分与ISP下载无
关,是为了便于无示
波器或万用表等简易
测试设备的用户观察
Vcc
.
d
e
t
i
m
Li
1K
1K
STC 单片机在线编程线路, STC RS-232 转换器
Vcc
USB+5V T1OUT R1IN GND
USB1
C
T
S
+
0.1μF
STC3232,STC232,MAX232,SP232
1 C1+
Vcc 16
2 V+
Gnd 15
3 C1-
T1OUT 14
4 C2+
R1IN 13
5 C2-
R1OUT 12
6 V7 T2OUT
8 R2IN
T1IN 11
+
Vcc
Gnd
PC_RxD(COM Pin2)
PC COM
2
3
5
PC_TxD(COM Pin3)
MCU_RxD(P3.0)
MCU_TxD(P3.1)
T2IN 10
R2OUT 9
U1-P3.2
U1-P3.3
MCU-VCC
U1-P3.0
U1-P3.1
Gnd
内部高可靠复位,不需要外部复位电路
P0.0/RST/IRC_CLKO脚出厂时默认为I/O口,可以通过 STC-ISP 编程器将其设置为RST复位脚.
内部高精度R/C振荡器,温飘±1%(-400C~+850C),常温下温飘5‰, 不需要昂贵的外部晶振
建议加上电容C1(10μF), C2(0.1μF), 可去除电源噪声,提高抗干扰能力
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
15
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.7 STC15F204EA系列����
管脚说明
管脚
管脚编号
P0.0/RST/
IRC_CLKO
11
P0.1
13
P1.0/ADC0
3
P1.1/ADC1
4
P1.2/ADC2
5
P1.3/ADC3
P1.4/ADC4
P1.5/ADC5
P1.6/ADC6
P1.7/ADC7
说明
P0.0
标准I/O口 PORT0[0]
RST
复位脚;
IRC_CLKO
标准 PORT0[1]
P1.0
标准I/O口 PORT1[0]
ADC0
ADC 输入通道-0
P1.1
ADC1
P1.2
ADC2
P1.3
6
ADC3
ADC4
C
T
S
9
10
标准 PORT1[1]
ADC 输入通道-1
P1.5
ADC5
P1.6
ADC6
P1.7
ADC7
P2.0
.
d
e
t
i
m
标准I/O口 PORT1[2]
ADC 输入通道-2
Li
标准I/O口 PORT1[3]
ADC 输入通道-3
U
C
M
P1.4
7
8
内部R/C振荡时钟输出;输出的频率可为IRC_CLK/1或
IRC_CLK/2
标准I/O口 PORT1[4]
ADC 输入通道-4
标准I/O口 PORT1[5]
ADC 输入通道-5
标准I/O口 PORT1[6]
ADC 输入通道-6
标准I/O口 PORT1[7]
ADC 输入通道-7
标准I/O口 PORT2[0]
P2.0/
RSTOUT_LOW
23
P2.1
24
标准I/O口 PORT2[1]
P2.2
25
标准I/O口 PORT2[2]
P2.3
26
标准I/O口 PORT2[3]
P2.4
27
标准I/O口 PORT2[4]
P2.5
28
标准I/O口 PORT2[5]
P2.6
1
标准I/O口 PORT2[6]
P2.7
2
标准I/O口 PORT2[7]
P3.0
标准I/O口 PORT3[0]
上电后,输出低电平,在复位期间也是输出低电平,用户
RSTOUT_LOW 可用软件将其设置为高电平或低电平,如果要读外部状
态,可将该口先置高后再读
P3.0/INT4
P3.1
16
15
16
南通国芯微电子有限公司
INT4
外部中断4,只能下降沿中断
支持掉电唤醒
标准I/O口 PORT3[1]
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
管脚
P3.2/INT0
P3.3/INT1
技术支持网站:www.STCMCU.com
管脚编号
17
18
研发顾问:13922809991
说明
P3.2
标准I/O口 PORT3[2]
INT0
外部中断0,既可上升沿中断也可下降沿中断.
如 果I T 0 ( T CON.0)被置为1 ,INT0管脚仅为下降沿中断。如果
IT0(TCON.0)被清0,INT0管脚既支持上升沿中断也支持下降沿中
断。
INT0支持掉电唤醒。
P3.3
标准I/O口 PORT3[3]
INT1
外部中断1,既可上升沿中断也可下降沿中断.
如果IT1(TCON.2)被置为1,INT1管脚仅为下降沿中断。如果
IT1(TCON.2)被清0,INT1管脚既支持上升沿中断也支持下降沿中
断。
INT1支持掉电唤醒。
P3.4
标准I/O口 PORT3[4]
T0
定时器/计数器0的外部输入
P3.4/T0/
CLKOUT1
19
P3.5/T1/
CLKOUT0
20
P3.6/INT2
21
P3.7/INT3
22
Vcc
12
电源正极
Gnd
14
电源负极,接地
南通国芯微电子有限公司
临时技术支持:13922829991
.
d
e
t
i
m
Li
定时器/计数器1的时钟输出
CLKOUT1 可通过设置INT_CLKO[1]位/T1CLKO将该管脚配置为CLKOUT1,
也可对T1脚的外部时钟输入进行分频输出
P3.5
标准I/O口 PORT3[5]
T1
U
C
M
定时器/计数器1的外部输入
定时器/计数器0的时钟输出
CLKOUT0 可通过设置INT_CLKO[0]位/T0CLKO将该管脚配置为CLKOUT0,
也可对T0脚的外部时钟输入进行分频输出
P3.6
标准I/O口 PORT3[6]
C
T
S
INT2
外部中断2,只能下降沿中断
支持掉电唤醒
P3.7
标准I/O口 PORT3[7]
INT3
外部中断3,只能下降沿中断
支持掉电唤醒
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
17
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.8 STC15系列��������
单片机封装尺寸图
1.8.1 STC15F204EA系列封装尺寸图
SOP-28 封装尺寸图
28-Pin Small Outline Package (SOP-28)
Dimensions in Millimeters
D
b
A2
C
T
S
U
C
M
b1
b
WITH PLATING
c
BASE METAL
Φ
R
R1
L2
L
L1
18
南通国芯微电子有限公司
A
e
1.27mm
A1
z
E
E1
.
d
e
t
i
m
Li
一般尺寸
(测量单位 = MILLMETER / mm)
MIN.
NOM.
MAX.
符号
A
A1
A2
b
b1
c
D
E
E1
e
L
L1
L2
R
R1
Φ
z
总机:0513-5501 2928 / 2929 / 2966
2.465
0.100
2.100
0.356
0.366
17.750
10.100
7.424
0.764
1.303
00
-
2.515
0.150
2.300
0.406
0.426
0.254
17.950
10.300
7.500
1.27
0.864
1.403
0.274
0.200
0.300
0.745
2.565
0.200
2.500
0.456
0.486
18.150
10.500
7.624
0.964
1.503
100
-
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
SKDIP-28 封装尺寸图
28-Pin Plastic Dual-In-line Package (SKDIP-28)
Dimensions in Inches
E
E1
eA
θ
0
D
A2
A
L
U
C
M
A1
e
100 mil
b
b1
C
T
S
.
d
e
t
i
m
Li
符号
A
A1
A2
b
b1
D
E
E1
e
L
θ0
eA
一般尺寸
(测量单位 = INCH)
MIN.
0.015
0.125
1.385
0.283
0.115
0
0.330
NOM.
0.13
0.018
0.060
1.390
0.310
0.288
0.100
0.130
7
0.350
MAX.
0.210
0.135
1.40
0.293
0.150
15
0.370
UNIT: INCH, 1 inch = 1000 mil
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
19
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.8.2 STC15F101E系列封装尺寸图
SOP-8 封装尺寸图
8-PIN SMALL OUTLINE PACKAGE (SOP-8)
Dimensions in Inches
0.004 max.
C
T
S
A
b
U
C
M
Li
一般尺寸
(测量单位 = INCH)
符号
A
A1
b
D
E
E1
e
L
L1
Φ
A1
e
50 mil
Φ
L1
.
d
e
t
i
m
E
E1
D
L
MIN.
0.053
0.004
0.189
0.228
0.150
0.016
00
NOM.
0.016
0.050
0.008
-
MAX.
0.069
0.010
0.196
0.244
0.157
0.050
80
UNIT: INCH, 1 inch = 1000 mil
20
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
DIP-8 封装尺寸图
8-Pin Plastic Dual Inline Package (DIP-8)
Dimensions in Inches
E
E1
eA
θ
0
D
b
一般尺寸
(测量单位 = INCH)
A2
A
Li
符号
L
A1
e
b1
.
d
e
t
i
m
18 mil
100 mil
60 mil
C
T
S
U
C
M
A
A1
A2
b
b1
D
E
E1
e
L
θ0
eA
MIN.
0.015
0.125
0.355
0.245
0.115
0
0.335
NOM.
0.130
0.018
0.060
0.365
0.300
0.250
0.100
0.130
7
0.355
MAX.
0.210
0.135
0.400
0.255
0.150
15
0.375
UNIT: INCH, 1 inch = 1000 mil
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
21
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.8.3 STC15S204EA系列封装尺寸图
SOP-20 封装尺寸图
20-Pin Small Outline Package (SOP-20) (for STC15S/V204EA series)
Dimensions in Inches and (Millimeters)
z
e
1.27mm
A2
b1
b
c
WITH PLATING
c1
BASE METAL
Φ
R1
R
L2
L
L1
22
南通国芯微电子有限公司
.
d
e
t
i
m
Li
一般尺寸
A
A1
C
T
S
b
U
C
M
E
E1
D
(测量单位 = MILLMETER/ mm)
MIN.
NOM. MAX.
符号
A
A1
A2
b1
b
c
c1
D
E
E1
e
L
L1
L2
R
R1
Φ
z
总机:0513-5501 2928 / 2929 / 2966
2.465
0.100
2.100
0.366
0.356
0.234
12.500
10.206
7.450
0.800
1.303
00
-
2.515
0.150
2.300
0.426
0.406
0.254
12.700
10.306
7.500
1.27
0.864
1.403
0.274
0.300
0.200
0.660
2.565
0.200
2.500
0.486
0.456
0.274
12.900
10.406
7.550
0.900
1.503
100
-
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
DIP-20 封装尺寸图
20-Pin Plastic Dual Inline Package (DIP-20) (for STC15S/V204EA series)
Dimensions in Inches
D
θ
eA
E
E1
0
C
S
一般尺寸
(测量单位 = INCH)
A2
A
L
U
C
M
A1
e
100 mil
.
d
e
t
i
m
120 mil
b
b1
C
T
S
符号
A
A1
A2
b
b1
C
D
E
E1
e
L
θ0
eA
S
Li
MIN.
0.015
0.125
0.016
0.058
0.008
1.012
0.290
0.245
0.090
0.120
0
0.355
-
NOM.
0.13
0.018
0.060
0.010
1.026
0.300
0.250
0.100
0.130
0.355
-
MAX.
0.175
0.135
0.020
0.064
0.11
1.040
0.310
0.255
0.110
0.140
15
0.375
0.075
UNIT: INCH, 1 inch = 1000 mil
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
23
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.9 STC15系列�������
单片机命名规则
1.9.1 STC15F204EA系列单片机命名规则
STC15 x
2 xx
xx
--
35
x
-
xxxx
xx
管脚数
如 28
封装类型:
如 SOP, SKDIP
工作温度范围:
I : 工业级, -40℃ ~ 85℃
C : 商业级, 0℃ ~ 70℃
.
d
e
t
i
m
工作频率:
35 : 工作频率可到35MHz
Li
有EA字样 : 有内部EEPROM,有A/D转换
仅有A 字样: 无内部EEPROM,有A/D转换
C
T
S
U
C
M
程序空间大小,如:
01是1K字节, 02是2K字节,03是3K字节,
04是4K字节,05是5K字节等
SRAM空间大小: 128×2 = 256字节
工作电压
F : 5.5V~3.8V
L : 2.4V~3.6V
STC 1T 8051,同样的工作频率时,速度是普通8051的6~12倍
24
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.9.2 STC15F100系列单片机命名规则
STC15 x
1 xx
xxx
--
35
x
-
xxxx
xx
管脚数
如8
封装类型:
如 SOP, DIP
工作温度范围:
I : 工业级, -40℃ ~ 85℃
C : 商业级, 0℃ ~ 70℃
工作频率:
35 : 工作频率可到35MHz
.
d
e
t
i
m
有E字样 : 有内部EEPROM
有W字样 : 有内部掉电唤醒专用定时器
无字样 : 无内部EEPROM
C
T
S
Li
程序空间大小,如:
00是512字节(无规律,特殊编号),
01是1K字节,02是2K字节,
03是3K字节, 04是4K字节,
05是5K字节等
U
C
M
SRAM空间大小: 128×1 = 128字节
工作电压
F : 5.5V~3.8V
L : 2.4V~3.6V
STC 1T 8051,同样的工作频率时,速度是普通8051的6~12倍
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
25
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.10 每个单片机具有全球唯一身份证号码(ID号)
STC最新一代STC15系列每一个单片机出厂时都具有全球唯一身份证号码�
(ID号�����
)����
,用户可
以在单片机上电后读取内部RAM单元从F1H - F7H 连续�����������������
7����������������
个单元的值来获取此单片机的唯一身
份证号码�(ID号����
),��
使用“ MOV @Ri” ������
指令来读取。如果用户需要用全球唯一ID号进行用户自己
的软件加密,建议用户在程序的多个地方有技巧地判断自己的用户程序有无被非法修改,提高
解密的难度,防止解密者修改程序,绕过对全球唯一ID号的判断。
除内部RAM的F1H ~ F7H单元的内容为全球唯一ID号外,最新的STC15系列的程序存储器
的最后7个字节单元的值也是全球唯一ID号,用户不可修改,但IAP15系列整个程序区是开放
的,可以修改,建议利用全球唯一ID号加密时,使用STC15系列,并将EEPROM功能使用上,从
EEPROM起始地址0000H开始使用,有效杜绝对全球唯一ID号的攻击。使用程序区的最后7个字节
的全球唯一ID号比使用RAM单元 F1H - F7H 的全球唯一ID号进行比较更难被攻击。
//读内部ID号的C语言参考程序
U
C
M
.
d
e
t
i
m
Li
/* --- STC MCU Limited ------------------------------------------------- */
/* --- STC 姚永平 2009/2/7 V1.0 ---------------------------------- */
/* --- STC15 系列单片机,软件实现自定义下载程序-------------------------- */
/* --- Mobile: 13922805190 ----------------------------------------------- */
/* --- Fax: 0755-82905966 ------------------------------------------------ */
/* --- Tel: 0755-82948409 ------------------------------------------------- */
/* --- Web: www.STCMCU.com ------------------------------------------ */
/* --- 本演示程序在STC-ISP Ver 3.0A.PCB的下载编程工具上测试通过 ----------- */
/* --- 如果要在程序中使用该程序,请在程序中注明使用了STC的资料及程序 - */
/* --- 如果要在文章中引用该程序,请在文章中注明使用了STC的资料及程序-- */
#include
#include
sfr
IAP_CONTR
= 0xC7;
C
T
S
sbit
MCU_Start_Led = P1^7;
//unsigned
char
self_command_array[4] = {0x22,0x33,0x44,0x55};
#define Self_Define_ISP_Download_Command
0x22
#define RELOAD_COUNT
0xfb
//18.432MHz,12T,SMOD=0,9600bps
void
void
void
void
void
void
26
serial_port_initial();
send_UART(unsigned char);
UART_Interrupt_Receive(void);
soft_reset_to_ISP_Monitor(void);
delay(void);
display_MCU_Start_Led(void);
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
void main(void)
{
unsigned char i = 0;
unsigned char j = 0;
unsigned char idata *idata_point;
serial_port_initial();
//
display_MCU_Start_Led();
//
send_UART(0x34);
//
send_UART(0xa7);
idata_point = 0xF1;
for(j=0;j 0 or (Rn) < 0
THEN
(PC) ��
←�������
������
(PC)+ ���
rel
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
101
STC15F204EA系列单片机指南
DJNZ
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
direct, rel
指令长度(字节): 3
执行周期: 2
二进制编码:
操作: DJNZ
(PC) ��
←���������
��������
(PC) + 2
(direct) ←����������
�� ���������
(direct) ��– �1
IF (direct) > 0 or (direct) < 0
THEN
(PC) ��
← �������
(PC) + ���
rel
INC
.
d
e
t
i
m
功能: 加1
说明:
INC指令将所代表的数据加1。如果原来的值为FFH,则加1后变为00H,
该指令步影响标志位。支持3种寻址模式:寄存器寻址、直接寻址、寄存器间接寻
址。
U
C
M
Li
注意:如果该指令被用来修改输出引脚上的状态,那么byte所代表的数据是从端
口输出数据锁存器中获取的,而不是直接读的引脚。
举例: 假设寄存器0的内容为7EH(0111110B),内部RAM的7E单元和7F单元分别存放着0FFH
和40H,则指令序列
C
T
S
INC
@R0
INC
R0
INC
@R0
执行完毕后,寄存器0的内容变为7FH,而内部RAM的7EH和7FH单元的内容分别变
成00H和41H。
INC
A
指令长度(字节): 1
执行周期: 1
二进制编码:
0 0
0
0
0 1 0 0
操作: INC
(A) ��
← �����
(A)+1
INC Rn
指令长度(字节): 1
执行周期: 1
二进制编码:
0 0
0
0
1 r r r
操作: INC
(Rn) ←
�� (Rn)+1
������
102
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
INC
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
direct
指令长度(字节): 2
执行周期: 1
二进制编码:
0 0 0 0
0 1 0 1
direct address
操作: INC
(direct)����������
←���������
(direct) + 1
INC
@Ri
指令长度(字节): 1
执行周期: 1
二进制编码:
0 0 0 0
0 1 1 i
.
d
e
t
i
m
操作: INC
((Ri))�����������
←����������
((Ri)) + 1
INC
DPTR
U
C
M
功能: 数据指针加1
说明:
Li
该指令实现将DPTR加1功能。需要注意的是,这是16位的递增指令,低位字节
DPL从FFH增加1之后变为00H,同时进位到高位字节DPH。该操作不影响标志位。
C
T
S
该指令是唯一1条16位寄存器递增指令。
举例: 假设寄存器DPH和DPL的内容分别为12H和0FEH,则指令序列
INC
DPTR
INC
DPTR
INC
DPTR
执行完毕后,DPH和DPL变成13H和01H
指令长度(字节): 1
执行周期: 2
二进制编码:
1 0
1
0
0 0 1 1
操作: INC
(DPTR) ��
← ��������
(DPTR)+1
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
103
STC15F204EA系列单片机指南
JB
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
bit, rel
功能: 若位数据为1则跳转
说明: 如果bit代表的位数据为1,则跳转到rel所指定的地址处去执行;否则,继续执行下
一条指令。跳转的目标地址按照如下方式计算:先增加PC的值,使其指向下一条指
令的首字节地址,然后把rel所代表的有符号的相对偏移量(指令的第3个字节)加到
PC上去,新的PC值即为目标地址。该指令只是测试相应的位数据,但不会改变其数
值,而且该操作不会影响标志位。
举例: 假设端口1的输入数据为11001010B,累加器的值为56H(01010110B)。则指令
JB
P1.2, LABEL1
JB
ACC.2, LABEL2
将导致程序转到标号LABEL2处去执行
指令长度(字节): 3
执行周期: 2
二进制编码:
0 0 1 0
0 0 0 0
bit address
操作: JB
(PC) ��
← �������
(PC)+ 3
IF (bit) = 1
THEN
(PC) ��
←��������
�������
(PC) + ���
rel
JBC
bit, rel
C
T
S
U
C
M
.
d
e
t
i
m
Li
rel. address
功能: 若位数据为1则跳转并将其清零
说明:
如果bit代表的位数据为1,则将其清零并跳转到rel所指定的地址处去执行。如果
bit代表的位数据为0,则继续执行下一条指令。跳转的目标地址按照如下方式计算:
先增加PC的值,使其指向下一条指令的首字节地址,然后把rel所代表的有符号的相
对偏移量(指令的第3个字节)加到PC上去,新的PC值即为目标地址,而且该操作不
会影响标志位。
注意:如果该指令被用来修改输出引脚上的状态,那么byte所代表的数据是从端
口输出数据锁存器中获取的,而不是直接读取引脚。
举例: 假设累加器的内容为56H(01010110B),则指令序列
JBC ACC.3, LABEL1
JBC
ACC.2, LABEL2
将导致程序转到标号LABEL2处去执行,且累加器的内容变为52H(01010010B)。
指令长度(字节): 3
执行周期: 2
二进制编码:
0 0 0 1
0 0 0 0
bit address
rel. address
操作: JBC
(PC) ��
← �������
(PC)+ 3
IF (bit) = 1
THEN
(bit) ←
�� 0�
(PC) ��
←��������
�������
(PC) + ���
rel
104
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
JC
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
rel
功能: 若进位标志为1,则跳转
说明: 如果进位标志为1,则程序跳转到rel所代表的地址处去执行;否则,继续执行下面的
指令。跳转的目标地址按照如下方式计算:先增加PC的值,使其指向紧接JC指令的
下一条指令的首地址,然后把rel所代表的有符号的相对偏移量(指令的第2个字节)
加到PC上去,新的PC值即为目标地址。该操作不会影响标志位。
举例: 假设进位标志此时为0,则指令序列
JC
LABEL1
CPL C
JC
LABEL2
执行完毕后,进位标志变成1,并导致程序跳转到标号LABEL2处去执行。
指令长度(字节): 2
执行周期: 2
二进制编码:
0 1 0 0
0 0 0 0
操作: JC
(PC) ��
← �������
(PC)+ 2
IF (C) = 1
THEN
(PC) ��
←��������
�������
(PC) + ���
rel
JMP @A+DPTR
U
C
M
C
T
S
功能: 间接跳转。
.
d
e
t
i
m
rel. address
Li
说明: 把累加器A中的8位无符号数据和16位的数据指针的值相加,其和作为下一条将要执
行的指令的地址,传送给程序计数器PC。执行16位的加法时,低字节DPL的进位会
传到高字节DPH。累加器A和数据指针DPTR 的内容都不会发生变化。不影响任何标
志位。
举例: 假设累加器A中的值是偶数(从0到6)。下面的指令序列将使得程序跳转到位于跳转
表JMP_TBL 的4条AJMP指令中的某一条去执行:
MOV
DPTR, #JMP_TBL
JMP
@A+DPTR
JMP-TBL:
AJMP
LABEL0
AJMP
LABEL1
AJMP
LABEL2
AJMP
LABEL3
如果开始执行上述指令序列时,累加器A中的值为04H,那么程序最终会跳转到标号
LABEL2处去执行。
注意:AJMP是一个2字节指令,因而在跳转表中,各个跳转指令的入口地址依次相
差2个字节。
指令长度(字节): 1
执行周期: 2
二进制编码:
0 1 1 1
0 0 1 1
操作: JMP
(PC) ��
← ������������
(A) + (DPTR)
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
105
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
JNB bit, rel
功能: 如果bit所代表的位不为1则跳转。
说明: 如果bit所表示的位为0,则转移到rel所代表的地址去执行;否则,继续执行下一条
指令。跳转的目标地址如此计算:先增加PC的值,使其指向下一条指令的首字节地
址,然后把rel所代表的有符号的相对偏移量(指令的第3个字节)加到PC上去,新的
PC值即为目标地址。该指令只是测试相应的位数据,但不会改变其数值,而且该操
作不会影响标志位。
举例: 假设端口1的输入数据为110010108,累加器的值为56H(01010110B)。则指令序列
JNB
P1.3, LABEL1
JNB
ACC.3, LABEL2
执行后将导致程序转到标号LABEL2处去执行。
指令长度(字节): 3
执行周期: 2
二进制编码:
0 0 1 1
0 0 0 0
bit address
操作: JNB
(PC) ��
← �������
(PC)+ 3
IF (bit) = 0
THEN (PC) ��
←��������
�������
(PC) + ���
rel
JNC
C
T
S
rel
U
C
M
Li
.
d
e
t
i
m
rel. address
功能: 若进位标志非1则跳转
说明: 如果进位标志为0,则程序跳转到rel所代表的地址处去执行;否则,继续执行下面的
指令。跳转的目标地址按照如下方式计算:先增加PC的值加2,使其指向紧接JNC指
令的下一条指令的地址,然后把rel所代表的有符号的相对偏移量(指令的第2个字
节)加到PC上去,新的PC值即为目标地址。该操作不会影响标志位。
举例: 假设进位标志此时为1,则指令序列
JNC LABEL1
CPL C
JNC LABEL2
执行完毕后,进位标志变成0,并导致程序跳转到标号LABEL2处去执行。
指令长度(字节): 2
执行周期: 2
二进制编码:
0 1 0 1
0 0 0 0
rel. address
操作: JNC
(PC) ��
← �������
(PC)+ 2
IF (C) = 0
THEN (PC) ��
←��������
�������
(PC) + ���
rel
106
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
JNZ
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
rel
功能: 如果累加器的内容非0则跳转
说明: 如果累加器A的任何一位为1,那么程序跳转到rel所代表的地址处去执行,如果各个
位都为0,继续执行下一条指令。跳转的目标地址按照如下方式计算:先把PC的值增
加2,然后把rel所代表的有符号的相对偏移量(指令的第2个字节)加到PC上去,新
的PC值即为目标地址。操作过程中累加器的值不会发生变化,不会影响标志位。
举例: 设累加器的初始值为00H,则指令序列
JNZ
INC
JNZ
LABEL1
A
LAEEL2
执行完毕后,累加器的内容变成01H,且程序将跳转到标号LABEL2处去执行。
指令长度(字节): 2
执行周期: 2
二进制编码:
0 1 1 1
0 0 0 0
rel. address
操作: JNZ
(PC) ��
← �������
(PC)+ 2
IF (A) ≠ 0
THEN (PC) ��
←��������
�������
(PC) + ���
rel
JZ
C
T
S
rel
U
C
M
.
d
e
t
i
m
Li
功能: 若累加器的内容为0则跳转
说明: 如果累加器A的任何一位为0,那么程序跳转到rel所代表的地址处去执行,如果各个
位都为0,继续执行下一条指令。跳转的目标地址按照如下方式计算:先把PC的值增
加2,然后把rel所代表的有符号的相对偏移量(指令的第2个字节)加到PC上去,新
的PC值即为目标地址。操作过程中累加器的值不会发生变化,不会影响标志位。
举例: 设累加器的初始值为01H,则指令序列
JZ
DEC
JZ
LABEL1
A
LAEEL2
执行完毕后,累加器的内容变成00H,且程序将跳转到标号LABEL2处去执行。
指令长度(字节): 2
执行周期: 2
二进制编码:
0 1 1 0
0 0 0 0
rel. address
操作: JZ
(PC) ��
← �������
(PC)+ 2
IF (A) = 0
THEN (PC) ��
←��������
�������
(PC) + ���
rel
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
107
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
LCALL addr16
功能: 长调用
说明: LCALL用于调用addr16所指地址处的子例程。首先将PC的值增加3,使得PC指向紧随
LCALL的下一条指令的地址,然后把16位PC的低8位和高8位依次压入栈(低位字节
在先),同时把栈指针加2。然后再把LCALL指令的第2字节和第3字节的数据分别装
入PC的高位字节DPH和低位字节DPL,程序从新的PC所对应的地址处开始执行。因
而子例程可以位于64KB程序存储空间的任何地址处。该操作不影响标志位。
举例: 栈指针的初始值为07H,标号SUBRTN被分配的程序存储器地址为1234H。则执行如
下位于地址0123H的指令后,
LCALL SUBRTN
栈指针变成09H,内部RAM的08H和09H单元的内容分别为26H和01H,且PC的当前
值为1234H。
指令长度(字节): 3
执行周期: 2
二进制编码:
0 0 0 1
0 0 1 0
C
T
S
LJMP addr16
addr15-addr8
U
C
M
操作: LCALL
(PC) ��
←���������
��������
(PC) + 3
(SP) ��
←���������
��������
(SP) + 1
((SP)) ��
←����
���
(PC7-0)
(SP) ��
←���������
��������
(SP) + 1
((SP)) ��
←����
���
(PC15-8)
(PC) ��
←� ����
addr15-0
Li
.
d
e
t
i
m
addr7-addr0
功能: 长跳转
说明: LJMP使得CPU无条件跳转到addr16所指的地址处执行程序。把该指令的第2字节和第
3字节分别装入程序计数器PC的高位字节DPH和低位字节DPL。程序从新PC值对应的
地址处开始执行。该16位目标地址可位于64KB程序存储空间的任何地址处。该操作
不影响标志位。
举例: 假设标号JMPADR被分配的程序存储器地址为1234H。则位于地址1234H的指令
LJMP JMPADR
执行完毕后,PC的当前值变为1234H。
指令长度(字节): 3
执行周期: 2
二进制编码:
0 0 0 0
0 0 1 0
addr15-addr8
addr7-addr0
操作: LJMP
(PC) ��
←� ����
addr15-0
108
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
MOV ,
功能: 传送字节变量
说明:
将第2操作数代表字节变量的内容复制到第1操作数所代表的存储单元中去。该
指令不会改变源操作数,也不会影响其他寄存器和标志位。
MOV指令是迄今为止使用最灵活的指令,源操作数和目的操作数组合起来,寻
址方式可达15种。
举例: 假设内部RAM的30H单元的内容为40H,而40H单元的内容为10H。端口1 的数据为
11001010B(0CAH)。则指令序列
MOV
MOV
MOV
MOV
MOV
MOV
R0, #30H
A, @R0
R1, A
B, @Rl
@Rl, Pl
P2, P1
;R0< = 30H
;A < = 40H
;R1 < = 40H
;B < = 10H
;RAM (40H) < = 0CAH
;P2 #0CAH
.
d
e
t
i
m
Li
执行完毕后,寄存器0的内容为30H,累加器和寄存器1的内容都为40H,寄存器B的
内容为10H,RAM中40H单元和P2口的内容均为0CAH。
MOV A,Rn
指令长度(字节): 1
执行周期: 1
二进制编码:
U
C
M
C
T
S
0
1 r r r
1 1 1 0
0 1 0 1
1 1
1
操作: MOV
(A) ��
←�����
����
(Rn)
*MOV A,direct
指令长度(字节): 2
执行周期: 1
二进制编码:
direct address
操作: MOV
(A)��
←���������
��������
(direct)
注意:MOV A, ACC是无效指令。
MOV A,@Ri
指令长度(字节): 1
执行周期: 1
二进制编码:
1 1
1
0
0 1 1 i
操作: MOV
(A) ��
←�������
������
((Ri))
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
109
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
MOV A,#data
指令长度(字节): 2
执行周期: 1
二进制编码:
0 1 1 1
0 1 0 0
immediate data
操作: MOV
(A)��
←� �����
#data
MOV Rn, A
指令长度(字节): 1
执行周期: 1
二进制编码:
1 1 1 1
1 r r r
操作: MOV
(Rn)����
←���
(A)
MOV Rn,direct
指令长度(字节): 2
执行周期: 2
二进制编码:
1 0 1 0
操作: MOV
(Rn)���������
←��������
(direct)
MOV Rn,#data
指令长度(字节): 2
执行周期: 1
二进制编码:
C
T
S
0 1 1 1
U
C
M
.
d
e
t
i
m
Li
1 r r r
direct addr.
1 r r r
immediate data
0 1 0 1
direct address
1 r r r
direct address
操作: MOV
(Rn) ←�
�� �����
#data
MOV direct, A
指令长度(字节): 2
执行周期: 1
二进制编码:
1 1 1 1
操作: MOV
(direct) ←����
�� ���
(A)
MOV direct, Rn
指令长度(字节): 2
执行周期: 2
二进制编码:
1 0 0 0
操作: MOV
(direct) ←�����
�� ����
(Rn)
110
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
MOV direct, direct
指令长度(字节): 3
执行周期: 2
二进制编码:
1 0 0 0
0 1 0 1
dir.addr. (src)
操作: MOV
(direct)��
←���������
��������
(direct)
MOV direct, @Ri
指令长度(字节): 2
执行周期: 2
二进制编码:
1 0 0 0
0 1 1 i
direct addr.
.
d
e
t
i
m
操作: MOV
(direct)�������
←������
((Ri))
MOV direct,#data
指令长度(字节): 3
执行周期: 2
二进制编码:
0 1 1 1
操作: MOV
(direct) ←
�� �����
#data
MOV @Ri, A
指令长度(字节): 1
执行周期: 1
二进制编码:
U
C
M
0 1 0 1
C
T
S
1 1 1 1
direct address
Li
0 1 1 i
操作: MOV
((Ri)) ←����
�� (A)
���
MOV @Ri, direct
指令长度(字节): 2
执行周期: 2
二进制编码:
1 0 1 0
0 1 1 i
direct addr.
0 1 1 i
immediate data
操作: MOV
((Ri)) ←���������
�� (direct)
��������
MOV @Ri, #data
指令长度(字节): 2
执行周期: 1
二进制编码:
0 1 1 1
操作: MOV
((Ri)) ←�
�� �����
#data
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
111
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
MOV ,
功能: 传送位变量
说明:
将代表的布尔变量复制到所指定的数据单元中去,两个操作数
必须有一个是进位标志,而另外一个是可直接寻址的位。本指令不影响其他寄存器和
标志位。
举例: 假设进位标志C的初值为1,端口P2中的数据是11000101B,端口1的数据被设置为
35H(00110101B)。则指令序列
MOV
MOV
MOV
P1.3, C
C, P3.3
P1.2, C
执行后,进位标志被清零,端口1的数据变为39H(00111001B)。
MOV C,bit
.
d
e
t
i
m
指令长度(字节): 2
执行周期: 1
二进制编码:
1
0
1
0
0
0
1
操作: MOV
(C) ��
←������
�����
(bit)
指令长度(字节): 2
二进制编码:
C
T
S
1
0
0
1
0
bit address
U
C
M
MOV bit,C
执行周期: 2
1
0
1
0
Li
bit address
操作: MOV
(bit)��
←����
(C)
���
MOV DPTR , #data 16
功能: 将16位的常数存放到数据指针
说明:
该指令将16位常数传递给数据指针DPTR。16位的常数包含在指令的第2字节和
第3字节中。其中DPH中存放的是#data16的高字节,而DPL中存放的是#data16的低字
节。不影响标志位。
该指令是唯一一条能一次性移动���������
16�������
位数据的指令。
举例: 指令:
MOV
DPTR, #1234H
将立即数1234H装入数据指针寄存器中。DPH的值为12H,DPL的值为34H。
指令长度(字节): 3
执行周期: 2
二进制编码: 1 0 0
1
0
0
0
0
immediate data 15-8
操作: MOV
(DPTR) ��
←� �����
#data15-0
DPH DPL ��
← �����
#data15-8 #data7-0
112
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
MOVC A , @A+
功能: 把程序存储器中的代码字节数据(常数数据)转送至累加器A
说明: MOVC指令将程序存储器中的代码字节或常数字节传送到累加器A。被传送的数据字
节的地址是由累加器中的无符号8位数据和16位基址寄存器(DPTR或PC)的数值相
加产生的。如果以PC为基址寄存器,则在累加器内容加到PC之前,PC需要先增加到
指向紧邻MOVC之后的语句的地址;如果是以DPTR为基址寄存器,则没有此问题。
在执行16位的加法时,低8位产生的进位会传递给高8位。本指令不影响标志位。
举例:
假设累加器A的值处于0~4之间,如下子例程将累加器A中的值转换为用DB伪指
令(定义字节)定义的4个值之一。
REL-PC:
INC
A
MOVC A, @A+PC
RET
DB
66H
DB
77H
DB
88H
DB
99H
U
C
M
.
d
e
t
i
m
Li
如果在调用该子例程之前累加器的值为01H,执行完该子例程后,累加器的值
变为77H。MOVC指令之前的INC A指令是为了在查表时越过RET而设置的。如果
MOVC和表格之间被多个代码字节所隔开,那么为了正确地读取表格,必须将相应
的字节数预先加到累加器A上。
C
T
S
MOVC A,@A+DPTR
指令长度(字节): 1
执行周期: 2
二进制编码:
1 0
0
1
0 0 1 1
操作: MOVC
(A) ��
←�������������
������������
((A)+(DPTR))
MOVC A,@A+PC
指令长度(字节): 1
执行周期: 2
二进制编码:
1 0 0 0
0 0 1 1
操作: MOVC
(PC) ��
← ������
(PC)+1
(A) ��
←�����������
����������
((A)+(PC))
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
113
STC15F204EA系列单片机指南
MOVX
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
,
功能: 外部传送
说明:
MOVX指令用于在累加器和外部数据存储器之间传递数据。因此在传送指令
MOV后附加了X。MOVX又分为两种类型,它们之间的区别在于访问外部数据RAM
的间接地址是8位的还是16位的。
对于第1种类型,当前工作寄存器组的R0和R1提供8位地址到复用端口P0。对于
外部I/O扩展译码或者较小的RAM阵列,8位的地址已经够用。若要访问较大的RAM
阵列,可在端口引脚上输出高位的地址信号。此时可在MOVX指令之前添加输出指
令,对这些端口引脚施加控制。
对于第2种类型,通过数据指针DPTR产生16位的地址。当P2端口的输出缓冲器
发送DPH的内容时,P2的特殊功能寄存器保持原来的数据。在访问规模较大的数据
阵列时,这种方式更为有效和快捷,因为不需要额外指令来配置输出端口。
.
d
e
t
i
m
在某些情况下,可以混合使用两种类型的MOVX指令。在访问大容量的RAM
空间时,既可以用数据指针DP在P2端口上输出地址的高位字节,也可以先用某条
指令,把地址的高位字节从P2端口上输出,再使用通过R0或Rl间址寻址的MOVX指
令。
举例:
U
C
M
Li
假设有一个分时复用地址/数据线的外部RAM存储器,容量为256B(如�
:Inte1的
8155 RAM / I/O / TIMER),该存储器被连接到8051的端口P0上,端口P3被用于提供
外部RAM所需的控制信号。端口Pl和P2用作通用输入/输出端口。R0和Rl中的数据分
别为12H和34H,外部RAM的34H单元存储的数据为56H,则下面的指令序列:
C
T
S
MOVX
MOVX
A, @R1
@R0, A
将数据56H复制到累加器A以及外部RAM的12H单元中。
MOVX A,@Ri
指令长度(字节): 1
执行周期: 2
二进制编码:
1 1
1
0
0 0 1 i
操作: MOVX
(A) ��
←�������
������
((Ri))
MOVX A,@DPTR
指令长度(字节): 1
执行周期: 2
二进制编码:
1 1 1 0
0 0 0 0
操作: MOVX
(A) ��
←���������
��������
((DPTR))
114
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
MOVX
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
@Ri, A
指令长度(字节): 1
执行周期: 2
二进制编码:
1 1 1 1
0 0 1 i
操作: MOVX
((Ri))��
←����
(A)
���
MOVX
@DPTR, A
指令长度(字节): 1
执行周期: 2
二进制编码:
1 1 1 1
.
d
e
t
i
m
0 0 0 0
操作: MOVX
(DPTR)����
←���
(A)
U
C
M
MUL AB
功能: 乘法
Li
说明: 该指令可用于实现累加器和寄存器B中的无符号8位整数的乘法。所产生的16位乘积
的低8位存放在累加器中,而高8位存放在寄存器B中。若乘积大于255(0FFH),则置
位溢出标志;否则清零标志位。在执行该指令时,进位标志总是被清零。
C
T
S
举例: 假设累加器A的初始值为80(50H),寄存器B的初始值为160 (0A0H),则指令�
:
MUL AB
求得乘积12 800 (3200H),所以寄存器B的值变成32H (00110010B),累加器被清零,
溢出标志被置位,进位标志被清零。
指令长度(字节): 1
执行周期: 4
二进制编码:
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
115
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
NOP
功能: 空操作
说明: 执行本指令后,将继续执行随后的指令。除了PC外,其他寄存器和标志位都不会有
变化。
举例: 假设期望在端口P2的第7号引脚上输出一个长时间的低电平脉冲,该脉冲持续5个机
器周期(精确)。若是仅使用SETB和CLR指令序列,生成的脉冲只能持续1个机器周
期。因而需要设法增加4个额外的机器周期。可以按照如下方式来实现所要求的功能
(假设中断没有被启用):
CLR
NOP
NOP
NOP
NOP
SETB
P2.7
P2.7
指令长度(字节): 1
执行周期: 1
二进制编码:
0
0
0
0
操作: NOP
(PC) ←�������
(PC)+1
C
T
S
ORL ,
0
0
U
C
M
0
0
.
d
e
t
i
m
Li
功能: 两个字节变量的逻辑或运算
说明:
ORL指令将由和所指定的两个字节变量进行逐位逻辑或运
算,结果存放在所代表的数据单元中。该操作不影响标志位。
两个操作数组合起来,支持6种寻址方式。当目的操作数是累加器A时,源操作
数可以采用寄存器寻址、直接寻址、寄存器间接寻址或者立即寻址。当目的操作数
采用直接寻址方式时,源操作数可以是累加器或立即数。
注意:如果该指令被用来修改输出引脚上的状态,那么所代表的数
据是从端口输出数据锁存器中获取的数据,而不是从引脚上读取的数据。
举例:
假设累加器A中数据为0C3H (11000011B),寄存器R0中的数据为55H(01010101) ,
则指令�
:
ORL
A, R0
执行后,累加器的内容变成0D7H(11010111B)。当目的操作数是直接寻址数据字节
时,ORL指令可用来把任何RAM单元或者硬件寄存器中的各个位设置为1。究竟哪
些位会被置1由屏蔽字节决定,屏蔽字节既可以是包含在指令中的常数,也可以是
累加器A在运行过程中实时计算出的数值。执行指令�
:
ORL
P1, #00110010B
之后,把1口的第5、4、1位置1。
116
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
ORL A,Rn
指令长度(字节): 1
执行周期: 1
二进制编码:
0
1
0
0
1
r
r
r
1
0
1
操作: ORL
(A) ��
←����
���
(A)∨(Rn)
ORL A,direct
指令长度(字节): 2
执行周期: 1
二进制编码:
0
1
0
0
0
direct address
操作: ORL
(A)��
←����
���
(A)∨(direct)
ORL A,@Ri
指令长度(字节): 1
执行周期: 1
二进制编码:
0
1
0
0
0
U
C
M
1
1
i
1
0
0
操作: ORL
(A)��
←����
���
(A)∨((Ri))
ORL A,#data
指令长度(字节): 2
执行周期: 1
二进制编码:
C
T
S
0
1
0
0
0
.
d
e
t
i
m
Li
immediate data
操作: ORL
(A)��
←����
���
(A)∨ #data
ORL direct, A
指令长度(字节): 2
执行周期: 1
二进制编码:
0
1
0
0
0
0
1
0
direct address
1
direct address
操作: ORL
(direct)��
←���������
��������
(direct)∨(A)
ORL direct, #data
指令长度(字节): 3
执行周期: 2
二进制编码:
0
1
0
0
0
0
1
immediate data
操作: ORL
(direct) ←���������
�� ��������
(direct)∨#data
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
117
STC15F204EA系列单片机指南
ORL
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
C,
功能: 位变量的逻辑或运算
说明: 如果所表示的位变量为1,则置位进位标志;否则,保持进位标志的当前状
态不变。在汇编语言中,位于源操作数之前的“/”表示将源操作数取反后使用,但
源操作数本身不发生变化。在执行本指令时,不影响其他标志位。
举例: 当执行如下指令序列时,当且仅当P1.0=1或ACC.7=1或OV=0时,置位进位标志C:
MOV
ORL
ORL
C, P1.0
C, ACC.7
C, /OV
;LOAD CARRY WITH INPUT PIN P10
;OR CARRY WITH THE ACC.BIT 7
;OR CARRY WITH THE INVERSE OF OV
ORL C, bit
指令长度(字节): 2
执行周期: 2
二进制编码:
0
1
1
1
0
0
1
0
ORL C, /bit
指令长度(字节): 2
执行周期: 2
二进制编码:
1
0
1
0
C
T
S
0
0
操作: ORL
(C) ��
←����
���
(C)∨(bit)
POP direct
U
C
M
0
0
.
d
e
t
i
m
bit address
操作: ORL
(C) ��
←����
���
(C)∨(bit)
Li
bit address
功能: 出栈
说明: 读取栈指针所指定的内部RAM单元的内容,栈指针减1。然后,将读到的内容传送到
由direct所指示的存储单元(直接寻址方式)中去。该操作不影响标志位。
举例:
设栈指针的初值为32H,内部RAM的30H~32H单元的数据分别为20H、23H和
01H。则执行指令�
:
POP DPH
POP DPL
之后,栈指针的值变成30H,数据指针变为0123H。此时指令
POP SP
将把栈指针变为20H 。
注意:在这种特殊情况下,在写入出栈数据(20H)之前,栈指针先减小到
2FH,然后再随着20H的写入,变成20H。
指令长度(字节): 2
执行周期: 2
二进制编码: 1 1 0 1
0
0
0
0
direct address
操作: POP
(diect) ←�������
((SP))
(SP) ��
←������
�����
(SP) ��- �1
118
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
PUSH direct
功能: 压栈
说明: 栈指针首先加1,然后将direct所表示的变量内容复制到由栈指针指定的内部RAM存
储单元中去。该操作不影响标志位。
举例: 设在进入中断服务程序时栈指针的值为09H,数据指针DPTR的值为0123H。则执行如
下指令序列
PUSH
PUSH
DPL
DPH
之后,栈指针变为0BH,并把数据23H和01H分别存入内部RAM的0AH和0BH存储单
元之中。
指令长度(字节): 2
执行周期: 2
二进制编码: 1 1 0 0
0
0
0
操作: PUSH
(SP) ��
←���������
��������
(SP) + 1
((SP)) ��
←���������
��������
(direct)
direct address
U
C
M
C
T
S
RET
0
功能: 从子例程返回
.
d
e
t
i
m
Li
说明: 执行RET指令时,首先将PC值的高位字节和低位字节从栈中弹出,栈指针减2。然
后,程序从形成的PC值所对应的地址处开始执行,一般情况下,该指令和ACALL或
LCALL配合使用。改指令的执行不影响标志位。
举例: 设栈指针的初值为0BH,内部RAM的0AH和0BH存储单元中的数据分别为23H和
01H。则指令:
RET
执行后,栈指针变为09H。程序将从0123H地址处继续执行。
指令长度(字节): 1
执行周期: 2
二进制编码: 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
119
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
RETI
功能: 中断返回
说明: 执行该指令时,首先从栈中弹出PC值的高位和低位字节,然后恢复中断启用,准备
接受同优先级的其他中断,栈指针减2。其他寄存器不受影响。但程序状态字PSW
不会自动恢复到中断前的状态。程序将继续从新产生的PC值所对应的地址处开始执
行,一般情况下是此次中断入口的下一条指令。在执行RETI指令时,如果有一个优
先级较低的或同优先级的其他中断在等待处理,那么在处理这些等待中的中断之前需
要执行1条指令。
举例: 设栈指针的初值为0BH,结束在地址0123H处的指令执行结束期间产生中断,内部
RAM的0AH和0BH单元的内容分别为23H和01H。则指令�
:
.
d
e
t
i
m
RETI
执行完毕后,栈指针变成09H,中断返回后程序继续从0123H地址开始执行。
指令长度(字节): 1
执行周期: 2
二进制编码: 0 0 1 1
0
0
操作: RETI
(PC15-8) ��
←�������
������
((SP))
(SP) ��
←��������
�������
(SP) -1
(PC7-0) ��
←�������
������
((SP))
(SP) ��
←��������
�������
(SP) -1
RL A
C
T
S
U
C
M
1
0
Li
功能: 将累加器A中的数据位循环左移
说明: 将累加器中的8位数据均左移1位,其中位7移动到位0。该指令的执行不影响标志位。
举例: 设累加器的内容为0C5H(11000101B),则指令
RL
A
执行后,累加器的内容变成8BH(10001011B),且标志位不受影响。
指令长度(字节): 1
执行周期: 1
二进制编码: 0 0 1 0
0
0
1
1
操作: RL
(An+1) ��
←�����������
����������
(An) n ��
= ���
0-6
(A0) ��
←�����
����
(A7)
120
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
RLC A
功能: 带进位循环左移
说明: 累加器的8位数据和进位标志一起循环左移1位。其中位7移入进位标志,进位标志的
初始状态值移到位0。该指令不影响其他标志位。
举例: 假设累加器A的值为0C5H(11000101B),则指令
RLC
A
执行后,将把累加器A的数据变为8BH(10001011B),进位标志被置位。
指令长度(字节): 1
执行周期: 1
二进制编码:
0
0
1 1
操作: RLC
(An+1) ��
←���
��
(An)
(A0) ←����
�� (C)
���
(C) ←���
�� (A
��7)
RR A
0
0
1
n = 0-6
U
C
M
C
T
S
.
d
e
t
i
m
1
Li
功能: 将累加器的数据位循环右移
说明: 将累加器的8个数据位均右移1位,位0将被移到位7,即循环右移,该指
令不影响标志位。
举例: 设累加器的内容为0C5H(11000101B),则指令
RR
A
执行后累加器的内容变成0E2H(11100010B),标志位不受影响。
指令长度(字节): 1
执行周期: 1
二进制编码: 0 0 0 0
操作: RR
(An) ←���
�� (A
��n+1)
(A7) ←���
�� (A
��0)
南通国芯微电子有限公司
0
0
1
1
n=0-6
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
121
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
RRC A
功能: 带进位循环右移
说明: 累加器的8位数据和进位标志一起循环右移1位。其中位0移入进位标志,进位标志的
初始状态值移到位7。该指令不影响其他标志位。
举例: 假设累加器的值为0C5H(11000101B),进位标志为0,则指令
RRC
A
执行后,将把累加器的数据变为62H(01100010B),进位标志被置位。
指令长度(字节): 1
执行周期: 1
二进制编码:
0
0
0 1
0
操作: RRC
(An+1) ←���
�� ��
(An)
(A7) ��
←����
���
(C)
(C) ��
←���
��
(A0)
SETB
0
1
1
n = 0-6
U
C
M
功能: 置位
.
d
e
t
i
m
Li
说明: SETB指令可将相应的位置1,其操作对象可以是进位标志或其他可直接寻址的位。
该指令不影响其他标志位。
C
T
S
举例: 设进位标志被清零,端口1的输出状态为34H(00110100B),则指令
SETB
C
SETB
P1.0
执行后,进位标志变为1,端口1的输出状态变成35H(00110101B)。
SETB
C
指令长度(字节): 1
执行周期: 1
二进制编码:
1
1
0 1
0
0
1
1
0
0
0
1
0
操作: SETB
(C) ��
←��
�1
SETB
bit
指令长度(字节): 2
执行周期: 1
二进制编码:
1
1
1
bit address
操作: SETB
(bit) ←��
�� 1�
122
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
SJMP rel
功能: 短跳转
说明: 程序无条件跳转到rel所示的地址去执行。目标地址按如下方法计算:首先PC值加2,
然后将指令第2字节(即rel)所表示的有符号偏移量加到PC上,得到的新PC值即短
跳转的目标地址。所以,跳转的范围是当前指令(即SJMP)地址的前128字节和后
127字节。
举例: 设标号RELADR对应的指令地址位于程序存储器的0123H地址,则指令:
SJMP
RELADR
汇编后位于0100H。当执行完该指令后,PC值变成0123H。
注意:在上例中,紧接SJMP的下一条指令的地址是0102H,因此,跳转的偏移
量为0123H-0102H=21H。另外,如果SJMP的偏移量是0FEH,那么构成只有1条指
令的无限循环。
指令长度(字节): 2
执行周期: 2
二进制编码:
1
0
0 0
0
操作: SJMP
(PC) ��
←�������
������
(PC)+2
(PC) ��
←���������
��������
(PC)+rel
SUBB A,
C
T
S
功能: 带借位的减法
说明:
0
0
0
rel. address
U
C
M
.
d
e
t
i
m
Li
SUBB指令从累加器中减去所代表的字节变量的数值及进位标志,减
法运算的结果置于累加器中。如果执行减法时第7位需要借位,SUBB将会置位进位
标志(表示借位);否则,清零进位标志。(如果在执行SUBB指令前,进位标志
C已经被置位,这意味着在前面进行多精度的减法运算时,产生了借位。因而在执
行本条指令时,必须把进位连同源操作数一起从累加器中减去。)如果在进行减法
运算的时候,第3位处向上有借位,那么辅助进位标志AC会被置位;如果第6位有借
位;而第7位没有,或是第7位有借位,而第6位没有, 则溢出标志OV被置位。
当进行有符号整数减法运算时,若OV置位,则表示在正数减负数的过程中产生
了负数;或者,在负数减正数的过程中产生了正数。
源操作数支持的寻址方式:寄存器寻址、直接寻址、寄存器间接寻址和立即数
寻址。
举例:
设累加器中的数据为0C9H(11001001B)。寄存器R2的值为54H(01010100B),进
位标志C被置位。则如下指令:
SUBB
A, R2
执行后,累加器的数据变为74H(01110100B),进位标志C和辅助进位标志AC被清
零,溢出标志C被置位。
注意:0C9H减去54H应该是75H,但在上面的计算中,由于在SUBB指令执行
前,进位标志C已经被置位,因而最终结果还需要减去进位标志,得到74H。因此,
如果在进行单精度或者多精度减法运算前,进位标志C的状态未知,那么应改采用
CLR C 指令把进位标志C清零。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
123
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
SUBB A, Rn
指令长度(字节): 1
执行周期: 1
二进制编码: 1 0 0 1
1 r r r
操作: SUBB
(A) ��
←�����
����
(A) ��- ����
(C) ��- ����
(Rn)
SUBB A, direct
指令长度(字节): 2
执行周期: 1
二进制编码: 1 0 0
1
0
1
0
1
direct address
操作: SUBB
(A) ��
←�����
����
(A) ��- ����
(C) ��- ��������
(direct)
.
d
e
t
i
m
SUBB A, @Ri
指令长度(字节): 1
执行周期: 1
二进制编码: 1 0 0
1
0
1
1
i
U
C
M
操作: SUBB
(A) ��
←�����
����
(A) ��- ����
(C) ��- ������
((Ri))
SUBB A, #data
C
T
S
指令长度(字节): 2
执行周期: 1
二进制编码: 1 0 0
1
0
1
0
0
Li
immediate data
操作: SUBB
(A) ��
←�����
����
(A) ��- ����
(C) ��- �����
#data
SWAP A
功能: 交换累加器的高低半字节
说明: SWAP指令把累加器的低4位(位3~位0)和高4位(位7~位4)数据进行交换。实际上
SWAP指令也可视为4位的循环指令。该指令不影响标志位。
举例: 设累加器的内容为0C5H(11000101B),则指令
SWAP
A
执行后,累加器的内容变成5CH(01011100B)。
指令长度(字节): 1
执行周期: 1
二进制编码:
1
1
0 0
操作: SWAP
(A3-0)
124
南通国芯微电子有限公司
0
1
0
0
(A7-4)
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
XCH A,
功能: 交换累加器和字节变量的内容
说明: XCH指令将所指定的字节变量的内容装载到累加器,同时将累加器的旧内容
写入所指定的字节变量。指令中的源操作数和目的操作数允许的寻址方式:寄
存器寻址、直接寻址和寄存器间接寻址。
举例: 设R0的内容为地址20H,累加器的值为3FH (00111111B)。内部RAM的20H单元的内
容为75H (01110101B)。则指令
XCH
A, @R0
执行后,内部RAM的20H单元的数据变为3FH (00111111B),累加器的内容变为
75H(01110101B)。
.
d
e
t
i
m
XCH A, Rn
指令长度(字节): 1
执行周期: 1
二进制编码: 1 1 0 0
操作: XCH
(A)
1 r r r
(Rn)
XCH A, direct
指令长度(字节): 2
执行周期: 1
二进制编码: 1 1 0 0
C
T
S
操作: XCH
(A)
U
C
M
0 1 0 1
Li
direct address
(direct)
XCH A, @Ri
指令长度(字节): 1
执行周期: 1
二进制编码: 1 1 0 0
操作: XCH
(A)
南通国芯微电子有限公司
0 1 1
i
((Ri))
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
125
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
XCHD A, @Ri
功能: 交换累加器和@Ri对应单元中的数据的低4位
说明: XCHD指令将累加器内容的低半字节(位0~3,一般是十六进制数或BCD码)和间接
寻址的内部RAM单元的数据进行交换,各自的高半字(位7~4)节不受影响。另外,
该指令不影响标志位。
举例: 设R0保存了地址20H,累加器的内容为36H (00110110B)。内部RAM的20H单元存储
的数据为75H (011110101B)。则指令:
XCHD
A, @R0
执行后,内部RAM 20H单元的内容变成76H (01110110B),累加器的内容变为
35H(00110101B)。
指令长度(字节): 1
执行周期: 1
二进制编码: 1 1 0 1
操作: XCHD
(A3-0)
0 1 1 i
(Ri3-0)
XRL ,
C
T
S
功能: 字节变量的逻辑异或
说明:
U
C
M
.
d
e
t
i
m
Li
XRL指令将和所代表的字节变量逐位进行逻辑异或运算,
结果保存在所代表的字节变量里。该指令不影响标志位。
两个操作数组合起来共支持6种寻址方式:当目的操作数为累加器时,源操作数
可以采用寄存器寻址、直接寻址、寄存器间接寻址和立即数寻址;当目的操作数是
可直接寻址的数据时,源操作数可以是累加器或者立即数。
注意:如果该指令被用来修改输出引脚上的状态,那么dest-byte所代表的数据就
是从端口输出数据锁存器中获取的数据,而不是从引脚上读取的数据。
举例:
如果累加器和寄存器0的内容分别为0C3H (11000011B)和0AAH(10101010B),则
指令�
:
XRL
A, R0
执行后,累加器的内容变成69H (01101001B)。
当目的操作数是可直接寻址字节数据时,该指令可把任何RAM单元或者寄存器
中的各个位取反。具体哪些位会被取反,在运行过程当中确定。指令�
:
XRL
P1, #00110001B
执行后,P1口的位5、4、0被取反。
126
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
XRL A, Rn
操作: XRL
(A) ��
← ����
(A)�
≮
指令长度(字节): 1
执行周期: 1
二进制编码: 0 1 1 0
1 r r r
(Rn)
XRL A, direct
指令长度(字节): 2
执行周期: 1
0 1 1 0
操作: XRL
(A) ��
← ����
(A)�
0 1 0 1
≮
二进制编码:
direct address
XRL A, @Ri
指令长度(字节): 1
执行周期: 1
1
操作: XRL
(A) ��
← ����
(A)�
XRL A, #data
指令长度(字节): 2
执行周期: 1
二进制编码:
0
≮
0 1
0 1
1
操作: XRL
(A) ��
← ����
(A)�
0
U
C
M
0 1 1 i
((Ri))
C
T
S
≮
二进制编码:
.
d
e
t
i
m
(direct)
0 1 0 0
Li
immediate data
#data
XRL direct, A
指令长度(字节): 2
执行周期: 1
0 1
1
0
0 0 1 0
操作: XRL
(direct) ←
�� ���������
(direct)�
≮
二进制编码:
direct address
(A)
XRL direct, #dataw
指令长度(字节): 3
执行周期: 2
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
127
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
5.3.2 Instruction Definitions of Traditional 8051 MCU
ACALL addr 11
Function:
Description:
Absolute Call
ACALL unconditionally calls a subroutine located at the indicated address.The instruction
increments the PC twice to obtain the address of the following instruction, then pushes the
16-bit result onto the stack (low-order byte first) and increments the Stack Pointer twice.
The destination address is obtained by suceesively concatenating the five high-order bits of
the incremented PC opcode bits 7-5,and the second byte of the instruction. The subroutine
called must therefore start within the same 2K block of the program memory as the first
byte of the instruction following ACALL. No flags are affected.
Example:
Initially SP equals 07H. The label “SUBRTN” is at program memory location 0345H. After
executingthe instruction,
.
d
e
t
i
m
ACALL SUBRTN
at location 0123H, SP will contain 09H, internal RAM locations 08H and 09H will contain
25H and 01H, respectively, and the PC will contain 0345H.
Bytes:
2
Cycles:
2
Encoding:
Operation:
a10 a9 a8 1
U
C
M
0 0 1 0
a7 a6 a5 a4
Li
a3 a2 a1 a0
ACALL
(PC)��
←��������
�������
(PC)+ 2
(SP)���������
←��������
(SP) + 1
((SP)) ��
←����
���
(PC7-0)
(SP)���������
←��������
(SP) + 1
((SP))����
←���
(PC15-8)
(PC10-0)��
←� page
����� �������
address
C
T
S
ADD A,
Function:
Description:
Add
ADD adds the byte variable indicated to the Accumulator, leaving the result in the
Accumulator. The carry and auxiliary-carry flags are set, respectively, if there is a carryout from bit 7 or bit 3, and cleared otherwise. When adding unsigned integers, the carry flag
indicates an overflow occured.
OV is set if there is a carry-out of bit 6 but not out of bit 7, or a carry-out of bit 7 but not bit
6; otherwise OV is cleared. When adding signed integers, OV indicates a negative number
produced as the sum of two positive operands, or a positive sum from two negative operands.
Example:
Four source operand addressing modes are allowed: register,direct register-indirect, or
immediate.
The Accumulator holds 0C3H(11000011B) and register 0 holds 0AAH (10101010B). The
instruction,
ADD A,R0
will leave 6DH (01101101B) in the Accumulator with the AC flag cleared and both the carry
flag and OV set to 1.
128
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
ADD A,Rn
Bytes:
1
Cycles:
1
Encoding:
Operation:
0 0
1
0
1 r r r
ADD
(A)�����������
←����������
(A) + (Rn)
ADD A,direct
Bytes:
2
Cycles:
1
Encoding:
Operation:
0 0 1 0
0 1 0 1
direct address
ADD
(A)���������������
←��������������
(A) + (direct)
.
d
e
t
i
m
ADD A,@Ri
Bytes:
1
Cycles:
1
Encoding:
Operation:
0 0
Operation:
0
2
1
C
T
S
0 0 1 0
U
C
M
0 1 1 i
ADD
(A)�������������
←������������
(A) + ((Ri))
ADD A,#data
Bytes:
Cycles:
Encoding:
1
0 1 0 0
Li
immediate data
ADD
(A)�������
←������
(A) + �����
#data
ADDC A,
Function:
Description:
Example:
Add with Carry
ADDC simultaneously adds the byte variable indicated, the Carry flag and the Accumulator,
leaving the result in the Accumulator. The carry and auxiliary-carry flags are set, respectively,
if there is a carry-out from bit 7 or bit 3, and cleared otherwise. When adding unsigned
integers, the carry flag indicates an overflow occured.
OV is set if there is a carry-out of bit 6 but not out of bit 7, or a carry-out of bit 7 but not
out of bit 6; otherwise OV is cleared. When adding signed integers, OV indicates a negative
number produced as the sum of two positive operands or a positive sum from two negative
operands.
Four source operand addressing modes are allowed: register, direct, register-indirect, or
immediate.
The Accumulator holds 0C3H(11000011B) and register 0 holds 0AAH (10101010B) with the
Carry. The instruction,
ADDC A,R0
will leave 6EH (01101101B) in the Accumulator with the AC flag cleared and both the carry
flag and OV set to 1.
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
129
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
ADDC A,Rn
Bytes:
1
Cycles:
1
Encoding:
Operation:
0 0
1
1
1 r r r
ADDC
(A)�����������������
←����������������
(A) + (C) + (Rn)
ADDC A,direct
Bytes:
2
Cycles:
1
Encoding:
Operation:
0 0 1 1
0 1 0 1
direct address
ADDC
(A)���������������������
←��������������������
(A) + (C) + (direct)
ADDC A,@Ri
Bytes:
1
Cycles:
1
Encoding:
Operation:
0 0
1
U
C
M
0 1 1 i
ADDC
(A)�������������������
←������������������
(A) + (C) + ((Ri))
ADDC A,#data
Bytes:
2
Cycles:
1
Encoding:
Operation:
1
C
T
S
0 0 1 1
0 1 0 0
.
d
e
t
i
m
Li
immediate data
ADDC
(A)�������������
←������������
(A) + (C) + �����
#data
AJMP addr 11
Function:
Description:
Example:
Bytes:
Cycles:
Encoding:
Operation:
130
Absolute Jump
AJMP transfers program execution to the indicated address, which is formed at run-time by
concatenating the high-order five bits of the PC (after incrementing the PC twice), opcode
bits 7-5, and the second byte of the instruction. The destination must therefore be within the
same 2K block of program memory as the first byte of the instruction following AJMP.
The label “JMPADR” is at program memory location 0123H. The instruction,
AJMP JMPADR
is at location 0345H and will load the PC with 0123H.
2
2
a10 a9 a8 0
0 0 0 1
a7 a6 a5 a4
a3 a2 a1 a0
AJMP
(PC)��
←��������
�������
(PC)+ 2
(PC10-0)��
←� �����
page �������
address
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
ANL ,
Function:
Description:
Logical-AND for byte variables
ANL performs the bitwise logical-AND operation between the variables indicated and stores
the results in the destination variable. 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 55H (01010101B) then the
instruction,
.
d
e
t
i
m
ANL A,R0
will leave 41H (01000001B) in the Accumulator.
Li
When the destination is a directly addressed byte, this instruction will clear combinations of
bits in any RAM location or hardware register. The mask byte determining the pattern of bits
to be cleared would either be a constant contained in the instruction or a value computed in
the Accumulator at run-time. The instruction,
ANL Pl, #01110011B
U
C
M
will clear bits 7, 3, and 2 of output port 1.
ANL A,Rn
Bytes:
1
Cycles:
1
Encoding:
Operation:
C
T
S
0 1
0
1
1 r r r
ANL
(A)�����
←����
(A) ∧ (Rn)
ANL A,direct
Bytes:
2
Cycles:
1
Encoding:
Operation:
0 1 0 1
0 1 0 1
direct address
ANL
(A)�����
←����
(A) ∧ (direct)
ANL A,@Ri
Bytes:
1
Cycles:
1
Encoding:
Operation:
0 1
0
1
0 1 1 i
ANL
(A)�����
←����
(A) ∧ ((Ri))
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
131
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
ANL A,#data
Bytes:
2
Cycles:
1
Encoding:
Operation:
0 1 0 1
0 1 0 0
immediate data
ANL
(A)�����
←����
(A) ∧ #data
ANL direct,A
Bytes:
2
Cycles:
1
Encoding:
Operation:
0 1 0 1
0 0 1 0
direct address
ANL direct,#data
Bytes:
3
Cycles:
2
Encoding:
Operation:
0 1 0 1
U
C
M
0 0 1 1
Li
direct address
immediate data
ANL
(direct)����������
←���������
(direct) ∧ #data
C
T
S
ANL C ,
Function:
Description:
.
d
e
t
i
m
ANL
(direct)����������
←���������
(direct) ∧ (A)
Logical-AND for bit variables
If the Boolean value of the source bit is a logical 0 then clear the carry flag; otherwise
leave the carry flag in its current state. 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 affceted. No other flsgs are affected.
Only direct addressing is allowed for the source operand.
Example:
Set the carry flag if, and only if, P1.0 = 1, ACC. 7 = 1, and OV = 0:
MOV C, P1.0
;LOAD CARRY WITH INPUT PIN STATE
ANL C, ACC.7
;AND CARRY WITH ACCUM. BIT.7
ANL C, /OV
;AND WITH INVERSE OF OVERFLOW FLAG
ANL C,bit
Bytes:
2
Cycles:
2
Encoding:
Operation:
132
1 0 0 0
0 0 1 0
bit address
ANL
(C) ��
← ����
(C) ∧ (bit)
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
ANL C, /bit
Bytes:
2
Cycles:
2
Encoding:
1 0 1 1
Operation:
ANL
(C)�����
←����
(C) ∧ (bit)
0 0 0 0
bit address
CJNE , , rel
Function:
Description:
Compare and Jump if Not Equal
CJNE compares the magnitudes of the first two operands, and branches if their values are not
equal. The branch destination is computed by adding the signed relative-displacement in the
last instruction byte to the PC, after incrementing the PC to the start of the next instruction.
The carry flag is set if the unsigned integer value of is less than the unsigned
integer value of ; otherwise, the carry is cleared. Neither operand is affected.
.
d
e
t
i
m
The first two operands allow four addressing mode combinations: the Accumulator may
be compared with any directly addressed byte or immediate data, and any indirect RAM
location or working register can be compared with an immediate constant.
Example:
U
C
M
Li
The Accumulator contains 34H. Register 7 contains 56H. The first instruction in the sequence
CJNE
...
JC
...
;
NOT_EQ:
;
C
T
S
R7,#60H, NOT-EQ
......
REQ_LOW
.....
; R7 = 60H.
; IF R7 < 60H.
; R7 > 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
133
STC15F204EA系列单片机指南
技术支持网站: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:
134
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
STC15F204EA系列单片机指南
技术支持网站: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
135
STC15F204EA系列单片机指南
技术支持网站: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)
136
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
DA
技术支持网站:www.STCMCU.com
临时技术支持: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
137
STC15F204EA系列单片机指南
技术支持网站: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
138
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
STC15F204EA系列单片机指南
DEC
临时技术支持:13922829991
研发顾问:13922809991
direct
Bytes:
2
Cycles:
1
Encoding:
Operation:
DEC
技术支持网站:www.STCMCU.com
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
139
STC15F204EA系列单片机指南
技术支持网站: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:
140
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
STC15F204EA系列单片机指南
Operation:
INC
技术支持网站:www.STCMCU.com
临时技术支持: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
141
STC15F204EA系列单片机指南
INC
Bytes:
1
Cycles:
1
Operation:
Example:
0 0 0 0
0 1 1 i
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:
142
研发顾问:13922809991
DPTR
Function:
Description:
JB
临时技术支持:13922829991
@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
STC15F204EA系列单片机指南
JBC
临时技术支持:13922829991
研发顾问:13922809991
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
技术支持网站:www.STCMCU.com
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
143
STC15F204EA系列单片机指南
技术支持网站: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:
144
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
STC15F204EA系列单片机指南
JNC
技术支持网站:www.STCMCU.com
临时技术支持: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
145
STC15F204EA系列单片机指南
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:
146
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
STC15F204EA系列单片机指南
技术支持网站: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
147
STC15F204EA系列单片机指南
技术支持网站: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:
148
0 1 1 1
MOV
(Rn) ��
←� �����
#data
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站: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
149
STC15F204EA系列单片机指南
技术支持网站: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:
150
1
0
0
MOV
(bit)��
←����
(C)
���
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站: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 ��
← �����
#data15-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
151
STC15F204EA系列单片机指南
技术支持网站: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:
152
1 1
1
0
0 0 1 i
MOVX
(A) ��
←�������
������
((Ri))
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站: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
153
STC15F204EA系列单片机指南
技术支持网站: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.
154
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站: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
155
STC15F204EA系列单片机指南
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:
156
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
STC15F204EA系列单片机指南
技术支持网站: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
157
STC15F204EA系列单片机指南
技术支持网站: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:
158
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
STC15F204EA系列单片机指南
技术支持网站: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
159
STC15F204EA系列单片机指南
SETB
Function:
Example:
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).
1
Cycles:
1
Encoding:
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:
160
研发顾问:13922809991
Set bit
C
Bytes:
Operation:
SETB
临时技术支持:13922829991
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
STC15F204EA系列单片机指南
技术支持网站: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
161
STC15F204EA系列单片机指南
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:
162
.
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
STC15F204EA系列单片机指南
技术支持网站: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
163
STC15F204EA系列单片机指南
技术支持网站: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:
164
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
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
第6章 中断系统
中断系统是为使CPU具有对外界����������������
紧急��������������
事件的�����������
实时���������
处理能力而设置的。
当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的
工作,转而去处理这个紧急事件���������������������������
,��������������������������
处理完以后,再回到原来被中断的地方,继续原来的工作,
这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断
源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服
务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排
队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响
应������������
优先����������
级别最高的中断请求。
当CPU正在处理一个中断源请求的时候(执行相应的����������������
中断��������������
服务程序),发生了另外一个优
先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的�������������
服务�����������
程序,转而去处理优先级
更高的中断请求源,处理完以后,再回到原低级中断������������������
服务����������������
程序,这样的过程称为中断嵌套。这
样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。
.
d
e
t
i
m
Li
STC15F204EA系列单片机提供了9个中断请求源,它们分别是:外部中断0(INT0)、定时
器0中断、外部中断1(INT1)、定时器1中断、A/D转换中断、低压检测(LVD)中断、外部中断2(
U
C
M
INT2)、外部中断3(INT3)以及外部中断4(INT4)。除外部中断2(INT2)、外部中断3(INT3)及
外部中断4(INT4)固定是最低优先级中断外,其它的中断都具有两个中断优先级,可实现两级
中断服务程序嵌套。用户可以用关总中断允许位(EA/IE.7)或相应中断的允许位屏蔽相应的中
断请求,也可以用打开相应的中断允许位来使CPU响应相应的中断申请;每一个中断源可以用
软件独立地控制为开中断或关中断状态;部分中断的优先级别均可用软件设置。高优先级的中
断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优先级的中断。当
两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。
C
T
S
STC15F204EA系列单片机的各个中断查询次序如下表6-1所示:
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
165
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
表6-1 中断查询次序
中断向 相同优先级内的 中断优先 中断优 中断请求标
量地址
查询次序
级设置
先级
志位
中断源
INT0
(外部中断 0)
Timer 0
INT1
(外部中断1)
Timer1
No S1(UART1)
ADC
LVD
No PCA
No S2(UART2)
No SPI
中断允许
控制位
0003H
0 (highest)
PX0
0/1
IE0
EX0/EA
000BH
1
PT0
0/1
TF0
ET0/EA
0013H
2
PX1
0/1
IE1
EX1/EA
001BH
0023B
002BH
0033H
003BH
0043H
004BH
3
4
5
6
7
8
9
PT1
0/1
TF1
ET1/EA
PADC
PLVD
0/1
0/1
ADC_FLAG
LVDF
EADC/EA
ELVD/EA
INT2
(外部中断2)
0053H
10
INT3
(外部中断3)
005BH
No BRT_INT
System Reserved
System Reserved
0063H
006BH
0073H
007BH
INT4
(外部中断4)
0083H
C
T
S
Li
0
U
C
M
11
.
d
e
t
i
m
0
EX2/EA
EX3/EA
12
13
14
15
16��������
(lowest)
0
EX4/EA
如果使用C语言编程,中断查询次序号就是中断号,例如:
166
void
void
void
void
void
void
void
void
void
Int0_Routine(void)
Timer0_Rountine(void)
Int1_Routine(void)
Timer1_Rountine(void)
ADC_Routine(void)
LVD_Routine(void)
Int2_Routine(void)
Int3_Routine(void)
Int4_Routine(void)
南通国芯微电子有限公司
interrupt 0;
interrupt 1;
interrupt 2;
interrupt 3;
interrupt 5;
interrupt 6;
interrupt 10;
interrupt 11;
interrupt 16;
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.1 中断结构
STC15F204EA系列单片机的中断系统结构示意图如图6-1所示
上升沿和
下降沿均
可中断
中断允许控制
寄存器
中断优先级
控制寄存器
高优先级中断
IE, INT_CLKO
寄存器
TCON.0/IT0=0
INT0
EA
EX0
IE0
IP 寄存器
PX0
低优先级中断
'1'
'0'
high
.
d
e
t
i
m
TCON.0/IT0=1
ET0
Timer0 / TF0
TCON.2/IT1=0
INT1
EX1
IE1
TCON.2/IT1=1
LVDF
INT2
INT3
INT4
PX1
U
C
M
ET1
Timer1 / TF1
ADC_FLAG
PT0
C
T
S
PT1
EADC
ELVD
PADC
PLVD
EX2
'1'
'0'
'1'
'0'
'1'
'0'
Li
中断
查询
次序
'1'
'0'
'1'
'0'
无中断优先级控制位,
中断优先级固定为0级
EX3
无中断优先级控制位,
中断优先级固定为0级
EX4
无中断优先级控制位,
中断优先级固定为0级
low
EA
Global Enable
EA
图6-1 STC15F204EA系列中断系统结构图
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
167
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
外部中断0(INT0)和外部中断1(INT1)既可上升沿触发,又可下降沿触发。请求两个外部中
断的标志位是位于寄存器TCON中的IE0/TCON.1和IE1/TCON.3。当外部中断服务程序被响应
后,中断标志位IE0和IE1会自动被清0。TCON寄存器中的IT0/TCON.0和IT1/TCON.2决定了外
部中断0和1是上升沿触发还是下降沿触发。如果ITx = 0(x = 0,1),那么系统在INTx(x = 0,1)脚探
测到上升沿或下降沿后均可产生外部中断。如果ITx = 1(x = 0,1),那么系统在INTx( x= 0,1)脚探
测下降沿后才可产生外部中断。外部中断0(INT0)和外部中断1(INT1)还可以用于将单片机从掉
电模式唤醒。
定时器0和1的中断请求标志位是TF0和TF1。当定时器寄存器THx/TLx(x = 0,1)溢出时,溢
出标志位TFx(x = 0,1)会被置位,定时器中断发生。当单片机转去执行该定时器中断时,定时器
的溢出标志位TFx(x = 0,1)会被硬件清除。
A/D转换的中断是由ADC_FLAG/ADC_CONTR.4请求产生的。该位需用软件清除。
.
d
e
t
i
m
低压检测(LVD)中断是由LVDF/PCON.5请求产生的。该位也需用软件清除。
外部中断2(INT2)、外部中断3(INT3)及外部中断4(INT4)都只能下降沿触发。外部中
断2~4的中断请求标志位被隐藏起来了,对用户不可见。当相应的中断服务程序执行后或
Li
EXn=0(n=2,3,4),这些中断请求标志位会自动地被清0。外部中断2(INT2)、外部中断3(INT3)
及外部中断4(INT4)也可以用于将单片机从掉电模式唤醒。
U
C
M
各个中断触发行为总结如下表6-2所示:
中断源
INT0
(外部中断0)
Timer 0
INT1
(外部中断1)
Timer1
ADC
LVD
INT2
(外部中断2)
INT3
(外部中断3)
INT4
(外部中断4)
168
C
T
S
表6-2 中断触发
触发行为
(IT0 = 1): 下降沿; (IT0 = 0): 上升沿和下降沿均可
定时器0溢出
(IT1 = 1): 下降沿; (IT1 = 0): 上升沿和下降沿均可
定时器1溢出
A/D转换完成
电源电压下降到低于LVD检测电压
下降沿
下降沿
下降沿
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.2 中断寄存器
符号
描述
位地址及符号
地址 MSB
IE
Interrupt Enable
A8H
EA
IP
Interrupt Priority Low
B8H
-
TCON
Timer Control register
88H
PCON
Power Control register 87H
External Interrupt enable
INT_CLKO
8FH
and Clock output register
ADC_CONTR ADC control register
BCH
LSB
ELVD EADC
PADC
TF1
TR1
TF0
-
-
-
EX4
ET1
EX1
ET0
EX0
000x 0000B
-
PT1
PX1
PT0
PX0
x00x 0000B
TR0
IE1
IT1
IE0
IT0
0000 0000B
GF1
GF0
-
PLVD
LVDF
EX3
复位值
-
EX2
-
-
PD
IDL xx1x 0000B
T1CLKO T0CLKO
ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1
CHIS0
x000 xx00B
0000 0000B
.
d
e
t
i
m
上表中列出了与STC15F204EA系列单片机中断相关的所有寄存器,下面逐一地对这些寄
存器进行介绍。
1. 中断允许寄存器IE和INT_CLKO
Li
STC15F204EA系列单片机CPU对中断源的开放或屏蔽,每一个中断源是否被允许中断,
是由内部的中断允许寄存器IE(IE为特殊功能寄存器,它的字节地址为A8H)控制的,其格式
如下:
IE : 中断允许寄存器 (可位寻址)
SFR name
IE
Address
A8H
bit
name
C
T
S
B7
EA
U
C
M
B6
ELVD
B5
EADC
B4
-
B3
ET1
B2
EX1
B1
ET0
B0
EX0
EA : CPU的总中断允许控制位,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。
EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受各中断源自
己的中断允许控制位控制。
ELVD : 低压检测中断允许位,ELVD=1,允许低压检测中断,ELVD=0,禁止低压检测中断。
EADC : A/D转换中断允许位,EADC=1,允许A/D转换中断,EADC=0,禁止A/D转换中断。
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
169
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
INT_CLKO是STC15F204EA系列单片机新增寄存器,地址是8FH,INT_CLKO格式如下:
INT_CLKO : 外部中断允许和时钟输出寄存器
SFR name
Address
bit
B7
B6
B5
B4
B3
B2
INT_CLKO
8FH
name
-
EX4
EX3
EX2
-
-
B1
B0
T1CLKO T0CLKO
EX4 : 外部中断4(INT4)中断允许位,EX4=1允许中断,EX4=0禁止中断。外部中断4(INT4)只
能下降沿触发。
EX3 : 外部中断3(INT3)中断允许位,EX3=1允许中断,EX3=0禁止中断。外部中断3(INT3)也
只能下降沿触发。
EX2 : 外部中断2(INT2)中断允许位,EX2=1允许中断,EX2=0禁止中断。外部中断2(INT2)同
样只能下降沿触发。
.
d
e
t
i
m
T1CLKO,T0CLKO与中断无关,在此不作介绍。
STC15F204EA系列单片机复位以后,IE和INT_CLKO被清0,由用户程序置“1”或清“0”IE
和INT_CLKO的相应位,实现允许或禁止各中断源的中断申请,若使某一个中断源允许中断必
须同时使CPU开放中断。更新IE的内容可由位操作指令来实现(SETB BIT;CLR BIT),也可
用字节操作指令实现(即MOV IE,#DATA,ANL IE,#DATA;ORL IE,#DATA;MOV IE,
A等)。更新INT_CLKO(不可位寻址)的内容可用MOV INT_CLKO, #DATA指令来解决。
C
T
S
170
南通国芯微电子有限公司
U
C
M
Li
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 中断优先级控制寄存器IP
STC15F204EA系列单片机部分中断设有两个中断优先级,除外部中断2(INT2)、外部中断
3(INT3)及外部中断4(INT4)外,所有中断请求源可编程为高优先级中断或低优先级中断,可
实现二级中断嵌套。一个正在执行的低优先级中断能被高优先级中断所中断,但不能被另一个
低优先级中断所中断,一直执行到结束,遇到返回指令RETI,返回主程序后再执行一条指令
才能响应新的中断申请。以上所述可归纳为下面两条基本规则:
⒈ 低优先级中断可被高优先级中断所中断,反之不能。
⒉ 任何一种中断(不管是高级还是低级),一旦得到响应,不会再被它的同级中断所中断
STC15F204EA系列单片机的片内有一个优先级寄存器IP,其字节地址为B8H,只要用程序
改变其内容,即可进行各中断源中断级别的设置,IP寄存器格式:
IP : 中断优先级控制寄存器 (可位寻址)
SFR name
IP
Address
B8H
bit
name
B7
-
B6
PLVD
B5
PADC
B4
-
.
d
e
t
i
m
B3
PT1
Li
B2
PX1
B1
PT0
B0
PX0
PLVD : 低压检测中断优先级控制位。PLVD=1,低压检测中断定义为高优先级中断;
PLVD=0,低压检测中断定义为低优先级中断。
U
C
M
PADC : A/D转换中断优先级控制位。PADC=1,A/D转换中断定义为高优先级中断;
PADC=0,A/D转换中断定义为低优先级中断。
PT1:定时器T1中断优先级控制位。PT1=1,定时器T1中断定义为高优先级中断;PT1=0,定
时器T1中断定义为低优先级中断。
PX1:外部中断1中断优先级控制位。PX1=1,外部中断1定义为高优先级中断;PX1=0,外部
中断1定义为低优先级中断。
PT0:定时器T0中断优先级控制位。PT0=1,定时器T0定义为高优先级中断;PT0=0,定时器
T0定义为低优先级中断。
PX0:外部中断0中断优先级控制位。PX0=1,外部中断0定义为高优先级中断;PX0=0,外部
中断0定义为低优先级中断。
中断优先级控制寄存器IP的各位都由用户程序置"1"和清"0",可用位操作指令或字节操
作指令更新IP的内容。以改变各中断源的中断优先级。STC15F204EA系列单片机复位后IP为
00H,各个中断源均为低优先级中断。
C
T
S
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
171
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
3. 定时器/计数器控制寄存器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的运行控制位。
.
d
e
t
i
m
TF0:T0溢出中断标志。T0被允许计数以后,从初值开始加1计数,当产生溢出时,由硬件置
“1”TF0,向CPU请求中断,一直保持CPU响应该中断时,才由硬件清0(也可由查询
软件清0)。
TR0: 定时器0的运行控制位。
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为下降沿触发方式。
172
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
4. 低压检测中断相关寄存器:电源控制寄存器PCON
PCON为电源控制寄存器,PCON格式如下:
PCON : 电源控制寄存器
SFR name Address
PCON
87H
bit
B7
B6
B5
B4
B3
B2
B1
B0
name
-
-
LVDF
-
GF1
GF0
PD
IDL
LVDF : 低压检测标志位,同时也是低压检测中断请求标志位。
在正常工作和空闲工作状态时,如果内部工作电压Vcc低于低压检测门槛电压,该位自
动置1,与低压检测中断是否被允许无关。即在内部工作电压Vcc低于低压检测门槛电
压时,不管有没有允许低压检测中断,该位都自动为1。该位要用软件清0,清0后,如
内部工作电压Vcc继续低于低压检测门槛电压,该位又被自动设置为1。
在进入掉电工作状态前,如果低压检测电路未被允许可产生中断,则在进入掉电模式
后,该低压检测电路不工作以降低功耗。如果被允许可产生低压检测中断,则在进入
掉电模式后,该低压检测电路继续工作,在内部工作电压Vcc低于低压检测门槛电压
后,产生低压检测中断,可将MCU从掉电状态唤醒。
.
d
e
t
i
m
Li
电源控制寄存器PCON中的其他位与低压检测中断无关,在此不作介绍。
U
C
M
在中断允许寄存器IE中,低压检测中断相应的允许位是ELVD/IE.6
IE : 中断允许寄存器 (可位寻址)
SFR name
IE
Address
A8H
bit
name
C
T
S
B7
EA
B6
ELVD
B5
EADC
B4
-
B3
ET1
B2
EX1
B1
ET0
B0
EX0
EA : CPU的总中断允许控制位,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。
EA的作用是使中断允许形成两级控制。即各中断源首先受EA控制;其次还受各中断源自
己的中断允许控制位控制。
ELVD : 低压检测中断允许位,ELVD=1,允许低压检测中断,ELVD=0,禁止低压检测中断。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
173
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
5. A/D转换控制寄存器ADC_CONTR
ADC_CONTR为A/D转换控制寄存器,ADC_CONTR格式如下:
ADC_CONTR : A/D转换控制寄存器
SFR name
ADC_CONTR
Address
bit
BCH
name
B7
B6
B5
B4
B3
B2
B1
ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1
B0
CHS0
ADC_POWER : ADC电源控制位。当ADC_POWER=0时,关闭ADC电源;
当ADC_PWOER=1时,打开ADC电源。
ADC_FLAG: ADC转换结束标志位,可用于请求A/D转换的中断。当A/D转换完成后,
ADC_FLAG= 1,要用软件清0。不管是 A/D转换完成后由该位申请产生中
断 , 还 是 由 软 件 查 询 该 标 志 位 A / D 转 换 是 否 结 束 , 当 A / D 转 换 完成 后 ,
ADC_FLAG=1,一定要软件清0。
ADC_START: ADC转换启动控制位,设置为“1”时,开始转换,转换结束后为0。
A/D转换控制寄存器ADC_CONTR中的其他位与中断无关,在此不作介绍。
Li
.
d
e
t
i
m
在中断允许寄存器IE中,A/D转换器的中断允许位是EADC/IE.5
IE : 中断允许寄存器 (可位寻址)
SFR name
IE
Address
A8H
bit
name
B7
EA
U
C
M
B6
ELVD
B5
EADC
B4
-
B3
ET1
B2
EX1
B1
ET0
B0
EX0
EA : CPU的总中断允许控制位,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。
EA的作用是使中断允许形成两级控制。即各中断源首先受EA控制;其次还受各中断源自
己的中断允许控制位控制。
C
T
S
EADC : A/D转换中断允许位,EADC=1,允许A/D转换中断,EADC=0,禁止A/D转换中断。
174
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.3 中断优先级
除外部中断2(INT2)、外部中断3(INT3)及外部中断4(INT4)外,STC15F204EA系列单片
机的所有的中断都具有两个中断优先级,对于这些中断请求源可编程为高优先级中断或低优先
级中断,可实现两级中断服务程序嵌套。�����������������������
一个正在执行的低优先级中断能被高优先级中断所中
断,但不能被另一个低优先级中断所中断,一直执行到结束,遇到返回指令RETI,返回主程
序后再执行一条指令才能响应新的中断申请。以上所述可归纳为下面两条基本规则:
⒈ 低优先级中断可被高优先级中断所中断,反之不能。
⒉ 任何一种中断(不管是高级还是低级),一旦得到响应,不能被它的同级中断所中
断。
当同时收到几个同一优先级的中断要求时,哪一个要求得到服务,取决于内部的查询次
序。这相当于在每个优先级内,还同时存在另一个辅助优先级结构,STC15F204EA系列单片
机各中断优先查询次序如下:
中断源
0.
INT0
1.
Timer 0
2.
INT1
3.
Timer 1
4.
5. ADC interrupt
6.
LVD
7.
8.
9.
10.
INT2
11.
INT3
12.
13.
14.
15.
16.
INT4
查询次序
(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
ADC_Routine(void) interrupt 5;
void
LVD_Routine(void) interrupt 6;
void
Int2_Routine(void)
interrupt 10;
void
Int3_Routine(void)
interrupt 11;
void
Int4_Routine(void)
interrupt 16;
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
175
STC15F204EA系列单片机指南
技术支持网站: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
中断源
中断向量
External Interrupt 0
Timer 0
External Interrupt 1
Timer 1
/
ADC interrupt
LVD
/
/
/
External Interrupt 2
External Interrupt 3
/
/
/
/
External Interrupt 4
0003H
000BH
0013H
001BH
0023H
002BH
0033H
003BH
0043H
004BH
0053H
005BH
0063H
006BH
0073H
007BH
0083H
U
C
M
Li
当“转去执行中断”时,引起外部中断INT0/INT1/INT2/INT3/INT4请求标志位和定时器/计数
器0、定时器/计数器1的中断请求标志位将被硬件自动清零,其它中断的中断请求标志位需软
件清"0"。由于中断向量入口地址位于程序存储器的开始部分,所以主程序的第1条指令通常为
跳转指令,越过中断向量区(LJMP MAIN)。
注意:不能用RET指令代替RETI指令
RET指令虽然也能控制PC返回到原来中断的地方,但RET指令没有清零中断优先级状态触
发器的功能,中断控制系统会认为中断仍在进行,其后果是与此同级或低级的中断请求将不被
响应。
若用户在中断服务程序中进行了入栈操作,则在RETI指令执行前应进行相应的出栈操
作,即在中断服务程序中PUSH指令与POP指令必须成对使用,否则不能正确返回断点。
176
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.5 外部中断
外部中断0(INT0)和外部中断1(INT1)触发有两种触发方式,上升沿或下降沿均可触发方式
和仅下降沿触发方式。
TCON寄存器中的IT0/TCON.0和IT1/TCON.2决定了外部中断0和1是上升沿和下降沿均可触
发还是仅下降沿触发。如果ITx = 0(x = 0,1),那么系统在INTx(x = 0,1)脚探测到上升沿或下降沿
后均可产生外部中断。如果ITx = 1(x = 0,1),那么系统在INTx( x= 0,1)脚探测下降沿后才可产生
外部中断。外部中断0(INT0)和外部中断1(INT1)还可以用于将单片机从掉电模式唤醒。
外部中断2(INT2)、外部中断3(INT3)及外部中断4(INT4)都只能下降沿触发。外部中断
2~4的中断请求标志位被隐藏起来了,对用户不可见,故也无需用户清"0"。当相应的中断服务
程序执行后或EXn=0(n=2,3,4),这些中断请求标志位会自动地被清0。这些中断请求标志位也
.
d
e
t
i
m
可以通过软件禁止相应的中断允许控制位将其清“0”(特殊应用)。外部中断2(INT2)、外部
中断3(INT3)及外部中断4(INT4)也可以用于将单片机从掉电模式唤醒。
Li
由于系统每个时钟对外部中断引脚采样1次,所以为了确保被检测到,输入信号应该至少
维持2个时钟。如果外部中断是仅下降沿触发,要求必须在相应的引脚维持高电平至少1个时
钟,而且低电平也要持续至少一个时钟,才能确保该下降沿被CPU检测到。同样,如果外部中
断是上升沿、下降沿均可触发,则要求必须在相应的引脚维持低电平或高电平至少1个时钟,
而且高电平或低电平也要持续至少一个时钟,这样才能确保CPU能够检测到该上升沿或下降
沿。
C
T
S
南通国芯微电子有限公司
U
C
M
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
177
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.6 外部中断的测试程序(C程序和汇编程序)
6.6.1 外部中断0(INT0)的测试程序(可支持上升沿或下降沿中断)
C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机外部中断0�(上升沿/下降沿) -------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
bit FLAG;
.
d
e
t
i
m
Li
//1:上升沿中断 0:下降沿中断
//External interrupt0 service routine
void exint0() interrupt 0
//中断0 (向量地址 0003H)
{
FLAG = INT0;
//读 INT0(P3.2)管脚的状态, INT0=0(下降沿Falling ); INT0=1(上升沿Rising)
}
void main()
{
IT0 = 0;
EX0 = 1;
EA = 1;
while (1);
}
178
C
T
S
南通国芯微电子有限公司
U
C
M
//设置 INT0 的中断触发方式 (1:Falling only 0:Rising & Falling)
//允许INT0 中断
//开总中断
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机外部中断0�(上升沿/下降沿) -------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -------------------------------------------- --*/
/* 如果要在程序中使用或在文章中引用该程序, ----------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 ----------*/
/*------------------------------------------------------------------------------------*/
FLAG
BIT
20H.0
;1:上升沿中断 0:下降沿中断
.
d
e
t
i
m
;----------------------------------------;interrupt vector table
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EXINT0
U
C
M
;----------------------------------------
MAIN:
ORG
C
T
S
0100H
MOV SP,
CLR IT0
SETB EX0
SETB EA
SJMP $
#7FH
Li
;中断0 (向量地址 0003H)
;初始化堆栈指针SP
;设置 INT0 的中断触发方式 (1:Falling only 0:Rising & Falling)
;允许INT0 中断
;开总中断
;----------------------------------------;External interrupt0 service routine
EXINT0:
PUSH PSW
MOV C,
INT0
MOV FLAG, C
POP PSW
RETI
;读 INT0(P3.2)管脚的状态,
;INT0=0(下降沿Falling ); INT0=1(上升沿Rising)
;----------------------------------------
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
179
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.6.2 外部中断1(INT1)的测试程序(可支持上升沿或下降沿中断)
C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机外部中断1�(上升沿/下降沿) -------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
.
d
e
t
i
m
#include "reg51.h"
bit FLAG;
//1:rising edge interrupt 0:falling edge int
Li
//External interrupt1 service routine
void exint1() interrupt 2
/INT1, interrupt 2 (location at 0013H)
{
FLAG = INT1;
//read INT1(P3.3) port status, INT1=0(Falling); INT1=1(Rising)
}
void main()
{
IT1 = 0;
EX1 = 1;
EA = 1;
C
T
S
U
C
M
//set INT1 interrupt type (1:Falling only 0:Rising & Falling)
//enable INT1 interrupt
//open global interrupt switch
while (1);
}
180
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机外部中断1�(上升沿/下降沿) -------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
FLAG
BIT
20H.0
;1:rising edge interrupt 0:falling edge int
.
d
e
t
i
m
;----------------------------------------;interrupt vector table
ORG 0000H
LJMP MAIN
ORG 0013H
LJMP EXINT1
C
T
S
;----------------------------------------
MAIN:
ORG
0100H
MOV SP,
CLR 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 only 0:Rising & Falling)
;enable INT1 interrupt
;open global interrupt switch
;----------------------------------------;External interrupt1 service routine
EXINT1:
PUSH PSW
MOV C,
INT1
MOV FLAG, C
POP PSW
RETI
;read INT1(P3.3) port status
;INT1=0(Falling); INT1=1(Rising)
;----------------------------------------
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
181
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.6.3 外部中断2(INT2)的测试程序(下降沿中断)
C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机外部中断2 (INT2) (下降沿) -------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
.
d
e
t
i
m
#include "reg51.h"
sfr INT_CLKO = 0x8f;
//External interrupt2 service routine
void exint2() interrupt 10
{
}
void main()
{
C
T
S
INT_CLKO |= 0x10;
EA = 1;
while (1);
Li
//- EX4 EX3 EX2 - - T1CLKO T0CLKO
U
C
M
//INT2, interrupt 10 (location at 0053H)
//(EX2 = 1)enable INT2 interrupt
//open global interrupt switch
}
182
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机外部中断2 (INT2) (下降沿) -------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
INT_CLKO
DATA 08FH
;- EX4 EX3 EX2 - - T1CLKO T0CLKO
;----------------------------------------;interrupt vector table
ORG 0000H
LJMP MAIN
ORG 0053H
LJMP EXINT2
C
T
S
;----------------------------------------
MAIN:
ORG
0100H
MOV
SP,
#7FH
ORL INT_CLKO,
SETB EA
SJMP $
#10H
U
C
M
.
d
e
t
i
m
Li
;INT2, interrupt 10 (location at 0053H)
;initial SP
;(EX2 = 1)enable INT2 interrupt
;open global interrupt switch
;----------------------------------------;External interrupt2 service routine
EXINT2:
RETI
;----------------------------------------
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
183
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.6.4 外部中断3(INT3)的测试程序(下降沿中断)
C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机外部中断3 (INT3) (下降沿) -------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
.
d
e
t
i
m
#include "reg51.h"
sfr INT_CLKO = 0x8f;
//External interrupt3 service routine
void exint3() interrupt 11
{
}
void main()
{
C
T
S
INT_CLKO |= 0x20;
EA = 1;
while (1);
Li
//- EX4 EX3 EX2 - - T1CLKO T0CLKO
U
C
M
//INT3, interrupt 11 (location at 005BH)
//(EX3 = 1)enable INT3 interrupt
//open global interrupt switch
}
184
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机外部中断3 (INT3) (下降沿) -------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
INT_CLKO
DATA 08FH
;- EX4 EX3 EX2 - - T1CLKO T0CLKO
;----------------------------------------;interrupt vector table
ORG 0000H
LJMP MAIN
ORG 005BH
LJMP EXINT3
;-----------------------------------------
U
C
M
MAIN:
ORG
.
d
e
t
i
m
Li
;INT3, interrupt 11 (location at 005BH)
C
T
S
0100H
MOV SP,
#7FH
ORL INT_CLKO,
SETB EA
SJMP $
#20H
;initial SP
;(EX3 = 1)enable INT3 interrupt
;open global interrupt switch
;----------------------------------------;External interrupt 3 service routine
EXINT3:
RETI
;----------------------------------------
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
185
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.6.5 外部中断4(INT4)的测试程序(下降沿中断)
C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机外部中断4 (INT4) (下降沿) -------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
.
d
e
t
i
m
#include "reg51.h"
sfr INT_CLKO = 0x8f;
//External interrupt4 service routine
void exint4() interrupt 16
{
}
void main()
{
C
T
S
INT_CLKO |= 0x40;
EA = 1;
while (1);
Li
//- EX4 EX3 EX2 - - T1CLKO T0CLKO
U
C
M
//INT4, interrupt 16 (location at 0083H)
//(EX4 = 1)enable INT4 interrupt
//open global interrupt switch
}
186
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机外部中断4 (INT4) (下降沿) -------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
INT_CLKO
DATA 08FH
;- EX4 EX3 EX2 - - T1CLKO T0CLKO
;----------------------------------------;interrupt vector table
ORG 0000H
LJMP MAIN
ORG 0083H
LJMP EXINT4
MAIN:
C
T
S
ORG
0100H
MOV
SP,
#7FH
ORL INT_CLKO,
SETB EA
SJMP $
Li
M
;INT4, interrupt 16 (location at 0083H)
;initial SP
;-----------------------------------------
CU
.
d
e
t
i
m
#40H
;(EX4 = 1) enable INT4 interrupt
;open global interrupt switch
;----------------------------------------;External interrupt4 service routine
EXINT4:
RETI
;----------------------------------------
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
187
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
第7章 定时器/计数器
STC15Fxx系列������������������������������������
单片机内部设置了两个16位定时器/计数器T0和T1,它们都具有计数方式和
定时方式两种工作方式。对每个定时器/计数器(T0和T1),在特殊功能寄存器TMOD中都有一
控制位— C/T来选择T0或T1为定时器还是计数器。定时器/计数器的核心部件是一个加法计数
器,其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统时钟,则为定
时方式,此时定时器/计数器每12个时钟或者每1个时钟得到一个计数脉冲,计数值加1;如果
计数脉冲来自单片机外部引脚(T0为P3.4,T1为P3.5),则为计数方式,每来一个脉冲加1。
当定时器/计数器工作在定时模式时,特殊功能寄存器AUXR中的T0x12和T1x12分别决定是
系统时钟/12还是系统时钟/1(不分频)后让T0和T1进行计数。当定时器/计数器工作在计数模式
时,对外部脉冲计数不分频。
.
d
e
t
i
m
定时器/计数器0有4种工作模式:模式0(16位自动重装模式),模式1(16位定时器/计数器模
式),模式2(8位自动重装模式),模式3(两个8位定时器/计数器)。定时器/计数器1除模式3外,
其他工作模式与定时器/计数器0相同,T1在模式3时无效,停止计数。
Li
U
C
M
7.1 定时器/计数器的相关寄存器
C
T
S
符号
描述
地址
TCON
Timer Control
88H
TMOD
TL0
TL1
TH0
TH1
AUXR
Timer Mode
Timer Low 0
Timer Low 1
Timer High 0
Timer High 1
Auxiliary register
External interrupt
INT_CLKO enable and Clock
Output register
188
南通国芯微电子有限公司
89H
8AH
8BH
8CH
8DH
8EH
8FH
位地址及其符号
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
00xx xxxxB
T0x12 T1x12
-
EX4
EX3
EX2
-
总机:0513-5501 2928 / 2929 / 2966
-
T1CLKO
T0CLKO
x000 xx00B
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站: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”(也可由
查询软件清“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(也可由查询
软件清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。IT1=1,外部中
断1程控为下降沿触发方式。
IE0:外部中断0请求源(INT0/P3.2)标志。IE0=1外部中断0向CPU请求中断,当CPU响应外
部中断时,由硬件清“0”IE0(边沿触发方式)。
IT0:外部中断源0触发控制位。IT0=0,上升沿或下降沿均可触发外部中断0。IT0=1,外部中
断0程控为下降沿触发方式。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
189
STC15F204EA系列单片机指南
技术支持网站: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
C/T
M1
0
M0
.
d
e
t
i
m
定时器0
定时器1
位
2 1
符号
GATE
功能
TMOD.7控制定时器1,置1时只有在INT1脚为高及TR1控制位置1
时才可打开定时器/计数器1。
TMOD.3/
GATE
TMOD.3控制定时器0,置1时只有在INT0脚为高及TR0控制位置1
时才可打开定时器/计数器0。
TMOD.6/
C/T
TMOD.6控制定时器1用作定时器或计数器,清零则用作定时器
(从内部系统时钟输入),置1用作计数器(从T1/P3.5脚输入)
TMOD.7/
C
T
S
TMOD.2/
C/T
TMOD.2控制定时器0用作定时器或计数器,清零则用作定时器
(从内部系统时钟输入),置1用作计数器(从T0/P3.4脚输入)
TMOD.5/TMOD.4 M1、M0
0
0
0
1
1
0
1
1
TMOD.1/TMOD.0 M1、M0
0
190
0
0
1
1
0
1
1
U
C
M
Li
南通国芯微电子有限公司
定时器定时器/计数器1模式选择
16位自动重装定时器,当溢出时将RL_TH1和RL_TL1存放的值自
动重装入TH1和TL1中。
16位定时器/计数器,TL1、TH1全用
8位自动重装载定时器,当溢出时将TH1存放的值自动重装入TL1
定时器/计数器1此时无效(停止计数)。
定时器/计数器0模式选择
16位自动重装定时器,当溢出时将RL_TH0和RL_TL0存放的值自
动重装入TH0和TL0中。
16位定时器/计数器,TL0、TH0全用
8位自动重装载定时器,当溢出时将TH0存放的值自动重装入TL0
定时器0此时作为双8位定时器/计数器。TL0作为一个8位定时
器/计数器,通过标准定时器0的控制位控制。TH0仅作为一个
8位定时器,由定时器1的控制位控制。
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
3. 辅助寄存器AUXR
STC15F204EA系列����
单片机�
是 1T 的8051单片机,为兼容传统8051,定时器0和定时器1复位
后是传统8051的速度,即12分频,这是为了兼容传统8051。但也可不进行12分频,通过设置新
增加的特殊功能寄存器AUXR,将T0,T1设置为1T。普通111条机器指令�����������
执行速度�������
是固定的,快3
到24倍,无法改变。
AUXR格式如下:
AUXR : 辅助寄存器
SFR name
AUXR
Address
8EH
bit
name
B7
T0x12
B6
T1x12
B5
-
B4
-
B3
-
B2
-
B1
-
B0
-
.
d
e
t
i
m
T0x12: 0, 定时器0是传统8051速度,12分频;1, 定时器0的速度是传统8051的12倍,不分频
T1x12: 0, 定时器1是传统8051速度,12分频;1, 定时器1的速度是传统8051的12倍,不分频
C
T
S
U
C
M
Li
4. T0和T1的时钟输出寄存器和外部中断允许INT_CLKO
CLKOUT0/P3.5和CLKOUT1/P3.4的时钟输出控制由INT_CLKO寄存器的T0CLKO位和
T1CLKO位控制�
。CLKOUT0的输出时钟频率由定时器0控制,CLKOUT1的输出时钟频率由定时
器1控制,相应的定时器需要工作在定时器的��������������������������
模式������������������������
0(16��������������������
位自动重装模式�������������
)������������
或�����������
模式2(8位自动重装载
模式),不要允许相应的定时器中断,免得CPU反复进中断.
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
191
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
INT_CLKO格式如下:
INT_CLKO : 外部中断允许和时钟输出寄存器
SFR name
Address
bit
B7
B6
B5
B4
B3
B2
INT_CLKO
8FH
name
-
EX4
EX3
EX2
-
-
B1
B0
T1CLKO T0CLKO
T1CLKO :
1,�
将P3.4/T0管脚配置为定时器1的时钟输出CLKOUT1,输出时钟频率= T1溢出�
率/2
若定时器/计数器T1工作在定时器模式0(16位自动重装模式),
如果C/T=0,定时器/计数器T1是对内部系统时钟计数,则:
T1工作在1T模式(AUXR.6/T1x12=1)时的输出频率 = (SYSclk) / (65536-[RL_TH1, RL_TL1])/2
T1工作在12T模式(AUXR.6/T1x12=0)时的输出频率 = (SYSclk) /12/ (65536-[RL_TH1, RL_TL1])/2
如果C/T=1,定时器/计数器T1是对外部脉冲输入(P3.5/T1)计数,则:
输出����
时钟��
频率 = (T1_Pin_CLK) / (65536-[RL_TH1, RL_TL1])/2
若定时器/计数器T1工作在模式2(8位自动重装模式),
如果C/T=0,定时器/计数器T1是对内部系统时钟计数,则:
.
d
e
t
i
m
T1工作在1T模式(AUXR.6/T1x12=1)时的输出频率 = (SYSclk) / (256-TH1)/2
T1工作在12T模式����������������������
(AUXR.6/T1x12=0)������
时的输出频率 = (SYSclk)/12/(256-TH1)/2
Li
如果C/T=1,定时器/计数器T1是对外部脉冲输入(P3.5/T1)计数,则:
输出����
时钟��
频率 = (T1_Pin_CLK) / (256-TH1) / 2
0,不允许P3.4/T0管脚被配置为定时器1的时钟输出
U
C
M
T0CLKO :
1,����������������������
将���������������������
P3.5�����������������
/T1管脚配置为定时器0的时钟输出CLKOUT0,输出时钟频率 = T0溢出率/2
若定时器/计数器T0工作在定时器模式0(16位自动重装模式)时,
如果C/T=0,定时器/计数器T0是对内部系统时钟计数,则:
T0工作在1T模式(AUXR.7/T0x12=1)时的输出频率 = (SYSclk)/(65536-[RL_TH0, RL_TL0])/2
C
T
S
T0工作在12T模式(AUXR.7/T0x12=0)时的输出频率 = (SYSclk) /12/ (65536-[RL_TH0, RL_TL0])/2
如果C/T=1,定时器/计数器T0是对外部脉冲输入(P3.4/T0)计数,则:
输出����
时钟��
频率 = (T0_Pin_CLK) / (65536-[RL_TH0, RL_TL0])/2
若定时器/计数器T0工作在定时器模式2(8位自动重装模式)时,
如果C/T=0,定时器/计数器T0是对内部系统时钟计数,则:
T0工作在1T模式(AUXR.7/T0x12=1)时的输出频率 = (SYSclk) / (256-TH0) / 2
T0工作在12T模式(AUXR.7/T0x12=0)时的输出频率 = (SYSclk) / 12 / (256-TH0) / 2
如果C/T=1,定时器/计数器T0是对外部脉冲输入(P3.4/T0)计数,则:
输出����
时钟��
频率 = (T0_Pin_CLK) / (256-TH0) / 2
0,不允许P3.5/T1管脚被配置为定时器0的时钟输出
EX4 : 外部中断4(INT4)中断允许位,EX4=1允许中断,EX4=0禁止中断。外部中断4(INT4)只
能下降沿触发。
EX3 : 外部中断3(INT3)中断允许位,EX3=1允许中断,EX3=0禁止中断。外部中断3(INT3)也
只能下降沿触发。
EX2 : 外部中断2(INT2)中断允许位,EX2=1允许中断,EX2=0禁止中断。外部中断2(INT2)同
样只能下降沿触发。
192
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.2 定时器/计数器0工作模式
通过对寄存器TMOD中的M1(TMOD.1)、M0(TMOD.0)的设置,定时器/计数器0有4种不同的
工作模式
7.2.1 模式0(16位自动重装)及测试程序,建议只学习此模式足矣
此模式下定时器���������������������������
/��������������������������
计数器�����������������������
0����������������������
作为可自动重装载的�������������
16�����������
位计数器,如下图所示。
AUXR.7/T0x12=0
÷12
TF0
SYSclk
÷1
AUXR.7/T0x12=1
C/T=0
TL0
(8 bits)
C/T=1
T0 Pin
TR0
GATE
Toggle
TH0
(8 bits)
.
d
e
t
i
m
control
CLKOUT0
P3.5
RL_TL0
(8 bits)
INT0
Interrupt
RL_TH0
(8 bits)
Li
T0CLKO
定时器/计数器0的模式 0: 16位自动重装
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工作在计数方式。
STC15F204EA������������������������������������
系列单片机的定时器有两种计数速率:一种是����������������
12T�������������
模式,每���������
12�������
个时钟加���
1��
,与
传统��������������������������������������������
8051����������������������������������������
单片机相同;另外一种是�����������������������������
1T���������������������������
模式,每个时钟加�������������������
1������������������
,速度是传统������������
8051��������
单片机的����
12��
倍。
T0�������������������������������������������������
的速率由特殊功能寄存器��������������������������������������
AUXR����������������������������������
中的��������������������������������
T0x12���������������������������
决定,如果����������������������
T0x12=0���������������
,��������������
T0������������
则工作在��������
12T�����
模式;如果
T0x12=1������������
,�����������
T0���������
则工作在�����
1T���
模式。
定时器0有��������
2�������
个隐藏的寄存器RL_TH0和RL_TL0。RL_TH0与�����������
TH0��������
共有同一个地址,RL_TL0
与TL0共有同一个地址。当TR0=0即定时器/计数器0被禁止工作时,对TL0写入的内容会同时
写入RL_TL0,对TH0写入的内容也会同时写入RL_TH0。当TR0=1即定时器/计数器0被允许工作
时,,对TL0写入的内容不会写入RL_TL0,对TH0写入的内容不会写入RL_TH0。这样可以巧妙地
实现16位重装载定时器。
当定时器������
0�����
工作在模式0(TMOD[1:0]/[M1,M0]=00B)时,����������������
[TL0,TH0]�������
的溢出不仅置位TF0,而
且会自动将[RL_TL0,RL_TH0]的内容重新装入[TL0,TH0]。
当T0CLKO/INT_CLKO.0=1时,P3.5/T1管脚配置为定时器0的时钟输出CLKOUT0。
输出时钟频率 = T0 溢出率/2
如果C/T=0,定时器/计数器T0对内部系统时钟计数,则:
T0工作在1T模式(AUXR.7/T0x12=1)时的输出����
时钟��
频率 = (SYSclk)/(65536-[RL_TH0, RL_TL0])/2
T0工作在12T模式(AUXR.7/T0x12=0)时的输出����
时钟��
频率=(SYSclk)/12/(65536-[RL_TH0, RL_TL0])/2
如果C/T=1,定时器/计数器T0是对外部脉冲输入(P3.4/T0)计数,则:
输出����
时钟��
频率 = (T0_Pin_CLK) / (65536-[RL_TH0, RL_TL0])/2
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
193
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
定时器0的16位自动重装模式的测试程序
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机定时器0的16位自动重装模式 ----------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
.
d
e
t
i
m
#include "reg51.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
//----------------------------------------------/* define constants */
#define SYSclk 18432000L
#define MODE1T
C
T
S
U
C
M
Li
//Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
#ifdef MODE1T
#define T1MS (65536-SYSclk/1000)
//1ms timer calculation method in 1T mode
#else
#define T1MS (65536-SYSclk/12/1000)
//1ms timer calculation method in 12T mode
#endif
/* define SFR */
sfr AUXR = 0x8e;
sbit TEST_LED = P0^0;
/* define variables */
WORD count;
//Auxiliary register
//work LED, flash once per second
//1000 times counter
//----------------------------------------------/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1
{
if (count-- == 0)
{
count = 1000;
TEST_LED = ! TEST_LED;
}
}
194
南通国芯微电子有限公司
//1ms * 1000 -> 1s
//reset counter
//work LED flash
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
//----------------------------------------------/* main program */
void main()
{
#ifdef MODE1T
AUXR = 0x80;
#endif
TMOD = 0x00;
TL0 = T1MS;
TH0 = T1MS >> 8;
TR0 = 1;
ET0 = 1;
EA = 1;
count = 0;
}
while (1);
//timer0 work in 1T mode
//set timer0 as mode0 (16-bit auto-reload)
//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
//loop
2. 汇编程序:
U
C
M
Li
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机定时器0的16位自动重装模式 ----------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
C
T
S
;/* define constants */
#define MODE1T
#ifdef MODE1T
T1MS
EQU 0B800H
#else
T1MS
EQU 0FA00H
#endif
;Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
;1ms timer calculation method in 1T mode is (65536-18432000/1000)
;1ms timer calculation method in 12T mode is (65536-18432000/12/1000)
;/* define SFR */
AUXR
DATA 8EH
TEST_LED BIT P1.0
;Auxiliary register
;work LED, flash once per second
;/* define variables */
COUNT DATA 20H
;1000 times counter (2 bytes)
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
195
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;----------------------------------------------
ORG
LJMP
ORG
LJMP
0000H
MAIN
000BH
TM0_ISR
;----------------------------------------------;/* main program */
MAIN:
#ifdef MODE1T
MOV AUXR, #80H
#endif
MOV TMOD, #00H
MOV TL0,
#LOW T1MS
MOV TH0,
#HIGH T1MS
SETB TR0
SETB ET0
SETB EA
CLR A
MOV COUNT, A
MOV COUNT+1, A
SJMP $
C
T
S
;timer0 work in 1T mode
;set timer0 as mode0 (16-bit auto-reload)
;initial timer0 low byte
;initial timer0 high byte
;timer0 start running
;enable timer0 interrupt
;open global interrupt switch
U
C
M
;----------------------------------------------;/* Timer0 interrupt routine */
TM0_ISR:
PUSH ACC
PUSH PSW
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
.
d
e
t
i
m
Li
;initial counter
;check whether count(2byte) is equal to 0
;1ms * 1000 -> 1s
;work LED flash
;count--
;----------------------------------------------
END
196
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.2.2 模式1(16位定时器),不建议学习
此模式下定时器��������������������
/�������������������
计数器����������������
0���������������
作为�������������
16�����������
位定时器,如下图所示。
÷12
AUXR.7/T0x12=0
SYSclk
÷1
AUXR.7/T0x12=1
C/T=0
C/T=1
T0 Pin
TR0
TL0
TH0
(8 Bits) (8 bits)
TF0
Interrupt
control
GATE
INT0
.
d
e
t
i
m
定时器/计数器0的模式 1: 16位定时器
此模式下,定时器0配置为����������������������������������
16��������������������������������
位的计数器,由�������������������������
TL0����������������������
的���������������������
8��������������������
位和������������������
TH0���������������
的��������������
8�������������
位所构成。��������
TL0�����
的8位溢出
向������������������������������
TH0���������������������������
进位,������������������������
TH0���������������������
计数溢出置位���������������
TCON�����������
中的溢出标志位����
TF0�
。
Li
当�������
GATE=0(TMOD.3)时,如TR0=1,则定时器计数。GATE=1时,允许由外部输入INT0控制定
时器0,这样可实现脉宽测量。TR0为TCON寄存器内的控制位,TCON寄存器各位的具体功能描述
见上节�����������
TCON寄存器����
的介绍�
。
U
C
M
当C/T=0时,多路开关连接到系统时钟的分频输出,T0对内部系统时钟计数,T0工作在定
时方式。当C/T=1时,多路开关连接到外部脉冲输入P3.4/T0,即T0工作在计数方式。
C
T
S
STC15F204EA系列单片机的定时器有两种计数速率:一种是���������������
12T������������
模式,每��������
12������
个时钟加��
1�
,
与传统��������������������������������������������
8051����������������������������������������
单片机相同;另外一种是�����������������������������
1T���������������������������
模式,每个时钟加�������������������
1������������������
,速度是传统������������
8051��������
单片机的����
12��
倍。
T0�������������������������������������������������
的速率由特殊功能寄存器��������������������������������������
AUXR����������������������������������
中的��������������������������������
T0x12���������������������������
决定,如果����������������������
T0x12=0���������������
,��������������
T0������������
则工作在��������
12T�����
模式;如果
T0x12=1������������
,�����������
T0���������
则工作在�����
1T���
模式。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
197
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.2.3 模式2(8位自动重装模式),不建议学习
此模式下定时器��������������������������
/�������������������������
计数器����������������������
0���������������������
作为可自动重装载的������������
8�����������
位计数器,如下图所示。
AUXR.7/T0x12=0
÷12
Interrupt
TF0
SYSclk
÷1
AUXR.7/T0x12=1
Toggle
C/T=0
TL0
(8 Bits)
C/T=1
T0 Pin
TR0
CLKOUT0
control
GATE
P3.5
TH0
(8 Bits)
T0CLKO
INT0
.
d
e
t
i
m
定时器/计数器0的模式 2: 8位自动重装
Li
TL0���������������������������������������������
的溢出不仅置位��������������������������������������
TF0�����������������������������������
,而且将�������������������������������
TH0����������������������������
内容重新装入����������������������
TL0�������������������
,������������������
TH0���������������
内容由软件预置,重装时����
TH0�
内
容不变。
U
C
M
当T0CLKO/INT_CLKO.0=1时,P3.5/T1管脚配置为定时器0的时钟输出CLKOUT0。
输出时钟频率 = T0 溢出率/2
如果C/T=0,定时器/计数器T0对内部系统时钟计数,则:
C
T
S
T0工作在1T模式(AUXR.7/T0x12=1)时的输出����
时钟��
频率=(SYSclk) / (256-TH0)/2
T0工作在12T模式(AUXR.7/T0x12=0)时的输出����
时钟��
频率=(SYSclk)/12/(256-TH0)/2
如果C/T=1,定时器/计数器T0是对外部脉冲输入(P3.4/T0)计数,则:
输出����
时钟��
频率 = (T0_Pin_CLK) / (256-TH0) / 2
198
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.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
AUXR.7/T0x12=0
.
d
e
t
i
m
SYSclk
÷1
AUXR.7/T0x12=1
C/T=0
TL0
(8 bit)
C/T=1
T0 Pin
TR0
GATE
INT0
control
U
C
M
Li
TF0
Interrupt
÷12 AUXR.7/T0x12=0
SYSclk
C
T
S
÷1
TH0
(8 Bits)
AUXR.7/T0x12=0
TR1
TF1
Interrupt
control
定时/计数器0 模式3: 两个8位计数器
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
199
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.3 定时器/计数器1工作模式
通过对寄存器TMOD中的M1(TMOD.5)、M0(TMOD.4)的设置,定时器/计数器1有3种不同的
工作模式
7.3.1 模式0(16位自动重装)及测试程序,建议只学习此模式足矣
此模式下定时器���������������������������
/��������������������������
计数器�����������������������
1����������������������
作为可自动重装载的�������������
16�����������
位计数器,如下图所示。
AUXR.6/T1x12=0
÷12
TF1
SYSclk
÷1
AUXR.6/T1x12=1
C/T=0
TL1
(8 bits)
C/T=1
T1 Pin
TR1
GATE
Toggle
TH1
(8 bits)
.
d
e
t
i
m
control
CLKOUT1
P3.4
RL_TL1
(8 bits)
INT1
Interrupt
Li
RL_TH1
(8 bits)
T1CLKO
定时器/计数器1的模式 0: 16位自动重装
U
C
M
当�������
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工作在计数方式。
STC15F204EA系列单片机的定时器有两种计数速率:一种是���������������
12T������������
模式,每��������
12������
个时钟加��
1�
,
与传统��������������������������������������������
8051����������������������������������������
单片机相同;另外一种是�����������������������������
1T���������������������������
模式,每个时钟加�������������������
1������������������
,速度是传统������������
8051��������
单片机的����
12��
倍。
T1�������������������������������������������������
的速率由特殊功能寄存器��������������������������������������
AUXR����������������������������������
中的��������������������������������
T1x12���������������������������
决定,如果����������������������
T1x12=0���������������
,��������������
T1������������
则工作在��������
12T�����
模式;如果
T1x12=1������������
,�����������
T1���������
则工作在�����
1T���
模式。
定时器1有��������
2�������
个隐藏的寄存器RL_TH1和RL_TL1。RL_TH1与�����������
TH1��������
共有同一个地址,RL_TL1
与TL1共有同一个地址。当TR1=0即定时器/计数器1被禁止工作时,对TL1写入的内容会同时
写入RL_TL1,对TH1写入的内容也会同时写入RL_TH1。当TR1=1即定时器/计数器1被允许工作
时,,对TL1写入的内容不会写入RL_TL1,对TH1写入的内容不会写入RL_TH1。这样可以巧妙地
实现16位重装载定时器。
当定时器������
1�����
工作在模式0(TMOD[5:4]/[M1,M0]=00B)时,����������������
[TL1,TH1]�������
的溢出不仅置位TF1,而
且会自动将[RL_TL1,RL_TH1]的内容重新装入[TL1,TH1]。
当T1CLKO/INT_CLKO.1=1时,P3.4/T0管脚配置为定时器1的时钟输出CLKOUT1。
输出时钟频率 = T1 溢出率/2
如果C/T=0,定时器/计数器T1对内部系统时钟计数,则
T1工作在1T模式(AUXR.6/T1x12=1)时的输出����
时钟��
频率 = (SYSclk) / (65536-[RL_TH1, RL_TL1])/2
T1工作在12T模式(AUXR.6/T1x12=0)时的输出����
时钟��
频率=(SYSclk)/12/(65536-[RL_TH1, RL_TL1])/2
如果C/T=1,定时器/计数器T1是对外部脉冲输入(P3.5/T1)计数,则:
输出����
时钟��
频率 = (T1_Pin_CLK) / (65536-[RL_TH1, RL_TL1])/2
200
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
定时器1的16位自动重装模式的测试程序
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机定时器1的16位自动重装模式 ----------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
.
d
e
t
i
m
#include "reg51.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
//----------------------------------------------/* define constants */
#define SYSclk 18432000L
#define MODE1T
//Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
C
T
S
#ifdef MODE1T
#define T1MS (65536-SYSclk/1000)
#else
#define T1MS (65536-SYSclk/12/1000)
#endif
/* define SFR */
sfr AUXR = 0x8e;
sbit TEST_LED = P0^0;
/* define variables */
WORD count;
U
C
M
Li
//1ms timer calculation method in 1T mode
//1ms timer calculation method in 12T mode
//Auxiliary register
//work LED, flash once per second
//1000 times counter
//----------------------------------------------/* Timer1 interrupt routine */
void tm1_isr() interrupt 3 using 1
{
if (count-- == 0)
{
count = 1000;
TEST_LED = ! TEST_LED;
}
}
南通国芯微电子有限公司
//1ms * 1000 -> 1s
//reset counter
//work LED flash
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
201
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
//----------------------------------------------/* main program */
void main()
{
#ifdef MODE1T
AUXR = 0x40;
#endif
TMOD = 0x00;
TL1 = T1MS;
TH1 = T1MS >> 8;
TR1 = 1;
ET1 = 1;
EA = 1;
count = 0;
}
while (1);
//timer1 work in 1T mode
//set timer1 as mode0 (16-bit auto-reload)
//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
//loop
2. 汇编程序:
U
C
M
Li
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机定时器1的16位自动重装模式 ----------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
C
T
S
;/* define constants */
#define MODE1T
#ifdef MODE1T
T1MS
EQU 0B800H
#else
T1MS
EQU 0FA00H
#endif
;Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
;1ms timer calculation method in 1T mode is (65536-18432000/1000)
;1ms timer calculation method in 12T mode is (65536-18432000/12/1000)
;/* define SFR */
AUXR
DATA 8EH
TEST_LED BIT P1.0
;Auxiliary register
;work LED, flash once per second
;/* define variables */
COUNT DATA 20H
;1000 times counter (2 bytes)
202
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;----------------------------------------------
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP TM1_ISR
;----------------------------------------------;/* main program */
MAIN:
#ifdef MODE1T
MOV AUXR, #40H
#endif
MOV TMOD, #00H
MOV TL1,
#LOW T1MS
MOV TH1,
#HIGH T1MS
SETB TR1
SETB ET1
SETB EA
CLR A
MOV COUNT,
A
MOV COUNT+1, A
SJMP $
;-----------------------------------------------
C
T
S
;timer1 work in 1T mode
U
C
M
;/* Timer1 interrupt routine */
TM1_ISR:
PUSH ACC
PUSH PSW
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
;----------------------------------------------
;set timer1 as mode0 (16-bit auto-reload)
;initial timer1 low byte
;initial timer1 high byte
;timer1 start running
;enable timer1 interrupt
;open global interrupt switch
.
d
e
t
i
m
Li
;initial counter
;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
203
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.3.2 模式1(16位定时器),不建议学习
此模式下定时器��������������������
/�������������������
计数器����������������
1���������������
作为�������������
16�����������
位定时器,如下图所示。
÷12
AUXR.6/T1x12=0
SYSclk
÷1
AUXR.6/T1x12=1
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工作在计数方式。
STC15F204EA系列单片机的定时器有两种计数速率:一种是���������������
12T������������
模式,每��������
12������
个时钟加��
1�
,
与传统��������������������������������������������
8051����������������������������������������
单片机相同;另外一种是�����������������������������
1T���������������������������
模式,每个时钟加�������������������
1������������������
,速度是传统������������
8051��������
单片机的����
12��
倍。
T1�������������������������������������������������
的速率由特殊功能寄存器��������������������������������������
AUXR����������������������������������
中的��������������������������������
T1x12���������������������������
决定,如果����������������������
T1x12=0���������������
,��������������
T1������������
则工作在��������
12T�����
模式;如果
T1x12=1������������
,�����������
T1���������
则工作在�����
1T���
模式。
204
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.3.3 模式2(8位自动重装模式),不建议学习
此模式下定时器��������������������������
/�������������������������
计数器����������������������
1���������������������
作为可自动重装载的������������
8�����������
位计数器,如下图所示。
AUXR.6/T1x12=0
÷12
TF1
Interrupt
SYSclk
÷1
AUXR.6/T1x12=1
Toggle
C/T=0
TL1
(8 Bits)
C/T=1
T1 Pin
TR1
CLKOUT1
control
GATE
P3.4
T1CLKO
TH1
(8 Bits)
INT1
.
d
e
t
i
m
定时器/计数器1的模式 2: 8位自动重装
Li
TL1���������������������������������������������
的溢出不仅置位��������������������������������������
TF1�����������������������������������
,而且将�������������������������������
TH1����������������������������
内容重新装入����������������������
TL1�������������������
,������������������
TH1���������������
内容由软件预置,重装时����
TH1�
内
容不变。
U
C
M
当T1CLKO/INT_CLKO.1=1时,P3.4/T0管脚配置为定时器1的时钟输出CLKOUT1。
������
输出时钟频率 = T1 溢出率/2
如果C/T=0,定时器/计数器T1对内部系统时钟计数,则
T1工作在1T模式(AUXR.6/T1x12=1)时的输出����
时钟��
频率=(SYSclk) / (256-TH1)/2
T1工作在12T模式(AUXR.6/T1x12=0)时的输出����
时钟��
频率=(SYSclk)/12/(256-TH1)/2
如果C/T=1,定时器/计数器T1是对外部脉冲输入(P3.5/T1)计数,则:
输出����
时钟��
频率 = (T1_Pin_CLK) / (256-TH1) / 2
C
T
S
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
205
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.4 可编程时钟输出
STC15F204EA系列有3路可编程时钟输出:IRC_CLKO/P0.0,CLKOUT0/P3.5,CLKOUT1/P3.4
只有内部R/C时钟频率为12MHz以下时,现版本才能正常输出。
IRC_CLKO : Internal R/C clock output register
SFR Name
SFR Address
bit
B7
B6
B5
B4
B3
B2
B1
B0
IRC_CLKO
BBH
name
EN_IRCO
-
-
-
DIVIRCO
-
-
-
如何利用IRC_CLKO/P0.0管脚输出时钟
IRC_CLKO/P0.0的时钟输出控制由IRC_CLKO寄存器的EN_IRCO位控制。设置EN_IRCO
(IRC_CLKO.7)可将IRC_CLKO/P0.0管脚配置为内部R/C振荡时钟输出。通过设置DIVIRCO
(IRC_CLKO.3)位可以设置内部R/C振荡时钟的输出频率是IRC_CLK/2还是IRC_CLK/1(不分频)
新增加的特殊功能寄存器: IRC_CLKO (地址:0xBB)
B7 - EN_IRCO :
1,�
将IRC_CLKO/P0.0管脚配置为内部R/C振荡时钟输出
0,不允许IRC_CLKO/P0.0管脚配置为内部R/C振荡时钟输出
B3 - DIVIRCO :
1,��
内部R/C振荡时钟的输出频率被2分频��������
,输出时钟频率 = IRC_CLK/2
0,��
内部R/C振荡时钟的输出频率不被分频,输出时钟频率 = IRC_CLK/1
IRC_CLKO指内部R/C振荡时钟输出;IRC_CLK指内部R/C振荡时钟频率。
C
T
S
.
d
e
t
i
m
Li
U
C
M
INT_CLKO : External Interrupt Enable and Clock Output register
SFR Name
SFR Address
bit
B7
B6
B5
B4
B3
B2
INT_CLKO
8FH
name
-
EX4
EX3
EX2
-
-
B1
B0
T1CLKO T0CLKO
如何利用CLKOUT0/P3.5和CLKOUT1/P3.4管脚输出时钟
如何利用CLKOUT0/P3.5和CLKOUT1/P3.4管脚输出时钟
CLKOUT0/P3.5管脚是否�����
输出时钟由INT_CLKO寄存器的T0CLKO位控制
B0 - T0CLKO : 1,������
允许时钟输出
0,������
禁止时钟输出
CLKOUT1/P3.4管脚是否�����
输出时钟由INT_CLKO寄存器的T1CLKO位控制
B1 - T1CLKO : 1,������
允许时钟输出
0,������
禁止时钟输出
CLKOUT0的输出时钟频率由定时器0控制,CLKOUT1的输出时钟频率由定时器1控制,相应的
定时器需要工作在定时器的����������������������������������
模式0(16位自动重装模式)或�������������������
模式2(8位自动重装载模式),不要允许
相应的定时器中断,免得CPU反复进中断.
新增加的特殊功能寄存器: INT_CLKO (地址:0x8F)
B6 - EX4 : ��������
允许外部中断4(INT4)�
。
B5 - EX3 : ��������
允许外部中断3(INT3)�
。
B4 - EX2 : ��������
允许外部中断2(INT2)�
。
206
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
B1 - T1CLKO :
1,�
将P3.4/T0管脚配置为定时器1的时钟输出CLKOUT1,输出时钟频率= T1溢出�
率/2
若定时器/计数器T1工作在定时器模式0(16位自动重装模式),
如果C/T=0,定时器/计数器T1是对内部系统时钟计数,则:
T1工作在1T模式(AUXR.6/T1x12=1)时的输出频率 = (SYSclk) / (65536-[RL_TH1, RL_TL1])/2
T1工作在12T模式(AUXR.6/T1x12=0)时的输出频率 = (SYSclk) /12/ (65536-[RL_TH1, RL_TL1])/2
如果C/T=1,定时器/计数器T1是对外部脉冲输入(P3.5/T1)计数,则:
输出����
时钟��
频率 = (T1_Pin_CLK) / (65536-[RL_TH1, RL_TL1])/2
若定时器/计数器T1工作在模式2(8位自动重装模式),
如果C/T=0,定时器/计数器T1是对内部系统时钟计数,则:
T1工作在1T模式(AUXR.6/T1x12=1)时的输出频率 = (SYSclk) / (256-TH1)/2
T1工作在12T模式����������������������
(AUXR.6/T1x12=0)������
时的输出频率 = (SYSclk)/12/(256-TH1)/2
如果C/T=1,定时器/计数器T1是对外部脉冲输入(P3.5/T1)计数,则:
输出����
时钟��
频率 = (T1_Pin_CLK) / (256-TH1) / 2
0,不允许P3.4/T0管脚被配置为定时器1的时钟输出
.
d
e
t
i
m
Li
B0 - T0CLKO :
1,����������������������
将���������������������
P3.5�����������������
/T1管脚配置为定时器0的时钟输出CLKOUT0,输出时钟频率 = T0溢出率/2
若定时器/计数器T0工作在定时器模式0(16位自动重装模式)时,
如果C/T=0,定时器/计数器T0是对内部系统时钟计数,则:
T0工作在1T模式(AUXR.7/T0x12=1)时的输出频率 = (SYSclk)/(65536-[RL_TH0, RL_TL0])/2
U
C
M
T0工作在12T模式(AUXR.7/T0x12=0)时的输出频率 = (SYSclk) /12/ (65536-[RL_TH0, RL_TL0])/2
C
T
S
如果C/T=1,定时器/计数器T0是对外部脉冲输入(P3.4/T0)计数,则:
输出����
时钟��
频率 = (T0_Pin_CLK) / (65536-[RL_TH0, RL_TL0])/2
若定时器/计数器T0工作在定时器模式2(8位自动重装模式),如果C/T=0,则:
T0工作在1T模式(AUXR.7/T0x12=1)时的输出频率 = (SYSclk) / (256-TH0) / 2
T0工作在12T模式(AUXR.7/T0x12=0)时的输出频率 = (SYSclk) / 12 / (256-TH0) / 2
如果C/T=1,定时器/计数器T0是对外部脉冲输入(P3.4/T0)计数,则:
输出����
时钟��
频率 = (T0_Pin_CLK) / (256-TH0) / 2
0,不允许P3.5/T1管脚被配置为定时器0的时钟输出
AUXR : Auxiliary register
SFR Name SFR Address
AUXR
8EH
bit
name
B7
T0x12
B6
T1x12
B5
-
B4
-
B3
-
B2
-
B1
-
B0
-
AUXR (地址:0x8E)
T0x12:
0, 定时器0是传统8051速度,12分频;
1, 定时器0的速度是传统8051的12倍,不分频
T1x12:
0, 定时器1是传统8051速度,12分频;
1, 定时器1的速度是传统8051的12倍,不分频
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
207
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
特殊功能寄存器IRC_CLKO/INT_CLKO/AUXR的C语言声明:
sfr
IRC_CLKO
= 0xBB;
�������������
//新增加的特殊功能寄存器IRC_CLKO的地址声明
sfr
INT_CLKO
= 0x8F;
//�����������
新增加的特殊功能寄存器INT_CLKO的地址声明
sfr
AUXR
= 0x8E;
//�������
特殊功能寄存器AUXR的地址声明
特殊功能寄存器IRC_CLKO/INT_CLKO/AUXR的汇编语言声明:
IRC_CLKO
EQU 0BBH
;新增加的特殊功能寄存器IRC_CLKO的地址声明
INT_CLKO
EQU 8FH
;新增加的特殊功能寄存器INT_CLKO的地址声明
AUXR
EQU 8EH
;特殊功能寄存器AUXR的地址声明
.
d
e
t
i
m
7.4.1 内部R/C时钟输出的测试程序(C程序和汇编程序)
1. C程序:
Li
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机的内部R/C时钟输出 ----------------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
C
T
S
sfr IRC_CLKO = 0xbb;
U
C
M
//EN_IRCO - - - DIVIRCO - - -
//----------------------------------------void main()
{
IRC_CLKO = 0x80;
//
IRC_CLKO = 0x88;
}
208
//1000,0000 P0.0 output clock signal which frequency is SYSclk
//1000,1000 P0.0 output clock signal which frequency is SYSclk/2
while (1);
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机的内部R/C时钟输出 ----------------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
IRC_CLKO
DATA 0BBH
;----------------------------------------;interrupt vector table
.
d
e
t
i
m
;EN_IRCO - - - DIVIRCO - - -
ORG 0000H
LJMP MAIN
;-----------------------------------------
C
T
S
ORG 0100H
MAIN:
MOV SP,#7FH
MOV IRC_CLKO,
#80H
;
MOV IRC_CLKO,#88H
SJMP $
U
C
M
Li
;initial SP
;1000,0000 P0.0 output clock signal which frequency is SYSclk
;1000,1000
;P0.0 output clock signal which frequency is SYSclk/2
;----------------------------------------
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
209
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.4.2 定时器0的可编程时钟输出的测试程序(C程序和汇编程序)
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机定时器0的可编程时钟输-----------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
.
d
e
t
i
m
#include "reg51.h"
//----------------------------------------------/* define constants */
#define SYSclk 18432000L
//#define MODE1T
Li
//Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
U
C
M
#ifdef MODE1T
#define F38_4KHz (65536-SYSclk/2/38400) //38.4KHz frequency calculation method of 1T mode
#else
#define F38_4KHz (65536-SYSclk/2/12/38400) //38.4KHz frequency calculation method of 12T mode
#endif
C
T
S
/* define SFR */
sfr AUXR
= 0x8e;
sfr INT_CLKO = 0x8f;
sbit T0CLKO = P3^5;
//Auxiliary register
//External interrupt enable and clock output control register
//timer0 clock output pin
//----------------------------------------------/* main program */
void main()
{
#ifdef MODE1T
AUXR = 0x80;
#endif
TMOD = 0x00;
TL0 = F38_4KHz;
TH0 = F38_4KHz >> 8;
TR0 = 1;
INT_CLKO = 0x01;
while (1);
}
210
南通国芯微电子有限公司
//timer0 work in 1T mode
//set timer0 as mode0 (16-bit auto-reload)
//initial timer0 low byte
//initial timer0 high byte
//timer0 start running
//enable timer0 clock output
//loop
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机定时器0的可编程时钟输-----------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
;/* define constants */
#define MODE1T
;Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
.
d
e
t
i
m
#ifdef MODE1T
F38_4KHz EQU 0FF10H ;38.4KHz frequency calculation method of 1T mode is (65536-18432000/2/38400)
#else
F38_4KHz EQU 0FFECH ;38.4KHz frequency calculation method of 12T mode(65536-18432000/2/12/38400)
#endif
;/* define SFR */
AUXR
INT_CLKO
T0CLKO
DATA 08EH
DATA 08FH
BIT P3.5
C
T
S
U
C
M
Li
;Auxiliary register
;External interrupt enable and clock output control register
;timer0 clock output pin
;----------------------------------------------
ORG 0000H
LJMP MAIN
;----------------------------------------------;/* main program */
MAIN:
#ifdef MODE1T
MOV AUXR, #80H
#endif
MOV TMOD, #00H
MOV TL0,
#LOW F38_4KHz
MOV TH0,
#HIGH F38_4KHz
SETB TR0
MOV INT_CLKO,
#01H
;timer0 work in 1T mode
;set timer0 as mode0 (16-bit auto-reload)
;initial timer0 low byte
;initial timer0 high byte
;enable timer0 clock output
SJMP $
;----------------------------------------------
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
211
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.4.3 定时器1的可编程时钟输出的测试程序(C程序和汇编程序)
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机定时器1的可编程时钟输-----------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
.
d
e
t
i
m
#include "reg51.h"
//----------------------------------------------/* define constants */
#define SYSclk 18432000L
//#define MODE1T
U
C
M
Li
//Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
#ifdef MODE1T
#define F38_4KHz (65536-SYSclk/2/38400) //38.4KHz frequency calculation method of 1T mode
#else
#define F38_4KHz (65536-SYSclk/2/12/38400) //38.4KHz frequency calculation method of 12T mode
#endif
C
T
S
/* define SFR */
sfr AUXR
= 0x8e;
sfr INT_CLKO = 0x8f;
sbit T1CLKO = P3^4;
//Auxiliary register
//External interrupt enable and clock output control register
//timer1 clock output pin
//----------------------------------------------/* main program */
void main()
{
#ifdef MODE1T
AUXR = 0x40;
#endif
TMOD = 0x00;
TL1 = F38_4KHz;
TH1 = F38_4KHz >> 8;
TR1 = 1;
INT_CLKO = 0x02;
}
while (1);
212
南通国芯微电子有限公司
//timer1 work in 1T mode
//set timer1 as mode0 (16-bit auto-reload)
//initial timer1 low byte
//initial timer1 high byte
//timer1 start running
//enable timer1 clock output
//loop
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机定时器1的可编程时钟输-----------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
;/* define constants */
#define MODE1T
;Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
#ifdef MODE1T
F38_4KHz EQU 0FF10H
#else
F38_4KHz EQU 0FFECH
2/38400)
#endif
;/* define SFR */
AUXR
INT_CLKO
T1CLKO
.
d
e
t
i
m
;38.4KHz frequency calculation method of 1T mode is (65536-18432000/2/38400)
Li
;38.4KHz frequency calculation method of 12T mode (65536-18432000/2/1
DATA 08EH
DATA 08FH
BIT P3.4
C
T
S
U
C
M
;Auxiliary register
;External interrupt enable and clock output control register
;timer1 clock output pin
;----------------------------------------------
ORG 0000H
LJMP MAIN
;----------------------------------------------;/* main program */
MAIN:
#ifdef MODE1T
MOV AUXR, #40H
#endif
MOV TMOD, #00H
MOV TL1,
#LOW F38_4KHz
MOV TH1,
#HIGH F38_4KHz
SETB TR1
MOV INT_CLKO,
#02H
;timer1 work in 1T mode
;set timer1 as mode0 (16-bit auto-reload)
;initial timer1 low byte
;initial timer1 high byte
;enable timer1 clock output
SJMP $
;----------------------------------------------
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
213
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.5 古老的Intel 8051单片机定时器0/1应用举例
【例1】 定时/计数器应用编程,设某应用系统,选择定时/计数器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
L}i
;
;
开中断
�
;其他初始化程序
;启动T1开始计时
;������
继续主程序
…
U
C
M
…
.
d
e
t
i
m
A
;
PUSH DPL
PUSH DPH
MOV
TL1,#0F0H
MOV
TH1,#0D8H
POP
DPH
POP
DPL
POP
A
}
RETI
;返回
}
;
现场保护
…
…
;
214
南通国芯微电子有限公司
;
}
;
重新置初值
;中断处理主体程序
;
;
现场恢复
;
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
这里展示了中断服务子程序的基本格式。STC15F204EA系列单片机的中断属于矢量中断,
每一个矢量中断源只留有8个字节单元,一般是不够用的,常需用转移指令转到真正的中断服
务子程序区去执行。
【例2】 利用定时/计数器0或定时/计数器1的Tx端口改造成外部中断源输入端口的应用设计。
在某些应用系统中常会出现原有的两个外部中断源INT0和INT1不够用,而定时/计数器有
多余,则可将Tx用于增加的外部中断源。现选择定时/计数器1为对外部事件计数模式工作方式
2(自动再装入),设置计数初值为FFH,则T1端口输入一个负跳变脉冲,计数器即回0溢出,
置位对应的中断请求标志位TF1为1,向主机请求中断处理,从而达到了增加一个外部中断源的
目的。应用定时/计数器1(T1)的中断矢量转入中断服务程序处理。其程序示例如下:
.
d
e
t
i
m
(1)主程序段:
ORG
0000H
AJMP
MAIN
ORG
001BH
LJMP
INTER
ORG
…
C
T
S
0100
…
MAIN: …
;转主程序
U
C
M
Li
;转T1中断服务程序
;主程序入口
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
215
STC15F204EA系列单片机指南
技术支持网站: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
;启动
216
…
…
38H。
南通国芯微电子有限公司
;
开中断
;
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站: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
217
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
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
;开中断
…
研发顾问:13922809991
.
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中
218
…
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
第8章 模拟串口的实现程序
8.1 利用定时器0实现模拟串口的测试程序(C程序和汇编程序)
----定时器0工作在16位自动重装模式
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机利用定时器0实现模拟串口功能--------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
U
C
M
.
d
e
t
i
m
Li
//define baudrate const
//BAUD = 256 - SYSclk/3/BAUDRATE/M (1T:M=1; 12T:M=12)
//NOTE: (SYSclk/3/BAUDRATE) must be greater than 98, (RECOMMEND GREATER THAN 110)
C
T
S
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
0xF400
0xFA00
0xFD00
0xFE80
0xFF40
0xFFA0
// 1200bps @ 11.0592MHz
// 2400bps @ 11.0592MHz
// 4800bps @ 11.0592MHz
// 9600bps @ 11.0592MHz
//19200bps @ 11.0592MHz
//38400bps @ 11.0592MHz
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
#define BAUD
0xEC00
0xF600
0xFB00
0xFD80
0xFEC0
0xFF60
// 1200bps @ 18.432MHz
// 2400bps @ 18.432MHz
// 4800bps @ 18.432MHz
// 9600bps @ 18.432MHz
//19200bps @ 18.432MHz
//38400bps @ 18.432MHz
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
0xE800
0xF400
0xFA00
0xFD00
0xFE80
0xFF40
0xFF80
// 1200bps @ 22.1184MHz
// 2400bps @ 22.1184MHz
// 4800bps @ 22.1184MHz
// 9600bps @ 22.1184MHz
//19200bps @ 22.1184MHz
//38400bps @ 22.1184MHz
//57600bps @ 22.1184MHz
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
219
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
sfr AUXR = 0x8E;
sbit RXB = P3^0;
sbit TXB = P3^1;
临时技术支持:13922829991
研发顾问:13922809991
//define UART TX/RX port
typedef bit BOOL;
typedef unsigned char BYTE;
typedef unsigned int WORD;
BYTE TBUF,RBUF;
BYTE TDAT,RDAT;
BYTE TCNT,RCNT;
BYTE TBIT,RBIT;
BOOL TING,RING;
BOOL TEND,REND;
void UART_INIT();
BYTE t, r;
BYTE buf[16];
void main()
{
TMOD = 0x00;
AUXR = 0x80;
TL0 = BAUD;
TH0 = BAUD>>8;
TR0 = 1;
ET0 = 1;
PT0 = 1;
EA = 1;
C
T
S
U
C
M
.
d
e
t
i
m
Li
//timer0 in 16-bit auto reload mode
//timer0 working at 1T mode
//initial timer0 and set reload value
//tiemr0 start running
//enable timer0 interrupt
//improve timer0 interrupt priority
//open global interrupt switch
UART_INIT();
}
while (1)
{
//user's function
if (REND)
{
REND = 0;
buf[r++ & 0x0f] = RBUF;
}
if (TEND)
{
if (t != r)
{
TEND = 0;
TBUF = buf[t++ & 0x0f];
TING = 1;
}
}
}
220
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
//----------------------------------------//Timer interrupt routine for UART
void tm0() interrupt 1 using 1
{
if (RING)
{
if (--RCNT == 0)
{
RCNT = 3;
//reset send baudrate counter
if (--RBIT == 0)
{
RBUF = RDAT;
//save the data to RBUF
RING = 0;
//stop receive
REND = 1;
//set receive completed flag
}
else
{
RDAT >>= 1;
if (RXB) RDAT |= 0x80;
//shift RX data to RX buffer
}
}
}
else if (!RXB)
{
RING = 1;
//set start receive flag
RCNT = 4;
//initial receive baudrate counter
RBIT = 9;
//initial receive bit number (8 data bits + 1 stop bit)
}
C
T
S
U
C
M
.
d
e
t
i
m
Li
if (--TCNT == 0)
{
TCNT = 3;
//reset send baudrate counter
if (TING)
//judge whether sending
{
if (TBIT == 0)
{
TXB = 0;
//send start bit
TDAT = TBUF;
//load data from TBUF to TDAT
TBIT = 9;
//initial send bit number (8 data bits + 1 stop bit)
}
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
221
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
else
{
TDAT >>= 1;
//shift data to CY
if (--TBIT == 0)
{
TXB = 1;
TING = 0;
//stop send
TEND = 1;
//set send completed flag
}
else
{
TXB = CY;
//write CY to TX port
}
}
}
}
}
//----------------------------------------//initial UART module variable
void UART_INIT()
{
TING = 0;
RING = 0;
TEND = 1;
REND = 0;
TCNT = 0;
RCNT = 0;
}
222
C
T
S
南通国芯微电子有限公司
U
C
M
.
d
e
t
i
m
Li
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机利用定时器0实现模拟串口功能--------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
;----------------------------------------;define baudrate const
;BAUD = 65536 - SYSclk/3/BAUDRATE/M (1T:M=1; 12T:M=12)
;NOTE: (SYSclk/3/BAUDRATE) must be greater than 75, (RECOMMEND GREATER THAN 100)
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
EQU
EQU
EQU
EQU
EQU
EQU
EQU
0F400H
0FA00H
0FD00H
0FE80H
0FF40H
0FFA0H
0FFC0H
; 1200bps @ 11.0592MHz
; 2400bps @ 11.0592MHz
; 4800bps @ 11.0592MHz
; 9600bps @ 11.0592MHz
;19200bps @ 11.0592MHz
;38400bps @ 11.0592MHz
;57600bps @ 11.0592MHz
;BAUD EQU
;BAUD EQU
;BAUD EQU
;BAUD EQU
;BAUD EQU
;BAUD EQU
BAUD EQU
0EC00H
0F600H
0FB00H
0FD80H
0FEC0H
0FF60H
0FF95H
; 1200bps @ 18.432MHz
; 2400bps @ 18.432MHz
; 4800bps @ 18.432MHz
; 9600bps @ 18.432MHz
;19200bps @ 18.432MHz
;38400bps @ 18.432MHz
;57600bps @ 18.432MHz
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
0E800H
0F400H
0FA00H
0FD00H
0FE80H
0FF40H
0FF80H
; 1200bps @ 22.1184MHz
; 2400bps @ 22.1184MHz
; 4800bps @ 22.1184MHz
; 9600bps @ 22.1184MHz
;19200bps @ 22.1184MHz
;38400bps @ 22.1184MHz
;57600bps @ 22.1184MHz
EQU
EQU
EQU
EQU
EQU
EQU
EQU
C
T
S
南通国芯微电子有限公司
U
C
M
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
传真:0513-5501 2969 / 2956 / 2947
223
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;----------------------------------------;define UART TX/RX port
RXB
TXB
BIT
BIT
P3.0
P3.1
;----------------------------------------;define SFR
AUXR
DATA 8EH
;----------------------------------------;define UART module variable
TBUF
RBUF
TDAT
RDAT
TCNT
RCNT
TBIT
RBIT
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
TING BIT
MODULE)
RING BIT
TEND BIT
REND BIT
08H
09H
0AH
0BH
0CH
0DH
0EH
0FH
.
d
e
t
i
m
;(R0) ready send data buffer (USER WRITE ONLY)
;(R1) received data buffer (UAER READ ONLY)
;(R2) sending data buffer
(RESERVED FOR UART MODULE)
;(R3) receiving data buffer (RESERVED FOR UART MODULE)
;(R4) send baudrate counter (RESERVED FOR UART MODULE)
;(R5) receive baudrate counter (RESERVED FOR UART MODULE)
;(R6) send bit counter
(RESERVED FOR UART MODULE)
;(R7) receive bit counter
(RESERVED FOR UART MODULE)
U
C
M
Li
20H.0
; sending flag (USER WRITE "1" TO TRIGGER SEND DATA, CLEAR BY
20H.1
20H.2
20H.3
; receiving flag (RESERVED FOR UART MODULE)
; sent flag
(SET BY MODULE AND SHOULD USER CLEAR)
; received flag (SET BY MODULE AND SHOULD USER CLEAR)
C
T
S
RPTR DATA 21H
WPTR DATA 22H
BUFFER DATA 23H
;circular queue read pointer
;circular queue write pointer
;circular queue buffer (16 bytes)
;----------------------------------------ORG 0000H
LJMP RESET
;----------------------------------------;Timer0 interrupt routine for UART
ORG
000BH
PUSH ACC
PUSH PSW
MOV PSW, #08H
L_UARTSTART:
;-------------------
224
南通国芯微电子有限公司
;4 save ACC
;4 save PSW
;3 using register group 1
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
JB
RING, L_RING
JB
RXB, L_REND
L_RSTART:
SETB RING
MOV R5,
#4
MOV R7,
#9
SJMP L_REND
L_RING:
DJNZ R5,
L_REND
MOV R5,
#3
L_RBIT:
MOV C,
RXB
MOV A,
R3
RRC A
MOV R3,
A
DJNZ R7,
L_REND
L_RSTOP:
RLC A
MOV R1,
A
CLR RING
SETB REND
L_REND:
;------------------L_TING:
DJNZ R4,
L_TEND
MOV R4,
#3
JNB TING, L_TEND
MOV A,
R6
JNZ L_TBIT
L_TSTART:
CLR TXB
MOV TDAT, R0
MOV R6,
#9
JMP L_TEND
L_TBIT:
MOV A,
R2
SETB C
RRC A
MOV R2,
A
MOV TXB,
C
DJNZ R6,
L_TEND
L_TSTOP:
CLR TING
SETB TEND
L_TEND:
;------------------L_UARTEND:
POP PSW
POP ACC
RETI
C
T
S
南通国芯微电子有限公司
临时技术支持:13922829991
研发顾问:13922809991
;4 judge whether receiving
; check start signal
;
;
;
;
set start receive flag
initial receive baudrate counter
initial receive bit number (8 data bits + 1 stop bit)
end this time slice
;4 judge whether sending
;2 reset send baudrate counter
;3 read RX port data
;1 and shift it to RX buffer
;1
;2
;4 judge whether the data have receive completed
;
;
;
;
.
d
e
t
i
m
shift out stop bit
save the data to RBUF
stop receive
set receive completed flag
U
C
M
Li
;4 check send baudrate counter
;2 reset it
;4 judge whether sending
;1 detect the sent bits
;3 "0" means start bit not sent
;
;
;
;
send start bit
load data from TBUF to TDAT
initial send bit number (8 data bits + 1 stop bit)
end this time slice
;1 read data in TDAT
;1 shift in stop bit
;1 shift data to CY
;2 update TDAT
;4 write CY to TX port
;4 judge whether the data have send completed
; stop send
; set send completed flag
;3 restore PSW
;3 restore ACC
;4 (69)
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
225
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;----------------------------------------;initial UART module variable
UART_INIT:
CLR
CLR
SETB
CLR
CLR
MOV
MOV
RET
TING
RING
TEND
REND
A
TCNT, A
RCNT, A
.
d
e
t
i
m
;----------------------------------------;main program entry
RESET:
MOV R0,
#7FH
CLR A
MOV @R0, A
DJNZ R0,
$-1
MOV SP,
#7FH
;------------------;system initial
MOV TMOD, #00H
MOV AUXR, #80H
MOV TL0,
#LOW BAUD
MOV TH0,
#HIGH BAUD
SETB TR0
SETB ET0
SETB PT0
SETB EA
LCALL UART_INIT
;----------------------------------------MAIN:
JNB REND, CHECKREND
CLR REND
MOV A,
RPTR
INC RPTR
ANL A,
#0FH
ADD A,
#BUFFER
MOV R0,
A
MOV @R0, RBUF
C
T
S
226
南通国芯微电子有限公司
Li
;clear RAM
U
C
M
;initial SP
;timer0 in 16-bit auto reload mode
;timer0 working at 1T mode
;initial timer0 and
;set reload value
;tiemr0 start running
;enable timer0 interrupt
;improve timer0 interrupt priority
;open global interrupt switch
;if (REND)
;{
;
REND = 0;
;
BUFFER[RPTR++ & 0xf] = RBUF;
;}
;
;
;
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
CHECKREND:
JNB TEND,
MOV A,
XRL A,
JZ
MAIN
CLR TEND
MOV A,
INC WPTR
ANL A,
ADD A,
MOV R0,
MOV TBUF,
SETB TING
SJMP MAIN
技术支持网站:www.STCMCU.com
MAIN
RPTR
WPTR
;if (TEND)
;{
;
if (WPTR != REND)
;
{
;
TEND = 0;
WPTR
;
TBUF = BUFFER[WPTR++ & 0xf];
;
TING = 1;
#0FH
;
}
#BUFFER
;}
A
;
@R0
;
;
END
C
T
S
南通国芯微电子有限公司
研发顾问:13922809991
;----------------------------------------
临时技术支持:13922829991
U
C
M
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
传真:0513-5501 2969 / 2956 / 2947
227
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
8.2 利用定时器1实现模拟串口的测试程序(C程序和汇编程序)
----定时器1工作在16位自动重装模式
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机利用定时器1实现模拟串口功能--------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
.
d
e
t
i
m
Li
//define baudrate const
//BAUD = 256 - SYSclk/3/BAUDRATE/M (1T:M=1; 12T:M=12)
//NOTE: (SYSclk/3/BAUDRATE) must be greater than 98, (RECOMMEND GREATER THAN 110)
U
C
M
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
0xF400
0xFA00
0xFD00
0xFE80
0xFF40
0xFFA0
// 1200bps @ 11.0592MHz
// 2400bps @ 11.0592MHz
// 4800bps @ 11.0592MHz
// 9600bps @ 11.0592MHz
//19200bps @ 11.0592MHz
//38400bps @ 11.0592MHz
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
#define BAUD
0xEC00
0xF600
0xFB00
0xFD80
0xFEC0
0xFF60
// 1200bps @ 18.432MHz
// 2400bps @ 18.432MHz
// 4800bps @ 18.432MHz
// 9600bps @ 18.432MHz
//19200bps @ 18.432MHz
//38400bps @ 18.432MHz
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
0xE800
0xF400
0xFA00
0xFD00
0xFE80
0xFF40
0xFF80
// 1200bps @ 22.1184MHz
// 2400bps @ 22.1184MHz
// 4800bps @ 22.1184MHz
// 9600bps @ 22.1184MHz
//19200bps @ 22.1184MHz
//38400bps @ 22.1184MHz
//57600bps @ 22.1184MHz
228
C
T
S
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
sfr AUXR = 0x8E;
sbit RXB = P3^0;
sbit TXB = P3^1;
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
//define UART TX/RX port
typedef bit BOOL;
typedef unsigned char BYTE;
typedef unsigned int WORD;
BYTE TBUF,RBUF;
BYTE TDAT,RDAT;
BYTE TCNT,RCNT;
BYTE TBIT,RBIT;
BOOL TING,RING;
BOOL TEND,REND;
void UART_INIT();
BYTE t, r;
BYTE buf[16];
void main()
{
TMOD = 0x00;
AUXR = 0x40;
TL1 = BAUD;
TH1 = BAUD>>8;
TR1 = 1;
ET1 = 1;
PT1 = 1;
EA = 1;
C
T
S
.
d
e
t
i
m
Li
//timer1 in 16-bit auto reload mode
//timer1 working at 1T mode
U
C
M
//initial timer1 and set reload value
//tiemr1 start running
//enable timer1 interrupt
//improve timer1 interrupt priority
//open global interrupt switch
UART_INIT();
while (1)
{
//user's function
if (REND)
{
REND = 0;
buf[r++ & 0x0f] = RBUF;
}
if (TEND)
{
if (t != r)
{
TEND = 0;
TBUF = buf[t++ & 0x0f];
TING = 1;
}
}
}
}
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
229
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
//----------------------------------------//Timer interrupt routine for UART
void tm1() interrupt 3 using 1
{
if (RING)
{
if (--RCNT == 0)
{
RCNT = 3;
//reset send baudrate counter
if (--RBIT == 0)
{
RBUF = RDAT; //save the data to RBUF
RING = 0;
//stop receive
REND = 1;
//set receive completed flag
}
else
{
RDAT >>= 1;
if (RXB) RDAT |= 0x80;
//shift RX data to RX buffer
}
}
}
else if (!RXB)
{
RING = 1;
//set start receive flag
RCNT = 4;
//initial receive baudrate counter
RBIT = 9;
//initial receive bit number (8 data bits + 1 stop bit)
}
C
T
S
230
U
C
M
.
d
e
t
i
m
Li
if (--TCNT == 0)
{
TCNT = 3;
//reset send baudrate counter
if (TING)
//judge whether sending
{
if (TBIT == 0)
{
TXB = 0;
//send start bit
TDAT = TBUF; //load data from TBUF to TDAT
TBIT = 9;
//initial send bit number (8 data bits + 1 stop bit)
}
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
else
{
TDAT >>= 1;
//shift data to CY
if (--TBIT == 0)
{
TXB = 1;
TING = 0;
//stop send
TEND = 1;
//set send completed flag
}
else
{
TXB = CY;
//write CY to TX port
}
}
}
}
}
//----------------------------------------//initial UART module variable
void UART_INIT()
{
TING = 0;
RING = 0;
TEND = 1;
REND = 0;
TCNT = 0;
RCNT = 0;
}
南通国芯微电子有限公司
C
T
S
U
C
M
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
传真:0513-5501 2969 / 2956 / 2947
231
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机利用定时器1实现模拟串口功能--------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
;----------------------------------------;define baudrate const
;BAUD = 65536 - SYSclk/3/BAUDRATE/M (1T:M=1; 12T:M=12)
;NOTE: (SYSclk/3/BAUDRATE) must be greater than 75, (RECOMMEND GREATER THEN 100)
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
EQU
EQU
EQU
EQU
EQU
EQU
EQU
0F400H
0FA00H
0FD00H
0FE80H
0FF40H
0FFA0H
0FFC0H
; 1200bps @ 11.0592MHz
; 2400bps @ 11.0592MHz
; 4800bps @ 11.0592MHz
; 9600bps @ 11.0592MHz
;19200bps @ 11.0592MHz
;38400bps @ 11.0592MHz
;57600bps @ 11.0592MHz
;BAUD EQU
;BAUD EQU
;BAUD EQU
;BAUD EQU
;BAUD EQU
;BAUD EQU
BAUD EQU
0EC00H
0F600H
0FB00H
0FD80H
0FEC0H
0FF60H
0FF95H
; 1200bps @ 18.432MHz
; 2400bps @ 18.432MHz
; 4800bps @ 18.432MHz
; 9600bps @ 18.432MHz
;19200bps @ 18.432MHz
;38400bps @ 18.432MHz
;57600bps @ 18.432MHz
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
0E800H
0F400H
0FA00H
0FD00H
0FE80H
0FF40H
0FF80H
; 1200bps @ 22.1184MHz
; 2400bps @ 22.1184MHz
; 4800bps @ 22.1184MHz
; 9600bps @ 22.1184MHz
;19200bps @ 22.1184MHz
;38400bps @ 22.1184MHz
;57600bps @ 22.1184MHz
232
EQU
EQU
EQU
EQU
EQU
EQU
EQU
C
T
S
南通国芯微电子有限公司
U
C
M
.
d
e
t
i
m
Li
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;----------------------------------------;define UART TX/RX port
RXB
TXB
BIT
BIT
P3.0
P3.1
;----------------------------------------;define SFR
AUXR
DATA 8EH
;----------------------------------------;define UART module variable
TBUF
RBUF
TDAT
RDAT
TCNT
RCNT
TBIT
RBIT
DATA
DATA
DATA
DATA
DATA
DATA
DATA
DATA
08H
09H
0AH
0BH
0CH
0DH
0EH
0FH
TING
BIT
20H.0
ULE)
RING BIT 20H.1
TEND BIT 20H.2
REND BIT 20H.3
RPTR DATA 21H
WPTR DATA 22H
BUFFER DATA 23H
;(R0) ready send data buffer (USER WRITE ONLY)
;(R1) received data buffer (UAER READ ONLY)
;(R2) sending data buffer
(RESERVED FOR UART MODULE)
;(R3) receiving data buffer (RESERVED FOR UART MODULE)
;(R4) send baudrate counter (RESERVED FOR UART MODULE)
;(R5) receive baudrate counter (RESERVED FOR UART MODULE)
;(R6) send bit counter
(RESERVED FOR UART MODULE)
;(R7) receive bit counter
(RESERVED FOR UART MODULE)
U
C
M
.
d
e
t
i
m
Li
;sending flag(USER WRITE"1"TO TRIGGER SEND DATA,CLEAR BY MOD-
C
T
S
; receiving flag (RESERVED FOR UART MODULE)
; sent flag
(SET BY MODULE AND SHOULD USER CLEAR)
; received flag (SET BY MODULE AND SHOULD USER CLEAR)
;circular queue read pointer
;circular queue write pointer
;circular queue buffer (16 bytes)
;----------------------------------------
ORG 0000H
LJMP RESET
;----------------------------------------;Timer1 interrupt routine for UART
ORG
001BH
PUSH ACC
PUSH PSW
MOV PSW,
L_UARTSTART:
;------------------
JB
RING,
JB
RXB,
南通国芯微电子有限公司
#08H
L_RING
L_REND
;4 save ACC
;4 save PSW
;3 using register group 1
;4 judge whether receiving
; check start signal
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
233
STC15F204EA系列单片机指南
L_RSTART:
SETB
MOV
MOV
SJMP
L_RING:
DJNZ
MOV
L_RBIT:
MOV
MOV
RRC
MOV
DJNZ
L_RSTOP:
RLC
MOV
CLR
SETB
L_REND:
;------------------L_TING:
DJNZ
MOV
JNB
MOV
JNZ
L_TSTART:
CLR
MOV
MOV
JMP
L_TBIT:
MOV
SETB
RRC
MOV
MOV
DJNZ
L_TSTOP:
CLR
SETB
L_TEND:
;------------------L_UARTEND:
POP
POP
RETI
234
技术支持网站:www.STCMCU.com
RING
R5,
#4
R7,
#9
L_REND
R5,
R5,
L_REND
#3
C,
A,
A
R3,
R7,
RXB
R3
A
R1,
RING
REND
R4,
R4,
TING,
A,
L_TBIT
研发顾问:13922809991
set start receive flag
initial receive baudrate counter
initial receive bit number (8 data bits + 1 stop bit)
end this time slice
;4 judge whether sending
;2 reset send baudrate counter
;3 read RX port data
;1 and shift it to RX buffer
;1
A
;2
L_REND
;4 judge whether the data have receive completed
A
;
;
;
;
TXB
TDAT, R0
R6,
#9
L_TEND
R2
PSW
ACC
南通国芯微电子有限公司
;
;
;
;
Li
;4 check send baudrate counter
;2 reset it
;4 judge whether sending
;1 detect the sent bits
;3 "0" means start bit not sent
A
C
L_TEND
TING
TEND
.
d
e
t
i
m
shift out stop bit
save the data to RBUF
stop receive
set receive completed flag
U
C
M
L_TEND
#3
L_TEND
R6
C
T
S
A,
C
A
R2,
TXB,
R6,
;
;
;
;
临时技术支持:13922829991
send start bit
load data from TBUF to TDAT
initial send bit number (8 data bits + 1 stop bit)
end this time slice
;1 read data in TDAT
;1 shift in stop bit
;1 shift data to CY
;2 update TDAT
;4 write CY to TX port
;4 judge whether the data have send completed
; stop send
; set send completed flag
;3 restore PSW
;3 restore ACC
;4 (69)
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;----------------------------------------;initial UART module variable
UART_INIT:
CLR
CLR
SETB
CLR
CLR
MOV
MOV
RET
TING
RING
TEND
REND
A
TCNT,A
RCNT,A
.
d
e
t
i
m
;----------------------------------------;main program entry
RESET:
MOV R0,
#7FH
;clear RAM
CLR A
MOV @R0, A
DJNZ R0,
$-1
MOV SP,
#7FH
;initial SP
;------------------;system initial
MOV TMOD, #00H
MOV AUXR, #40H
MOV TL1,
#LOW BAUD
MOV TH1,
#HIGH BAUD
SETB TR1
SETB ET1
SETB PT1
SETB EA
LCALL UART_INIT
;----------------------------------------MAIN:
JNB REND, CHECKREND
CLR REND
MOV A,
RPTR
INC RPTR
ANL A,
#0FH
ADD A,
#BUFFER
MOV R0,
A
MOV @R0, RBUF
C
T
S
南通国芯微电子有限公司
U
C
M
Li
;timer1 in 16-bit auto reload mode
;timer1 working at 1T mode
;initial timer1 and
;set reload value
;tiemr1 start running
;enable timer1 interrupt
;improve timer1 interrupt priority
;open global interrupt switch
;if (REND)
;{
;
REND = 0;
;
BUFFER[RPTR++ & 0xf] = RBUF;
;}
;
;
;
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
235
STC15F204EA系列单片机指南
CHECKREND:
JNB TEND,
MOV A,
XRL A,
JZ
MAIN
CLR TEND
MOV A,
INC WPTR
ANL A,
ADD A,
MOV R0,
MOV TBUF,
SETB TING
SJMP MAIN
技术支持网站:www.STCMCU.com
MAIN
RPTR
WPTR
WPTR
临时技术支持:13922829991
#0FH
#BUFFER
A
@R0
;if (TEND)
;{
;
if (WPTR != REND)
;
{
;
TEND = 0;
;
TBUF = BUFFER[WPTR++ & 0xf];
;
TING = 1;
;
}
;}
;
;
;
.
d
e
t
i
m
;----------------------------------------
END
C
T
S
236
南通国芯微电子有限公司
研发顾问:13922809991
U
C
M
Li
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
第9章 STC15F204EA系列单片机的A/D转换器
9.1 A/D转换器的结构
STC15F204EA系列单片机ADC(A/D转换器)的结构如下图所示。
ADC_CONTR Register
ADC_POWER SPEED1
SPEED0
ADC_FLAG
ADC_START CHS2 CHS1 CHS0
模拟输入信号通道选择
开关CHS2/CHS1/CHS0
A/D转换结果寄存器:
ADC_ RES[7:0] and ADC_RESL[1:0]
.
d
e
t
i
m
ADC7/P1.7
ADC6/P1.6
ADC5/P1.5
ADC4/P1.4
逐次比较
寄存器
+
ADC3/P1.3
U
C
M
ADC2/P1.2
-
ADC1/P1.1
比较器
ADC0/P1.0
C
T
S
Li
10-bit DAC
ADC_RES[7:0]
ADC_B9 ADC_B8 ADC_B7 ADC_B6 ADC_B5 ADC_B4 ADC_B3 ADC_B2
-
-
-
-
-
-
ADC_B1 ADC_B0
ADC_RESL[1:0]
STC15F204EA系列单片机ADC由多路选择开关、比较器、逐次比较寄存器、10位DAC、转
换结果寄存器(ADC_RES和ADC_RESL)以及ADC_CONTR构成。
STC15F204EA系列单片机的ADC是逐次比较型ADC。逐次比较型ADC由一个比较器和D/A转
换器构成,通过逐次比较逻辑,从最高位(MSB)开始,顺序地对每一输入电压与内置D/A转换器
输出进行比较,经过多次比较,使转换所得的数字量逐次逼近输入模拟量对应值。逐次比较型
A/D转换器具有速度高,功耗低等优点。
从上图可以看出,通过模拟多路开关,将通过ADC0~7的模拟量输入送给比较器。用数
/模转换器(DAC)转换的模拟量与输入的模拟量通过比较器进行比较,将比较结果保存到逐次
比较寄存器,并通过逐次比较寄存器输出转换结果。A/D转换结束后,最终的转换结果保存到
ADC转换结果寄存器ADC_RES和ADC_RESL,同时,置位ADC控制寄存器ADC_CONTR中的A/D转换
结束标志位ADC_FLAG,以供程序查询或发出中断申请。模拟通道的选择控制由ADC控制寄存器
ADC_CONTR中的CHS2~CHS0确定。ADC的转换速度由ADC控制寄存器中的SPEED1和SPEED0确定。
在使用ADC之前,应先给ADC上电,也就是置位ADC控制寄存器中的ADC_POWER位。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
237
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
如果取完整的10位结果,按下面公式计算:
10-bit A/D Conversion Result:(ADC_RES[7:0], ADC_RESL[1:0]) = 1024 x
Vin
Vcc
如果只取高8位结果,按下面公式计算:
8-bit A/D Conversion Result:(ADC_RES[7:0])= 256 x
Vin
Vcc
式中,Vin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为
模拟参考电压。
U
C
M
.
d
e
t
i
m
Li
9.2 与A/D转换相关的寄存器
C
T
S
与STC15F204EA系列单片机A/D转换相关的寄存器列于下表所示。
位地址及其符号
符号
描述
地址
P1ASF
P1 Analog Function
Configure register
9DH
P17ASF P16ASF P15ASF P14ASF P13ASF P12ASF P11ASF P10ASF
0000 0000B
ADC_CONTR ADC Control Register
BCH
ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
0000 0000B
ADC_RES
ADC_RESL
IE
BDH
BEH
A8H
IP
238
ADC Result high
ADC Result low
Interrupt Enable
Interrupt Priority
Low
南通国芯微电子有限公司
B8H
MSB
EA
-
LSB
ELVD EADC
PLVD PADC
-
-
总机:0513-5501 2928 / 2929 / 2966
复位值
0000 0000B
0000 0000B
000x 0000B
ET1
EX1
ET0
EX0
PT1
PX1
PT0
PX0 x00x 0000B
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1. P1口模拟功能控制寄存器P1ASF
STC15F204EA系列单片机的�������������������������������������
A/D转换口在P1口(P1.7-P1.0),有8路10位高速A/D转换器,
速度可达到300KHz(30万次/秒)。8路电压输入型A/D,可做温度检测、电池电压检测、按键扫
描、频谱检测等。上电复位后P1口为弱上拉型I/O口,用户可以通过软件设置将8路中的任何
一路设置为A/D转换,不需作为A/D使用的P1口可继续作为I/O口使用(�����������
建议只作为输入����
)。需作
为A/D使用的口需先将P1ASF特殊功能寄存器中的相应位置为‘1’,将相应的口设置为模拟功
能。��������������
P1ASF寄存器的格式如下:
P1ASF : P1口模拟功能控制寄存器
SFR name
P1ASF
Address
9DH
bit
name
B7
B6
B5
B4
B3
B2
B1
B0
P17ASF P16ASF P15ASF P14ASF P13ASF P12ASF P11ASF P10ASF
P1ASF[7:0]
P1.x的功能
P1ASF.0 = 1
P1.0口作为模拟功能A/D使用
P1ASF.1 = 1
P1.1口作为模拟功能A/D使用
P1ASF.2 = 1
P1.2口作为模拟功能A/D使用
P1ASF.3 = 1
P1.3口作为模拟功能A/D使用
P1ASF.4 = 1
P1.4口作为模拟功能A/D使用
P1ASF.5 = 1
P1.5口作为模拟功能A/D使用
P1ASF.6 = 1
P1.6口作为模拟功能A/D使用
P1ASF.7 = 1
P1.7口作为模拟功能A/D使用
.
d
e
t
i
m
其中P1ASF寄存器地址为:[9DH](不能够进行位寻址)
U
C
M
C
T
S
Li
2. ADC控制寄存器ADC_CONTR
ADC_CONTR寄存器的格式如下:
ADC_CONTR : ADC控制寄存器
SFR name
Address
ADC_CONTR
BCH
bit
B7
B6
B5
B4
B3
B2
B1
B0
name ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
对ADC_CONTR寄存器进行操作,建议直接用MOV赋值语句,不要用‘与’和‘或’语句�
。
ADC_POWER: ADC 电源控制位。
0:关闭ADC 电源;
1:打开A/D转换器电源.
建议进入空闲模式�������������������������������������
和掉电模式��������������������������������
前,将ADC电源关闭,���������������������
即��������������������
ADC_POWER =0��������
,可降低功耗。�
启
动A/D转换前一定要确认A/D电源已打开,A/D转换结束后关闭A/D电源可降低功耗,也可
不关闭。初次打开内部A/D转换模拟电源,需适当延时,等内部模拟电源稳定后,再启
动A/D转换�
。
建议启动A/D转换后,在A/D转换结束之前,不改变任何I/O口的状态,有利于高精度A/D
转换,��������������������
如能将定时器/串行口/中断系统关闭更好。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
239
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
SPEED1,SPEED0:模数转换器转换速度控制位
SPEED1 SPEED0 A/D转换所需时间
1
1
90个时钟周期转换一次,CPU工作频率21MHz时,
A/D转换速度约300KHz
1
0
180个时钟周期转换一次
0
1
360个时钟周期转换一次
0
0
540个时钟周期转换一次
ADC_FLAG: 模数转换器转换结束标志位,当A/D转换完成后,ADC_FLAG = 1,要由软件清0。
不管是A/D 转换完成后由该位申请产生中断,还是由软件查询该标志位A/D转换是
否结束,当A/D转换完成后,ADC_FLAG = 1,一定要软件清0。
.
d
e
t
i
m
ADC_START:模数转换器(ADC)转换启动控制位,设置为“1”时,开始转换,转换结束后为0。
CHS2/CHS1/CHS0:模拟输入通道选择,CHS2/CHS1/CHS0
CHS2
240
CHS1 CHS0
Li
Analog Channel Select (模拟输入通道选择)
U
C
M
0
0
0
选择 P1.0 作为A/D输入来用
0
0
1
选择 P1.1 作为A/D输入来用
0
1
0
选择 P1.2 作为A/D输入来用
0
1
1
选择 P1.3 作为A/D输入来用
1
0
0
选择 P1.4 作为A/D输入来用
1
0
1
选择 P1.5 作为A/D输入来用
1
1
0
选择 P1.6 作为A/D输入来用
1
1
1
选择 P1.7 作为A/D输入来用
C
T
S
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
3. A/D转换结果寄存器ADC_RES、ADC_RESL
特殊功能寄存器ADC_RES和ADC_RESL寄存器用于保存A/D转换结果,其格式如下:
Mnemonic
Add
Name
B7
ADC_RES
BDh
A/D转换结果
寄存器高8位
ADC_RESL BEh
A/D转换结果
寄存器低2位
B6
B5
B4
B3
B2
B1
B0
ADC_RES9 ADC_RES8 ADC_RES7 ADC_RES6 ADC_RES5 ADC_RES4 ADC_RES3 ADC_RES2
-
-
-
-
-
-
ADC_RES1 ADC_RES0
STC15F204EA系列单片机的��������������������������������
10位A/D转换结果的高8位存放在ADC_RES中,低2位存放在
ADC_RESL的低2位中�
。
如果用户需取完整10位结果,按下面公式计算:
.
d
te
i
m
Li
10-bit A/D Conversion Result:(ADC_RES[7:0], ADC_RESL[1:0]) = 1024 x
如果用户只需取高8位结果,按下面公式计算:
U
C
M
8-bit A/D Conversion Result:(ADC_RES[7:0])= 256 x
C
T
S
Vin
Vcc
Vin
Vcc
式中,Vin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为
模拟参考电压。
4. 中断允许寄存器IE
IE : 中断允许寄存器 (可位寻址)
SFR name
IE
Address
A8H
bit
name
B7
EA
B6
ELVD
B5
EADC
B4
-
B3
ET1
B2
EX1
B1
ET0
B0
EX0
EA : CPU的中断开放标志,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。
EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受各中断源自
己的中断允许控制位控制。
EADC : A/D转换中断允许位,EADC=1,允许A/D转换中断,EADC=0,禁止A/D转换中断。
5. 中断优先级控制寄存器IP
IP : 中断优先级控制寄存器 (可位寻址)
SFR name
IP
Address
B8H
bit
name
B7
-
B6
PLVD
B5
PADC
B4
-
B3
PT1
B2
PX1
B1
PT0
B0
PX0
PADC : A/D转换中断优先级控制位。PADC=1,A/D转换中断定义为高优先级中断;
PADC=0,A/D转换中断定义为低优先级中断。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
241
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
9.3 A/D转换典型应用线路
1
28
P2.5
P2.7
2
27
P2.4
ADC0/P1.0
3
26
P2.3
ADC1/P1.1
4
25
P2.2
ADC2/P1.2
5
24
P2.1
ADC3/P1.3
6
23
P2.0/RSTOUT_LOW
ADC4/P1.4
7
22
P3.7/INT3
ADC5/P1.5
8
21
P3.6/INT2
ADC6/P1.6
9
20
P3.5/T1/CLKOUT0
ADC7/P1.7
10
19
P3.4/T0/CLKOUT1
IRC_CLKO/RST/P0.0
11
18
P3.3/INT1
Vcc
12
17
P3.2/INT0
P0.1
13
16
P3.1
Gnd
14
15
P3.0/INT4
SOP-28/SKDIP-28
P2.6
47pF以上
A/D转换在P1口,P1.0 - P1.7共8路
C
T
S
242
南通国芯微电子有限公司
U
C
M
1K
信号源
.
d
e
t
i
m
Li
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
9.4 A/D做按键扫描应用线路图
Vcc
1
28
P2.5
P2.7
2
27
P2.4
ADC0/P1.0
3
26
P2.3
ADC1/P1.1
4
25
P2.2
ADC2/P1.2
5
24
P2.1
ADC3/P1.3
6
23
P2.0/RSTOUT_LOW
ADC4/P1.4
7
22
P3.7/INT3
ADC5/P1.5
8
21
P3.6/INT2
ADC6/P1.6
9
20
P3.5/T1/CLKOUT0
19
P3.4/T0/CLKOUT1
18
P3.3/INT1
ADC7/P1.7
10
IRC_CLKO/RST/P0.0
11
SOP-28/SKDIP-28
P2.6
47pF以上
Vcc
12
17
P3.2/INT0
13
16
P3.1
Gnd
14
15
P3.0/INT4
2/3 Vcc
10K
3/4 Vcc
10K
28
P2.5
2
27
P2.4
3
26
P2.3
4
25
P2.2
ADC0/P1.0
ADC2/P1.2
ADC3/P1.3
ADC4/P1.4
ADC5/P1.5
ADC6/P1.6
C
T
S
5
6
7
8
9
ADC7/P1.7
10
IRC_CLKO/RST/P0.0
11
P2.1
23
P2.0/RSTOUT_LOW
22
P3.7/INT3
21
P3.6/INT2
20
P3.5/T1/CLKOUT0
19
P3.4/T0/CLKOUT1
18
P3.3/INT1
Vcc
12
17
P3.2/INT0
13
16
P3.1
Gnd
14
15
P3.0/INT4
+5V
R1
520Ω
sw1
Li
+5V
R1
10KΩ
ADCx
24
P0.1
R0
ADCx 10KΩ
47pF
SOP-28/SKDIP-28
ADC1/P1.1
.
d
e
t
i
m
5/4 Vcc
CU
M
1
1/2 Vcc
10K
A/D转换在P1口,P1.0 - P1.7共8路
P2.7
0V
10K
P0.1
P2.6
10K
1K
47pF
sw1
R2
520Ω
R3
1.8KΩ
R4
R5
R6
3.3KΩ 5.4KΩ 8.2KΩ
sw2
sw3
sw4
0`0.5
0
0.5`1
1`1.5
sw5
sw6
1.5`2.0 2.0`2.5
此电路可以实现单个按键扫描和组合按
键检测功能,但是具体电阻值应根据实
际需要进行选择
本电路图采用10个按键等间隔分压,每个按键正负误差余量允
许在±0.25V范围内变化,可以有效避免因为电阻误差或温度
漂移等造成的按键检测失效,如果要求按键检测更加稳定可
靠,可以减少按键数量放宽各个按键检测电压允许误差量。
R2
1.2KΩ
sw2
R3
1.6KΩ
sw3
R4
1.8KΩ
sw4
R5
3KΩ
sw5
R6
4KΩ
sw6
R7
6.5Ω
sw7
R8
10KΩ
sw8
R9
30KΩ
sw9
R10
100KΩ
sw10
sw11
0
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
243
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
9.5 A/D转换模块的参考电压源
STC15F204EA系列单片机的参考电压源是输入工作电压Vcc,所以一般不用外接参考电压
源。如7805的输出电压是5V,但实际电压可能是4.88V到4.96V,用户需要精度比较高的话,可
在出厂时将实际测出的工作电压值记录在单片机内部的EEPROM里面,以供计算。
如果有些用户的Vcc不固定,如电池供电,电池电压在5.3V-4.2V之间漂移,则Vcc不固
定,就需要在8路A/D转换的一个通道外接一个稳定的参考电压源,来计算出此时的工作电压
Vcc,再计算出其他几路A/D转换通道的电压。如可在ADC转换通道的第七通道外接一个1.25V
(或1V,或...)的基准参考电压源,由此求出此时的工作电压Vcc,再计算出其它几路A/D
转换通道的电压�������������������
(理论依据是短时间之内,Vcc不变)�
。
C
T
S
244
南通国芯微电子有限公司
U
C
M
.
d
e
t
i
m
Li
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
9.6 A/D转换测试程序(C程序和汇编程序)
9.6.1 A/D转换测试程序(ADC中断方式)
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机 A/D转换功能------------------------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
/*使用了软件模拟串口输出*/
#include "reg51.h"
#include "intrins.h"
typedef bit BOOL;
typedef unsigned char BYTE;
typedef unsigned int WORD;
C
T
S
U
C
M
.
d
e
t
i
m
Li
//define baudrate const
//BAUD = 256 - SYSclk/3/BAUDRATE/M (1T:M=1; 12T:M=12)
//NOTE: (SYSclk/3/BAUDRATE) must be greater then 98, (RECOMMEND GREATER THEN 110)
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
0xF400
0xFA00
0xFD00
0xFE80
0xFF40
0xFFA0
// 1200bps @ 11.0592MHz
// 2400bps @ 11.0592MHz
// 4800bps @ 11.0592MHz
// 9600bps @ 11.0592MHz
//19200bps @ 11.0592MHz
//38400bps @ 11.0592MHz
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
#define BAUD
0xEC00
0xF600
0xFB00
0xFD80
0xFEC0
0xFF60
// 1200bps @ 18.432MHz
// 2400bps @ 18.432MHz
// 4800bps @ 18.432MHz
// 9600bps @ 18.432MHz
//19200bps @ 18.432MHz
//38400bps @ 18.432MHz
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
245
STC15F204EA系列单片机指南
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
技术支持网站:www.STCMCU.com
0xE800
0xF400
0xFA00
0xFD00
0xFE80
0xFF40
0xFF80
临时技术支持:13922829991
研发顾问:13922809991
// 1200bps @ 22.1184MHz
// 2400bps @ 22.1184MHz
// 4800bps @ 22.1184MHz
// 9600bps @ 22.1184MHz
//19200bps @ 22.1184MHz
//38400bps @ 22.1184MHz
//57600bps @ 22.1184MHz
sfr AUXR = 0x8E;
sbit RXB = P3^0;
sbit TXB = P3^1;
//define UART TX/RX port
/*Declare SFR associated with the ADC */
sfr ADC_CONTR = 0xBC;
//ADC control register
sfr ADC_RES = 0xBD;
//ADC hight 8-bit result register
sfr ADC_LOW2 = 0xBE;
//ADC low 2-bit result register
sfr P1ASF
= 0x9D;
//P1 secondary function control register
U
C
M
Li
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER
0x80
//ADC power control bit
#define ADC_FLAG
0x10
//ADC complete flag
#define ADC_START
0x08
//ADC start control bit
#define ADC_SPEEDLL 0x00
//540 clocks
#define ADC_SPEEDL
0x20
//360 clocks
#define ADC_SPEEDH
0x40
//180 clocks
#define ADC_SPEEDHH 0x60
//90 clocks
C
T
S
.
d
e
t
i
m
void InitUart();
void SendData(BYTE dat);
void Delay(WORD n);
void InitADC();
BYTE TBUF,RBUF;
BYTE TDAT,RDAT;
BYTE TCNT,RCNT;
BYTE TBIT,RBIT;
BOOL TING,RING;
BOOL TEND,REND;
BYTE ch = 0;
246
南通国芯微电子有限公司
//ADC channel NO.
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
void main()
{
InitUart();
InitADC();
TMOD = 0x00;
AUXR = 0x80;
TL0 = BAUD;
TH0 = BAUD>>8;
TR0 = 1;
IE = 0xa0;
ET0 = 1;
PT0 = 1;
while (1);
}
//initial timer0 and set reload value
//tiemr0 start running
//Enable ADC interrupt and Open master interrupt switch
//enable timer0 interrupt
//improve timer0 interrupt priority
//Start A/D conversion
C
T
S
SendData(ch);
SendData(ADC_RES);
研发顾问:13922809991
//Init UART, use to show ADC result
//Init ADC sfr
//timer0 in 16-bit auto reload mode
//timer0 working at 1T mode
/*---------------------------ADC interrupt service routine
----------------------------*/
void adc_isr() interrupt 5 using 1
{
ADC_CONTR &= !ADC_FLAG;
临时技术支持:13922829991
U
C
M
.
d
e
t
i
m
Li
//Clear ADC interrupt flag
//Show Channel NO.
//Get ADC high 8-bit result and Send to UART
//if you want show 10-bit result, uncomment next line
//
SendData(ADC_LOW2);
//Show ADC low 2-bit result
if (++ch > 7) ch = 0;
//switch to next channel
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
}
/*---------------------------Initial ADC sfr
----------------------------*/
void InitADC()
{
P1ASF = 0xff;
//Set all P1 as analog input port
ADC_RES = 0;
//Clear previous result
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
Delay(2);
//ADC power-on delay and Start A/D conversion
}
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
247
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
/*---------------------------Software delay function
----------------------------*/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
//----------------------------------------//Timer interrupt routine for UART
.
d
e
t
i
m
Li
void tm0() interrupt 1 using 1
{
if (RING)
{
if (--RCNT == 0)
{
RCNT = 3;
//reset send baudrate counter
if (--RBIT == 0)
{
RBUF = RDAT;
//save the data to RBUF
RING = 0;
//stop receive
REND = 1;
//set receive completed flag
}
else
{
RDAT >>= 1;
if (RXB) RDAT |= 0x80; //shift RX data to RX buffer
}
}
}
else if (!RXB)
{
RING = 1;
//set start receive flag
RCNT = 4;
//initial receive baudrate counter
RBIT = 9;
//initial receive bit number (8 data bits + 1 stop bit)
}
C
T
S
248
南通国芯微电子有限公司
U
C
M
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
}
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
if (--TCNT == 0)
{
TCNT = 3;
//reset send baudrate counter
if (TING)
//judge whether sending
{
if (TBIT == 0)
{
TXB = 0;
//send start bit
TDAT = TBUF; //load data from TBUF to TDAT
TBIT = 9;
//initial send bit number (8 data bits + 1 stop bit)
}
else
{
TDAT >>= 1;
//shift data to CY
if (--TBIT == 0)
{
TXB = 1;
TING = 0;
//stop send
TEND = 1;
//set send completed flag
}
else
{
TXB = CY;
//write CY to TX port
}
}
}
}
C
T
S
U
C
M
.
d
e
t
i
m
Li
//----------------------------------------//initial UART module variable
void InitUart()
{
TING = 0;
RING = 0;
TEND = 1;
REND = 0;
TCNT = 0;
RCNT = 0;
}
//----------------------------------------//initial UART module variable
void SendData(BYTE dat)
{
while (!TEND);
TEND = 0;
TBUF = dat;
TING = 1;
}
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
249
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机 A/D转换功能------------------------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
;使用了软件模拟串口输出
.
d
e
t
i
m
;define baudrate const
;BAUD = 65536 - SYSclk/3/BAUDRATE/M (1T:M=1; 12T:M=12)
;NOTE: (SYSclk/3/BAUDRATE) must be greater then 75, (RECOMMEND GREATER THEN 100)
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
0F400H
0FA00H
0FD00H
0FE80H
0FF40H
0FFA0H
0FFC0H
0EC00H
0F600H
0FB00H
0FD80H
0FEC0H
0FF60H
0FF95H
0E800H
0F400H
0FA00H
0FD00H
0FE80H
0FF40H
0FF80H
; 1200bps @ 11.0592MHz
; 2400bps @ 11.0592MHz
; 4800bps @ 11.0592MHz
; 9600bps @ 11.0592MHz
;19200bps @ 11.0592MHz
;38400bps @ 11.0592MHz
;57600bps @ 11.0592MHz
; 1200bps @ 18.432MHz
; 2400bps @ 18.432MHz
; 4800bps @ 18.432MHz
; 9600bps @ 18.432MHz
;19200bps @ 18.432MHz
;38400bps @ 18.432MHz
;57600bps @ 18.432MHz
; 1200bps @ 22.1184MHz
; 2400bps @ 22.1184MHz
; 4800bps @ 22.1184MHz
; 9600bps @ 22.1184MHz
;19200bps @ 22.1184MHz
;38400bps @ 22.1184MHz
;57600bps @ 22.1184MHz
C
T
S
U
C
M
Li
;define UART TX/RX port
RXB
BIT P3.0
TXB
BIT P3.1
;define SFR
AUXR
DATA 8EH
250
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;define UART module variable
TBUF DATA 08H
;(R0) ready send data buffer (USER WRITE ONLY)
RBUF DATA 09H
;(R1) received data buffer (UAER READ ONLY)
TDAT DATA 0AH
;(R2) sending data buffer
(RESERVED FOR UART MODULE)
RDAT DATA 0BH
;(R3) receiving data buffer (RESERVED FOR UART MODULE)
TCNT DATA 0CH
;(R4) send baudrate counter (RESERVED FOR UART MODULE)
RCNT DATA 0DH
;(R5) receive baudrate counter (RESERVED FOR UART MODULE)
TBIT
DATA 0EH
;(R6) send bit counter
(RESERVED FOR UART MODULE)
RBIT DATA 0FH
;(R7) receive bit counter
(RESERVED FOR UART MODULE)
TING
RING
TEND
REND
BIT
BIT
BIT
BIT
20H.0
20H.1
20H.2
20H.3
;sending flag(USER WRITE"1"TO TRIGGER SEND DATA,CLEAR BY MODULE)
; receiving flag (RESERVED FOR UART MODULE)
; sent flag
(SET BY MODULE AND SHOULD USER CLEAR)
; received flag (SET BY MODULE AND SHOULD USER CLEAR)
.
d
e
t
i
m
;/*Declare SFR associated with the ADC */
ADC_CONTR EQU 0BCH
;ADC control register
ADC_RES
EQU 0BDH
;ADC high 8-bit result register
ADC_LOW2 EQU 0BEH
;ADC low 2-bit result register
P1ASF
EQU 09DH
;P1 secondary function control register
U
C
M
Li
;/*Define ADC operation const for ADC_CONTR*/
ADC_POWER EQU 80H
;ADC power control bit
ADC_FLAG
EQU 10H
;ADC complete flag
ADC_START EQU 08H
;ADC start control bit
ADC_SPEEDLL EQU 00H
;540 clocks
ADC_SPEEDL EQU 20H
;360 clocks
ADC_SPEEDH EQU 40H
;180 clocks
ADC_SPEEDHH EQU 60H
;90 clocks
C
T
S
ADCCH
DATA 21H
;ADC channel NO.
;----------------------------------------ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TM0_ISR
ORG 002BH
LJMP ADC_ISR
;-----------------------------------------
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
251
STC15F204EA系列单片机指南
MAIN:
ORG
技术支持网站:www.STCMCU.com
MOV SP,
#7FH
MOV ADCCH, #0
LCALL INIT_UART
;Init UART, use to show ADC result
LCALL INIT_ADC
;Init ADC sfr
MOV TMOD, #00H
;timer0 in 16-bit auto reload mode
MOV AUXR, #80H
;timer0 working at 1T mode
MOV TL0,
#LOW BAUD
;initial timer0 and
MOV TH0,
#HIGH BAUD
;set reload value
SETB TR0
;tiemr0 start running
MOV IE,
#0A0H
;Enable ADC interrupt and Open master interrupt switch
SETB ET0
;enable timer0 interrupt
SETB PT0
;improve timer0 interrupt priority
SJMP $
C
T
S
U
C
M
ANL ADC_CONTR,
#NOT ADC_FLAG
MOV A,
ADCCH
LCALL SEND_DATA
MOV A,
ADC_RES
LCALL SEND_DATA
;//if you want show 10-bit result, uncomment next 2 lines
;
MOV A,
ADC_LOW2
;
LCALL SEND_DATA
252
研发顾问:13922809991
0100H
;/*---------------------------;ADC interrupt service routine
;----------------------------*/
ADC_ISR:
PUSH ACC
PUSH PSW
临时技术支持:13922829991
INC
MOV
ANL
MOV
ORL
MOV
POP
POP
RETI
.
d
e
t
i
m
Li
;Clear ADC interrupt flag
;Send channel NO.
;Get ADC high 8-bit result
;Send to UART
;Get ADC low 2-bit result
;Send to UART
ADCCH
A,
ADCCH
A,
#07H
ADCCH, A
A,
#ADC_POWER | ADC_SPEEDLL | ADC_START
ADC_CONTR,
A
;ADC power-on delay and re-start A/D conversion
PSW
ACC
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;/*---------------------------;Initial ADC sfr
;----------------------------*/
INIT_ADC:
MOV P1ASF, #0FFH
;Set all P1 as analog input port
MOV ADC_RES, #0
;Clear previous result
MOV A,
ADCCH
ORL A,
#ADC_POWER | ADC_SPEEDLL | ADC_START
MOV ADC_CONTR,
A
;ADC power-on delay and Start A/D conversion
MOV A,
#2
LCALL DELAY
RET
;/*---------------------------;Software delay function
;----------------------------*/
DELAY:
MOV R2,
A
CLR A
MOV R0,
A
MOV R1,
A
DELAY1:
DJNZ R0,
DELAY1
DJNZ R1,
DELAY1
DJNZ R2,
DELAY1
RET
;/*---------------------------;Initial UART
;----------------------------*/
INIT_UART:
CLR TING
CLR RING
SETB TEND
CLR REND
CLR A
MOV TCNT, A
MOV RCNT, A
RET
;/*---------------------------;Send one byte data to PC
;Input: ACC (UART data)
;Output:;----------------------------*/
SEND_DATA:
JNB TEND, $
CLR TEND
MOV TBUF, A
SETB TING
RET
C
T
S
南通国芯微电子有限公司
U
C
M
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
传真:0513-5501 2969 / 2956 / 2947
253
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;----------------------------------------;Timer0 interrupt routine for UART
TM0_ISR:
PUSH ACC
;4 save ACC
PUSH PSW
;4 save PSW
MOV PSW,
#08H
;3 using register group 1
L_UARTSTART:
;------------------
JB
RING, L_RING
;4 judge whether receiving
JB
RXB, L_REND
; check start signal
L_RSTART:
SETB RING
; set start receive flag
MOV R5,
#4
; initial receive baudrate counter
MOV R7,
#9
; initial receive bit number (8 data bits + 1 stop bit)
SJMP L_REND
; end this time slice
L_RING:
DJNZ R5,
L_REND
;4 judge whether sending
MOV R5,
#3
;2 reset send baudrate counter
L_RBIT:
MOV C,
RXB
;3 read RX port data
MOV A,
R3
;1 and shift it to RX buffer
RRC A
;1
MOV R3,
A
;2
DJNZ R7,
L_REND
;4 judge whether the data have receive completed
L_RSTOP:
RLC A
; shift out stop bit
MOV R1,
A
; save the data to RBUF
CLR RING
; stop receive
SETB REND
; set receive completed flag
L_REND:
;----------------L_TING:
DJNZ R4,
L_TEND
;4 check send baudrate counter
MOV R4,
#3
;2 reset it
JNB TING, L_TEND
;4 judge whether sending
MOV A,
R6
;1 detect the sent bits
JNZ L_TBIT
;3 "0" means start bit not sent
L_TSTART:
CLR TXB
; send start bit
MOV TDAT, R0
; load data from TBUF to TDAT
MOV R6,
#9
; initial send bit number (8 data bits + 1 stop bit)
JMP L_TEND
; end this time slice
L_TBIT:
MOV A,
R2
;1 read data in TDAT
SETB C
;1 shift in stop bit
RRC A
;1 shift data to CY
MOV R2,
A
;2 update TDAT
MOV TXB,
C
;4 write CY to TX port
DJNZ R6,
L_TEND
;4 judge whether the data have send completed
C
T
S
254
南通国芯微电子有限公司
U
C
M
.
d
e
t
i
m
Li
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
L_TSTOP:
CLR
SETB
L_TEND:
;------------------L_UARTEND:
POP
POP
RETI
TING
TEND
技术支持网站:www.STCMCU.com
PSW
ACC
临时技术支持:13922829991
; stop send
; set send completed flag
;3 restore PSW
;3 restore ACC
;4 (69)
研发顾问:13922809991
;----------------------------------------
END
C
T
S
南通国芯微电子有限公司
U
C
M
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
传真:0513-5501 2969 / 2956 / 2947
255
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
9.6.2 A/D转换测试程序(ADC查询方式)
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机 A/D转换功能------------------------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
.
d
e
t
i
m
/*使用了软件模拟串口输出*/
#include "reg51.h"
#include "intrins.h"
typedef bit BOOL;
typedef unsigned char BYTE;
typedef unsigned int WORD;
U
C
M
Li
//define baudrate const
//BAUD = 256 - SYSclk/3/BAUDRATE/M (1T:M=1; 12T:M=12)
//NOTE: (SYSclk/3/BAUDRATE) must be greater then 98, (RECOMMEND GREATER THEN 110)
C
T
S
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
0xF400
0xFA00
0xFD00
0xFE80
0xFF40
0xFFA0
// 1200bps @ 11.0592MHz
// 2400bps @ 11.0592MHz
// 4800bps @ 11.0592MHz
// 9600bps @ 11.0592MHz
//19200bps @ 11.0592MHz
//38400bps @ 11.0592MHz
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
#define BAUD
0xEC00
0xF600
0xFB00
0xFD80
0xFEC0
0xFF60
// 1200bps @ 18.432MHz
// 2400bps @ 18.432MHz
// 4800bps @ 18.432MHz
// 9600bps @ 18.432MHz
//19200bps @ 18.432MHz
//38400bps @ 18.432MHz
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
//#define BAUD
0xE800
0xF400
0xFA00
0xFD00
0xFE80
0xFF40
0xFF80
// 1200bps @ 22.1184MHz
// 2400bps @ 22.1184MHz
// 4800bps @ 22.1184MHz
// 9600bps @ 22.1184MHz
//19200bps @ 22.1184MHz
//38400bps @ 22.1184MHz
//57600bps @ 22.1184MHz
256
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
sfr AUXR = 0x8E;
sbit RXB = P3^0;
sbit TXB = P3^1;
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
//define UART TX/RX port
/*Declare SFR associated with the ADC */
sfr ADC_CONTR = 0xBC;
//ADC control register
sfr ADC_RES = 0xBD;
//ADC high 8-bit result register
sfr ADC_LOW2 = 0xBE;
//ADC low 2-bit result register
sfr P1ASF
= 0x9D;
//P1 secondary function control register
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80
//ADC power control bit
#define ADC_FLAG 0x10
//ADC complete flag
#define ADC_START 0x08
//ADC start control bit
#define ADC_SPEEDLL 0x00
//540 clocks
#define ADC_SPEEDL 0x20
//360 clocks
#define ADC_SPEEDH 0x40
//180 clocks
#define ADC_SPEEDHH 0x60
//90 clocks
BYTE TBUF,RBUF;
BYTE TDAT,RDAT;
BYTE TCNT,RCNT;
BYTE TBIT,RBIT;
BOOL TING,RING;
BOOL TEND,REND;
C
T
S
void InitUart();
void InitADC();
void SendData(BYTE dat);
BYTE GetADCResult(BYTE ch);
void Delay(WORD n);
void ShowResult(BYTE ch);
void main()
{
TMOD = 0x00;
AUXR = 0x80;
TL0 = BAUD;
TH0 = BAUD>>8;
TR0 = 1;
ET0 = 1;
PT0 = 1;
EA = 1;
InitUart();
InitADC();
南通国芯微电子有限公司
U
C
M
.
d
e
t
i
m
Li
//timer0 in 16-bit auto reload mode
//timer0 working at 1T mode
//initial timer0 and set reload value
//tiemr0 start running
//enable timer0 interrupt
//improve timer0 interrupt priority
//open global interrupt switch
//Init UART, use to show ADC result
//Init ADC sfr
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
257
STC15F204EA系列单片机指南
}
while (1)
{
}
技术支持网站:www.STCMCU.com
ShowResult(0);
ShowResult(1);
ShowResult(2);
ShowResult(3);
ShowResult(4);
ShowResult(5);
ShowResult(6);
ShowResult(7);
临时技术支持:13922829991
研发顾问:13922809991
//Show Channel0
//Show Channel1
//Show Channel2
//Show Channel3
//Show Channel4
//Show Channel5
//Show Channel6
//Show Channel7
/*---------------------------Send ADC result to UART
----------------------------*/
void ShowResult(BYTE ch)
{
SendData(ch);
SendData(GetADCResult(ch));
.
d
e
t
i
m
//Show Channel NO.
//Show ADC high 8-bit result
//if you want show 10-bit result, uncomment next line
//
SendData(ADC_LOW2);
//Show ADC low 2-bit result
}
U
C
M
Li
/*---------------------------Get ADC result
----------------------------*/
BYTE GetADCResult(BYTE ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_();
//Must wait before inquiry
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG)); //Wait complete flag
ADC_CONTR &= ~ADC_FLAG;
//Close ADC
C
T
S
}
return ADC_RES;
/*---------------------------Initial ADC sfr
----------------------------*/
void InitADC()
{
P1ASF = 0xff;
ADC_RES = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2);
}
258
南通国芯微电子有限公司
//Return ADC result
//Open 8 channels ADC function
//Clear previous result
//ADC power-on and delay
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
/*---------------------------Software delay function
----------------------------*/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
//----------------------------------------//Timer interrupt routine for UART
.
d
e
t
i
m
Li
void tm0() interrupt 1 using 1
{
if (RING)
{
if (--RCNT == 0)
{
RCNT = 3;
//reset send baudrate counter
if (--RBIT == 0)
{
RBUF = RDAT;
//save the data to RBUF
RING = 0;
//stop receive
REND = 1;
//set receive completed flag
}
else
{
RDAT >>= 1;
if (RXB) RDAT |= 0x80; //shift RX data to RX buffer
}
}
}
else if (!RXB)
{
RING = 1;
//set start receive flag
RCNT = 4;
//initial receive baudrate counter
RBIT = 9;
//initial receive bit number (8 data bits + 1 stop bit)
}
C
T
S
南通国芯微电子有限公司
U
C
M
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
259
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
if (--TCNT == 0)
{
TCNT = 3;
//reset send baudrate counter
if (TING)
//judge whether sending
{
if (TBIT == 0)
{
TXB = 0;
//send start bit
TDAT = TBUF;
//load data from TBUF to TDAT
TBIT = 9;
//initial send bit number (8 data bits + 1 stop bit)
}
else
{
TDAT >>= 1;
//shift data to CY
if (--TBIT == 0)
{
TXB = 1;
TING = 0;
//stop send
TEND = 1;
//set send completed flag
}
else
{
TXB = CY;
//write CY to TX port
}
}
}
}
C
T
S
U
C
M
.
d
e
t
i
m
Li
}
//----------------------------------------//initial UART module variable
void InitUart()
{
TING = 0;
RING = 0;
TEND = 1;
REND = 0;
TCNT = 0;
RCNT = 0;
}
//----------------------------------------//initial UART module variable
void SendData(BYTE dat)
{
while (!TEND);
TEND = 0;
TBUF = dat;
TING = 1;
}
260
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机 A/D转换功能------------------------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
;使用了软件模拟串口输出
.
d
e
t
i
m
;define baudrate const
;BAUD = 65536 - SYSclk/3/BAUDRATE/M (1T:M=1; 12T:M=12)
;NOTE: (SYSclk/3/BAUDRATE) must be greater then 75, (RECOMMEND GREATER THEN 100)
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
;BAUD
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
0F400H
0FA00H
0FD00H
0FE80H
0FF40H
0FFA0H
0FFC0H
0EC00H
0F600H
0FB00H
0FD80H
0FEC0H
0FF60H
0FF95H
0E800H
0F400H
0FA00H
0FD00H
0FE80H
0FF40H
0FF80H
C
T
S
; 1200bps @ 11.0592MHz
; 2400bps @ 11.0592MHz
; 4800bps @ 11.0592MHz
; 9600bps @ 11.0592MHz
;19200bps @ 11.0592MHz
;38400bps @ 11.0592MHz
;57600bps @ 11.0592MHz
; 1200bps @ 18.432MHz
; 2400bps @ 18.432MHz
; 4800bps @ 18.432MHz
; 9600bps @ 18.432MHz
;19200bps @ 18.432MHz
;38400bps @ 18.432MHz
;57600bps @ 18.432MHz
; 1200bps @ 22.1184MHz
; 2400bps @ 22.1184MHz
; 4800bps @ 22.1184MHz
; 9600bps @ 22.1184MHz
;19200bps @ 22.1184MHz
;38400bps @ 22.1184MHz
;57600bps @ 22.1184MHz
U
C
M
Li
;define UART TX/RX port
RXB
BIT P3.0
TXB
BIT P3.1
;define SFR
AUXR
DATA 8EH
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
261
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;define UART module variable
TBUF DATA 08H
;(R0) ready send data buffer (USER WRITE ONLY)
RBUF DATA 09H
;(R1) received data buffer (UAER READ ONLY)
TDAT DATA 0AH
;(R2) sending data buffer
(RESERVED FOR UART MODULE)
RDAT DATA 0BH
;(R3) receiving data buffer (RESERVED FOR UART MODULE)
TCNT DATA 0CH
;(R4) send baudrate counter (RESERVED FOR UART MODULE)
RCNT DATA 0DH
;(R5) receive baudrate counter (RESERVED FOR UART MODULE)
TBIT DATA 0EH
;(R6) send bit counter
(RESERVED FOR UART MODULE)
RBIT DATA 0FH
;(R7) receive bit counter
(RESERVED FOR UART MODULE)
TING BIT
RING BIT
TEND BIT
REND BIT
20H.0
20H.1
20H.2
20H.3
;sending flag(USER WRITE"1"TO TRIGGER SEND DATA,CLEAR BY MODULE)
; receiving flag (RESERVED FOR UART MODULE)
; sent flag
(SET BY MODULE AND SHOULD USER CLEAR)
; received flag (SET BY MODULE AND SHOULD USER CLEAR)
;/*Declare SFR associated with the ADC */
ADC_CONTR EQU 0BCH
ADC_RES
EQU 0BDH
ADC_LOW2 EQU 0BEH
P1ASF
EQU 09DH
.
d
e
t
i
m
;ADC control register
;ADC high 8-bit result register
;ADC low 2-bit result register
;P1 secondary function control register
U
C
M
Li
;/*Define ADC operation const for ADC_CONTR*/
ADC_POWER EQU 80H
;ADC power control bit
ADC_FLAG
EQU 10H
;ADC complete flag
ADC_START EQU 08H
;ADC start control bit
ADC_SPEEDLL EQU 00H
;540 clocks
ADC_SPEEDL EQU 20H
;360 clocks
ADC_SPEEDH EQU 40H
;180 clocks
ADC_SPEEDHH EQU 60H
;90 clocks
;----------------------------------------
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TM0_ISR
;----------------------------------------MAIN:
MOV SP,
#7FH
MOV TMOD, #00H
;timer0 in 16-bit auto reload mode
MOV AUXR, #80H
;timer0 working at 1T mode
MOV TL0,
#LOW BAUD
;initial timer0 and
MOV TH0,
#HIGH BAUD
;set reload value
SETB TR0
;tiemr0 start running
SETB ET0
;enable timer0 interrupt
SETB PT0
;improve timer0 interrupt priority
SETB EA
;open global interrupt switch
C
T
S
262
LCALL INIT_UART
LCALL INIT_ADC
南通国芯微电子有限公司
;Init UART, use to show ADC result
;Init ADC sfr
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
;------------------------------
MOV A,
#55H
LCALL SEND_DATA
MOV A,
#66H
LCALL SEND_DATA
NEXT:
MOV A,
#0
LCALL SHOW_RESULT
MOV A,
#1
LCALL SHOW_RESULT
MOV A,
#2
LCALL SHOW_RESULT
MOV A,
#3
LCALL SHOW_RESULT
MOV A,
#4
LCALL SHOW_RESULT
MOV A,
#5
LCALL SHOW_RESULT
MOV A,
#6
LCALL SHOW_RESULT
MOV A,
#7
LCALL SHOW_RESULT
C
T
S
SJMP NEXT
;/*---------------------------;Send ADC result to UART
;Input: ACC (ADC channel NO.)
;Output:;----------------------------*/
SHOW_RESULT:
LCALL SEND_DATA
LCALL GET_ADC_RESULT
LCALL SEND_DATA
临时技术支持:13922829991
研发顾问:13922809991
;Show result
;Show result
;Show channel0 result
;Show channel1 result
;Show channel2 result
.
d
e
t
i
m
;Show channel3 result
;Show channel4 result
;Show channel5 result
U
C
M
;Show channel6 result
Li
;Show channel7 result
;Show Channel NO.
;Get high 8-bit ADC result
;Show result
;//if you want show 10-bit result, uncomment next 2 lines
;
MOV A,
ADC_LOW2
;Get low 2-bit ADC result
;
LCALL SEND_DATA
;Show result
RET
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
263
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;/*---------------------------;Read ADC conversion result
;Input: ACC (ADC channel NO.)
;Output:ACC (ADC result)
;----------------------------*/
GET_ADC_RESULT:
ORL A,
#ADC_POWER | ADC_SPEEDLL | ADC_START
MOV ADC_CONTR,
A
;Start A/D conversion
NOP
;Must wait before inquiry
NOP
NOP
NOP
WAIT:
MOV A,
ADC_CONTR
;Wait complete flag
JNB ACC.4, WAIT
;ADC_FLAG(ADC_CONTR.4)
ANL ADC_CONTR,
#NOT ADC_FLAG
;Clear ADC_FLAG
MOV A,
ADC_RES
;Return ADC result
RET
U
C
M
.
d
e
t
i
m
Li
;/*---------------------------;Initial ADC sfr
;----------------------------*/
INIT_ADC:
MOV P1ASF, #0FFH
;Open 8 channels ADC function
MOV ADC_RES, #0
;Clear previous result
MOV ADC_CONTR,
#ADC_POWER | ADC_SPEEDLL
MOV A,
#2
;ADC power-on and delay
LCALL DELAY
RET
C
T
S
;/*---------------------------;Initial UART
;----------------------------*/
INIT_UART:
CLR TING
CLR RING
SETB TEND
CLR REND
CLR A
MOV TCNT, A
MOV RCNT, A
RET
264
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;/*---------------------------;Send one byte data to PC
;Input: ACC (UART data)
;Output:;----------------------------*/
SEND_DATA:
JNB TEND, $
CLR TEND
MOV TBUF, A
SETB TING
RET
;/*---------------------------;Software delay function
;----------------------------*/
DELAY:
MOV R2,
A
CLR A
MOV R0,
A
MOV R1,
A
DELAY1:
DJNZ R0,
DELAY1
DJNZ R1,
DELAY1
DJNZ R2,
DELAY1
RET
;----------------------------------------;Timer0 interrupt routine for UART
U
C
M
C
T
S
TM0_ISR:
PUSH
PUSH
MOV
L_UARTSTART:
;------------------
JB
JB
L_RSTART:
SETB
MOV
MOV
SJMP
L_RING:
DJNZ
MOV
ACC
PSW
PSW,
RING,
RXB,
#08H
R5,
R5,
南通国芯微电子有限公司
;4 judge whether receiving
;check start signal
L_REND
#3
Li
;4 save ACC
;4 save PSW
;3 using register group 1
L_RING
L_REND
RING
R5,
#4
R7,
#9
L_REND
.
d
e
t
i
m
;
;
;
;
set start receive flag
initial receive baudrate counter
initial receive bit number (8 data bits + 1 stop bit)
end this time slice
;4 judge whether sending
;2 reset send baudrate counter
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
265
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
L_RBIT:
MOV C,
RXB
;3 read RX port data
MOV A,
R3
;1 and shift it to RX buffer
RRC A
;1
MOV R3,
A
;2
DJNZ R7,
L_REND
;4 judge whether the data have receive completed
L_RSTOP:
RLC A
; shift out stop bit
MOV R1,
A
; save the data to RBUF
CLR RING
; stop receive
SETB REND
; set receive completed flag
L_REND:
;----------------L_TING:
DJNZ R4,
L_TEND
;4 check send baudrate counter
MOV R4,
#3
;2 reset it
JNB TING, L_TEND
;4 judge whether sending
MOV A,
R6
;1 detect the sent bits
JNZ L_TBIT
;3 "0" means start bit not sent
L_TSTART:
CLR TXB
; send start bit
MOV TDAT, R0
; load data from TBUF to TDAT
MOV R6,
#9
; initial send bit number (8 data bits + 1 stop bit)
JMP L_TEND
; end this time slice
L_TBIT:
MOV A,
R2
;1 read data in TDAT
SETB C
;1 shift in stop bit
RRC A
;1 shift data to CY
MOV R2,
A
;2 update TDAT
MOV TXB,
C
;4 write CY to TX port
DJNZ R6,
L_TEND
;4 judge whether the data have send completed
L_TSTOP:
CLR TING
; stop send
SETB TEND
; set send completed flag
L_TEND:
;------------------L_UARTEND:
POP PSW
;3 restore PSW
POP ACC
;3 restore ACC
RETI
;4 (69)
C
T
S
U
C
M
.
d
e
t
i
m
Li
;----------------------------------------
266
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
第10章 STC15F204EA系列单片机EEPROM的应用
STC15F204EA系列单片机内部集成了1KB/2KB的EEPROM,其与程序空间是分开的。地址
范围是0000H~03FFH(1KB)/0000H~07FFH(2KB)。1KB的EEPROM分为2个扇区,2KB的EEPROM分为
4个扇区,每个扇区包含512字节。使用时,建议同一次修改的数据放在同一个扇区,不是同一
次修改的数据放在不同的扇区,不一定要用满。数据存储器的擦除操作是按扇区进行的。
EEPROM的擦写次数在10万次以上,可用于保存一些需要在应用过程中修改并且掉电不丢失
的参数数据。在用户程序中,可以对EEPROM进行字节读/字节编程/扇区擦除操作。
在工作电压Vcc偏低时,建议不要进行EEPROM/IAP操作。
10.1 IAP及EEPROM新增特殊功能寄存器介绍
符号
IAP_DATA
IAP_ADDRH
IAP_ADDRL
IAP_CMD
IAP_TRIG
IAP_CONTR
PCON
描述
地址
ISP/IAP Flash Data
Register
ISP/IAP Flash Address High
ISP/IAP Flash Address Low
ISP/IAP Flash Command Register
ISP/IAP Flash Command Trigger
ISP/IAP Control
Register
Power Control
南通国芯微电子有限公司
C
T
S
C4H
C5H
Li
MSB
C2H
C3H
.
d
e
t
i
m
位地址及符号
CU
M
-
-
-
LSB
87H
1111 1111B
0000 0000B
0000 0000B
-
-
-
MS1
MS0
C6H
C7H
复位值
xxxx x000B
xxxx xxxxB
IAPEN SWBS SWRST CMD_FAIL
-
-
LVDF
总机:0513-5501 2928 / 2929 / 2966
-
GF1
-
WT2 WT1
GF0
PD
WT0
0000 x000B
IDL
xx1x 0000B
传真:0513-5501 2969 / 2956 / 2947
267
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1. ISP/IAP数据寄存器IAP_DATA
IAP_DATA : ISP/IAP 操作时的数据寄存器。
ISP/IAP 从Flash 读出的数据放在此处,向Flash 写的数据也需放在此处
2. ISP/IAP地址寄存器IAP_ADDRH和IAP_ADDRL
IAP_ADDRH : ISP/IAP 操作时的地址寄存器高八位。
IAP_ADDRL : ISP/IAP 操作时的地址寄存器低八位。
3. ISP/IAP命令寄存器IAP_CMD
ISP/IAP命令寄存器IAP_CMD格式如下:
SFR name
Address
bit
B7
B6
B5
B4
B3
IAP_CMD
C5H
name
-
-
-
-
-
B2
B1
.
d
e
t
i
m
-
MS1
MS1
MS0
0
0
Standby 待机模式,无ISP操作
0
1
从用户的应用程序区对"Data Flash/EEPROM区"进行字节读
1
0
从用户的应用程序区对"Data Flash/EEPROM区"进行字节编程
1
1
从用户的应用程序区对"Data Flash/EEPROM区"进行扇区擦除
命令 / 操作 模式选择
U
C
M
B0
MS0
Li
程序在用户应用程序区时,仅可以对数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除
,IAP15F205A/IAP15L205A除外,IAP15F205A/IAP15L205A可在��������������
用户������������
应用程序区修改�����
用户���
应用程
序区。
特别声明:EEPROM也可以用MOVC指令读(MOVC访问的是程序存储器),但起始地址不再是0000H,
而是程序存储空间结束地址的下一个地址。
C
T
S
4. ISP/IAP命令触发寄存器IAP_TRIG
IAP_TRIG: ISP/IAP操作时的命令触发寄存器。
在IAPEN(IAP_CONTR.7) = 1 时,对IAP_TRIG先写入5Ah,再写入A5h,ISP/IAP命令才会生效。
ISP/IAP���������������������������������������������������
操作完成后,IAP地址高八位寄存器IAP_ADDRH、IAP地址低八位寄存器IAP_ADDRL和IAP
命令寄存器IAP_CMD的内容不变。如果接下来要对下一个地址的数据进行ISP/IAP操作,需手动
将该地址的高8位和低8位分别写入IAP_ADDRH和IAP_ADDRL寄存器。
每次IAP操作时,都要对IAP_TRIG先写入5AH,再写入A5H,ISP/IAP命令才会生效。
现有A版本在每次触发前,需重新送字节读/字节编程/扇区擦除命令,以后的B版本在命令
不需改变时,不需重新送命令
268
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
5. ISP/IAP命令寄存器IAP_CONTR
ISP/IAP控制寄存器IAP_CONTR格式如下:
SFR name
Address
IAP_CONTR
C7H
bit
B7
B6
B5
B4
name IAPEN SWBS SWRST CMD_FAIL
B3
B2
B1
B0
-
WT2
WT2
WT0
IAPEN: ISP/IAP功能允许位。0:禁止IAP读/写���
/��
擦除Data Flash/EEPROM
1: 允许IAP读/写���
/��
擦除Data Flash/EEPROM
SWBS: 软件选择从用户应用程序区启动(送0),还是从������������
系统����������
ISP�������
监控�����
程序区启动(送1)。
要与SWRST直接配合才可以实现
SWRST: 0: 不操作; 1: 产生软件系统复位,硬件自动���
复位�
。
CMD_FAIL: 如果送了ISP/IAP命令,并对IAP_TRIG送5Ah/A5h触发失败,则为1,需由软件清零�.
;在用户应用程序区(AP 区)软件复位并从用户应用程序区(AP 区)开始执行程序
MOV IAP_CONTR, #00100000B ;SWBS = 0(选择AP 区), SWRST = 1(软复位)
;在用户应用程序区(AP 区)软件复位并从系统ISP 监控程序区开始执行程序
MOV IAP_CONTR, #01100000B ;SWBS = 1(选择ISP 区), SWRST = 1(软复位)
;在系统ISP 监控程序区软件复位并从用户应用程序区(AP 区)开始执行程序
MOV IAP_CONTR, #00100000B ;SWBS = 0(选择AP 区), SWRST = 1(软复位)
;在系统ISP 监控程序区软件复位并从系统ISP 监控程序区开始执行程序
MOV IAP_CONTR, #01100000B ;SWBS = 1(选择ISP 区), SWRST = 1(软复位)
C
T
S
U
C
M
设置等待时间 CPU等待时间(多少个CPU工作时钟 )
Sector Erase
Read/读
Program/编程
WT2 WT1 WT0
扇区擦除
(2个时钟)
(=55us)
(=21us)
1 1 1 2个时钟
55个时钟
21012个时钟
1 1 0 2个时钟
110个时钟
42024个时钟
1 0 1 2个时钟
165个时钟
63036个时钟
1 0 0 2个时钟
330个时钟
126072个时钟
0 1 1 2个时钟
660个时钟
252144个时钟
0 1 0 2个时钟
1100个时钟
420240个时钟
0 0 1 2个时钟
1320个时钟
504288个时钟
0 0 0 2个时钟
1760个时钟
672384个时钟
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
Recommended System Clock
跟等待参数对应的推荐系统时钟
≤ 1MHz
≤ 2MHz
≤ 3MHz
≤ 6MHz
≤ 12MHz
≤ 20MHz
≤ 24MHz
≤ 30MHz
传真:0513-5501 2969 / 2956 / 2947
269
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6. 工作电压过低判断,此时不要进行EEPROM/IAP操作
PCON : 电源控制寄存器
SFR name Address
PCON
87H
bit
B7
B6
B5
B4
B3
B2
B1
B0
name
-
-
LVDF
-
GF1
GF0
PD
IDL
LVDF: 低压检测标志位,当工作电压Vcc低于低压检测门槛电压时,该位置1。该位要由软件清0
当低压检测电路发现工作电压Vcc偏低时,不要进行EEPROM/IAP操作。
5V单片机的低压检测门槛电压:
-40 0C
25 0C
85 0C
4.74
4.64
4.60
4.41
4.32
4.27
4.14
4.05
4.00
3.90
3.82
3.77
3.69
3.61
3.56
3.51
3.43
3.38
3.36
3.28
3.23
3.21
3.14
3.09
U
C
M
3.3V单片机的低压检测门槛电压:
-40 0C
3.11
2.85
2.63
2.44
2.29
2.14
2.01
1.90
C
T
S
270
南通国芯微电子有限公司
25 0C
3.08
2.82
2.61
2.42
2.26
2.12
2.00
1.89
.
d
e
t
i
m
Li
85 0C
3.09
2.83
2.61
2.43
2.26
2.12
2.00
1.89
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
10.2 STC15F204EA系列单片机EEPROM空间大小及地址
STC15F204EA系列单片机内部EEPROM选型一览表
STC15L204EA系列单片机内部EEPROM选型一览表
型号
用IAP字 用IAP字
扇 节读时
节读时
EEPROM
区 EEPROM EEPROM
字节数
数 起始扇区 结束扇区
首地址 末尾地址
用MOVC
指令读时
EEPROM
起始扇区
首地址
用MOVC
指令读时
EEPROM
结束扇区
末尾地址
0BFFh
STC15F201EA/
STC15L201EA
2K
4
0000h
07FFh
0400h
STC15F202EA/
STC15L202EA
2K
4
0000h
07FFh
0800h
0FFFh
STC15F203EA/
STC15L203EA
2K
4
0000h
07FFh
0C00h
13FFh
STC15F204EA/
STC15L204EA
1K
2
0000h
03FFh
1000h
13FFh
U
C
M
STC15F204EA
系列单片机内
部EEPROM还
可以用MOVC
指令读,但此
时首地址不再
是0000H,而
是程序存储空
间结束地址的
下一个地址
.
d
e
t
i
m
Li
以下系列特殊,可在用户程序区直接修改程序,所有Flash空间均可作EEPROM修改
IAP15F205A/
IAP15L205A
第一扇区
-
10
C
T
S
0000h
第二扇区
13FFh
第三扇区
第四扇区
每个扇区512
字节,共4个
起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址
扇区。
0000h
01FFh
0200h
03FFh
0400h
05FFh
0600h
07FFh 建 议 同 一 次
修改的数据
第五扇区
第六扇区
第七扇区
第八扇区
放在同一个
起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 扇区,不是同
一次修改的
0800h
09FFh
0A00h
0BFFh
0C00h
0DFFh
0E00h
0FFFh
数据放在不
第九扇区
第十扇区
同的扇区,
不必用满,
起始地址 结束地址 起始地址 结束地址
当然可全用
1000h
11FFh
1200h
13FFh
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
271
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
10.3 IAP及EEPROM汇编简介
;用DATA还是EQU声明新增特殊功能寄存器地址要看你用的汇编器/编译器
IAP_DATA
DATA
0C2h;
IAP_DATA
EQU
0C2h
IAP_ADDRH
DATA
0C3h; 或
IAP_ADDRH
EQU
0C3h
IAP_ADDRL
DATA
0C4h; 或
IAP_ADDRL
EQU
0C4h
IAP_CMD
DATA
0C5h; 或
IAP_CMD
EQU
0C5h
IAP_TRIG
DATA
0C6h; 或
IAP_TRIG
EQU
0C6h
IAP_CONTR
DATA
0C7h; 或
IAP_CONTR
EQU
0C7h
或
.
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,
U
C
M
EQU
Li
;20MHz以下2,12M以下3,6M以下4,3M以下5,2M以下6,1M以下7,
C
T
S
;字节读,����������������������������
也可以用MOVC指令读,但起始地址不再是0000H,而是程序存储空间结束地址的下一个地址
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
;送字节读命令,�����������������
�������������������������
现有A版本每次触发前需重新送命令。
;以后的B版本在���������������
命令不需改变时,不需重新送命令
地址需要改变时
才需重新送地址
此两句可以合成一句,
并且只送一次就够了
MOV
IAP_TRIG,
#5Ah ;先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此
MOV
IAP_TRIG,
#0A5h ;送完A5h后,ISP/IAP命令立即被触发起动
;CPU等待IAP动作完成后,才会继续执行程序。
NOP
A,
ISP_DATA
272
MOV
南通国芯微电子有限公司
;数据读出到IAP_DATA寄存器后,CPU继续执行程序
;将读出的数据送往Acc
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站: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
;送地址高字节单元为FFH,指向非EEPROM区
;MOV
IAP_ADDRL,
#0FFh
;送地址低字节单元为FFH,防止误操作
;字节编程,该字节为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
;允许ISP/IAP操作
MOV
IAP_CMD,
#ISP_IAP_BYTE_PROGRAM
;送字节编程命令,现有A版本每次触发前需重新送命令。
;以后的B版本在���������������
命令不需改变时,不需重新送命令
C
T
S
U
C
M
.
d
e
t
i
m
Li
地址需要改变时
才需重新送地址
此两句可合成
一句,并且只
送一次就够了
MOV
IAP_TRIG,
#5Ah
;先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此
MOV
IAP_TRIG,
#0A5h ;送完A5h后,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 ;送地址高字节单元为FFH,;指向非EEPROM区,防止误操作
;MOV
IAP_ADDRL,
#0FFh ;送地址低字节单元为FFH,指向非EEPROM区,防止误操作
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
273
STC15F204EA系列单片机指南
技术支持网站: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
;送扇区擦除命令,�����������������
现有A版本每次触发前需重新送命令。
;以后的B版本在���������������
命令不需改变时,不需重新送命令
MOV
IAP_TRIG,
MOV
C
T
S
IAP_TRIG,
U
C
M
.
d
e
t
i
m
Li
此两句可以合
成一句,并且只
送一次就够了
#5Ah
;先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此
#0A5h ;送完A5h后,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
;送地址高字节单元为FFH,指向非EEPROM区
;MOV
IAP_ADDRL,
#0FFh
;送地址低字节单元为FFH,防止误操作
274
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC15F204EA系列单片机指南
技术支持网站: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要
快很多,读一个字节/编程一个字节大概是2���������
个时钟������
/55uS。
U
C
M
3.如果在一个扇区中存放了大量的数据,某次只需要修改其中的一个字节或一部分字节时,则
另外的不需要修改的数据须先读出放在STC单片机的RAM中,然后擦除整个扇区,再将需要保留
的数据和需修改的数据��������������������������������
按字节逐字节��������������������������
写回该扇区中(�������������������
只有字节写命令,无连续字节写命令���
)。这
时每个扇区使用的字节数是使用的越少越方便(不需读出一大堆需保留数据)。
C
T
S
常问的问题:
1:IAP指令完成后,地址是否会自动“加1”或“减1”?
答:不会
2:送5A和A5触发后,下一次IAP命令是否还需要送5A和A5触发?
答:是,一定要。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
275
STC15F204EA系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
10.4 EEPROM测试程序(不使用模拟串口)
1. C程序:
;STC15F204EA系列单片机EEPROM/IAP 功能测试程序演示
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 15 系列单片机 EEPROM/IAP功能--------------------------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- 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 = 0xC2;
//Flash data register
sfr IAP_ADDRH = 0xC3;
//Flash address HIGH
sfr IAP_ADDRL = 0xC4;
//Flash address LOW
sfr IAP_CMD = 0xC5;
//Flash command register
sfr IAP_TRIG = 0xC6;
//Flash command trigger
sfr IAP_CONTR = 0xC7;
//Flash control register
C
T
S
/*Define ISP/IAP/EEPROM command*/
#define CMD_IDLE
0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3
.
d
e
t
i
m
Li
//Stand-By
//Byte-Read
//Byte-Program
//Sector-Erase
/*Define ISP/IAP/EEPROM operation const for IAP_CONTR*/
//#define ENABLE_IAP 0x80
//if SYSCLK