STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
STC12C5A60S2系列单片机器件手册
---1个时钟/机器周期8051
---����
超强加�
密
---高速,高可靠
---低功耗,超低价
---强抗静电,强抗干扰
STC12C5A08S2,
STC12C5A16S2,
STC12C5A20S2,
STC12C5A32S2,
STC12C5A40S2,
STC12C5A48S2,
STC12C5A52S2,
STC12C5A56S2,
STC12C5A60S2,
STC12C5A62S2,
C
T
S
U
C
M
STC12C5A08AD
STC12C5A16AD
STC12C5A20AD
STC12C5A32AD
STC12C5A40AD
STC12C5A48AD
STC12C5A52AD
STC12C5A56AD
STC12C5A60AD
STC12C5A62AD
.
d
e
t
i
m
Li
全部中国本土独立自主知识产权,请全体中国人民支持,您的
支持是中国本土�����������
力量前进的������
有力保证.
STC-ISP:最方便的在线升级软件
技术支持���
网站: www.STCMCU.com
Update date: 2011/10/30
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
目录
第1章 STC12C5A60S2系列单片机总体介绍................... 8
1.1 STC12C5A60S2系列单片机简介................................ 8
1.2 STC12C5A60S2系列单片机的内部结构......................... 10
1.3 STC12C5A60S2系列单片机管脚图............................. 11
1.4 STC12C5A60S2系列单片机选型一览表......................... 13
1.5 STC12C5A60S2系列单片机最小应用系统....................... 15
1.6 STC12C5A60S2系列在系统可编程(ISP)典型应用线路图.......... 17
1.7 STC12C5A60S2系列管脚说明................................. 19
1.8 STC12C5A60S2系列单片机封装尺寸图......................... 22
1.9 STC12C5A60S2系列单片机命名规则........................... 27
1.10 每个单片机具有全球唯一身份证号码(ID号)................... 28
1.11 如何从传统8051单片机过渡到STC12C5A60S2系列单片机........ 31
第2章 时钟,省电模式及复位............................. 35
2.1 STC12C5A60S2系列单片机的时钟............................. 35
2.1.1
2.1.2
2.1.3
2.1.4
STC12C5A60S2系列单片机内部/外部工作时钟可选..................................... 35
时钟分频及分频寄存器................................................................................. 36
如何知道单片机内部R/C振荡频率(内部时钟频率)....................................... 37
可编程时钟输出............................................................................................ 40
2.2 STC12C5A60S2系列单片机的省电模式......................... 45
2.2.1 低速模式....................................................................................................... 47
2.2.2 空闲模式....................................................................................................... 48
2.2.3 掉电模式/停机模式....................................................................................... 48
2.3 复位...................................................... 54
2.3.1 外部RST引脚复位(第一复位功能脚)............................................................ 54
2.3.2 外部低压检测复位(高可靠复位,新增第二复位功能脚RST2复位). ............. 54
2.3.3 外部低压检测若不作第二复位功能时,可作外部低压检测中断. .................. 56
2.3.4 软件复位....................................................................................................... 60
2.3.5 上电复位/掉电复位....................................................................................... 60
2.3.6 MAX810专用复位电路.................................................................................. 61
2.3.7 看门狗(WDT)复位.......................................................................................... 61
2.3.8 冷启动复位和热启动复位.............................................................................. 65
第3章 片内存储器和特殊功能寄存器(SFRs).................................... 66
3.1 程序存储器................................................ 66
3.2 数据存储器(SRAM)...................................................................................67
3.2.1 内部RAM...................................................................................................... 67
3.2.2 内部扩展RAM............................................................................................... 69
3.2.3 外部扩展的64KB数据存储器(片外RAM). .................................................... 77
3.3 特殊功能寄存器(SFRs)..............................................................................80
第4章 STC12C5A60S2系列单片机的I/O口结构............... 87
4.1 I/O口各种不同的工作模式及配置介绍.......................... 87
4.2 STC12C5A60S2系列单片机P4/P5口的使用...................... 92
4.3 I/O口各种不同的工作模式结构框图............................ 94
4.3.1
4.3.2
4.3.3
4.3.4
准双向口输出配置..................................................................................................94
强推挽输出配置......................................................................................................95
仅为输入(高阻)配置..........................................................................................95
开漏输出配置(若外加上拉电阻,也可读).................................................... 95
4.4 一种典型三极管控制电路.................................... 97
4.5 典型发光二极管控制电路.................................... 97
4.6 混合电压供电系统3V/5V器件I/O口互连........................ 97
4.7 如何让I/O口上电复位时为低电平.............................. 98
4.8 PWM输出时I/O口的状态..................................... 99
4.9 I/O口直接驱动LED数码管应用线路图......................... 100
4.10 I/O口直接驱动LCD应用线路图.............................. 101
4.11 A/D做按键扫描应用线路图................................. 102
第5章 指令系统........................................ 103
5.1 寻址方式................................................. 103
5.1.1
5.1.2
5.1.3
5.1.4
5.1.5
5.1.6
5.1.7
立即寻址..................................................................................................... 103
直接寻址..................................................................................................... 103
间接寻址..................................................................................................... 103
寄存器寻址. ................................................................................................ 104
相对寻址..................................................................................................... 104
变址寻址..................................................................................................... 104
位寻址......................................................................................................... 104
5.2 指令系统分类总结......................................... 105
5.3 传统8051单片机指令定义详解(中文&English).................. 110
5.3.1 传统8051单片机指令定义详解. ................................................................... 110
5.3.2 Instruction Definitions of Traditional 8051 MCU. ........................................... 150
第6章 中断系统........................................ 187
6.1
6.2
6.3
6.4
6.5
6.6
中断结构................................................. 189
中断寄存器............................................... 191
中断优先级............................................... 199
中断处理................................................. 200
外部中断................................................. 201
中断测试程序(C程序及汇编程序)............................ 202
6.6.1 外部中断0(INT0)的测试程序(C程序及汇编程序)....................................... 202
6.6.2 外部中断1(INT1)的测试程序(C程序及汇编程序)....................................... 206
6.6.3 P3.4/T0/INT下降沿中断(可用于唤醒掉电模式)的测试程序........................ 210
6.6.4 P3.5/T1/INT下降沿中断(可用于唤醒掉电模式)的测试程序........................ 212
6.6.5 P3.0/RxD/INT下降沿中断(可用于唤醒掉电模式)的测试程序. .................... 214
—— C程序及汇编程序............................................................................... 214
6.6.6 低压检测LVD中断(可用于唤醒掉电模式)的测试程序................................ 217
6.6.7 PCA模块中断(可用于唤醒掉电模式)的测试程序. ...................................... 220
第7章 定时器/计数器................................... 224
7.1 定时器/计数器的相关寄存器................................ 224
7.2 定时器/计数器0工作模式(与传统8051单片机兼容)............. 229
7.2.1
7.2.2
7.2.3
7.2.4
模式0(13位定时器/计数器)......................................................................... 229
模式1(16位定时器/计数器)及测试程序...................................................... 230
模式2(8位自动重装模式)............................................................................. 234
模式3(两个8位计数器). ............................................................................... 237
7.3 定时器/计数器1工作模式(与传统8051单片机兼容)............. 238
7.3.1 模式0(13位定时器/计数器)......................................................................... 238
7.3.2 模式1(16位定时器/计数器)......................................................................... 239
7.3.3 模式2(8位自动重装模式)............................................................................. 243
7.4 可编程时钟输出及测试程序(C程序和汇编程序)................ 246
7.4.1 定时器0的可编程时钟输出的测试程序........................................................ 249
7.4.2 定时器1的可编程时钟输出的测试程序........................................................ 251
7.4.3 独立波特率发生器的可编程时钟输出的测试程序....................................... 253
7.5 古老Intel 8051单片机定时器0/1的应用举例.................... 255
7.6 如何将定时器T0/T1的速度提高12倍.......................... 262
第8章 串行口通信...................................... 263
8.1 串行口1的相关寄存器...................................... 263
8.2 串行口1工作模式.......................................... 269
8.2.1
8.2.2
8.2.3
8.2.4
8.3
8.4
8.5
8.6
8.7
8.8
8.9
串行口1工作模式0:同步移位寄存器. ........................................................ 269
串行口1工作模式1:8位UART,波特率可变. ............................................... 271
串行口1工作模式2:9位UART,波特率固定. ............................................... 273
串行口1工作模式3:9位UART,波特率可变. ............................................... 275
串行通信中波特率的设置................................... 277
串行口1的测试程序........................................ 282
串行口2的相关寄存器...................................... 288
串行口2工作模式.......................................... 294
串行口2的测试程序........................................ 296
双机通信............................................. 302
多机通信............................................. 313
第9章 STC12C5A60S2系列单片机的A/D转换器............. 319
9.1
9.2
9.3
9.4
9.5
9.6
A/D转换器的结构.......................................... 319
与A/D转换相关的寄存器.................................... 321
A/D转换典型应用线路...................................... 326
A/D做按键扫描应用线路图.................................. 327
A/D转换模块的参考电压源.................................. 328
A/D转换测试程序(C程序和汇编程序)........................ 329
9.6.1 A/D转换测试程序(ADC中断方式)..................................................................... 329
9.6.2 A/D转换测试程序(ADC查询方式).............................................................. 335
第10章 STC12C5A60S2系列单片机PCA/PWM应用.......... 341
10.1 与PCA/PWM应用有关的特殊功能寄存器..................... 341
10.2 PCA/PWM模块的结构..................................... 347
10.3 PCA模块的工作模式...................................... 349
10.3.1
10.3.2
10.3.3
10.3.4
捕获模式..............................................................................................................349
16位软件定时器模式..........................................................................................350
高速输出模式......................................................................................................351
脉宽调节模式(PWM).......................................................................................... 352
10.4 用PCA功能扩展外部中断的示例程序(C程序和汇编程序)....... 354
10.5
10.6
10.7
10.8
用PCA功能实现定时器的示例程序(C程序和汇编程序)......... 358
PCA输出高速脉冲的示例程序(C程序和汇编程序)............. 362
PCA输出PWM的示例程序(C程序和汇编程序)................ 366
利用PWM实现D/A功能的典型应用线路图.................... 370
第11章 同步串行外围接口(SPI接口)...................... 371
11.1 与SPI功能模块相关的特殊功能寄存器....................... 371
11.2 SPI接口的结构........................................... 374
11.3 SPI接口的数据通信....................................... 375
11.3.1
11.3.2
11.3.3
11.3.4
11.3.5
11.3.6
SPI接口的数据通信方式............................................................................ 376
对SPI进行配置. ......................................................................................... 378
作为主机/从机时的额外注意事项............................................................. 379
通过SS改变模式........................................................................................ 380
写冲突....................................................................................................... 380
数据模式. .................................................................................................. 381
11.4 适用单主单从系统的SPI功能测试程序....................... 383
11.4.1 中断方式. .................................................................................................. 383
11.4.2 查询方式. .................................................................................................. 389
11.5 适用互为主从系统的SPI功能测试程序....................... 395
11.5.1 中断方式. .................................................................................................. 395
11.5.2 查询方式. .................................................................................................. 401
第12章 STC12C5A60S2系列单片机EEPROM的应用......... 407
12.1
12.2
12.3
12.4
IAP及EEPROM新增特殊功能寄存器介绍..................... 407
STC12C5A60S2系列单片机EEPROM空间大小及地址........... 411
IAP及EEPROM汇编简介................................... 413
EEPROM测试程序(C程序及汇编程序)....................... 417
第13章 STC12系列单片机开发/编程工具说明............... 425
13.1 在系统可编程(ISP)原理,官方演示工具使用说明.............. 425
13.1.1
13.1.2
13.1.3
13.1.4
13.1.5
在系统可编程(ISP)原理使用说明. ............................................................. 425
STC12C5A60S2系列在系统可编程(ISP)典型应用线路图........................... 426
电脑端的ISP控制软件界面使用说明.......................................................... 428
STC-ISP(最方便的在线升级软件)下载编程工具硬件使用说明................. 430
若无RS-232转换器,如何用ISP下载板做RS-232通信转换. ....................... 431
13.2 编译器/汇编器,编程器,仿真器........................... 432
13.3 自定义下载演示程序(实现不停电下载)...................... 434
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
附录A:汇编语言编程...................................
附录B:C语言编程......................................
附录C:STC12C5A60S2系列单片机电气特性...............
附录D:内部常规256字节RAM间接寻址测试程序...........
附录E:用串口扩展I/O接口..............................
附录F:利用STC单片机普通I/O驱动LCD显示..............
附录G:一个I/O口驱动发光二极管并扫描按键..............
附录H:如何利用Keil C软件减少代码长度.................
附录I:STC12系列单片机取代传统8051注意事项............
附录J:每日更新内容的备忘录...........................
C
T
S
南通国芯微电子有限公司
U
C
M
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
传真:0513-5501 2969 / 2956 / 2947
438
460
470
472
474
477
484
485
486
490
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
第1章 STC12C5A60S2系列单片机总体介绍
1.1 STC12C5A60S2系列单片机简介
STC12C5A60S2/AD/PWM 系列单片机是STC生产的单时钟/机器周期(1T)的单片机,是高
速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12 倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S�������������
,即25万次/秒�����
),针对电
机控制,强干扰场合。
1. 增强型 8051 CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051
2. 工作电压:
STC12C5A60S2 系列工作电压: 5.5V - 3.5V(5V单片机)
STC12LE5A60S2 系列工作电压: 3.6V - 2.2V(3V单片机)
3. 工作频率范围:0~35MHz,相当于普通8051的 0~420MHz
4. 用户应用程序空间 8K /16K / 20K / 32K / 40K / 48K / 52K / 60K / 62K 字节......
5. 片上集成1280字节 RAM
6. 通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O口)
可设置成四种模式:准双向口/弱上拉,������������������
强�����������������
推挽/强上拉,仅为输入/高阻,开漏
每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过120mA
7. ISP(在系统可编程)/ IAP(在应用可编程),无需专用编程器,无需专用仿真器
可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片
8. 有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM)
9. 看门狗
10.内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地)
11. 外部掉电检测电路: 在P4.6口有一个低压门槛比较器
5V单片机为1.33V,误差为±5%,3.3V 单片机为1.31V,误差为±3%
12. 时钟源:外部高精度晶体/时钟,内部R/C振荡器(温漂为±5% 到±10% 以内)
用户在下载用户程序时,可选择是使用内部R/C 振荡器还是外部晶体/ 时钟
常温下内部R/C振荡器频率为:5.0V 单片机为: 11MHz ~ 17MHz
3.3V 单片机为: 8MHz ~ 12MHz
精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准
13. 共4个16位定时器
两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立
波特率发生器做串行通讯的波特率发生器,再加上2路PCA模块可再实现2个16位定时器
14. 3个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟,独
立波特率发生器可以在P1.0口输出时钟
15. 外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模
块�
,Power Down模式可由外部中断唤醒�
,INT0/P3.2,INT1/P3.3,T0/P3.4, T1/P3.5, RxD/P3.0,
CCP0/P1.3(也可通过寄存器设置到P4.2), CCP1/P1.4(也可通过寄存器设置到P4.3)
C
T
S
南通国芯微电子有限公司
U
C
M
.
d
e
t
i
m
Li
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
16. PWM(2路)/ PCA(可编程计数器阵列,2路)
--- 也可用来当2路D/A使用
--- 也可用来再实现2个定时器
--- 也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持)
17. A/D转换, 10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次)
18. 通用全双工异步串行口(UART),由于STC12系列是高速的8051��������������
,�������������
可再用定时器或PCA软件
实现多串口
19. STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过寄存器设
置到P4.2),TxD2/P1.3(可通过寄存器设置到P4.3)
20. 工作温度范围:-40 ~ +85℃(工业级) / 0 ~ 75℃(商业级)
21. 封装:LQFP-48, LQFP-44, PDIP-40, PLCC-44, QFN-40
I/O口不够时,可用2到3根普通I/O口线外接74HC164/165/595(均可级联)来扩展I/O口,
还可用A/D做按键扫描来节省I/O口,或用双CPU,三线通信,还多了串口。
C
T
S
南通国芯微电子有限公司
U
C
M
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.2 STC12C5A60S2系列单片机的内部结构
STC12C5A60S2系列单片机的内部结构框图如下图所示。STC12C5A60S2单片机中包含中
央处理器(CPU)、程序存储器(Flash)、数据存储器(SRAM)、定时/计数器、UART串口、串
口2、I/O接口、高速A/D转换、SPI接口、PCA、看门狗及片内R/C振荡器和外部晶体振荡电路
等模块。STC12C5A60S2系列单片机几乎包含了数据采集和控制中所需的所有单元模块,可称
得上一个片上系统。
RAM 地址
寄存器
AUX-RAM
1024字节
RAM
256字节
.
d
e
t
i
m
程序存储器(Flash)
B寄存器
ACC
堆栈指针
TMP2
LVD/LVR
C
T
S
U
C
M
PSW
ISP/IAP
定时器 0/1
地址生成器
串口1
ALU
串口2
程序计数器(���
PC)
WDT
PCA
SPI
Control
Unit
RESET
Li
TMP1
Port 0,2,3,4,5
锁存器
Port1 锁存器
ADC
XTAL1
XTAL2
Port 1 驱动器
8
P1.0 ~ P1.7
P1.0 ~ P1.7
Port 0,2,3,4,5
驱动器
P0,P2,P3,P4,P5
STC12C5A60S2系列内部结构框图
10
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
所有封装形式均满足欧盟RoHS要求
CCP:是英文单词的缩写
Capture(捕获),Compare(比较),PWM(脉宽调制)
34
35
36
37
38
39
40
41
42
43
44
LQFP-44
STC12C5A60S2
增加了P4口
并可位寻址
22
21
20
19
18
17
16
15
14
13
12
.
d
e
t
i
m
37
38
39
40
41
42
43
44
45
46
47
48
LQFP-48
STC12C5A60S2
增加了P4/P5口
并可位寻址
C
T
S
24
23
22
21
10
19
18
17
16
15
14
13
Li
CLKOUT2/ADC0/P1.0
ADC1/P1.1
RxD2/ECI/ADC2/P1.2
TxD2/CPP0/ADC3/P1.3
SS/CPP1/ADC4/P1.4
MOSI/ADC5/P1.5
MISO/ADC6/P1.6
SCLK/ADC7/P1.7
P4.7/RST
INT/RxD/P3.0
TxD/P3.1
INT0/P3.2
INT1/P3.3
CLKOUT0/INT/T0/P3.4
CLKOUT1/INT/T1/P3.5
WR/P3.6
RD/P3.7
XTAL2
XTAL1
Gnd
总机:0513-5501 2928 / 2929 / 2966
1
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PDIP-40, STC12C5A60S2, 增加了P4口
南通国芯微电子有限公司
P5.0
P2.4/A12
P2.3/A11
P2.2/A10
P2.1/A9
P2.0/A8
P4.0/SS
Gnd
XTAL1
XTAL2
P3.7/RD
P3.6/WR
U
C
M
P5.3
MOSI/ADC5/P1.5
MISO/ADC6/P1.6
SCLK/ADC7/P1.7
P4.7/RST
INT/RxD/P3.0
SCLK/TxD2/CCP1/P4.3
TxD/P3.1
INT0/P3.2
INT1/P3.3
CLKOUT0/INT/T0/P3.4
CLKOUT1/INT/T1/P3.5
1
2
3
4
5
6
7
8
9
10
11
12
P0.3
P0.2
P0.1
P0.0
VCC
MISO/RxD2/CCP0/P4.2
ADC0/CLKOUT2/P1.0
ADC1/P1.1
RxD2/ECI/ADC2/P1.2
TxD2/CCP0/ADC3/P1.3
SS/CCP1/ADC4/P1.4
P5.2
P2.4/A12
P2.3/A11
P2.2/A10
P2.1/A9
P2.0/A8
P4.0/SS
Gnd
XTAL1
XTAL2
P3.7/RD
P3.6/WR
MOSI/ADC5/P1.5
MISO/ADC6/P1.6
SCLK/ADC7/P1.7
P4.7/RST
INT/RxD/P3.0
SCLK/TxD2/CCP1/P4.3
TxD/P3.1
INT0/P3.2
INT1/P3.3
CLKOUT0/INT/T0/P3.4
CLKOUT1/INT/T1/P3.5
36
35
34
33
32
31
30
29
28
27
26
25
1
2
3
4
5
6
7
8
9
10
11
P0.4
P0.5
P0.6
P0.7
EX_LVD/P4.6/RST2
P4.1/ECI/MOSI
ALE/P4.5
NA/P4.4
P2.7/A15
P2.6/A14
P2.5/A13
P5.1
P0.3
P0.2
P0.1
P0.0
Vcc
MISO/RxD2/CCP0/P4.2
CLKOUT2/ADC0/P1.0
ADC1/P1.1
RxD2/ECI/ADC2/P1.2
TxD2/CCP0/ADC3/P1.3
SS/CCP1/ADC4/P1.4
33
32
31
30
29
28
27
26
25
24
23
P0.4
P0.5
P0.6
P0.7
EX_LVD/P4.6/RST2
P4.1/ECI/MOSI
ALE/P4.5
NA/P4.4
P2.7/A15
P2.6/A14
P2.5/A13
1.3 STC12C5A60S2系列������
单片机���
管脚图
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
Vcc
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7
EX_LVD/P4.6/RST2
ALE/P4.5
NA/P4.4
P2.7/A15
P2.6/A14
P2.5/A13
P2.4/A12
P2.3/A11
P2.2/A10
P2.1/A9
P2.0/A8
传真:0513-5501 2969 / 2956 / 2947
11
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
U
C
M
QFN-40
STC12C5A60S2
增加了P4口
并可位寻址
40
1
增加了P4口
并可位寻址
P0.3
P0.2
P0.1
P0.0
Vcc
CLKOUT2/ADC0/P1.0
ADC1/P1.1
RxD2/ECI/ADC2/P1.2
TxD2/CCP0/ADC3/P1.3
SS/CCP1/ADC4/P1.4
P2.4/A12
P2.3/A11
P2.2/A10
P2.1/A9
P2.0/A8
Gnd
XTAL1
XTAL2
P3.7/RD
P3.6/WR
MOSI/ADC5/P1.5
MISO/ADC6/P1.6
SCLK/ADC7/P1.7
P4.7/RST
INT/RxD/P3.0
TxD/P3.1
INT0/P3.2
INT1/P3.3
CLKOUT0/INT/T0/P3.4
CLKOUT1/INT/T1/P3.5
6
5
4
3
2
1
44
43
42
41
40
PLCC-44
STC12C5A60S2
P0.4
P0.5
P0.6
P0.7
EX_LVD/P4.6/RST2
P4.1/ECI/MOSI
ALE/P4.5
NA/P4.4
P2.7/A15
P2.6/A14
P2.5/A13
39
38
37
36
35
34
33
32
31
30
29
18
19
20
21
22
23
24
25
26
27
28
7
8
9
10
11
12
13
14
15
16
17
WR/P3.6
RD/P3.7
XTAL2
XTAL1
Gnd
SS/P4.0
A8/P2.0
A9/P2.1
A10/P2.2
A11/P2.3
A12/P2.4
MOSI/ADC5/P1.5
MISO/ADC6/P1.6
SCLK/ADC7/P1.7
P4.7/RST
INT/RxD/P3.0
SCLK/TxD2/CCP1/P4.3
TxD/P3.1
INT0/P3.2
INT1/P3.3
CLKOUT0/INT/T0/P3.4
CLKOUT1/INT/T1/P3.5
研发顾问:13922809991
P0.4
P0.5
P0.6
P0.7
EX_LVD/P4.6/RST2
ALE/P4.5
NA/P4.4
P2.7/A15
P2.6/A14
P2.5/A13
P1.4/ADC4/CCP1/SS
P1.3/ADC3/CCP0/TxD2
P1.2/ADC2/ECI/RxD2
P1.1/ADC1
P1.0/ADC0/CLKOUT2
P4.2/CCP0RxD2/MISO
Vcc
P0.0
P0.1
P0.2
P0.3
STC12C5A60S2系列单片机指南
.
d
e
t
i
m
Li
STC12C5A60S2系列(有第二串口,有A/D转换,有PWM/PCA功能,有内部EEPROM)
STC12C5A60AD系列(无第二串口,有A/D转换,有PWM/PCA功能,有内部EEPROM)
STC12C5A60PWM/CCP系列(无第二串口,无A/D 转换,有PWM/CCP功能,有内部EEPROM)
C
T
S
由P4SW寄存器设置(NA/P4.4,ALE/P4.5,EX_LVD/P4.6)三个端口的第二功能
Mnemonic Add
Name
P4SW
BBH Port-4 switch
7
6
5
4
LVD_P4.6 ALE_P4.5 NA_P4.4
3
2
1
0
Reset Value
x000,xxxx
NA/P4.4: 0,复位后P4SW.4 = 0,NA/P4.4脚是弱上拉,无任何功能
1,通过设置P4SW.4 = 1,将NA/P4.4脚设置成I/O口(P4.4)
ALE/P4.5:0,复位后P4SW.5=0,ALE/P4.5脚是ALE信号,只有在用MOVX指令访问片外扩展器件时才有信号输出
1,通过设置P4SW.5 = 1,将ALE/P4.5脚设置成I/O口(P4.5)
EX_LVD/P4.6: 0,复位后P4SW.6=0,EX_LVD/P4.6是外部低压检测脚,可使用查询方式或设置成中断来检测
1,通过设置P4SW.6 = 1将EX_LVD/P4.6脚设置成I/O口(P4.6)
在ISP烧录程序时设置RST/P4.7的第二功能
RST/P4.7在ISP烧录程序时选择是复位脚还是P4.7口,如设置成P4.7口,必须使用外部时钟。
由AUXR1寄存器设置(PCA/PWM/SPI/UART2)是在P1口还是在P4口
Mnemonic Add
Name
AUXR1 A2H Auxiliary register 1
7
-
6
5
4
3
2
PCA_P4 SPI_P4 S2_P4 GF2 ADRJ
1
-
0
Reset Value
DPS x000,00x0
PCA_P4: 0,复位后AUXR1.6 = 0,PCA/PWM在P1口
1,通过设置AUXR1.6 = 1,将PCA/PWM从P1口切换到P4口
SPI_P4: 0,复位后AUXR1.5 = 0,SPI在P1口
1,通过设置AUXR1.5 = 1,将SPI从P1口切换到P4口
S2_P4: 0,复位后AUXR1.4 = 0,UART2/串口2在P1口(仅针对双串口单片机有效)
1,通过设置AUXR1.4=1,将UART2/串口2从P1口切换到P4口(仅针对双串口单片机有效)
12
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.4 STC12C5A60S2系列单片机选型一览表
型号
独
U 立
Flash
定
A 波 D
PCA
工作 程序
时 PCA
SRAM
R 特 P EEP 16位 A/D
电压 存储
器 定时
T 率 T ROM PWM 8路
字节
(V) 器字
T0 器
8位
串 发 R
节
T1
口 生
器
I/O
外
内 部
看
置 低
门
复 压
狗
位 检
测
封装
40-Pin
封装
44-Pin
封装
48-Pin
STC12C5A60S2系列单片机选型一览
STC12C5A08PWM
5.5-3.5
8K
1280 有
2
1
有 2
有
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A08AD
5.5-3.5
8K
1280 有
2
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A08S2
5.5-3.5
8K
1280 有
2
2
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A16PWM
5.5-3.5 16K
1280 有
2
1
有 2
有
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A16AD
5.5-3.5 16K
1280 有
2
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A16S2
5.5-3.5 16K
1280 有
2
2
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A20PWM
5.5-3.5 20K
1280 有
2
1
有 2
有
2路
STC12C5A20AD
5.5-3.5 20K
1280 有
2
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A20S2
5.5-3.5 20K
1280 有
2
2
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A32PWM
5.5-3.5 32K
1280 有
2
1
有 2
有
2路
STC12C5A32AD
5.5-3.5 32K
1280 有
2
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A32S2
5.5-3.5 32K
1280 有
2
2
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A40PWM
5.5-3.5 40K
1280 有
2
1
有 2
有
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A40AD
5.5-3.5 40K
1280 有
2
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A40S2
5.5-3.5 40K
1280 有
2
2
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A48PWM
5.5-3.5 48K
1280 有
2
1
有 2
有
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A48AD
5.5-3.5 48K
1280 有
2
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A48S2
5.5-3.5 48K
1280 有
2
2
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A52PWM
5.5-3.5 52K
1280 有
2
1
有 2
有
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A52AD
5.5-3.5 52K
1280 有
2
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A52S2
5.5-3.5 52K
1280 有
2
2
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A56PWM
5.5-3.5 56K
1280 有
2
1
有 2
有
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A56AD
5.5-3.5 56K
1280 有
2
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A56S2
5.5-3.5 56K
1280 有
2
2
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A60PWM
5.5-3.5 60K
1280 有
2
1
有 2
有
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A60AD
5.5-3.5 60K
1280 有
2
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A60S2
5.5-3.5 60K
1280 有
2
2
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A62PWM
5.5-3.5 62K
1280 有
2
1
有 2
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A62AD
5.5-3.5 62K
1280 有
2
1
有 2
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A62S2
5.5-3.5 62K
1280 有
2
2
有 2
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
C
T
S
南通国芯微电子有限公司
CU
M
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
传真:0513-5501 2969 / 2956 / 2947
13
STC12C5A60S2系列单片机指南
型号
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
独
U 立
Flash
定
A 波 D
PCA
工作 程序
时 PCA
SRAM
R 特 P EEP 16位 A/D
电压 存储
器 定时
T 率 T ROM PWM 8路
字节
(V) 器字
T0 器
8位
串 发 R
节
T1
口 生
器
I/O
外
内 部
看
置 低
门
复 压
狗
位 检
测
研发顾问:13922809991
封装
40-Pin
封装
44-Pin
封装
48-Pin
STC12LE5A60S2系列单片机选型一览
STC12LE5A08PWM 3.6-2.2
8K
1280 有
2
1
有 2
有
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A08AD
3.6-2.2
8K
1280 有
2
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A08S2
3.6-2.2
8K
1280 有
2
2
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A16PWM 3.6-2.2 16K
1280 有
2
1
有 2
有
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A16AD
3.6-2.2 16K
1280 有
2
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A16S2
.
d
e
t
i
m
3.6-2.2 16K
1280 有
2
2
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A20PWM 3.6-2.2 20K
1280 有
2
1
有 2
有
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A20AD
3.6-2.2 20K
1280 有
2
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A20S2
Li
3.6-2.2 20K
1280 有
2
2
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A32PWM 3.6-2.2 32K
1280 有
2
1
有 2
有
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A32AD
3.6-2.2 32K
1280 有
2
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A32S2
3.6-2.2 32K
1280 有
2
2
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A40PWM 3.6-2.2 40K
1280 有
2
1
有 2
有
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
C
T
S
CU
M
STC12LE5A40AD
3.6-2.2 40K
1280 有
2
STC12LE5A40S2
3.6-2.2 40K
1280 有
2
2
有 2
有
2路
STC12LE5A48PWM 3.6-2.2 48K
1280 有
2
1
有 2
有
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A48AD
3.6-2.2 48K
1280 有
2
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A48S2
3.6-2.2 48K
1280 有
2
2
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A52PWM 3.6-2.2 52K
1280 有
2
1
有 2
有
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A52AD
3.6-2.2 52K
1280 有
2
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A52S2
3.6-2.2 52K
1280 有
2
2
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A56PWM 3.6-2.2 56K
1280 有
2
1
有 2
有
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A56AD
3.6-2.2 56K
1280 有
2
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A56S2
3.6-2.2 56K
1280 有
2
2
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A60PWM 3.6-2.2 60K
1280 有
2
1
有 2
有
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A60AD
3.6-2.2 60K
1280 有
2
1
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A60S2
3.6-2.2 60K
1280 有
2
2
有 2
有
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A62PWM 3.6-2.2 62K
1280 有
2
1
有 2
2路
36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A62AD
3.6-2.2 62K
1280 有
2
1
有 2
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12LE5A62S2
3.6-2.2 62K
1280 有
2
2
有 2
2路
10位 36/40/44 有 有 有 PDIP40 LQFP44 LQFP48
STC12C5A60S2系列单片机44-pin的封装除LQFP44外,还有PLCC44,但是不推荐使用PLCC44
封装,建议选用LQFP44的封装。
14
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1.5 STC12C5A60S2系列���������
单片机最小应用系统
10μF
10K
+
C1
R1
C2 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
160
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
STC12C5A60S2系列单片机指南
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
161
STC12C5A60S2系列单片机指南
技术支持网站: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:
162
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
STC12C5A60S2系列单片机指南
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
163
STC12C5A60S2系列单片机指南
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:
164
研发顾问: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
STC12C5A60S2系列单片机指南
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
165
STC12C5A60S2系列单片机指南
技术支持网站: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:
166
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
STC12C5A60S2系列单片机指南
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
167
STC12C5A60S2系列单片机指南
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:
168
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
STC12C5A60S2系列单片机指南
技术支持网站: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
169
STC12C5A60S2系列单片机指南
技术支持网站: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:
170
0 1 1 1
MOV
(Rn) ��
←� �����
#data
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站: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
171
STC12C5A60S2系列单片机指南
技术支持网站: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:
172
1
0
0
MOV
(bit)��
←����
(C)
���
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站: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
173
STC12C5A60S2系列单片机指南
技术支持网站: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:
174
1 1
1
0
0 0 1 i
MOVX
(A) ��
←�������
������
((Ri))
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站: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
175
STC12C5A60S2系列单片机指南
技术支持网站: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.
176
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站: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
177
STC12C5A60S2系列单片机指南
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:
178
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
STC12C5A60S2系列单片机指南
技术支持网站: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
179
STC12C5A60S2系列单片机指南
技术支持网站: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:
180
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
STC12C5A60S2系列单片机指南
技术支持网站: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
181
STC12C5A60S2系列单片机指南
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:
182
研发顾问: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
STC12C5A60S2系列单片机指南
技术支持网站: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
183
STC12C5A60S2系列单片机指南
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:
184
.
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
STC12C5A60S2系列单片机指南
技术支持网站: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
185
STC12C5A60S2系列单片机指南
技术支持网站: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:
186
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
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
第6章 中断系统
中断系统是为使CPU具有对外界��������������
紧急������������
事件的处理能力而设置的。
当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前
的工作,转而去处理这个紧急事件�������������������������
,������������������������
处理完以后,再回到原来被中断的地方,继续原来的工
作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中
断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它
服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排
队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响
应������������
优先����������
级别最高的中断请求。
当CPU正在处理一个中断源请求的时候(执行相应的���������������
中断�������������
服务程序),发生了另外一个
优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的������������
服务����������
程序,转而去处理优先
级更高的中断请求源,处理完以后,再回到原低级中断�����������������
服务���������������
程序,这样的过程称为中断嵌套。
这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。
.
d
e
t
i
m
Li
STC12C5A60S2系列单片机提供了10个中断请求源,它们分别是:外部中断0(INT0)、定
时器0中断、外部中断1(INT1)、定时器1中断、串口1(UART1)中断、A/D转换中断、低压检测
(LVD)中断、PCA中断、串口2中断及SPI中断。所有的中断都具有4个中断优先级。用户可以用
关总中断允许位(EA/IE.7)或相应中断的允许位来屏蔽所有的中断请求,也可以用打开相应的
中断允许位来使CPU响应相应的中断申请;每一个中断源可以用软件独立地控制为开中断或关
中断状态;每一个中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的
中断,反之,低优先级的中断请求不可以打断高优先级及同优先级的中断。当两个相同优先级
的中断同时产生时,将由查询次序来决定系统先响应哪个中断。STC12C5A60S2系列单片机的
C
T
S
U
C
M
各个中断查询次序如下表6-1所示:
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
187
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
表6-1 中断查询次序
中断源
中断向 相同优先级内
量地址 的查询次序
INT0
0003H
(外部中断 0)
Timer 0
000BH
INT1
(外部中断1)
Timer1
UART1
ADC
LVD
PCA
中断优先级
优先级0 优先 优先 优先级3 中断请求标 中断允许控
设置
(最低) 级1 级2 (最高)
志位
制位
(IPH,IP)
0 (highest) PX0H, PX0
0, 0
0, 1 1, 0
1, 1
IE0
EX0/EA
1
PT0H, PT0
0, 0
0, 1 1, 0
1, 1
TF0
ET0/EA
0013H
2
PX1H, PX1
0, 0
0, 1 1, 0
1, 1
IE1
EX1/EA
001BH
0023H
002BH
0033H
3
4
5
6
PT1H, PT1
0, 0
0, 0
0, 0
0, 0
0, 1
0, 1
0, 1
0, 1
1, 1
1, 1
1, 1
1, 1
TF1
RI+TI
ET1/EA
ADC_FLAG
EADC/EA
ELVD/EA
003BH
S2(UART2) 0043H
SPI
004BH
7
PSH, PS
PADCH,PADC
PLVDH,PLVD
1, 0
1, 0
1, 0
1, 0
PPCAH,PPCA
0, 0
0, 1 1, 0
PS2H, PS2
8
9 (lowest) PSPIH, PSPI
0, 0
0, 0
0, 1 1, 0
0, 1 1, 0
U
C
M
Li
.
d
e
t
i
m
1, 1
1, 1
1, 1
LVDF
CF+CCF0 + (ECF+ECCF0
CCF1
+ECCF1)/EA
S2TI+S2RI
ES2/EA
SPIF
ESPI/EA
通过设置新增加的特殊功能寄存器IPH或IP2H中的相应位,可将中断优先级设为四级,
如果只设置IP或IP2,那么中断优先级就只有两级,与传统8051单片机两级中断优先级完全
兼容。
C
T
S
如果使用C语言编程,中断查询次序号就是中断号,例如:
188
void
void
void
void
void
void
void
void
void
void
Int0_Routine(void)
interrupt 0;
Timer0_Rountine(void) interrupt 1;
Int1_Routine(void)
interrupt 2;
Timer1_Rountine(void) interrupt 3;
UART_Routine(void) interrupt 4;
ADC_Routine(void) interrupt 5;
LVD_Routine(void) interrupt 6;
PCA_Routine(void) interrupt 7;
UART2_Routine(void) interrupt 8;
SPI_Routine(void)
interrupt 9;
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.1 中断结构
STC12C5A60S2系列单片机的中断系统结构示意图如图6-1所示
中断允许控
制寄存器
IE, IE2寄存器
TCON.0/IT0=0
IE0
INT0
EA
EX0
TCON.0/IT0=1
TCON.2/IT1=0
IE1
INT1
TCON.2/IT1=1
串口1/S1 RI
TI
ADC_FLAG
LVDF
C
T
S
PX0H, PX0
PX1H, PX1
EX1
U
C
M
PT1H, PT1
ET1
TF1
最低优先级中断
IP,IP2,IPH,IP2H
Registers
PT0H, PT0
ET0
TF0
中断优先级
控制寄存器
PSH, PS
ES
EADC
ELVD
CF
ECF
CCF0
ECCF0
CCF1
ECCF1
PADCH, PADC
PLVDH, PLVD
PPCAH, PPCA
PS2H, PS2
ES2
串口2/S2 S2RI
S2TI
SPIF
0,0
0,1
Li
0,0
0,0
0,0
0,0
0,0
0,0
0,0
0,0
1,0
1,1
.
d
e
t
i
m
0,0
PSPIH, PSPI
ESPI
最高优先级中断
0,1
0,1
0,1
0,1
0,1
0,1
0,1
0,1
0,1
1,0
1,0
1,0
1,0
1,0
1,0
1,0
1,0
1,0
high
1,1
1,1
1,1
中断
查询
次序
1,1
1,1
1,1
1,1
1,1
1,1
low
EA
Global Enable
EA
图6-1 STC12C5A60S2系列中断系统结构图
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
189
STC12C5A60S2系列单片机指南
技术支持网站: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)会被硬件清除。
当串行口1接收中断请求标志位RI和串行口1发送中断请求标志位TI中的任何一个被置为1
后,串行口中断都会产生。
.
d
e
t
i
m
A/D转换的中断是由ADC_FLAG/ADC_CONTR.4请求产生的。该位需用软件清除。
低压检测(LVD)中断是由LVDF/PCON.5请求产生的。该位也需用软件清除。
U
C
M
各个中断触发行为总结如下表6-2所示:
表6-2 中断触发
中断源
INT0
(外部中断0)
Timer 0
INT1
(外部中断1)
190
触发行为
C
T
S
(IT0/TCON.0 = 1): 下降沿
Li
(IT0/TCON.0 = 0): 低电平
定时器0溢出
(IT1/TCON.2 = 1): 下降沿
Timer1
定时器1溢出
UART1
发送或接受完成
(IT1/TCON.2 = 0): 低电平
ADC
A/D转换完成
LVD
电源电压下降到低于LVD检测电压
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.2 中断寄存器
位地址及符号
符号
描述
地址
IE
Interrupt Enable
Interrupt Priority
Low
Interrupt Priority
High
A8H
Interrupt Enable 2
AFH
-
-
-
-
-
-
B5H
-
-
-
-
-
-
B6H
-
-
-
-
-
IP
IPH
IE2
IP2
IP2H
2rd Interrupt Priority
Low register
2rd Interrupt Priority
Low register
MSB
EA
LSB
ELVD EADC
ES
ET1
EX1
ET0
EX0
0000 0000B
PT1
PX1
PT0
PX0
0000 0000B
PX0H
0000 0000B
ESPI
ES2
xxxx xx00B
PSPI
PS2
xxxx xx00B
B8H
PPCA PLVD PADC
B7H
PPCAH PLVDH PADCH PSH PT1H PX1H PT0H
PS
复位值
.
d
e
t
i
m
-
PSPIH
PS2H
xxxx xx00B
TCON
Timer Control
88H
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
0000 0000B
SCON
Serial Control
98H
SM0/FE
SM1
SM2
REN
TB8
RB8
TI
RI
0000 0000B
AUXR
Auxiliary register
8EH
PCON
Power Control
87H
CLK_Output Power
WAKE_CLKO down Wake-up control
register
8FH
ADC_CONTR
BCH
CCON
CMOD
CCAPM0
CCAPM1
SPSTAT
C
T
S
ADC Control
PCA Control Register
PCA Mode Register
PCA Module 0
Mode Register
PCA Module 1
Mode Register
SPI Status register
Li
T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS
U
C
M
SMOD SMOD0 LVDF POF
GF1
GF0
PD
IDL
0000 0000B
0011 0000B
PCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_WAKE BRTCLKO T1CLKO T0CLKO
0000 0000B
ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
0000 0000B
D8H
CF
CR
-
-
-
-
D9H
CIDL
-
-
-
CPS2
CPS1
CCF1 CCF0 00xx xx00B
CPS0
ECF
00xx 0000B
DAH
-
ECOM0 CAPP0 CAPN0 MAT0 TOG0 PWM0 ECCF0
x000 0000B
DBH
-
ECOM1 CAPP1 CAPN1 MAT1 TOG1 PWM1 ECCF1
x000 0000B
CDH
SPIF WCOL
-
-
-
-
-
-
00xx xxxxB
上表中列出了与STC12C5A60S2系列单片机中断相关的所有寄存器,下面逐一地对部分寄
存器进行介绍。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
191
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1. 中断允许寄存器IE和IE2
STC12C5A60S2系列单片机CPU对中断源的开放或屏蔽,每一个中断源是否被允许中断,
是由内部的中断允许寄存器IE(IE为特殊功能寄存器,它的字节地址为A8H)控制的,其格式
如下:
IE : 中断允许寄存器 (可位寻址)
SFR name
IE
Address
A8H
bit
name
B7
EA
B6
ELVD
B5
EADC
B4
ES
B3
ET1
B2
EX1
B1
ET0
B0
EX0
EA : CPU的总中断允许控制位,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。
EA的作用是使中断允许形成两级控制。即各中断源首先受EA控制;其次还受各中断源自
己的中断允许控制位控制。
.
d
e
t
i
m
ELVD : 低压检测中断允许位。ELVD=1,允许低压检测中断;ELVD=0,禁止低压检测中断。
EADC : A/D转换中断允许位。EADC=1,允许A/D转换中断;EADC=0,禁止A/D转换中断。
Li
ES : 串行口1中断允许位。ES=1,允许串行口1中断;ES=0,禁止串行口1中断。
ET1 : 定时/计数器T1的溢出中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。
U
C
M
EX1 : 外部中断1中断允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。
ET0 : T0的溢出中断允许位。ET0=1,允许T0中断;ET0=0禁止T0中断。
EX0 : 外部中断0中断允许位。EX0=1,允许中断;EX0=0禁止中断。
C
T
S
IE2 : 中断允许寄存器 (不可位寻址)
SFR name
IE2
Address
AFH
bit
name
B7
-
B6
-
B5
-
B4
-
B3
-
B2
-
B1
ESPI
B0
ES2
ESPI: SPI中断允许位。ESPI=1,允许SPI中断;SPI=0,禁止SPI中断。
ES2 : 串行口2中断允许位。ES2=1,允许串行口2中断;ES2=0,禁止串行口2中断。
STC12C5A60S2系列单片机复位以后,IE和IE2被清0,由用户程序置“1”或清“0”IE和
IE2相应的位,实现允许或禁止各中断源的中断申请,若使某一个中断源允许中断必须同时使
CPU开放中断。更新IE的内容可由位操作指令来实现(SETB BIT;CLR BIT),也可用字节操
作指令实现(即MOV IE,#DATA,ANL IE,#DATA;ORL IE,#DATA;MOV IE,A等)。
更新IE2(不可位寻址)的内容可用MOV IE2, #DATA指令来解决。
192
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 中断优先级控制寄存器IP、IP2和IPH、IP2H
传统8051单片机具有两个中断优先级,即高优先级和低优先级,可以实现两级中断嵌套。
STC12C5A60S2系列单片机通过设置新增加的特殊功能寄存器(IPH和IP2H)中的相应位,可将
中断优先级设置为4个中断优先级;如果只设置IP和IP2,那么中断优先级只有两级,与传统
8051单片机两级中断优先级完全兼容。
一个正在执行的低优先级中断能被高优先级中断所中断,但不能被另一个低优先级中断所
中断,一直执行到结束,遇到返回指令RETI,返回主程序后再执行一条指令才能响应新的中
断申请。以上所述可归纳为下面两条基本规则:
⒈ 低优先级中断可被高优先级中断所中断,反之不能。
⒉ 任何一种中断(不管是高级还是低级),一旦得到响应,不会再被它的同级中断所中断
.
d
e
t
i
m
STC12C5A60S2系列单片机的片内各优先级控制寄存器的格式如下:
IPH: 中断优先级控制寄存器高(不可位寻址)
Li
SFR name Address
bit
B7
B6
B5
B4
B3
B2
B1
B0
IPH
B7H
name PPCAH PLVDH PADCH PSH PT1H PX1H PT0H PX0H
U
C
M
IP : 中断优先级控制寄存器低 (可位寻址)
SFR name
IP
Address
B8H
bit
name
C
T
S
B7
PPCA
B6
PLVD
B5
PADC
B4
PS
B3
PT1
B2
PX1
B1
PT0
B0
PX0
PPCAH, PPCA:
PCA中断优先级控制位。
当PPCAH=0且PPCA=0时,PCA中断为最低优先级中断(优先级0)
当PPCAH=0且PPCA=1时,PCA中断为较低优先级中断(优先级1)
当PPCAH=1且PPCA=0时,PCA中断为较高优先级中断(优先级2)
当PPCAH=1且PPCA=1时,PCA中断为最高优先级中断(优先级3)
PLVDH, PLVD:
低压检测中断优先级控制位。
当PLVDH=0且PLVD=0时,低压检测中断为最低优先级中断(优先级0)
当PLVDH=0且PLVD=1时,低压检测中断为较低优先级中断(优先级1)
当PLVDH=1且PLVD=0时,低压检测中断为较高优先级中断(优先级2)
当PLVDH=1且PLVD=1时,低压检测中断为最高优先级中断(优先级3)
PADCH, PADC:
A/D转换中断优先级控制位。
当PADCH=0且PADC=0时,A/D转换中断为最低优先级中断(优先级0)
当PADCH=0且PADC=1时,A/D转换中断为较低优先级中断(优先级1)
当PADCH=1且PADC=0时,A/D转换中断为较高优先级中断(优先级2)
当PADCH=1且PADC=1时,A/D转换中断为最高优先级中断(优先级3)
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
193
STC12C5A60S2系列单片机指南
PSH, PS:
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
串口1中断优先级控制位。
当PSH=0且PS=0时,串口1中断为最低优先级中断(优先级0)
当PSH=0且PS=1时,串口1中断为较低优先级中断(优先级1)
当PSH=1且PS=0时,串口1中断为较高优先级中断(优先级2)
当PSH=1且PS=1时,串口1中断为最高优先级中断(优先级3)
PT1H, PT1:
定时器1中断优先级控制位。
当PT1H=0且PT1=0时,定时器1中断为最低优先级中断(优先级0)
当PT1H=0且PT1=1时,定时器1中断为较低优先级中断(优先级1)
当PT1H=1且PT1=0时,定时器1中断为较高优先级中断(优先级2)
当PT1H=1且PT1=1时,定时器1中断为最高优先级中断(优先级3)
.
d
e
t
i
m
PX1H, PX1: 外部中断1优先级控制位。
当PX1H=0且PX1=0时,外部中断1为最低优先级中断(优先级0)
当PX1H=0且PX1=1时,外部中断1为较低优先级中断(优先级1)
当PX1H=1且PX1=0时,外部中断1为较高优先级中断(优先级2)
当PX1H=1且PX1=1时,外部中断1为最高优先级中断(优先级3)
PT0H, PT0:
U
C
M
Li
定时器0中断优先级控制位。
当PT0H=0且PT0=0时,定时器0中断为最低优先级中断(优先级0)
当PT0H=0且PT0=1时,定时器0中断为较低优先级中断(优先级1)
当PT0H=1且PT0=0时,定时器0中断为较高优先级中断(优先级2)
当PT0H=1且PT0=1时,定时器0中断为最高优先级中断(优先级3)
C
T
S
PX0H, PX0: 外部中断0优先级控制位。
当PX0H=0且PX0=0时,外部中断0为最低优先级中断(优先级0)
当PX0H=0且PX0=1时,外部中断0为较低优先级中断(优先级1)
当PX0H=1且PX0=0时,外部中断0为较高优先级中断(优先级2)
当PX0H=1且PX0=1时,外部中断0为最高优先级中断(优先级3)
194
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
IP2H: 中断优先级高字节控制寄存器(不可位寻址)
SFR name Address
bit
IP2H
B6H
name
B7
-
B6
-
B5
-
B4
-
B3
-
B2
-
B1
B0
PSPIH PS2H
IP2 : 中断优先级控制寄存器 (不可位寻址)
SFR name
IP2
Address
B5H
bit
name
B7
-
B6
-
B5
-
B4
-
B3
-
B2
-
B1
PSPI
B0
PS2
PSPIH, PSPI: SPI中断优先级控制位。
当PSPIH=0且PSPI=0时,SPI中断为最低优先级中断(优先级0)
当PSPIH=0且PSPI=1时,SPI中断为较低优先级中断(优先级1)
当PSPIH=1且PSPI=0时,SPI中断为较高优先级中断(优先级2)
当PSPIH=1且PSPI=1时,SPI中断为最高优先级中断(优先级3)
PS2H, PS2:
.
d
e
t
i
m
Li
串口2中断优先级控制位。
当PS2H=0且PS2=0时,串口2中断为最低优先级中断(优先级0)
当PS2H=0且PS2=1时,串口2中断为较低优先级中断(优先级1)
当PS2H=1且PS2=0时,串口2中断为较高优先级中断(优先级2)
当PS2H=1且PS2=1时,串口2中断为最高优先级中断(优先级3)
C
T
S
U
C
M
中断优先级控制寄存器IP、IP2、IPH和IP2H的各位都由可用户程序置“1”和清“0”。但
IP寄存器可位操作,所以可用位操作指令或字节操作指令更新IP的内容。而IP2、IPH和IP2H
寄存器的内容只能用字节操作指令来更新。STC12C5A60S2系列单片机复位后IP、IP2、IPH和
IP2H均为00H,各个中断源均为低优先级中断。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
195
STC12C5A60S2系列单片机指南
技术支持网站: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的运行控制位。
TF0:T0溢出中断标志。T0被允许计数以后,从初值开始加1计数,当产生溢出时,由硬件置
“1”TF0,向CPU请求中断,一直保持CPU响应该中断时,才由硬件清0(也可由查询
软件清0)。
.
d
e
t
i
m
Li
TR0: 定时器0的运行控制位。
IE1:外部中断1请求源(INT1/P3.3)标志。IE1=1,外部中断向CPU请求中断,当CPU响应该
中断时由硬件清“0”IE1。
U
C
M
IT1:外部中断1中断源类型选择位。IT1=0,INT1/P3.3引脚上的低电平信号可触发外部中断
1。IT1=1,外部中断1为下降沿触发方式。
C
T
S
IE0:外部中断0请求源(INT0/P3.2)标志。IE0=1外部中断0向CPU请求中断,当CPU响应外
部中断时,由硬件清“0”IE0(边沿触发方式)。
IT0:外部中断0中断源类型选择位。IT0=0,INT0/P3.2引脚上的低电平可触发外部中断0。
IT0=1,外部中断0为下降沿触发方式。
4. 串行口控制寄存器SCON
SCON为串行口控制寄存器,SCON格式如下:
SCON : 串行口控制寄存器 (可位寻址)
SFR name
SCON
Address
98H
bit
name
B7
SM0/FE
B6
SM1
B5
SM2
B4
REN
B3
TB8
B2
RB8
B1
TI
B0
RI
RI: 串行口1接收中断标志。若串行口1允许接收且以方式0工作,则每当接收到第8位数据时
置1;若以方式1、2、3工作且SM2=0时,则每当接收到停止位的中间时置1;当串行口以
方式2或方式3工作且SM2=1时,则仅当接收到的第9位数据RB8为1后,同时还要接收到停
止位的中间时置1。RI为1表示串行口1正向CPU申请中断(接收中断),RI必须由用户的中
断服务程序清零。
TI: 串行口1发送中断标志。串行口1以方式0发送时,每当发送完8位数据,由硬件置1;若以
方式1、方式2或方式3发送时,在发送停止位的开始时置1。TI=1表示串行口1正在向CPU
申请中断(发送中断)。值得注意的是,CPU响应发送中断请求,转向执行中断服务程序
时并不将TI清零,TI必须由用户在中断服务程序中清零。
SCON寄存器的其他位与中断无关,在此不作介绍。
196
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
5. 低压检测中断相关寄存器:电源控制寄存器PCON
PCON为电源控制寄存器,PCON格式如下:
PCON : 电源控制寄存器
SFR name Address
PCON
87H
bit
B7
B6
B5
B4
B3
B2
B1
B0
name
SMOD
SMOD0
LVDF
POF
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
ES
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
197
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6. A/D转换控制寄存器ADC_CONTR
ADC_CONTR为A/D转换控制寄存器,ADC_CONTR格式如下:
ADC_CONTR : A/D转换控制寄存器
SFR name
ADC_CONTR
Address
BCH
bit
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
ES
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转换中断。
198
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.3 中断优先级
STC12C5A60S2系列单片机的所有的中断都具有4个中断优先级,对于这些中断请求源可
编程为高优先级中断或低优先级中断,可实现两级中断服务程序嵌套。����������
一个正在执行的低优先
级中断能被高优先级中断所中断,但不能被另一个低优先级中断所中断,一直执行到结束,遇
到返回指令RETI,返回主程序后再执行一条指令才能响应新的中断申请。以上所述可归纳为
下面两条基本规则:
⒈ 低优先级中断可被高优先级中断所中断,反之不能。
⒉ 任何一种中断(不管是高级还是低级),一旦得到响应,不会再被它的同级中断所中
断。
当同时收到几个同一优先级的中断要求时,哪一个要求得到服务,取决于内部的查询次
序。这相当于在每个优先级内,还同时存在另一个辅助优先级结构,STC12C5A60S2系列单片
机各中断优先查询次序如下:
中断源
0.
INT0
1.
Timer 0
2.
INT1
3.
Timer 1
4.
UART1
5. ADC interrupt
6.
LVD
7.
PCA
8.
UART2
9.
SPI
查询次序
(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
UART1_Rountine(void) interrupt 4;
void
ADC_Routine(void) interrupt 5;
void
LVD_Routine(void) interrupt 6;
void
PCA_Routine(void) interrupt 7;
void
UART2_Routine(void) interrupt 8;
void
SPI_Routine(void)
interrupt 9;
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
199
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.4 中断处理
当某中断产生而且被CPU响应,主程序被中断,接下来将执行如下操作:
1. 当前正被执行的指令全部执行完毕;
2. PC值被压入栈;
3. 现场保护;
4. 阻止同级别其他中断;
5. 将中断向量地址装载到程序计数器PC;
6. 执行相应的中断服务程序。
中断服务程序ISR完成和该中断相应的一些操作。ISR以RETI(中断返回)指令结束,将PC值
从栈中取回,并恢复原来的中断设置,之后从主程序的断点处继续执行。
.
d
e
t
i
m
当某中断被响应时,被装载到程序计数器PC中的数值称为中断向量,是同该中断源相对应
的中断服务程序的起始地址。各中断源服务程序的入口地址(即中断向量)为:
C
T
S
Li
中断源
中断向量
External Interrupt 0
Timer 0
External Interrupt 1
Timer 1
UART1
ADC interrupt
LVD
PCA
UART2
SPI
0003H
000BH
0013H
001BH
0023H
002BH
0033H
003BH
0043H
004BH
U
C
M
当“转去执行中断”时,引起中断的标志位将被硬件自动清零。由于中断向量入口地址位于
程序存储器的开始部分,所以主程序的第1条指令通常为跳转指令,越过中断向量区(LJMP
MAIN)。
注意:不能用RET指令代替RETI指令
RET指令虽然也能控制PC返回到原来中断的地方,但RET指令没有清零中断优先级状态触
发器的功能,中断控制系统会认为中断仍在进行,其后果是与此同级或低级的中断请求将不被
响应。
若用户在中断服务程序中进行了入栈操作,则在RETI指令执行前应进行相应的出栈操
作,即在中断服务程序中PUSH指令与POP指令必须成对使用,否则不能正确返回断点。
200
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站: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)还可以用于将单片机从掉电模式唤醒。
由于系统每个时钟对外部中断引脚采样1次,所以为了确保被检测到,输入信号应该至少
维持2个系统时钟。如果外部中断是仅下降沿触发,要求必须在相应的引脚维持高电平至少1个
系统时钟,而且低电平也要持续至少一个系统时钟,才能确保该下降沿被CPU检测到。同样,
如果外部中断是低电平可触发,则要求必须在相应的引脚维持低电平至少2个系统时钟,这样
才能确保CPU能够检测到该低电平信号。
C
T
S
南通国芯微电子有限公司
U
C
M
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
传真:0513-5501 2969 / 2956 / 2947
201
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.6 中断测试程序(C程序及汇编程序)
6.6.1 外部中断0(INT0)的测试程序(C程序及汇编程序)
1. 程序1——演示外部中断0的下降沿中断
C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机外部中断0�(下降沿) -----------------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
//External interrupt0 service routine
void exint0() interrupt 0
{
}
void main()
{
IT0 = 1;
EX0 = 1;
EA = 1;
C
T
S
U
C
M
.
d
e
t
i
m
Li
//INT0, interrupt 0 (location at 0003H)
//set INT0 interrupt type (1:Falling 0:Low level)
//enable INT0 interrupt
//open global interrupt switch
while (1);
}
202
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T系列单片机外部中断0�(下降沿) -----------------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -------------------------------------------- --*/
/* 如果要在程序中使用或在文章中引用该程序, ----------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 ----------*/
/*------------------------------------------------------------------------------------*/
;----------------------------------------;interrupt vector table
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EXINT0
;----------------------------------------
MAIN:
ORG
C
T
S
0100H
MOV SP,
SETB IT0
SETB EX0
SETB EA
SJMP $
#7FH
U
C
M
.
d
e
t
i
m
Li
;INT0, interrupt 0 (location at 0003H)
;initial SP
;set INT0 interrupt type (1:Falling 0:Low level)
;enable INT0 interrupt
;open global interrupt switch
;----------------------------------------;External interrupt0 service routine
EXINT0:
RETI
;----------------------------------------
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
203
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 程序2——演示外部中断0的下降沿中断唤醒掉电模式
C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机外部中断0�(下降沿)唤醒掉电模式 -----*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
//External interrupt0 service routine
void exint0( )
interrupt 0
{
}
void main()
{
IT0 = 1;
EX0 = 1;
EA = 1;
while (1)
{
}
U
C
M
.
d
e
t
i
m
Li
//INT0, interrupt 0 (location at 0003H)
C
T
S
//set INT0 interrupt type (1:Falling 0:Low level)
//enable INT0 interrupt
//open global interrupt switch
INT0 = 1;
while (!INT0);
_nop_();
_nop_();
PCON = 0x02;
_nop_();
_nop_();
P1++;
//ready read INT0 port
//check INT0
//MCU power down
}
204
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T系列单片机外部中断0�(下降沿)唤醒掉电模式 -----*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -------------------------------------------- --*/
/* 如果要在程序中使用或在文章中引用该程序, ----------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 ----------*/
/*------------------------------------------------------------------------------------*/
;----------------------------------------;interrupt vector table
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EXINT0
;----------------------------------------
MAIN:
LOOP:
ORG
0100H
MOV
SETB
SETB
SETB
SP,
IT0
EX0
EA
C
T
S
#7FH
SETB INT0
JNB INT0, $
NOP
NOP
MOV PCON, #02H
NOP
NOP
CPL P1.0
SJMP LOOP
.
d
e
t
i
m
Li
;INT0, interrupt 0 (location at 0003H)
U
C
M
;initial SP
;set INT0 interrupt type (1:Falling 0:Low level)
;enable INT0 interrupt
;open global interrupt switch
;ready read INT0 port
;check INT0
;MCU power down
;----------------------------------------;External interrupt0 service routine
EXINT0:
RETI
;----------------------------------------
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
205
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.6.2 外部中断1(INT1)的测试程序(C程序及汇编程序)
1. 程序1——演示外部中断1的下降沿中断
C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机外部中断1�(下降沿) -----------------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
//External interrupt1 service routine
void exint1() interrupt 2
{
}
void main()
{
IT1 = 1;
EX1 = 1;
EA = 1;
C
T
S
U
C
M
.
d
e
t
i
m
Li
//INT1, interrupt 2 (location at 0013H)
//set INT1 interrupt type (1:Falling only 0:Low level)
//enable INT1 interrupt
//open global interrupt switch
while (1);
}
206
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机外部中断1�(下降沿) -----------------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
.
d
e
t
i
m
;----------------------------------------;interrupt vector table
ORG 0000H
LJMP MAIN
ORG 0013H
LJMP EXINT1
C
T
S
;----------------------------------------
MAIN:
ORG
0100H
MOV SP,
SETB IT1
SETB EX1
SETB EA
SJMP $
#7FH
U
C
M
Li
;INT1, interrupt 2 (location at 0013H)
;initial SP
;set INT1 interrupt type (1:Falling 0:Low level)
;enable INT1 interrupt
;open global interrupt switch
;----------------------------------------;External interrupt1 service routine
EXINT1:
RETI
;----------------------------------------
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
207
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 程序2——演示外部中断1的下降沿中断唤醒掉电模式
C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机外部中断1�(下降沿)唤醒掉电模式 -----*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
//External interrupt0 service routine
void exint1( ) interrupt 2
{
}
void main()
{
IT1 = 1;
EX1 = 1;
EA = 1;
while (1)
{
}
U
C
M
.
d
e
t
i
m
Li
//INT1, interrupt 2 (location at 0013H)
C
T
S
//set INT1 interrupt type (1:Falling 0:Low level)
//enable INT1 interrupt
//open global interrupt switch
INT1 = 1;
while (!INT1);
_nop_();
_nop_();
PCON = 0x02;
_nop_();
_nop_();
P1++;
//ready read INT1 port
//check INT1
//MCU power down
}
208
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机外部中断1�(下降沿)唤醒掉电模式 -----*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
;----------------------------------------;interrupt vector table
ORG 0000H
LJMP MAIN
ORG 0013H
LJMP EXINT1
ORG
0100H
MOV
SETB
SETB
SETB
SP,#7FH
IT1
EX1
EA
Li
;INT1, interrupt 2 (location at 0013H)
;----------------------------------------
MAIN:
LOOP:
.
d
e
t
i
m
C
T
S
U
C
M
;initial SP
;set INT1 interrupt type (1:Falling 0:Low level)
;enable INT1 interrupt
;open global interrupt switch
SETB INT1
JNB INT1,$
NOP
NOP
MOV PCON,#02H
NOP
NOP
CPL P1.0
SJMP LOOP
;ready read INT1 port
;check INT1
;MCU power down
;----------------------------------------;External interrupt1 service routine
EXINT1:
RETI
;----------------------------------------
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
209
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.6.3 P3.4/T0/INT下降沿中断(可用于唤醒掉电模式)的测试程序
———— C程序及汇编程序
1. C程序:
/*---------------------------------------------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ------------------------------------------------------------------------------*/
/* --- 演示STC 1T 系列单片机P3.4/T0/INT下降沿中断(可将单片机从掉电模式唤醒) ----------------*/
/* --- 该中断借用了T0的中断请求标志TF0和T0的中断向量入口地址,此时定时器T0不要使用 ---*/
/* --- 该中断的允许位是WAKE_CLKO寄存器中的T0_PIN_IE/WAKE_CLKO.4位 ---------------------*/
/* --- Mobile: (86)13922809991 --------------------------------------------------------------------------------------*/
/* --- Fax: 86-755-82905966 ------------------------------------------------------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------------------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, --------------------------------------------------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 --------------------------------------------------*/
/*----------------------------------------------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
U
C
M
sfr WAKE_CLKO = 0x8f;
//External interrupt0 service routine
void t0int( ) interrupt 1
{
}
C
T
S
}
while (1)
{
}
210
T0 = 1;
while (!T0);
_nop_();
_nop_();
PCON = 0x02;
_nop_();
_nop_();
P1++;
南通国芯微电子有限公司
Li
//T0 interrupt, interrupt 1 (location at 000BH)
void main()
{
WAKE_CLKO = 0x10;
//ET0 = 1;
EA = 1;
.
d
e
t
i
m
//enable P3.4/T0/INT
��������
falling edge wakeup MCU
//from power-down mode
//T0_PIN_IE (WAKE_CLKO.4) = 1
//enable T0 interrupt
//open global interrupt switch
//ready read T0 port
//check T0
//MCU power down
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*---------------------------------------------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ------------------------------------------------------------------------------*/
/* --- 演示STC 1T 系列单片机P3.4/T0/INT下降沿中断(可将单片机从掉电模式唤醒) ----------------*/
/* --- 该中断借用了T0的中断请求标志TF0和T0的中断向量入口地址,此时定时器T0不要使用 ---*/
/* --- 该中断的允许位是WAKE_CLKO寄存器中的T0_PIN_IE/WAKE_CLKO.4位 ---------------------*/
/* --- Mobile: (86)13922809991 --------------------------------------------------------------------------------------*/
/* --- Fax: 86-755-82905966 ------------------------------------------------------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------------------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, --------------------------------------------------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 --------------------------------------------------*/
/*----------------------------------------------------------------------------------------------------------------------------*/
WAKE_CLKO EQU 8FH
;----------------------------------------;interrupt vector table
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0INT
;----------------------------------------
ORG 0100H
MAIN:
MOV SP,#7FH
MOV WAKE_CLKO, #10H
;SETB ET0
SETB EA
LOOP:
SETB T0
JNB T0
,$
NOP
NOP
MOV PCON, #02H
NOP
NOP
CPL P1.0
SJMP LOOP
;----------------------------------------;T0 interrupt service routine
C
T
S
U
C
M
.
d
e
t
i
m
Li
;T0 interrupt, interrupt 1 (location at 000BH)
;initial SP
;enable P3.4/T0/INT
��������
falling edge wakeup MCU
;from power-down mode
;T0_PIN_IE (WAKE_CLKO.4) = 1
;enable T0 interrupt
;open global interrupt switch
;ready read T0 port
;check T0
;MCU power down
T0INT:
RETI
;----------------------------------------
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
211
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.6.4 P3.5/T1/INT下降沿中断(可用于唤醒掉电模式)的测试程序
———— C程序及汇编程序
1. C程序:
/*---------------------------------------------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ------------------------------------------------------------------------------*/
/* --- 演示STC 1T 系列单片机P3.5/T1/INT下降沿中断(可将单片机从掉电模式唤醒) ----------------*/
/* --- 该中断借用了T1的中断请求标志TF1和T1的中断向量入口地址,此时定时器T1不要使用 ---*/
/* --- 该中断的允许位是WAKE_CLKO寄存器中的T1_PIN_IE/WAKE_CLKO.5位 ---------------------*/
/* --- Mobile: (86)13922809991 --------------------------------------------------------------------------------------*/
/* --- Fax: 86-755-82905966 ------------------------------------------------------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------------------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, --------------------------------------------------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 --------------------------------------------------*/
/*----------------------------------------------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
sfr
U
C
M
WAKE_CLKO = 0x8f;
//External interrupt0 service routine
void t1int() interrupt 3
{
}
C
T
S
}
while (1)
{
}
212
T1 = 1;
while (!T1);
_nop_();
_nop_();
PCON = 0x02;
_nop_();
_nop_();
P1++;
南通国芯微电子有限公司
Li
//T1 interrupt, interrupt 3 (location at 001BH)
void main()
{
WAKE_CLKO = 0x20;
//ET1 = 1;
EA = 1;
.
d
e
t
i
m
//enable P3.5/T1/INT
��������
falling edge wakeup MCU
//from power-down mode
//T1_PIN_IE / WAKE_CLKO.5 = 1
//enable T1 interrupt
//open global interrupt switch
//ready read T1 port
//check T1
//MCU power down
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*---------------------------------------------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ------------------------------------------------------------------------------*/
/* --- 演示STC 1T 系列单片机P3.5/T1/INT下降沿中断(可将单片机从掉电模式唤醒) ----------------*/
/* --- 该中断借用了T1的中断请求标志TF1和T1的中断向量入口地址,此时定时器T1不要使用 ---*/
/* --- 该中断的允许位是WAKE_CLKO寄存器中的T1_PIN_IE/WAKE_CLKO.5位 ---------------------*/
/* --- Mobile: (86)13922809991 --------------------------------------------------------------------------------------*/
/* --- Fax: 86-755-82905966 ------------------------------------------------------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------------------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, --------------------------------------------------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 --------------------------------------------------*/
/*----------------------------------------------------------------------------------------------------------------------------*/
WAKE_CLKO EQU 8FH
;----------------------------------------;interrupt vector table
ORG 0000H
LJMP MAIN
U
C
M
ORG 001BH
LJMP T1INT
;----------------------------------------
ORG 0100H
MAIN:
MOV SP,
#7FH
MOV WAKE_CLKO, #20H
;SETB ET1
SETB EA
LOOP:
SETB T1
JNB T1,
$
NOP
NOP
MOV PCON, #02H
NOP
NOP
CPL P1.0
SJMP LOOP
;----------------------------------------;T1 interrupt service routine
C
T
S
.
d
e
t
i
m
Li
;T1 interrupt, interrupt 3 (location at 001BH)
;initial SP
;enable P3.5/T1/INT
��������
falling edge wakeup MCU
;from power-down mode
;T1_PIN_IE / WAKE_CLKO.5 = 1
;enable T1 interrupt
;open global interrupt switch
;ready read T1 port
;check T1
;MCU power down
T1INT:
RETI
;----------------------------------------
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
213
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.6.5 P3.0/RxD/INT下降沿中断(可用于唤醒掉电模式)的测试程序
———— C程序及汇编程序
1. C程序:
/*---------------------------------------------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ------------------------------------------------------------------------------*/
/* --- 演示STC 1T 系列单片机串行口P3.0/RxD/INT下降沿,可将单片机从掉电模式唤醒 -------------*/
/* --- 该中断借用了RxD的中断请求标志RI和中断向量入口地址,此时RxD不要作串行口使用 ---*/
/* --- 该中断的允许位是WAKE_CLKO寄存器中的RxD_PIN_IE/WAKE_CLKO.6位 -------------------*/
/* --- Mobile: (86)13922809991 --------------------------------------------------------------------------------------*/
/* --- Fax: 86-755-82905966 ------------------------------------------------------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------------------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, --------------------------------------------------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 --------------------------------------------------*/
/*----------------------------------------------------------------------------------------------------------------------------*/
U
C
M
#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
C
T
S
.
d
e
t
i
m
Li
/*Declare SFR associated with the RxD */
sfr WAKE_CLKO = 0x8F;
void uart_isr() interrupt 4 using 1
{
if (RI)
{
RI = 0;
}
}
void main()
{
WAKE_CLKO = 0x40;
ES = 1;
EA = 1;
214
南通国芯微电子有限公司
//enable P3.0/RxD/INT falling edge wakeup MCU
//from power-down mode
//RxD_PIN_IE (WAKE_CLKO.6) = 1
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
while (1)
{
}
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
RXD = 1;
while (!RXD);
_nop_();
_nop_();
PCON = 0x02;
_nop_();
_nop_();
P2++;
//ready read RXD port
//check RXD
//MCU power down
}
2. 汇编程序:
.
d
e
t
i
m
Li
/*---------------------------------------------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ------------------------------------------------------------------------------*/
/* --- 演示STC 1T 系列单片机串行口P3.0/RxD/INT下降沿,可将单片机从掉电模式唤醒 -------------*/
/* --- 该中断借用了RxD的中断请求标志RI和中断向量入口地址,此时RxD不要作串行口使用 ---*/
/* --- 该中断的允许位是WAKE_CLKO寄存器中的RxD_PIN_IE/WAKE_CLKO.6位 -------------------*/
/* --- Mobile: (86)13922809991 --------------------------------------------------------------------------------------*/
/* --- Fax: 86-755-82905966 ------------------------------------------------------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------------------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, --------------------------------------------------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 --------------------------------------------------*/
/*----------------------------------------------------------------------------------------------------------------------------*/
C
T
S
U
C
M
;/*Declare SFR associated with the RxD */
WAKE_CLKO EQU 8FH
;----------------------------------------
ORG 0000H
LJMP MAIN
ORG 0023H
UART_ISR:
JBC RI,
EXIT
EXIT:
RETI
;----------------------------------------南通国芯微电子有限公司
;clear RI flag
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
215
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
ORG 0100H
MAIN:
MOV WAKE_CLKO, #40H
SETB ES
SETB EA
LOOP:
SETB RXD
JNB RXD, $
NOP
NOP
MOV PCON, #02H
NOP
NOP
CPL P1.0
SJMP LOOP
;----------------------------------------
216
END
C
T
S
南通国芯微电子有限公司
临时技术支持:13922829991
研发顾问:13922809991
;enable P3.0/RxD/INT falling edge wakeup MCU
;from power-down mode
;RxD_PIN_IE (WAKE_CLKO.6) = 1
;ready read RXD port
;check RXD
.
d
e
t
i
m
;MCU power down
U
C
M
Li
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.6.6 低压检测LVD中断(可用于唤醒掉电模式)的测试程序
1. C程序:
/*----------------------------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- --------------------------------------------------------------*/
/* --- 演示STC 1T 系列单片机低压检测LVD中断,可将单片机从掉电模式唤醒 ----------*/
/* --- Mobile: (86)13922809991 ----------------------------------------------------------------------*/
/* --- Fax: 86-755-82905966 --------------------------------------------------------------------------*/
/* --- Tel: 86-755-82948412 ---------------------------------------------------------------------------*/
/* --- Web: www.STCMCU.com ----------------------------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, ----------------------------------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 ----------------------------------*/
/*------------------------------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
sfr
sfr
sbit
WAKE_CLKO = 0x8f;
P4SW = 0xbb;
ELVD = IE^6;
//External interrupt0 service routine
void lvdint() interrupt 6
{
PCON &= 0xdf;
}
C
T
S
U
C
M
.
d
e
t
i
m
Li
//LVD interrupt, interrupt 6 (location at 0033H)
//clear LVD flag
void main()
{
P4SW &= 0xbf;
//Set P4.6 as LVD function pin
WAKE_CLKO = 0x08;
//enable LVD signal wakeup MCU from power-down mode
ELVD = 1;
//enable LVD interrupt
EA = 1;
//open global interrupt switch
while (1)
{
while (PCON & 0x20)
{
PCON &= 0xdf;
//clear LVD flag
_nop_();
_nop_();
_nop_();
_nop_();
}
_nop_();
_nop_();
PCON = 0x02;
//MCU power down
_nop_();
_nop_();
P1++;
}
}
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
217
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*----------------------------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- --------------------------------------------------------------*/
/* --- 演示STC 1T 系列单片机低压检测LVD中断,可将单片机从掉电模式唤醒 ----------*/
/* --- Mobile: (86)13922809991 ----------------------------------------------------------------------*/
/* --- Fax: 86-755-82905966 --------------------------------------------------------------------------*/
/* --- Tel: 86-755-82948412 ---------------------------------------------------------------------------*/
/* --- Web: www.STCMCU.com ----------------------------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, ----------------------------------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 ----------------------------------*/
/*------------------------------------------------------------------------------------------------------------*/
WAKE_CLKO EQU 8FH
P4SW
EQU 0BBH
ELVD
BIT
IE.6
;----------------------------------------;interrupt vector table
ORG 0000H
LJMP MAIN
ORG 0033H
LJMP LVDINT
C
T
S
U
C
M
.
d
e
t
i
m
Li
;LVD interrupt, interrupt 6 (location at 0033H)
;----------------------------------------
MAIN:
LOOP:
218
ORG
0100H
MOV SP,
#7FH
ANL P4SW, #0BFH
MOV WAKE_CLKO,#08H
SETB ELVD
SETB EA
ANL PCON, #0DFH
NOP
NOP
NOP
NOP
MOV A,
PCON
JB
ACC.5, LOOP
南通国芯微电子有限公司
;initial SP
;Set P4.6 as LVD function pin
;enable LVD signal wakeup MCU from power-down mode
;enable LVD interrupt
;open global interrupt switch
;clear LVD flag
;check LVD flag
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
NOP
NOP
MOV PCON, #02H
NOP
NOP
CPL P1.0
SJMP LOOP
临时技术支持:13922829991
研发顾问:13922809991
;MCU power down
;----------------------------------------;T1 interrupt service routine
LVDINT:
ANL
RETI
PCON, #0DFH
;clear LVD flag
;----------------------------------------
END
C
T
S
南通国芯微电子有限公司
U
C
M
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
传真:0513-5501 2969 / 2956 / 2947
219
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6.6.7 PCA模块中断(可用于唤醒掉电模式)的测试程序
1. C程序:
/*----------------------------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- --------------------------------------------------------------*/
/* --- 演示STC 1T 系列单片机PCA模块中断,可将单片机从掉电模式唤醒 ----------------*/
/* --- Mobile: (86)13922809991 ----------------------------------------------------------------------*/
/* --- 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 unsigned char BYTE;
typedef unsigned int WORD;
/*Declare SFR associated with the PCA */
sfr
WAKE_CLKO = 0x8F;
sfr
sbit
sbit
sbit
sbit
sfr
sfr
sfr
sfr
sfr
sfr
sfr
sfr
sfr
sfr
sfr
sfr
sfr
sfr
sfr
sfr
sfr
sfr
sfr
220
CCON =
CCF0 =
CCF1 =
CR
=
CF
=
CMOD =
CL
=
CH
=
CCAPM0=
CCAP0L =
CCAP0H =
CCAPM1=
CCAP1L =
CCAP1H =
CCAPM2=
CCAP2L =
CCAP2H =
CCAPM3=
CCAP3L =
CCAP3H =
PCAPWM0
PCAPWM1
PCAPWM2
PCAPWM3
C
T
S
0xD8;
CCON^0;
CCON^1;
CCON^6;
CCON^7;
0xD9;
0xE9;
0xF9;
0xDA;
0xEA;
0xFA;
0xDB;
0xEB;
0xFB;
0xDC;
0xEC;
0xFC;
0xDD;
0xED;
0xFD;
= 0xF2;
= 0xF3;
= 0xF4;
= 0xF5;
南通国芯微电子有限公司
U
C
M
Li
//PCA control register
//PCA module-0 interrupt flag
//PCA module-1 interrupt flag
//PCA timer run control bit
//PCA timer overflow flag
//PCA mode register
//PCA base timer LOW
//PCA base timer HIGH
//PCA module-0 mode register
//PCA module-0 capture register LOW
//PCA module-0 capture register HIGH
//PCA module-1 mode register
//PCA module-1 capture register LOW
//PCA module-1 capture register HIGH
//PCA module-2 mode register
//PCA module-2 capture register LOW
//PCA module-2 capture register HIGH
//PCA module-3 mode register
//PCA module-3 capture register LOW
//PCA module-3 capture register HIGH
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
sbit
sbit
技术支持网站:www.STCMCU.com
PCA_LED = P1^0;
CCP0
= P1^3;
CL = 0;
CH = 0;
CMOD = 0x00;
CCAPM0 = 0x11;
//
CCAPM0 = 0x21;
//
CCAPM0 = 0x31;
while (1)
{
}
.
d
e
t
i
m
Li
//Set PCA timer clock source as Fosc/12
//Disable PCA timer overflow interrupt
//PCA module-0 capture by a negative tigger on CCP0(P1.3)
//and enable PCA interrupt
//PCA module-0 capture by a rising edge on CCP0(P1.3)
//and enable PCA interrupt
//PCA module-0 capture by a transition (falling/rising edge)
//on CCP0(P1.3) and enable PCA interrupt
C
T
S
WAKE_CLKO = 0x80;
CR = 1;
EA = 1;
//Clear interrupt flag
//toggle the test pin while CCP0(P1.3) have a falling edge
//Initial PCA control register
//PCA timer stop running
//Clear CF flag
//Clear all module interrupt flag
//Reset PCA base timer
研发顾问:13922809991
//PCA test LED
void PCA_isr() interrupt 7 using 1
{
CCF0 = 0;
PCA_LED = !PCA_LED;
}
void main()
{
CCON = 0;
临时技术支持:13922829991
U
C
M
//enable PCA falling/raising edge wakeup MCU from power-down mode
//PCA timer start run
CCP0 = 1;
while (!CCP0);
_nop_();
_nop_();
PCON = 0x02;
_nop_();
_nop_();
P2++;
//ready read CCP0 port
//check CCP0
//MCU power down
}
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
221
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*----------------------------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- --------------------------------------------------------------*/
/* --- 演示STC 1T 系列单片机PCA模块中断,可将单片机从掉电模式唤醒 ----------------*/
/* --- Mobile: (86)13922809991 ----------------------------------------------------------------------*/
/* --- Fax: 86-755-82905966 --------------------------------------------------------------------------*/
/* --- Tel: 86-755-82948412 ---------------------------------------------------------------------------*/
/* --- Web: www.STCMCU.com ----------------------------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, ----------------------------------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 ----------------------------------*/
/*------------------------------------------------------------------------------------------------------------*/
.
d
e
t
i
m
;/*Declare SFR associated with the PCA */
WAKE_CLKO EQU 8FH
CCON EQU
CCF0 BIT
CCF1 BIT
CR
BIT
CF
BIT
CMOD EQU
CL
EQU
CH
EQU
CCAPM0
CCAP0L
CCAP0H
CCAPM1
CCAP1L
CCAP1H
CCAPM2
CCAP2L
CCAP2H
CCAPM3
CCAP3L
CCAP3H
0D8H
CCON.0
CCON.1
CCON.6
CCON.7
0D9H
0E9H
0F9H
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
0DAH
0EAH
0FAH
0DBH
0EBH
0FBH
0DCH
0ECH
0FCH
0DDH
0EDH
0FDH
PCA_LED
CCP0
BIT
BIT
P1.1
P1.3
222
U
C
M
C
T
S
南通国芯微电子有限公司
Li
;PCA control register
;PCA module-0 interrupt flag
;PCA module-1 interrupt flag
;PCA timer run control bit
;PCA timer overflow flag
;PCA mode register
;PCA base timer LOW
;PCA base timer HIGH
;PCA module-0 mode register
;PCA module-0 capture register LOW
;PCA module-0 capture register HIGH
;PCA module-1 mode register
;PCA module-1 capture register LOW
;PCA module-1 capture register HIGH
;PCA module-2 mode register
;PCA module-2 capture register LOW
;PCA module-2 capture register HIGH
;PCA module-3 mode register
;PCA module-3 capture register LOW
;PCA module-3 capture register HIGH
;PCA test LED
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;----------------------------------------
ORG 0000H
LJMP MAIN
ORG 003BH
PCA_ISR:
CLR CCF0
;Clear interrupt flag
CPL PCA_LED
;toggle the test pin while CCP0(P1.3) have a falling edge
RETI
;----------------------------------------
ORG 0100H
MAIN:
MOV CCON, #0
;Initial PCA control register
;PCA timer stop running
;Clear CF flag
;Clear all module interrupt flag
CLR A
;
MOV CL,
A
;Reset PCA base timer
MOV CH,
A
;
MOV CMOD, #00H
;Set PCA timer clock source as Fosc/12
;Disable PCA timer overflow interrupt
MOV CCAPM0,
#11H ;PCA module-0 capture by a falling edge on CCP0(P1.3)
;and enable PCA interrupt
;
MOV CCAPM0,
#21H ;PCA module-0 capture by a rising edge on CCP0(P1.3)
;and enable PCA interrupt
;
MOV CCAPM0,
#31H ;PCA module-0 capture by a transition (falling/rising edge)
;on CCP0(P1.3) and enable PCA interrupt
;------------------------------
MOV WAKE_CLKO, #80H
;enable PCA falling/raising edge wakeup MCU from
;power-down mode
SETB CR
;PCA timer start run
SETB EA
U
C
M
C
T
S
LOOP:
SETB CCP0
JNB CCP0, $
NOP
NOP
MOV PCON, #02H
NOP
NOP
CPL P1.0
SJMP LOOP
;----------------------------------------
END
南通国芯微电子有限公司
.
d
e
t
i
m
Li
;ready read CCP0 port
;check CCP0
;MCU power down
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
223
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
第7章 定时器/计数器
STC12C5A60S2系列��������������������������������
单片机有4个定时器,其中定时器0和定时器1两个16位定时器,与传
统8051的定时器完全兼容,也可以设置为1T模式,当在定时器1做波特率发生器时,定时器0可
以当两个8位定时器用(另外2路PCA/PWM可以再实现2个16位定时器)。
STC12C5A60S2系列���������������������������������
单片机内部设置的两个16位定时器/计数器T0和T1都具有计数方式和
定时方式两种工作方式。对每个定时器/计数器(T0和T1),在特殊功能寄存器TMOD中都有一控
制位— C/T来选择T0或T1为定时器还是计数器。定时器/计数器的核心部件是一个加法(也有减
法)的计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统时
钟,则为定时方式,此时定时器/计数器每12个时钟或者每1个时钟得到一个计数脉冲,计数值
加1;如果计数脉冲来自单片机外部引脚(T0为P3.4,T1为P3.5),则为计数方式,每来一个脉冲
加1。
.
d
e
t
i
m
当定时器/计数器工作在定时模式时,特殊功能寄存器AUXR中的T0x12和T1x12分别决定是
系统时钟/12还是系统时钟/1(不分频)后让T0和T1进行计数。当定时器/计数器工作在计数模式
时,对外部脉冲计数不分频。
U
C
M
Li
定时器/计数器0有4种工作模式:模式0(13位定时器/计数器),模式1(16位定时器/计数器
模式),模式2(8位自动重装模式),模式3(两个8位定时器/计数器)。定时器/计数器1除模式3
外,其他工作模式与定时器/计数器0相同,T1在模式3时无效,停止计数。
C
T
S
7.1 定时器/计数器的相关寄存器
符号
描述
地址
TCON
定时器控制寄存器 88H
TMOD
TL0
TL1
TH0
TH1
AUXR
89H
8AH
8BH
8CH
8DH
8EH
定时器模式寄存器
Timer Low 0
Timer Low 1
Timer High 0
Timer High 1
辅助寄存器
时钟输出和掉电唤
WAKE_CLKO
醒寄存器
224
南通国芯微电子有限公司
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
0000 0000B
T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12
EXTRAM
S1BRS
PCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PI_IE LVD_WAKE BRTCLKO T1CLKO T0CLKO
总机:0513-5501 2928 / 2929 / 2966
0000 0000B
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1. 定时器/计数器控制寄存器TCON
TCON为定时器/计数器T0、T1的控制寄存器,同时也锁存T0、T1溢出中断源和外部请求
中断源等,TCON格式如下:
TCON : 定时器/计数器中断控制寄存器 (可位寻址)
SFR name
TCON
Address
88H
bit
name
B7
TF1
B6
TR1
B5
TF0
B4
TR0
B3
IE1
B2
IT1
B1
IE0
B0
IT0
TF1: 定时器/计数器T1溢出标志。T1被允许计数以后,从初值开始加1计数。当最高位产生溢
出时由硬件置“1”TF1,向CPU请求中断,一直保持到CPU响应中断时,才由硬件清
“0”TF1(TF1也可由程序查询清“0”)。
TR1: 定时器T1的运行控制位。该位由软件置位和清零。当GATE(TMOD.7)=0,TR1=1时就
允许T1开始计数,TR1=0时禁止T1计数。当GATE(TMOD.7)=1,TR1=1且INT1 输入
高电平时,才允许T1计数。
.
d
e
t
i
m
TF0:定时器/计数器T0溢出中断标志。T0被允许计数以后,从初值开始加1计数,当最高位产
生溢出时,由硬件置“1”TF0,向CPU请求中断,一直保持CPU响应该中断时,才由硬
件清“0”TF0( TF0也可由程序查询清“0”)。
U
C
M
Li
TR0: 定时器T0的运行控制位。该位由软件置位和清零。当GATE(TMOD.3)=0,TR0=1时就
允许T0开始计数,TR0=0时禁止T0计数。当GATE(TMOD.3)=1,TR1=0且INT0 输入
高电平时,才允许T0计数。
C
T
S
IE1:外部中断1请求源(INT1 /P3.3)标志。IE1=1,外部中断向CPU请求中断,当CPU响应该
中断时由硬件清“0”IE1。
IT1:外部中断1触发方式控制位。IT1=0时,外部中断1为低电平触发方式,当INT1(P3.3)
输入低电平时,置位IE1 。采用低电平触发方式时,外部中断源(输入到INT1)必须保
持低电平有效,直到该中断被CPU 响应,同时在该中断服务程序执行完之前,外部中断
源必须被清除(P3.3要变高),否则将产生另一次中断。当IT1=1时,则外部中断1(INT1 )
端口由“1”→“0”下降沿跳变,激活中断请求标志位IE1 ,向主机请求中断处理。
IE0:外部中断0请求源(INT0/P3.2)标志。IE0=1外部中断0向CPU请求中断,当CPU响应外
部中断时,由硬件清“0”IE0(边沿触发方式)。
IT0:外部中断0触发方式控制位。IT0=0时,外部中断0为低电平触发方式,当INT0(P3.2)
输入低电平时,置位IE0。采用低电平触发方式时,外部中断源(输入到INT0)必须保
持低电平有效,直到该中断被CPU响应,同时在该中断服务程序执行完之前,外部中断源
必须被清除(P3.2要变高),否则将产生另一次中断。当IT0=1时,则外部中断0�(INT0)
端口由“1”→“0”下降沿跳变,激活中断请求标志位IE1 ,向主机请求中断处理。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
225
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 定时器�����������
/����������
计数器工作模式寄存器TMOD
定时和计数功能由特殊功能寄存器TMOD的控制位C/T进行选择,TMOD寄存器的各位信
息如下表所列。可以看出,2个定时/计数器有4种操作模式,通过TMOD的M1和M0选择。2个
定时/计数器的模式0、1和2都相同,模式3不同,各模式下的功能如下所述。
寄存器TMOD各位的功能描述
TMOD 地址:89H
不可位寻址
7
复位值:00H
6
GATE
5
C/T
M1
4
3
M0
GATE
TMOD.7/
TMOD.3/
GATE
TMOD.3控制定时器0,置1时只有在INT0脚为高及TR0控制位置1
时才可打开定时器/计数器0。
C
T
S
TMOD.2/
C/T
0
0
0
1
1
0
1
1
TMOD.1/TMOD.0 M1、M0
0
226
0
0
1
1
0
1
1
U
C
M
Li
TMOD.6控制定时器1用作定时器或计数器,清零则用作定时器
(从内部系统时钟输入),置1用作计数器(从T1/P3.5脚输入)
TMOD.2控制定时器0用作定时器或计数器,清零则用作定时器
(从内部系统时钟输入),置1用作计数器(从T0/P3.4脚输入)
TMOD.5/TMOD.4 M1、M0
.
d
e
t
i
m
功能
TMOD.7控制定时器1,置1时只有在INT1脚为高及TR1控制位置1
时才可打开定时器/计数器1。
C/T
M0
符号
GATE
TMOD.6/
M1
C/T
0
定时器0
定时器1
位
2 1
南通国芯微电子有限公司
定时器定时器/计数器1模式选择
13位定时器/计数器,兼容8048定时模式,TL1只用低5位参与
分频,TH1整个8位全用。
16位定时器/计数器,TL1、TH1全用
8位自动重装载定时器,当溢出时将TH1存放的值自动重装入TL1.
定时器/计数器1此时无效(停止计数)。
定时器/计数器0模式选择
13位定时器/计数器,兼容8048定时模式,TL0只用低5位参与
分频,TH0整个8位全用。
16位定时器/计数器,TL0、TH0全用
8位自动重装载定时器,当溢出时将TH0存放的值自动重装入TL0
定时器0此时作为双8位定时器/计数器。TL0作为一个8位定时
器/计数器,通过标准定时器0的控制位控制。TH0仅作为一个
8位定时器,由定时器1的控制位控制。
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
3. 辅助寄存器AUXR
STC12C5A60S2系列����
单片机�
是 1T 的8051单片机,为兼容传统8051,定时器0和定时器1复
位后是传统8051的速度,即12分频,这是为了兼容传统8051。但也可不进行12分频,通过设
置新增加的特殊功能寄存器AUXR,将T0,T1设置为1T。普通111条机器指令是固定的,快3到24
倍,无法改变。
AUXR格式如下:
AUXR : 辅助寄存器
SFR name
AUXR
Address
8EH
bit
B7
B6
B5
B4
B3
B2
B1
B0
name T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS
T0x12:定时器0速度控制位�
。
0����������������������������
:定时器0速度是8051单片机定时器的速度,即12分频;
1:定时器0速度是8051单片机定时器速度的12倍,即不分频。
T1x12:定时器1速度控制位�
。
0����������������������������
:定时器1速度是8051单片机定时器的速度,即12分频;
1:定时器1速度是8051单片机定时器速度的12倍,即不分频。
如果UART串口用T1作为波特率发生器,则由T1x12位决定UART串口是12T还是1T。
U
C
M
.
d
e
t
i
m
Li
UART 串口的模式0:
STC12C5A60S2系列是1T的8051单片机,为了兼容传统8051,UART串口复位后是兼容传统8051的�
。
UART_M0x6:串口模式0的通信速度设置位�
。
0�����������������������������������
:UART串口模式0的速度是传统8051单片机串口的速度,即12分频;
1:UART串口模式0的速度是传统8051单片机串口速度的6倍,即2分频。
如果用定时器T1做波特率发生器时,UART串口的速度由T1的溢出率决定
C
T
S
BRTR:独立波特率发生器运行控制位�
。
0���������������
:不允许独立波特率发生器运行;
1:允许独立波特率发生器运行。
S2SMOD:UART2的波特率加倍控制位�
。
0�
:UART2的波特率不加倍;
1:UART2的波特率加倍。
BRTx12:独立波特率发生器计数控制位�
。
0��������������������
:独立波特率发生器每12个时钟计数一次;
1:独立波特率发生器每1个时钟计数一次。
EXTRAM:内部/外部RAM存取控制位�
。
0����������������������
:允许使用内部扩展的1024字节扩展RAM;
1:禁止使用内部扩展的1024字节扩展RAM。
S1BRS:串口1(UART1)的波特率发生器选择位�
。
0�������������
:选择定时器1作为串口1(UART1)的波特率发生器;
1:选择独立波特率发生器作为串口1(UART1)的波特率发生器,此时定时器1得到释放,可
以作为独立定时器使用。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
227
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
4. WAKE_CLKO:时钟输出和掉电唤醒寄存器
SFR name
Address
WAKE_CLKO
8FH
bit
B7
B6
B5
B4
B3
B2
B1
B0
name PCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_WAKE BRTCLKO T1CLKO T0CLKO
PCAWAKEUP:在掉电模式下,是否��
允许PCA上升沿/下降沿中断唤醒powerdown。
0�����������������
:禁止PCA上升沿/下降沿中断��
唤醒powerdown ;
1:允许PCA上升沿/下降沿中断唤醒powerdown 。
RXD_PIN_IE:掉电模式下,允许P3.0(RXD)下降沿置RI,也能使RXD唤醒powerdown.
0���
:禁止P3.0(RXD)下降沿置RI,也��
禁止RXD唤醒powerdown ;
1:允许P3.0(RXD)下降沿置RI,也��
允许RXD唤醒powerdown 。
T1_PIN_IE:掉电模式下,允许T1/P3.5脚下降沿置T1中断标志,也能使T1脚唤醒powerdown.
0���
:禁止T1/P3.5脚下降沿置T1中断标志,也��
禁止T1脚唤醒powerdown ;
1:允许T1/P3.5脚下降沿置T1中断标志,也��
允许T1脚唤醒powerdown 。
.
d
e
t
i
m
Li
T0_PIN_IE:掉电模式下,允许T0/P3.4脚下降沿置T0中断标志,也能使T0脚唤醒powerdown.
0���
:禁止T0/P3.4脚下降沿置T0中断标志,也��
禁止T0脚唤醒powerdown ;
1:允许T0/P3.4脚下降沿置T0中断标志,也��
允许T0脚唤醒powerdown 。
U
C
M
LVD_WAKE: 掉电模式下,是否允EX_LVD/P4.6低压检测中断唤醒CPU.
0:禁止EX_LVD/P4.6低压检测中断唤醒CPU
C
T
S
1:允许EX_LVD/P4.6低压检测中断唤醒CPU。
BRTCLKO:是否允许将P1.0脚配置为独立波特率发生器(BRT)的时钟输出CLKOUT2
1: 允许将P1.0脚���
配置为独立波特率发生器(BRT)的时钟输出CLKOUT2,
输出时钟频率=BRT溢出率/2
BRT工作在1T模式时的输出频率 = SYSclk / ( 256 - BRT ) / 2
BRT工作在12T模式时的输出频率 = SYSclk / 12 / (256 - BRT) / 2
0: 不允许�
将P1.0脚���
配置为独立波特率发生器(BRT)的时钟输出CLKOUT2
T1CLKO: 是否允许将P3.5/T1脚配置为定时器T1的时钟输出CLKOUT1
1: 允许将P3.5/T1脚配置为定时器T1的时钟输出CLKOUT1,������������
此时定时器T1只能工作
在模式2(8位自动重装模式),CLKOUT1输出时钟频率= T1溢出率/2
T1工作在1T模式时的输出频率 = SYSclk / ( 256 - TH1 ) / 2
T1工作在12T模式时的输出频率 = SYSclk / 12 / (256 - TH1) / 2
0����
:���
不允许将P3.5/T1脚配置为定时器T1的时钟输出CLKOUT1
T0CLKO:是否允许将P3.4/T0脚配置为定时器T0的时钟输出CLKOUT0
1:��
允许将P3.4/T0脚配置为定时器T0的时钟输出CLKOUT0,�������������
此时定时器T0只能工作在
模式2(8位自动重装模式),CLKOUT0输出时钟频率 = T0溢出率 / 2
T0工作在1T 模式时的输出频率 = SYSclk / ( 256 - TH0 ) / 2
T0工作在12T模式时的输出频率 = SYSclk / 12 / (256 - TH0) / 2
0:���
不允许将P3.4/T0脚配置为定时器T0的时钟输出CLKOUT0
228
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.2 定时器/计数器0工作模式(与传统8051单片机兼容)
通过对寄存器TMOD中的M1(TMOD.1)、M0(TMOD.0)的设置,定时器/计数器0有4种不同的
工作模式
7.2.1 模式0(13位定时器/计数器)
将定时器设置成模式0时类似8048定时器,即8位计数器带32分频的预分频器。下图所示
为��������������������������������������������
定时器�����������������������������������������
/����������������������������������������
计数器的������������������������������������
模式0工作方式。此模式下,定时器0配置为13位的计数器,由TL0的低5位
和TH0的8位所构成。TL0低5位溢出向TH0进位,TH0计数溢出置位TCON中的溢出标志位TF0。
GATE(TMOD.3)=0 时,如TR0=1,则定时器计数。GATE=1 时,允许由外部输入INT1控制定时器
1,INT0控制定时器0,这样可实现脉宽测量。TR0为TCON寄存器内的控制位,TCON寄存器各位
的具体功能描述见TCON寄存器各位的具体功能描述表。
.
d
e
t
i
m
在模式0下定时器������������������������
/�����������������������
计数器��������������������
0�������������������
作为�����������������
13���������������
位定时器/计数器,如下图所示。
AUXR.7/T0x12=0
÷12
SYSclk
÷1
AUXR.7/T0x12=1
T0 Pin
C
T
S
GATE
INT0
U
C
M
C/T=0
C/T=1
TR0
Li
TL0
(5 bits)
TH0
(8 bits)
TF0
Interrupt
control
定时器/计数器0的模式 0: 13位定时器/计数器
当C/T=0时,多路开关连接到系统时钟的分频输出,T0对时钟周期计数,T0工作在定时方
式。当C/T=1时,多路开关连接到外部脉冲输入P3.4/T0,即T0工作在计数方式。
STC12C5A60S2�����������������������������������
系列单片机的定时器有两种计数速率:一种是���������������
12T������������
模式,每��������
12������
个时钟加��
1�
,
与传统��������������������������������������������
8051����������������������������������������
单片机相同;另外一种是�����������������������������
1T���������������������������
模式,每个时钟加�������������������
1������������������
,速度是传统������������
8051��������
单片机的����
12��
倍。
T0�������������������������������������������������
的速率由特殊功能寄存器��������������������������������������
AUXR����������������������������������
中的��������������������������������
T0x12���������������������������
决定,如果����������������������
T0x12=0���������������
,��������������
T0������������
则工作在��������
12T�����
模式;如果
T0x12=1������������
,�����������
T0���������
则工作在�����
1T���
模式。
该���������������������������������������������
模式下的�����������������������������������������
13位寄存器包含TH0全部8个位及TL0的低5位。TL0的高3位不定,可将其忽略。
置位运行标志(TR0)不能清零此寄存器。模式0的操作对于定时器0及定时器1都是相同的。2
个不同的GATE位(TMOD.7和TMOD.3)分别分配给定时器1及定时器0。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
229
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.2.2 模式1(16位定时器/计数器)及测试程序
模式1除了使用了TH0及TL0全部16位外,其他与模式0完全相同。�
即此模式下定时器���
/��
计数
器��������������������
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
.
d
e
t
i
m
INT0
定时器/计数器0的模式 1: 16位定时器/计数器
Li
此模式下,定时器配置为�����������������������������������
16���������������������������������
位定时器/计数器,由�����������������������
TL0��������������������
的�������������������
8������������������
位和����������������
TH0�������������
的������������
8�����������
位所构成。������
TL0���
的8位
溢出向������������������������������
TH0���������������������������
进位,������������������������
TH0���������������������
计数溢出置位���������������
TCON�����������
中的溢出标志位����
TF0�
。
U
C
M
当�������
GATE=0(TMOD.3)时,如TR0=1,则定时器计数。GATE=1时,允许由外部输入INT0控制定
时器0,这样可实现脉宽测量。TR0为TCON寄存器内的控制位,TCON寄存器各位的具体功能描述
见上节�����������
TCON寄存器����
的介绍�
。
C
T
S
当C/T=0时,多路开关连接到系统时钟的分频输出,T0对时钟周期计数,T0工作在定时方
式。当C/T=1时,多路开关连接到外部脉冲输入P3.4/T0,即T0工作在计数方式。
STC12C5A60S2系列单片机的定时器有两种计数速率:一种是���������������
12T������������
模式,每��������
12������
个时钟加��
1�
,
与传统��������������������������������������������
8051����������������������������������������
单片机相同;另外一种是�����������������������������
1T���������������������������
模式,每个时钟加�������������������
1������������������
,速度是传统������������
8051��������
单片机的����
12��
倍。
T0�������������������������������������������������
的速率由特殊功能寄存器��������������������������������������
AUXR����������������������������������
中的��������������������������������
T0x12���������������������������
决定,如果����������������������
T0x12=0���������������
,��������������
T0������������
则工作在��������
12T�����
模式;如果
T0x12=1������������
,�����������
T0���������
则工作在�����
1T���
模式。
230
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
定时器0工作在16位定时器/计数器模式的测试程序
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机定时器0的16位定时器/计数器模式 --*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
//-----------------------------------------------
.
d
e
t
i
m
Li
/* define constants */
#define FOSC 18432000L
#define MODE1T
//Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
U
C
M
#ifdef MODE1T
#define T1MS (65536-FOSC/1000)
#else
#define T1MS (65536-FOSC/12/1000)
#endif
C
T
S
/* define SFR */
sfr
AUXR
=
sbit
TEST_LED =
/* define variables */
WORD count;
0x8e;
P0^0;
//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
//----------------------------------------------/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1
{
TL0 = T1MS;
TH0 = T1MS >> 8;
if (count-- == 0)
{
count = 1000;
TEST_LED = ! TEST_LED;
}
}
//reload timer0 low byte
//reload timer0 high byte
//1ms * 1000 -> 1s
//reset counter
//work LED flash
//----------------------------------------------南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
231
STC12C5A60S2系列单片机指南
/* main program */
void main()
{
#ifdef MODE1T
AUXR
#endif
TMOD
TL0
TH0
TR0
ET0
EA
count
}
技术支持网站:www.STCMCU.com
= 0x80;
= 0x01;
= T1MS;
= T1MS >> 8;
= 1;
= 1;
= 1;
= 0;
while (1);
临时技术支持:13922829991
//timer0 work in 1T mode
//set timer0 as mode1 (16-bit)
//initial timer0 low byte
//initial timer0 high byte
//timer0 start running
//enable timer0 interrupt
//open global interrupt switch
//initial counter
Li
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机定时器0的16位定时器/计数器模式 ---*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
U
C
M
C
T
S
#ifdef
T1MS
#else
T1MS
#endif
.
d
e
t
i
m
//loop
2. 汇编程序:
;/* define constants */
#define MODE1T
研发顾问:13922809991
;Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
MODE1T
EQU 0B800H
;1ms timer calculation method in 1T mode is (65536-18432000/1000)
EQU
;1ms timer calculation method in 12T mode is (65536-18432000/12/1000)
;/* define SFR */
AUXR
TEST_LED
0FA00H
DATA 8EH
BIT
P1.0
;/* define variables */
COUNT
DATA 20H
;Auxiliary register
;work LED, flash once per second
;1000 times counter (2 bytes)
;-----------------------------------------------
232
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
ORG
LJMP
ORG
LJMP
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
0000H
MAIN
000BH
TM0_ISR
;----------------------------------------------;/* main program */
MAIN:
#ifdef MODE1T
MOV AUXR, #80H
#endif
MOV TMOD, #01H
MOV TL0,
#LOW T1MS
MOV TH0,
#HIGH T1MS
SETB TR0
SETB ET0
SETB EA
CLR A
MOV COUNT, A
MOV COUNT+1, A
SJMP $
;-----------------------------------------------
;timer0 work in 1T mode
.
d
e
t
i
m
Li
;initial counter
U
C
M
;/* Timer0 interrupt routine */
TM0_ISR:
PUSH ACC
PUSH PSW
MOV TL0,
#LOW T1MS
MOV TH0,
#HIGH T1MS
MOV A,
COUNT
ORL A,
COUNT+1
JNZ SKIP
MOV COUNT, #LOW 1000
MOV COUNT+1, #HIGH 1000
CPL TEST_LED
SKIP:
CLR C
MOV A,
COUNT
SUBB A,
#1
MOV COUNT, A
MOV A,
COUNT+1
SUBB A,
#0
MOV COUNT+1, A
POP PSW
POP ACC
RETI
C
T
S
;set timer0 as mode1 (16-bit)
;initial timer0 low byte
;initial timer0 high byte
;timer0 start running
;enable timer0 interrupt
;open global interrupt switch
;reload timer0 low byte
;reload timer0 high byte
;check whether count(2byte) is equal to 0
;1ms * 1000 -> 1s
;work LED flash
;count--
;----------------------------------------------
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
233
STC12C5A60S2系列单片机指南
技术支持网站: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.4
TH0
(8 Bits)
T0CLKO
INT0
.
d
e
t
i
m
定时器/计数器0的模式 2: 8位自动重装
Li
TL0���������������������������������������������
的溢出不仅置位��������������������������������������
TF0�����������������������������������
,而且将�������������������������������
TH0����������������������������
内容重新装入����������������������
TL0�������������������
,������������������
TH0���������������
内容由软件预置,重装时����
TH0�
内
容不变。
U
C
M
在此模式下,当T0CLKO/WAKE_CLKO.0=1时,P3.4/T0管脚配置为定时器������
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
234
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;定时器0中断(下降沿中断)的测试程序,定时器0工作在8位自动重装模式
;下面程序中的定时器中断不能将单片机从掉电模式唤醒
1. C程序:
/*-------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ----------------------------------*/
/* --- STC 1T Series MCU T0(Falling edge) Demo -------------------*/
/* --- Mobile: (86)13922809991 ------------------------------------------*/
/* --- Fax: 86-755-82905966 ----------------------------------------------*/
/* --- Tel: 86-755-82948412 -----------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------*/
/* If you want to use the program or the program referenced in the */
/* article, please specify in which data and procedures from STC */
/*------------------------------------------------------------------------------*/
#include "reg51.h"
sfr
AUXR = 0x8e;
//T0 interrupt service routine
void t0int( ) interrupt 1
{
}
C
T
S
void main()
{
AUXR = 0x80;
TMOD = 0x06;
TL0 = TH0 = 0xff;
TR0 = 1;
ET0 = 1;
EA = 1;
//Auxiliary register
U
C
M
.
d
e
t
i
m
Li
//T0 interrupt (location at 000BH)
//timer0 work in 1T mode
//set timer0 as counter mode2 (8-bit auto-reload)
//fill with 0xff to count one time
//timer0 start run
//enable T0 interrupt
//open global interrupt switch
while (1);
}
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
235
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*-------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ----------------------------------*/
/* --- STC 1T Series MCU T0(Falling edge) Demo -------------------*/
/* --- Mobile: (86)13922809991 ------------------------------------------*/
/* --- Fax: 86-755-82905966 ----------------------------------------------*/
/* --- Tel: 86-755-82948412 -----------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------*/
/* If you want to use the program or the program referenced in the */
/* article, please specify in which data and procedures from STC */
/*------------------------------------------------------------------------------*/
AUXR DATA 08EH
;Auxiliary register
;----------------------------------------;interrupt vector table
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0INT
U
C
M
;----------------------------------------
MAIN:
ORG
C
T
S
0100H
MOV SP,
MOV AUXR,
MOV TMOD,
MOV A,
MOV TL0,
MOV TH0,
SETB TR0
SETB ET0
SETB EA
SJMP $
#7FH
#80H
#06H
#0FFH
A
A
.
d
e
t
i
m
Li
;T0 interrupt (location at 000BH)
;initial SP
;timer0 work in 1T mode
;set timer0 as counter mode2 (8-bit auto-reload)
;fill with 0xff to count one time
;timer0 start run
;enable T0 interrupt
;open global interrupt switch
;----------------------------------------;T0 interrupt service routine
T0INT:
RETI
;----------------------------------------
236
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站: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
237
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.3 定时器/计数器1工作模式(与传统8051单片机兼容)
通过对寄存器TMOD中的M1(TMOD.5)、M0(TMOD.4)的设置,定时器/计数器1有3种不同的
工作模式。
7.3.1 模式0(13位定时器/计数器)
此模式下定时器��������������������������������������
/�������������������������������������
计数器����������������������������������
1���������������������������������
作为�������������������������������
13�����������������������������
位定时器/计数器,有�������������������
TL1����������������
的低��������������
5�������������
位和�����������
TH1��������
的�������
8������
位所构成,如
下图所示。模式0的操作对于定时器1����������
和���������
定时器0是相同的。
AUXR.6/T1x12=0
÷12
SYSclk
÷1
AUXR.6/T1x12=1
C/T=0
TH1
(8 bits)
C/T=1
T1 Pin
TR1
control
GATE
INT1
U
C
M
TL1
(8 bits)
.
d
te
i
m
Li
TF1
Interrupt
定时器/计数器1的模式 0: 13位定时器/计数器
C
T
S
当�������
GATE=0(TMOD.7)时,如TR1=1,则定时器计数。GATE=1时,允许由外部输入INT1控制定
时器1,这样可实现脉宽测量。TR1为TCON寄存器内的控制位,TCON寄存器各位的具体功能描述
见上节�����������
TCON寄存器����
的介绍�
。
当C/T=0时,多路开关连接到系统时钟的分频输出,T1对时钟周期计数,T1工作在定时方
式。当C/T=1时,多路开关连接到外部脉冲输入P3.5/T1,即T1工作在计数方式。
STC12C5A60S2系列单片机的定时器有两种计数速率:一种是���������������
12T������������
模式,每��������
12������
个时钟加��
1�
,
与传统��������������������������������������������
8051����������������������������������������
单片机相同;另外一种是�����������������������������
1T���������������������������
模式,每个时钟加�������������������
1������������������
,速度是传统������������
8051��������
单片机的����
12��
倍。
T1�������������������������������������������������
的速率由特殊功能寄存器��������������������������������������
AUXR����������������������������������
中的��������������������������������
T1x12���������������������������
决定,如果����������������������
T1x12=0���������������
,��������������
T1������������
则工作在��������
12T�����
模式;如果
T1x12=1������������
,�����������
T1���������
则工作在�����
1T���
模式。
238
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站: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工作在计数方式。
STC12C5A60S2系列单片机的定时器有两种计数速率:一种是���������������
12T������������
模式,每��������
12������
个时钟加��
1�
,
与传统��������������������������������������������
8051����������������������������������������
单片机相同;另外一种是�����������������������������
1T���������������������������
模式,每个时钟加�������������������
1������������������
,速度是传统������������
8051��������
单片机的����
12��
倍。
T1�������������������������������������������������
的速率由特殊功能寄存器��������������������������������������
AUXR����������������������������������
中的��������������������������������
T1x12���������������������������
决定,如果����������������������
T1x12=0���������������
,��������������
T1������������
则工作在��������
12T�����
模式;如果
T1x12=1������������
,�����������
T1���������
则工作在�����
1T���
模式。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
239
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
定时器1工作在16位定时器/计数器模式的测试程序
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机定时器1的16位定时器/计数器模式 --*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
typedef unsigned char
typedef unsigned int
BYTE;
WORD;
//----------------------------------------------/* define constants */
#define FOSC 18432000L
#define MODE 1T
U
C
M
C
T
S
/* define variables */
WORD count;
Li
//Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
#ifdef MODE 1T
#define T1MS (65536-FOSC/1000)
#else
#define T1MS (65536-FOSC/12/1000)
#endif
/* define SFR */
sfr
AUXR
=
sbit
TEST_LED =
.
d
e
t
i
m
0x8e;
P0^0;
//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
//----------------------------------------------/* Timer0 interrupt routine */
void tm1_isr() interrupt 3 using 1
{
TL1 = T1MS;
TH1 = T1MS >> 8;
if (count-- == 0)
{
count = 1000;
TEST_LED = ! TEST_LED;
}
}
//reload timer1 low byte
//reload timer1 high byte
//1ms * 1000 -> 1s
//reset counter
//work LED flash
//-----------------------------------------------
240
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
/* main program */
void main( )
{
#ifdef MODE 1T
AUXR = 0x40;
#endif
TMOD = 0x10;
TL1
= T1MS;
TH1
= T1MS >> 8;
TR1
= 1;
ET1
= 1;
EA
= 1;
count = 0;
}
while (1);
临时技术支持:13922829991
//timer1 work in 1T mode
//set timer1 as mode1 (16-bit)
//initial timer1 low byte
//initial timer1 high byte
//timer1 start running
//enable timer1 interrupt
//open global interrupt switch
//initial counter
Li
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机定时器1的16位定时器/计数器模式 ---*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
;/* define constants */
#define MODE 1T
U
C
M
;Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
#ifdef MODE 1T
T1MS EQU 0B800H
#else
T1MS EQU 0FA00H
#endif
;/* define SFR */
AUXR
DATA
TEST_LED BIT
.
d
e
t
i
m
//loop
2. 汇编程序:
C
T
S
研发顾问:13922809991
;1ms timer calculation method in 1T mode is (65536-18432000/1000)
;1ms timer calculation method in 12T mode is (65536-18432000/12/1000)
8EH
P1.0
;/* define variables */
COUNT DATA 20H
;Auxiliary register
;work LED, flash once per second
;1000 times counter (2 bytes)
;----------------------------------------------南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
241
STC12C5A60S2系列单片机指南
ORG
LJMP
ORG
LJMP
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
0000H
MAIN
001BH
TM1_ISR
;----------------------------------------------;/* main program */
MAIN:
#ifdef MODE1T
MOV AUXR, #40H
#endif
MOV TMOD, #10H
MOV TL1,
#LOW T1MS
MOV TH1,
#HIGH T1MS
SETB TR1
SETB ET1
SETB EA
CLR A
MOV COUNT, A
MOV COUNT+1,A
SJMP $
;-----------------------------------------------
;timer1 work in 1T mode
.
d
e
t
i
m
Li
;initial counter
U
C
M
;/* Timer1 interrupt routine */
TM1_ISR:
PUSH ACC
PUSH PSW
MOV TL1,
#LOW T1MS
MOV TH1,
#HIGH T1MS
MOV A,
COUNT
ORL A,
COUNT+1
JNZ SKIP
MOV COUNT, #LOW 1000
MOV COUNT+1,
#HIGH 1000
CPL TEST_LED
SKIP:
CLR C
MOV A,
COUNT
SUBB A,
#1
MOV COUNT, A
MOV A,
COUNT+1
SUBB A,
#0
MOV COUNT+1,A
POP PSW
POP ACC
RETI
C
T
S
;set timer1 as mode1 (16-bit)
;initial timer1 low byte
;initial timer1 high byte
;timer1 start running
;enable timer1 interrupt
;open global interrupt switch
;reload timer1 low byte
;reload timer1 high byte
;check whether count(2byte) is equal to 0
;1ms * 1000 -> 1s
;work LED flash
;count--
;----------------------------------------------
242
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站: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.5
T1CLKO
TH1
(8 Bits)
INT1
.
d
e
t
i
m
定时器/计数器1的模式 2: 8位自动重装
Li
TL1���������������������������������������������
的溢出不仅置位��������������������������������������
TF1�����������������������������������
,而且将�������������������������������
TH1����������������������������
内容重新装入����������������������
TL1�������������������
,������������������
TH1���������������
内容由软件预置,重装时����
TH1�
内
容不变。
U
C
M
当T1CLKO/WAKE_CLKO.1=1时,P3.5/T1管脚配置为定时1的时钟输出。
������
输出时钟频率 = 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
243
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;定时器1中断(下降沿中断)的测试程序,定时器1工作在8位自动重装模式
;下面程序中的定时器中断不能将单片机从掉电模式唤醒
1. C程序:
/*-------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ----------------------------------*/
/* --- STC 1T Series MCU T1(Falling edge) Demo -------------------*/
/* --- Mobile: (86)13922809991 ------------------------------------------*/
/* --- Fax: 86-755-82905966 ----------------------------------------------*/
/* --- Tel: 86-755-82948412 -----------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------*/
/* If you want to use the program or the program referenced in the */
/* article, please specify in which data and procedures from STC */
/*------------------------------------------------------------------------------*/
#include "reg51.h"
sfr AUXR = 0x8e;
C
T
S
void main()
{
AUXR = 0x40;
TMOD = 0x60;
TL1 = TH1 = 0xff;
TR1 = 1;
ET1 = 1;
EA = 1;
Li
//Auxiliary register
U
C
M
//T1 interrupt service routine
void t1int( ) interrupt 3
{
}
.
d
e
t
i
m
//T1 interrupt (location at 001BH)
//timer1 work in 1T mode
//set timer1 as counter mode2 (8-bit auto-reload)
//fill with 0xff to count one time
//timer1 start run
//enable T1 interrupt
//open global interrupt switch
while (1);
}
244
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*-------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ----------------------------------*/
/* --- STC 1T Series MCU T1(Falling edge) Demo -------------------*/
/* --- Mobile: (86)13922809991 ------------------------------------------*/
/* --- Fax: 86-755-82905966 ----------------------------------------------*/
/* --- Tel: 86-755-82948412 -----------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------*/
/* If you want to use the program or the program referenced in the */
/* article, please specify in which data and procedures from STC */
/*------------------------------------------------------------------------------*/
AUXR DATA 08EH
;Auxiliary register
;----------------------------------------;interrupt vector table
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP T1INT
U
C
M
ORG
C
T
S
0100H
MOV SP,
MOV AUXR,
MOV TMOD,
MOV A,
MOV TL1,
MOV TH1,
SETB TR1
SETB ET1
SETB EA
SJMP $
#7FH
#40H
#60H
#0FFH
A
A
Li
;T1 interrupt (location at 001BH)
;----------------------------------------
MAIN:
.
d
e
t
i
m
;initial SP
;timer1 work in 1T mode
;set timer1 as counter mode2 (8-bit auto-reload)
;fill with 0xff to count one time
;timer1 start run
;enable T1 interrupt
;open global interrupt switch
;----------------------------------------;T1 interrupt service routine
T1INT:
RETI
;----------------------------------------
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
245
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.4 可编程时钟输出及测试程序(C程序和汇编程序)
STC12C5A60S2系列单片机有三路可编程时钟输出:CLKOUT0/T0/P3.4, CLKOUT1/T1/P3.5,
CLKOUT2/P1.0
与可编程时钟输出有关的特殊功能寄存器�
:
AUXR : Auxiliary register
SFR Name Address bit
AUXR
8EH
name
B7
B6
B5
B4
B3
B2
B1
B0
T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS
WAKE_CLKO :Clock output and Power-down Wakeup Control register
SFR Name
Address
WAKE_CLKO
8FH
bit
B7
B6
B5
B4
B3
B2
B1
B0
name PCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_WAKE BRTCLKO T1CLKO T0CLKO
.
d
e
t
i
m
BRT : Dedicated Baud-Rate Timer register
SFR Name
Address
bit
BRT
9CH
name
B7
B6
B5
B4
B3
U
C
M
B2
Li
B1
B0
特殊功能寄存器AUXR/WAKE_CLKO/BRT的C语言声明:
sfr
AUXR
= 0x8E;
���������
//特殊功能寄存器AUXR的地址声明
sfr
WAKE_CLKO = 0x8F;
//����������
新增加特殊功能寄存器WAKE_CLKO的地址声明
sfr
BRT
= 0x9C;
//����������
新增加特殊功能寄存器BRT的地址声明
C
T
S
特殊功能寄存器IRC_CLKO/INT_CLKO/AUXR的汇编语言声明:
AUXR
EQU 8EH
;特殊功能寄存器AUXR的地址声明
WAKE_CLKO EQU 8FH
;新增加的特殊功能寄存器WAKE_CLKO的地址声明
BRT
EQU 9CH
;新增加的特殊功能寄存器BRT的地址声明
如何利用CLKOUT0/P3.4和CLKOUT1/P3.5管脚输出时钟:
CLKOUT0/P3.4和CLKOUT1/P3.5的时钟输出控制由WAKE_CLKO寄存器的T0CLKO位和
T1CLKO位控制�
。CLKOUT0的输出时钟频率由定时器0控制,CLKOUT1的输出时钟频率由定时
器1控制, 相应的定时器需要工作在定时器的模式2方式(8位自动重装载模式),不要允许相应的
定时器中断,免得CPU反复进中断.
新增加的特殊功能寄存器: WAKE_CLKO(地址:0x8F)
WAKE_CLKO :Clock output and Power-down Wakeup Control register(不可位寻址)
SFR Name
Address
WAKE_CLKO
8FH
bit
B7
B6
B5
B4
B3
B2
B1
B0
name PCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_WAKE BRTCLKO T1CLKO T0CLKO
B7 - PCAWAKEUP:在掉电模式下,是否��
允许PCA上升沿/下降沿中断唤醒powerdown。
0�����������������
:禁止PCA上升沿/下降沿中断��
唤醒powerdown ;
1:允许PCA上升沿/下降沿中断唤醒powerdown 。
246
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
B6 - RXD_PIN_IE:掉电模式下,允许P3.0(RXD)下降沿置RI,也能使RXD唤醒powerdown.
0���
:禁止P3.0(RXD)下降沿置RI,也��
禁止RXD唤醒powerdown ;
1:允许P3.0(RXD)下降沿置RI,也��
允许RXD唤醒powerdown 。
B5 - T1_PIN_IE:掉电模式下,允许T1/P3.5脚下降沿置T1中断标志,也能使T1脚唤醒powerdown.
0���
:禁止T1/P3.5脚下降沿置T1中断标志,也��
禁止T1脚唤醒powerdown ;
1:允许T1/P3.5脚下降沿置T1中断标志,也��
允许T1脚唤醒powerdown 。
B4 - T0_PIN_IE:掉电模式下,允许T0/P3.4脚下降沿置T0中断标志,也能使T0脚唤醒powerdown.
0���
:禁止T0/P3.4脚下降沿置T0中断标志,也��
禁止T0脚唤醒powerdown ;
1:允许T0/P3.4脚下降沿置T0中断标志,也��
允许T0脚唤醒powerdown 。
B3 - LVD_WAKE: 掉电模式下,是否允EX_LVD/P4.6低压检测中断唤醒CPU.
0:禁止EX_LVD/P4.6低压检测中断唤醒CPU
1:允许EX_LVD/P4.6低压检测中断唤醒CPU。
.
d
e
t
i
m
B2 - BRTCLKO:是否允许将P1.0脚配置为独立波特率发生器(BRT)的时钟输出CLKOUT2
1: 允许将P1.0脚���
配置为独立波特率发生器(BRT)的时钟输出CLKOUT2,
输出时钟频率=BRT溢出率/2
BRT工作在1T模式时的输出频率 = SYSclk / ( 256 - BRT ) / 2
BRT工作在12T模式时的输出频率 = SYSclk / 12 / (256 - BRT) / 2
0: 不允许�
将P1.0脚���
配置为独立波特率发生器(BRT)的时钟输出CLKOUT2
C
T
S
U
C
M
Li
B1 - T1CLKO: 是否允许将P3.5/T1脚配置为定时器T1的时钟输出CLKOUT1
1: 允许将P3.5/T1脚配置为定时器T1的时钟输出CLKOUT1,�����������
此时定时器T1只能工
作在模式2(8位自动重装模式),CLKOUT1输出时钟频率= T1溢出率/2
T1工作在1T模式时的输出频率 = SYSclk / ( 256 - TH1 ) / 2
T1工作在12T模式时的输出频率 = SYSclk / 12 / (256 - TH1) / 2
0����
:���
不允许将P3.5/T1脚配置为定时器T1的时钟输出CLKOUT1
B0 - T0CLKO:是否允许将P3.4/T0脚配置为定时器T0的时钟输出CLKOUT0
1:��
允许将P3.4/T0脚配置为定时器T0的时钟输出CLKOUT0,�����������
此时定时器T0只能工
作在模式2(8位自动重装模式),CLKOUT0输出时钟频率 = T0溢出率 / 2
T0工作在1T 模式时的输出频率 = SYSclk / ( 256 - TH0 ) / 2
T0工作在12T模式时的输出频率 = SYSclk / 12 / (256 - TH0) / 2
0:���
不允许将P3.4/T0脚配置为定时器T0的时钟输出CLKOUT0
特殊功能寄存器: AUXR(地址:0x8E)
AUXR : Auxiliary register(不可位寻址)
SFR Name Address bit
AUXR
8EH
name
B7
B6
B5
B4
B3
B2
B1
B0
T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS
B7 - T0x12:定时器0速度控制位�
。
0����������������������������
:定时器0速度是8051单片机定时器的速度,即12分频;
1:定时器0速度是8051单片机定时器速度的12倍,即不分频。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
247
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
B6 - T1x12:定时器1速度控制位�
。
0����������������������������
:定时器1速度是8051单片机定时器的速度,即12分频;
1:定时器1速度是8051单片机定时器速度的12倍,即不分频。
如果UART串口用T1作为波特率发生器,则由T1x12位决定UART串口是12T还是1T。
B5 - UART_M0x6:串口模式0的通信速度设置位�
。
0�����������������������������������
:UART串口模式0的速度是传统8051单片机串口的速度,即12分频;
1:UART串口模式0的速度是传统8051单片机串口速度的6倍,即2分频。
B4 - BRTR:独立波特率发生器运行控制位�
。
0���������������
:不允许独立波特率发生器运行;
1:允许独立波特率发生器运行。
B3 - S2SMOD:UART2的波特率加倍控制位�
。
0�
:UART2的波特率不加倍;
1:UART2的波特率加倍。
B2 - BRTx12:独立波特率发生器计数控制位�
。
0��������������������
:独立波特率发生器每12个时钟计数一次;
1:独立波特率发生器每1个时钟计数一次。
U
C
M
B1 - EXTRAM:内部/外部RAM存取控制位�
。
0����������������������
:允许使用内部扩展的1024字节扩展RAM;
1:禁止使用内部扩展的1024字节扩展RAM。
C
T
S
.
d
e
t
i
m
Li
B0 - S1BRS:串口1(UART1)的波特率发生器选择位�
。
0�������������
:选择定时器1作为串口1(UART1)的波特率发生器;
1:选择独立波特率发生器作为串口1(UART1)的波特率发生器,此时定时器1得到释
放,可以作为独立定时器使用。
如何利用CLKOUT2/P1.0管脚输出时钟
CLKOUT2/P1.0的时钟输出频率 = BRT溢出率/2
BRTx12 = 1,独立波特率发生器工作在1T模式
CLKOUT2工作在1T模式时的输出频率 = SYSclk / ( 256 - BRT ) / 2
BRTx12 = 0,独立波特率发生器工作在12T 模式
CLKOUT2工作在12T模式时的输出频率 = SYSclk / 12 / (256 - BRT) / 2
用户在程序中如何具体设置CLKOUT2/P1.0管脚输出时钟
1.对BRT寄存器独立波特率发生器定时器送8位重装载值, BRT = #reload_data
2.对AUXR寄存器中的BRTR位置1,让独立波特率发生器定时器运行
3.对WAKE_CLKO寄存器中的BRTCLKO位置1,让独立波特率发生器定时器的溢出在P1.0
口输出时钟
248
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.4.1 定时器0的可编程时钟输出的测试程序
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机定时器0的可编程时钟输-----------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
.
d
e
t
i
m
#include "reg51.h"
//----------------------------------------------/* define constants */
#define FOSC 18432000L
//#define MODE 1T
#ifdef MODE 1T
#define F38_4KHz
#else
#define F38_4KHz
#endif
C
T
S
CU
M
(256-FOSC/2/38400)
/* define SFR */
sfr
AUXR
sfr
WAKE_CLKO
sbit
T0CLKO
Li
//Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
//38.4KHz frequency calculation method of 1T mode
(256-FOSC/2/12/38400)
//38.4KHz frequency calculation method of 12T mode
= 0x8e;
= 0x8f;
= P3^4;
//Auxiliary register
//wakeup and clock output control register
//timer0 clock output pin
//----------------------------------------------/* main program */
void main()
{
#ifdef MODE 1T
AUXR =
0x80;
#endif
TMOD =
0x02;
TL0
=
F38_4KHz;
TH0
=
F38_4KHz;
TR0
= 1;
WAKE_CLKO = 0x01;
}
while (1);
南通国芯微电子有限公司
//timer0 work in 1T mode
//set timer0 as mode2 (8-bit auto-reload)
//initial timer0
//initial timer0
//timer0 start running
//enable timer0 clock output
//loop
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
249
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机定时器0的可编程时钟输-----------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
;/* define constants */
#define MODE 1T
#ifdef MODE 1T
F38_4KHz EQU 010H
#else
F38_4KHz EQU 0ECH
#endif
;Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
Li
;38.4KHz frequency calculation method of 12T mode (256-18432000/2/12/38400)
;/* define SFR */
AUXR
DATA 08EH
WAKE_CLKO DATA 08FH
T0CLKO
BIT P3.4
C
T
S
;----------------------------------------------
.
d
e
t
i
m
;38.4KHz frequency calculation method of 1T mode is (256-18432000/2/38400)
CU
;Auxiliary register
;wakeup and clock output control register
;timer0 clock output pin
M
ORG 0000H
LJMP MAIN
;----------------------------------------------;/* main program */
MAIN:
#ifdef MODE1T
MOV AUXR, #80H
#endif
MOV TMOD, #02H
MOV TL0,
#F38_4KHz
MOV TH0,
#F38_4KHz
SETB TR0
MOV WAKE_CLKO,#01H
SJMP $
;timer0 work in 1T mode
;set timer0 as mode2 (8-bit auto-reload)
;initial timer0
;initial timer0
;enable timer0 clock output
;----------------------------------------------
250
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.4.2 定时器1的可编程时钟输出的测试程序
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机定时器1的可编程时钟输-----------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
.
d
e
t
i
m
#include "reg51.h"
//----------------------------------------------/* define constants */
#define FOSC 18432000L
//#define MODE 1T
#ifdef MODE 1T
#define F38_4KHz
#else
#define F38_4KHz
#endif
(256-FOSC/2/38400)
M
CU
//38.4KHz frequency calculation method of 1T mode
(256-FOSC/2/12/38400)
//38.4KHz frequency calculation method of 12T mode
= 0x8e;
= 0x8f;
= P3^5;
//Auxiliary register
//wakeup and clock output control register
//timer1 clock output pin
C
T
S
/* define SFR */
sfr
AUXR
sfr
WAKE_CLKO
sbit
T1CLKO
Li
//Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
//----------------------------------------------/* main program */
void main()
{
#ifdef MODE 1T
AUXR = 0x40;
#endif
TMOD = 0x20;
TL1
= F38_4KHz;
TH1
= F38_4KHz;
TR1
= 1;
WAKE_CLKO = 0x02;
}
while (1);
南通国芯微电子有限公司
//timer1 work in 1T mode
//set timer1 as mode2 (8-bit auto-reload)
//initial timer1
//initial timer1
//timer1 start running
//enable timer1 clock output
//loop
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
251
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机定时器1的可编程时钟输-----------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
;/* define constants */
#define MODE 1T
#ifdef MODE 1T
F38_4KHz EQU 010H
#else
F38_4KHz EQU 0ECH
#endif
;Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
Li
;38.4KHz frequency calculation method of 12T mode (256-18432000/2/12/38400)
;/* define SFR */
AUXR
DATA 08EH
WAKE_CLKO DATA 08FH
T1CLKO
BIT P3.5
C
T
S
;----------------------------------------------
.
d
e
t
i
m
;38.4KHz frequency calculation method of 1T mode is (256-18432000/2/38400)
U
C
M
;Auxiliary register
;wakeup and clock output control register
;timer1 clock output pin
ORG 0000H
LJMP MAIN
;----------------------------------------------;/* main program */
MAIN:
#ifdef MODE 1T
MOV AUXR, #40H
#endif
MOV TMOD, #20H
MOV TL1,
#F38_4KHz
MOV TH1,
#F38_4KHz
SETB TR1
MOV WAKE_CLKO, #02H
SJMP $
;timer1 work in 1T mode
;set timer1 as mode2 (8-bit auto-reload)
;initial timer1
;initial timer1
;enable timer1 clock output
;----------------------------------------------
252
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.4.3 独立波特率发生器的可编程时钟输出的测试程序
1. C程序:
/*---------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ------------------------------------------*/
/* --- 演示STC 1T 系列单片机独立波特率发生器的可编程时钟输出---*/
/* --- Mobile: (86)13922809991 --------------------------------------------------*/
/* --- Fax: 86-755-82905966 ------------------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------------------*/
/* --- Web: www.STCMCU.com -------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- -----*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -------------*/
/*--------------------------------------------------------------------------------------*/
.
d
e
t
i
m
#include "reg51.h"
//----------------------------------------------/* define constants */
#define FOSC 18432000L
//#define MODE 1T
#ifdef MODE 1T
#define F38_4KHz
#else
#define F38_4KHz
#endif
U
C
M
(256-FOSC/2/38400)
C
T
S
/* define SFR */
sfr
AUXR
sfr
WAKE_CLKO
sfr
BRT
sbit
BRTCLKO
Li
//Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
//38.4KHz frequency calculation method of 1T mode
(256-FOSC/2/12/38400)
//38.4KHz frequency calculation method of 12T mode
= 0x8e;
= 0x8f;
= 0x9c;
= P1^0;
//Auxiliary register
//wakeup and clock output control register
//BRT clock output pin
//----------------------------------------------/* main program */
void main()
{
#ifdef MODE 1T
AUXR = 0x04;
#endif
BRT
=
F38_4KHz;
AUXR |=
0x10;
WAKE_CLKO = 0x04;
}
while (1);
南通国芯微电子有限公司
//BRT work in 1T mode
//initial BRT
//BRT start running
//enable BRT clock output
//loop
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
253
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*---------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ------------------------------------------*/
/* --- 演示STC 1T 系列单片机独立波特率发生器的可编程时钟输出---*/
/* --- Mobile: (86)13922809991 --------------------------------------------------*/
/* --- Fax: 86-755-82905966 ------------------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 --------------*/
/*----------------------------------------------------------------------------------------*/
;/* define constants */
#define MODE 1T
#ifdef MODE 1T
F38_4KHz EQU 010H
#else
F38_4KHz EQU 0ECH
#endif
;/* define SFR */
AUXR
WAKE_CLKO
BRT
BRTCLKO
DATA
DATA
DATA
BIT
.
d
e
t
i
m
;Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
;38.4KHz frequency calculation method of 1T mode is (256-18432000/2/38400)
Li
;38.4KHz frequency calculation method of 12T mode (256-18432000/2/12/38400)
08EH
08FH
09CH
P1.0
C
T
S
U
C
M
;Auxiliary register
;wakeup and clock output control register
;BRT clock output pin
;BRT work in 1T mode
;initial BRT reload value
;BRT start run
;enable BRT clock output
;----------------------------------------------
ORG 0000H
LJMP MAIN
;----------------------------------------------;/* main program */
MAIN:
#ifdef MODE 1T
MOV AUXR, #04H
#endif
MOV BRT,
#F38_4KHz
ORL AUXR, #10H
MOV WAKE_CLKO,#04H
SJMP $
;----------------------------------------------
254
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.5 古老Intel 8051单片机定时器0/1的应用举例
【例1】 定时/计数器编程,定时/计数器的应用编程主要需考虑:根据应用要求,通过程序初
始化,正确设置控制字,正确计算和计算计数初值,编写中断服务程序,适时设置控制位等。
通常情况下,设置顺序大致如下:
1)工作方式控制字(TMOD、T2CON)的设置;
2)计数初值的计算并装入THx、TLx、RCAP2H、RCAP2L;
3)中断允许位ETx、EA的设置,使主机开放中断;
4) 启/停位TRx的设置等。
现以定时/计数器0或1为例作一简要介绍。
.
d
e
t
i
m
8051系列单片机的定时器/计数器0或1是以不断加1进行计数的,即属加1计数器,因此,就
不能直接将实际的计数值作为计数初值送入计数寄存器THx、TLx中去,而必须将实际计数值以
28、213、216为模求补,以其补码作为计数初值设置THx和TLx。
Li
设:实际计数值为X,计数器长度为n(n=8、13、16),则应装入计数器THx、TLx中的计
数初值为2n-x,式中2n为取模值。例如,工作方式0的计数长度为13位,则n=13,以213为模,
工作方式1的计数长度为16,则n=16,以216为模等等。所以,计数初值为(x)= 2n-x。
U
C
M
对于定时模式,是对机器周期计数,而机器周期与选定的主频密切相关。因此,需根据应
C
T
S
用系统所选定的主频计算出机器周期值。现以主频6MHz为例,则机器周期为:
一个机器周期=
12
主振频率
=
12
6×106
μs
= 2μs
实际定时时间Tc = x·Tp
式中Tp为机器周期,Tc为所需定时时间,x为所需计数次数。Tp和Tp一般为已知值,在求出
Tp后即可求得所需计数值x,再将x求补码,即求得定时计数初值。即
(x)补= 2n - x
例如,设定时时间Tc = 5ms,机器周期TP = 2μs,可求得定时计数次数
5ms
x =
= 2500次
2μs
设选用工作方式1,则n=16,则应设置的定时时间计数初值为:
(x)补= 216 - x=65536-2500=63036,还需将它分解成两个8位十六进制数,分别求得低8
位为3CH装入TLx,高8位为F6H装入THx中。
工作方式0、1、2的最大计数次数分别为8192、65536和256。
对外部事件计数模式,只需根据实际计数次数求补后变换成两个十六进制码即可。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
255
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
【例2】 定时/计数器应用编程,设某应用系统,选择定时/计数器1定时模式,定时时间Tc
= 10ms,主频频率为12MHz,每10ms向主机请求处理。选定工作方式1。计算得计数初值:低8
位初值为F0H,高8位初值为D8H。
(1)初始化程序
…
所谓初始化,一般在主程序中根据应用要求对定时/计数器进行功能选择及参数设定等预置
程序,本例初始化程序如下:
START:
;����
主程序段
MOV
SP,#60H
;设置堆栈区域
MOV
TMOD,#10H
;选择T1、定时模式,工作方式1
MOV
TH1,#0D8H
;设置高字节计数初值
MOV
TL1,#0F0H
;设置低字节计数初值
SETB
EA
SETB
ET1
C
T
S
SETB
TR1
U
C
M
(2)中断服务程序
INTT1: PUSH
;
开中断
�
;其他初始化程序
;启动T1开始计时
;������
继续主程序
…
…
.
d
e
t
i
L}im
;
A
;
PUSH DPL
PUSH DPH
MOV
TL1,#0F0H
MOV
TH1,#0D8H
POP
DPH
POP
DPL
POP
A
}
RETI
;返回
}
;
现场保护
…
…
;
256
南通国芯微电子有限公司
;
}
;
重新置初值
;中断处理主体程序
;
;
现场恢复
;
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
这里展示了中断服务子程序的基本格式。STC12C5A60S2系列单片机的中断属于矢量中断,
每一个矢量中断源只留有8个字节单元,一般是不够用的,常需用转移指令转到真正的中断服
务子程序区去执行。
【例3】 对外部正脉冲测宽。选择定时/计数器2进行脉宽测试较方便,但也可选用定时/计
数器0或定时/计数器1进行测宽操作。本例选用定时/计数器0(T0)以定时模式,工作方式1对
INT0引脚上的正脉冲进行脉宽测试。
INT0 引脚
T0计数
启动
停止
.
d
e
t
i
m
INTT0:
MOV
TMOD,#09H
MOV
TL0,#00H
MOV
TH0,#00H
L}i
CLR
EX0
;关INT0中断
LOP1:
JB
P3.2,LOP1
;等待INT0引低电平
LOP2:
JNB
P3.2,LOP2
;等待INT0引脚高电平
SETB
TR0
;启动T0开始计数
LOP3:
JB
P3.2,LOP3
;等待INT0低电平
CLR
TR0
;停止T0计数
MOV
A,TL0
;低字节计数值送A
MOV
B,TH0
;高字节计数值送B
…
设置GATE为1,机器周期TP为1μs。本例程序段编制如下:
;计算脉宽和处理
南通国芯微电子有限公司
C
T
S
U
C
M
总机:0513-5501 2928 / 2929 / 2966
;设T0为定时方式1,GATE为1
;
;
TH0,TL0清0
传真:0513-5501 2969 / 2956 / 2947
257
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
【例4】 利用定时/计数器0或定时/计数器1的Tx端口改造成外部中断源输入端口的应用设计。
在某些应用系统中常会出现原有的两个外部中断源INT0和INT1不够用,而定时/计数器有
多余,则可将Tx用于增加的外部中断源。现选择定时/计数器1为对外部事件计数模式工作方式
2(自动再装入),设置计数初值为FFH,则T1端口输入一个负跳变脉冲,计数器即回0溢出,
置位对应的中断请求标志位TF1为1,向主机请求中断处理,从而达到了增加一个外部中断源的
目的。应用定时/计数器1(T1)的中断矢量转入中断服务程序处理。其程序示例如下:
(1)主程序段:
ORG
0000H
AJMP
MAIN
;转主程序
ORG
001BH
LJMP
INTER
;转T1中断服务程序
ORG
0100
…
…
MAIN: …
C
T
S
U
C
M
;主程序入口
.
d
e
t
i
m
Li
MOV
SP,#60H
MOV
TMOD,#60H
;设置定时/计数器1,计数方式2
MOV
TL1,#0FFH
;设置计数常数
MOV
TH1,#0FFH
SETB
EA
;开中断
SETB
ET1
;开定时/计数器1中断
SETB
TR1
;启动定时/计数器1计数
258
…
;设置堆栈区
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站: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
;启动
南通国芯微电子有限公司
…
…
38H。
总机:0513-5501 2928 / 2929 / 2966
;
开中断
;
传真:0513-5501 2969 / 2956 / 2947
259
STC12C5A60S2系列单片机指南
技术支持网站: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输出信号取反
;返回
…
… …
… …
U
C
M
…
C
T
S
.
d
e
t
i
m
Li
;重新设置初值
;对P1.1输出信号取反
;返回
行。但从回0溢出请求中断到主机响应中断并作出处理存在时间延迟,且这种延时随中断请求
时的现场环境的不同而不同,一般需延时3个机器周期以上,这就给实时处理带来误差。大多
数应用场合可忽略不计,但对某些要求实时性苛刻的场合,应采用补偿措施。
这种由中断响应引起的时间延时,对定时/计数器工作于方式0或1而言有两种含义:一
是由于中断响应延时而引起的实时处理的误差;二是如需多次且连续不间断地定时/计数,由
于中断响应延时,则在中断服务程序中再置计数初值时已延误了若干个计数值而引起误差,特
别是用于定时就更明显。
例如选用定时方式1设置系统时钟,由于上述原因就会产生实时误差。这种场合应采用
动态补偿办法以减少系统始终误差。所谓动态补偿,即在中断服务程序中对THx、TLx重新置计
数初值时,应将THx、TLx从回0溢出又重新从0开始继续计数的值读出,并补偿到原计数初值中
去进行重新设置。可考虑如下补偿方法:
260
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站: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中
…
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
261
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7.6 如何将定时器T0/T1的速度提高12倍
STC12C5A60S2 系列单片机的AUXR寄存器
Mnemonic Address
AUXR
8Eh
bit
B7
B6
B5
name T0x12 T1x12 UART_M0x06
B4
BRTR
B3
B2
B1
B0
S2SMOD BRTx12 EXTRAM S1BRS
定时器0和定时器1:
STC12C5A60S2系列是1T的8051单片机,为了兼容传统8051,定时器0和定时器1复位后是传统
8051的速度,即12分频,这是为了兼容传统8051。但也可不进行12分频,实现真正的1T。
T0x12: 0, 定时器0是传统8051速度,12分频;
1, 定时器0的速度是传统8051的12倍,不分频
T1x12: 0, 定时器1是传统8051速度,12分频;
1, 定时器1的速度是传统8051的12倍,不分频
如果UART串口用定时器1做波特率发生器,T1x12位就可以控制UART串口是12T还是1T了。
.
d
e
t
i
m
Li
UART串口的模式0:
STC12C5A60S2系列是1T的8051单片机,为了兼容传统8051,UART串口复位后是兼容传统8051
的
UART_M0x6: 0, UART串口的模式0是传统12T的8051速度,12分频;
1, UART串口的模式0的速度是传统12T的8051的6倍,2分频
如果用定时器T1做波特率发生器时,UART串口的速度由T1的溢出率决定
C
T
S
U
C
M
BRTR(S2TR): 0, 不允许独立波特率发生器运行
1, 允许独立波特率发生器运行
S2SMOD: 0, 缺省
1, 串口2/UART2 的波特率 x 2
BRTx12(S2Tx12): 0, 独立波特率发生器每12个时钟计数一次
1, 独立波特率发生器每1个时钟计数一次
EXTRAM: 0, 允许使用内部扩展的1024字节扩展RAM
1, 禁止使用内部扩展的1024 字节扩展RAM
S1BRS: 0, 缺省,串口1波特率发生器选择定时器1,S1BRS是串口1波特率发生器选择位
1, 独立波特率发生器作为串口1的波特率发生器,此时定时器1得到释放,可以作为
独立定时器使用
注意:
有串口2的单片机,串口2永远是使用独立波特率发生器(2)作为波特率发生器,串口2不能
够选择定时器1做波特率发生器,
串口1可以选择定时器1做波特率发生器,也可以选择独立波特率发生器(2)作为波特率发
生器
262
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
第8章 串行口通信
STC12C5A60S2系列单片机具有2个采用UART(Universal Asychronous Receiver/Transmitter)
工作方式的全双工串行通信接口(串口1和串口2)。每个串行口由2个数据缓冲器、一个移位寄
存器、一个串行控制寄存器和一个波特率发生器等组成。每个串行口的数据缓冲器由����
2���
个互相
独立的接收、发送缓冲器构成,可以同时发送和接收数据。发送缓冲器只能写入而不能读出,
接收缓冲器只能读出而不能写入,因而两个缓冲器可以共用一个地址码。串行口1的两个缓冲
器共用的地址码是�������������������������������������
99H����������������������������������
;串行口2的两个缓冲器共用的地址码是����������������
9BH�������������
。串行口1的两个缓冲器统称
串行通信特殊功能寄存器����������������������������������
SBUF������������������������������
;串行口2的两个缓冲器统称串行通信特殊功能寄存器������
S2BUF�
。
STC12C5A60S2系列单片机的两个串行口都有4种工作方式,其中两种方式的波特率是可变
的,另两种是固定的,以供不同应用场合选用。用户可用软件设置不同的波特率和选择不同的
工作方式。主机可通过查询或中断方式对接收/发送进行程序处理,使用十分灵活。
.
d
e
t
i
m
STC12C5A60S2系列单片机串行口1对应的硬件部分是TxD/P3.1和RxD/P3.0引脚,串行口2
对应的硬件部分是TxD2和RxD2。通过设置特殊功能寄存器AUXR1中的S2_P4/AUXR1.4位,串
行口2(UART2)功能可以在P1口和P4口之间任意切换。当串行口2功能在P1口实现时,对应的
管脚是P1.2/RxD2和P1.3/TxD2。当串行口2功能在P4口实现时,对应的管脚是P4.2/RxD2和P4.3/
TxD2。
Li
U
C
M
STC12C5A60S2系列单片机的串行通信口,除用于数据通信外,还可方便地构成一个或多
个并行I/O口,或作串����������������
—���������������
并转换,或用于扩展串行外设等。
C
T
S
8.1 串行口1的相关寄存器
符号
BRT
描述
地址
位地址及符号
MSB
LSB
dedicated Baud-Rate Timer 9CH
0000 0000B
独立波特率发生器,装入重装数
AUXR
Auxiliary register
8EH
SCON
Serial Control
98H
SBUF
Serial Buffer
99H
PCON
Power Control
87H
IE
Interrupt Enable
复位值
T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS
SM0/FE
SM1
SM2
RB8
TI
RI
PD
IDL
0000 0000B
0000 0000B
REN
TB8
POF
GF1
ES
ET1
EX1
ET0
EX0 0000 0000B
PT1
PX1
PT0
PX0 0000 0000B
xxxx xxxxB
SMOD SMOD0 LVDF
A8H EA ELVD EADC
GF0
0011 0000B
IP
Interrupt Priority Low
B8H PPCA PLVD PADC PS
IPH
Interrupt Priority High
B7H
SADEN
Slave Address Mask
B9H
0000 0000B
SADDR
Slave Address
A9H
0000 0000B
0000 0000B
WAKE_CLKO
CLK_Output Power down Wake-up
8FH
control register
南通国芯微电子有限公司
PPCAH PLVDH PADCH PSH PT1H PX1H PT0H
PX0H
PCAWAKEUP RxD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_WAKE BRTCLKO T1CLKO T0CLKO
总机:0513-5501 2928 / 2929 / 2966
0000 0000B
传真:0513-5501 2969 / 2956 / 2947
263
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1. 串行口1的控制寄存器SCON和PCON
STC12C5A60S2系列单片机的串行口1设有两个控制寄存器:串行控制寄存器SCON和波特
率选择特殊功能寄存器PCON。
串行控制寄存器SCON用于选择串行通信的工作方式和某些控制功能。其格式如下:
SCON : 串行控制寄存器 (可位寻址)
SFR name
SCON
Address
98H
bit
name
B7
SM0/FE
B6
SM1
B5
SM2
B4
REN
B3
TB8
B2
RB8
B1
TI
B0
RI
SM0/FE:当PCON寄存器中的SMOD0/PCON.6位为1时,该位用于帧错误检测。当检测到一个
无效停止位时,通过UART接收器设置该位。它必须由软件清零。
当PCON寄存器中的SMOD0/PCON.6位为0时,该位和SM1一起指定串行通信的工作
方式,如下表所示。
.
d
e
t
i
m
其中SM0、SM1按下列组合确定串行口1的工作方式:
SM0 SM1 工作方式
0
0
方式0
0
1
方式1
1
0
方式2
功能说明
波特率
同步移位串行
当UART_M0x6 = 0时,波特率是SYSclk/12,
方式:移位寄
当UART_M0x6 = 1时,波特率是SYSclk / 2
存器
8位UART,
( 2SMOD/32 )×(定时器1的溢出率或BRT独立波特率发生器的溢出率)
波特率可变
9位UART ( 2SMOD / 64) x SYSclk系统工作时钟频率
C
T
S
U
C
M
Li
9位UART,
(2SMOD/32 )x(定时器1的溢出率或BRT独立波特率发生器的溢出率)
波特率可变
当T1x12 = 0时���������
,定时器�����
1的溢出率 = SYSclk/12/( 256 - T H1);
当T1x12 = 1时,��������
定时器�����
1的溢出率 = SYSclk / ( 256 - T H1)
1
1
方式3
当BRTx12 = 0时����������������
,���������������
BRT独立波特率发生器的溢出率 = SYSclk/12/( 256 - BRT );
当BRTx12 = 1时����������������
,���������������
BRT独立波特率发生器的溢出率 = SYSclk / ( 256 - BRT )
SM2:允许方式2或方式3多机通信控制位。
在方式2或方式3时,如果SM2位为1且REN位为1,则接收机处于地址帧筛选状态。此时
可以利用接收到的第9位(即RB8)来筛选地址帧:若RB8=1,说明该帧是地址帧,地址信
息可以进入SBUF,并使RI为1,进而在中断服务程序中再进行地址号比较;若RB8=0,
说明该帧不是地址帧,应丢掉且保持RI=0。在方式2或方式3中,如果SM2位为0且REN位
为1,接收收机处于地址帧筛选被禁止状态。不论收到的RB8为0或1,均可使接收到的
信息进入SBUF,并使RI=1,此时RB8通常为校验位.
方式1和方式0是非多机通信方式,在这两种方式时,要设置SM2 应为0。
REN:允许/禁止串行接收控制位。由软件置位REN,即REN=1为允许串行接收状态,可启动
串行接收器RxD,开始接收信息。软件复位REN,即REN=0,则禁止接收。
TB8: 在方式2或方式3,它为要发送的第9位数据,按需要由软件置位或清0。例如,可用作数
据的校验位或多机通信中表示地址帧/数据帧的标志位。在方式0和方式1中,该位不用.
RB8: 在方式2或方式3,是接收到的第9位数据,作为奇偶校验位或地址帧/数据帧的标志位。
方式0中不用RB8(置SM2=0). 方式1中也不用RB8(置SM2=0, RB8是接收到的停止位)。
264
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
TI:
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
发送中断请求中断标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置
位,即TI=1,向主机请求中断,响应中断后TI必须用软件清零,即TI=0。在其他方式
中,则在停止位开始发送时由内部硬件置位,即TI=1,响应中断后TI必须用软件清零。
RI: 接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1,
向主机请求中断,响应中断后RI必须用软件清零,即RI=0。在其他方式中,串行接收
到停止位的中间时刻由内部硬件置位,即RI=1,向CPU发中断申请,响应中断后RI必须
由软件清零。
SCON的所有位可通过整机复位信号复位为全�
“ 0”�
。 SCON的字节地址为98H,可位寻
址,各位地址为98H~~9FH,可用软件实现位设置。
串行通信的中断请求:当一帧发送完成,内部硬件自动置位TI,即TI=1,请求中断处理;
当接收完一帧信息时,内部硬件自动置位RI,即RI=1,请求中断处理。由于TI和RI以���
“��
或逻
辑���������������������������
”��������������������������
关系向主机请求中断,所以主机响应中断时事先并不知道是TI还是RI请求的中断,必须在
中断服务程序中查询TI和RI进行判别,然后分别处理。因此,两个中断请求标志位均不能由硬
件自动置位,必须通过软件清0,否则将出现一次请求多次响应的错误。
U
C
M
.
d
e
t
i
m
Li
电源控制寄存器PCON中的SMOD/PCON.7用于设置方式1、方式2、方式3的波特率是否加
倍。
电源控制寄存器PCON格式如下:
PCON : 电源控制寄存器 (不可位寻址)
SFR name Address
bit
B7
B6
B5
B4
B3
B2
B1 B0
PCON
87H
name SMOD SMOD0 LVDF POF GF1 GF0 PD IDL
C
T
S
SMOD:波特率选择位。当用软件置位SMOD,即SMOD=1,则使串行通信方式1、2、3的波
特率加倍;SMOD=0,则各工作方式的波特率加倍。复位时SMOD=0。
SMOD0:帧错误检测有效控制位。当SMOD0=1,SCON寄存器中的SM0/FE位用于FE(帧错误
检测)功能;当SMOD0=0,SCON寄存器中的SM0/FE位用于SM0功能,和SM1一起指
定串行口的工作方式。复位时SMOD0=0
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
265
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 串行口数据缓冲寄存器SBUF
STC12C5A60S2系列单片机的串行口1缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲
器,写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分
别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器。
串行通道内设有数据寄存器。在所有的串行通信方式中,在写入SBUF信号(MOV SBUF,A)
的控制下,把数据装入相同的9位移位寄存器,前面8位为数据字节,其最低位为移位寄存器的
输出位。根据不同的工作方式会自动将�
“1”�
或TB8的值装入移位寄存器的第9位,并进行发送.
串行通道的接收寄存器是一个输入移位寄存器。在方式0时它的字长为8位,其他方式时为
9位。当一帧接收完毕,移位寄存器中的数据字节装入串行数据缓冲器SBUF中,其第9位则装入
SCON寄存器中的RB8位。如果由于SM2使得已接收到的数据无效时,RB8和SBUF中内容不变.
.
d
e
t
i
m
由于接收通道内设有输入移位寄存器和SBUF缓冲器,从而能使一帧接收完将数据由移位
寄存器装入SBUF后,可立即开始接收下一帧信息,主机应在该帧接收结束前从SBUF缓冲器中
将数据取走,否则前一帧数据将丢失。SBUF以并行方式送往内部数据总线。
3. 辅助寄存器AUXR
U
C
M
辅助寄存器AUXR的格式及各位含义如下:
AUXR : 辅助寄存器 (不可位寻址)
SFR name
Address
AUXR
8EH
bit
C
T
S
B7
B6
B5
Li
B4
B3
B2
B1
B0
name T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS
T0x12�����
:����
定时器0速度设置位
0, 定时器0是传统8051 速度,12 分频;
1, 定时器0 的速度是传统8051 的12 倍,不分频
T1x12: 定时器1速度设置位
0, 定时器1 是传统8051 速度,12 分频;
1, 定时器1 的速度是传统8051 的12 倍,不分频
如果UART串口用定时器1做波特率发生器,T1x12位就可以控制UART串口是12T还是1T了。
UART_M0x6:串行口模式0的通信速度设置位
0,�����������������������������
UART串口的模式0是传统12T的8051速度,12分频;
1��������������������������������
,�������������������������������
UART串口的模式0的速度是传统12T的8051的6倍,2分频
BRTR:独立波特率发生器运行控制位
0,��������������
不允许独立波特率发生器运行;
1�������������
,������������
允许独立波特率发生器运行
S2SMOD:串口2的波特率加倍控制位。
0,串口2的波特率不加倍�
;
1����������
,串口2的波特率加倍
对于�������������������������������������������
STC12C5A60S2�������������������������������
系列单片机,串口�����������������������
2����������������������
只能使用独立波特率发生器作为波特率发生器,不
能够选择定时器1作为波特率发生器;而串口1既可以选择定时器1作为波特率发生器,也可以
选择独立波特率发生器作为波特率发生器。
266
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
BRTx12:独立波特率发生器计数控制位。
0,�������������������
独立波特率发生器每12个时钟计数一次;
1�����������������
,����������������
独立波特率发生器每1个时钟计数一次
EXTRAM:������������������������
0, 允许使用内部扩展的1024字节扩展RAM
1, 禁止使用内部扩展的1024字节扩展RAM
S1BRS:串行口波特率发生器选择位。
0,��������������������������������������
缺省,串����������������������������������
行���������������������������������
口波特率发生器选择定时器1,S1BRS是串口1波特率发生器选择位;
1�������������������������������������������
,������������������������������������������
独立波特率发生器作为串�������������������������������
行������������������������������
口的波特率发生器,此时定时器1得到释放,可以作为独
立定时器使用
串口1可以选择定时器1做波特率发生器,也可以选择独立波特率发生器作为波特率发生
器�
。当设置AUXR寄存器中的S1BRS位(串�������������������������
行������������������������
口波特率选择位)为1时,串�����������
行����������
口选择独立波特率发生
器作为波特率发生器,此时定时器1可以释放出来作为定时器/计数器/时钟输出使用.
4. 独立波特率发生器寄存器BRT
.
d
e
t
i
m
Li
独立波特率发生器寄存器BRT(地址为9CH,复位值为00H)用于保存重装时间常数。
U
C
M
STC12C5A60S2系列单片机是1T的8051单片机,复位后兼容传统8051单片机。
如果UART串口用定时器1做波特率发生器,AUXR��������������������������
中的������������������������
T1x12/AUXR.6位就可以控制UART串口
是12T还是1T。
C
T
S
5. 从机地址控制寄存器SADEN和SADDR
为了方便多机通信,STC12C5A60S2系列单片机设置了从机地址控制寄存器SADEN和
SADDR。其中SADEN是从机地址掩模寄存器(地址为B9H,复位值为00H),SADDR是从机地址寄存
器(地址为A9H,复位值为00H)。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
267
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6. 与串行口1中断相关的寄存器IE、IP和IPH
串行口中断允许位ES位于中断允许寄存器IE中,中断允许寄存器的格式如下:
IE : 中断允许寄存器 (可位寻址)
SFR name
Address
bit
B7
IE
A8H
name
EA
B6
B5
ELVD EADC
B4
B3
B2
B1
B0
ES
ET1
EX1
ET0
EX0
EA : CPU的总中断允许控制位,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。
EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受各中断源自
己的中断允许控制位控制。
ES : 串行口中断允许位,ES=1,允许串行口中断,ES=0,禁止串行口中断。
.
d
e
t
i
m
IPH : 中断优先级控制寄存器高 (不可位寻址)
SFR name Address
IPH
B7H
bit
B7
B6
B5
B4
B3
B2
B1
B0
name PPCAH PLVDH PADCH PSH PT1H PX1H PT0H PX0H
IP : 中断优先级控制寄存器低 (可位寻址)
SFR name
IP
PSH, PS:
268
Address
B8H
bit
name
C
T
S
U
C
M
B7
PPCA
B6
PLVD
B5
PADC
Li
B4
PS
B3
PT1
B2
PX1
B1
PT0
B0
PX0
串行口1中断优先级控制位。
当PSH=0且PS=0时,串行口1中断为最低优先级中断(优先级0)
当PSH=0且PS=1时,串行口1中断为较低优先级中断(优先级1)
当PSH=1且PS=0时,串行口1中断为较高优先级中断(优先级2)
当PSH=1且PS=1时,串行口1中断为最高优先级中断(优先级3)
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
8.2 串行口1工作模式
STC12C5A60S2系列单片机的串行通信接口有4种工作模式,可通过软件编程对SCON中的
SM0、SM1的设置进行选择。其中模式1、模式2和模式3为异步通信,每个发送和接收的字符
都带有1个启动位和1个停止位。在模式0中,串行口被作为1个简单的移位寄存器使用。
8.2.1 串行口1工作模式0:同步移位寄存器
在模式0状态,串行通信接口工作在同步移位寄存器模式,当�������������
串行口模式0的通信速度设置
位UART_M0x6/AUXR.5 = 0时,其波特率固定为SYSclk/12。当��������������
串行口模式0的通信速度设置�
位
UART_M0x6/AUXR.5 = 1时,其波特率固定为SYSclk/2。串行口数据由RxD/P3.0端输入,同步
移位脉冲(SHIFTCLOCK)由TxD/P3.1输出,发送、接收的是8位数据,低位在先。
.
d
e
t
i
m
模式0的发送过程:当主机执行将数据写入发送缓冲器SBUF指令时启动发送,串行口即将
8位数据以SYSclk/12或SYSclk/2(由UART_M0x6/AUXR.5确定是12分频还是2分频)的波特率从
RxD管脚输出(从低位到高位),发送完中断标志TI置"1",TxD管脚输出同步移位脉冲(SHIFTCLOCK)。波形如图8-1中“发送”所示。
U
C
M
Li
当写信号有效后,相隔一个时钟,发送控制端SEND有效(高电平),允许RxD发送数据,
同时允许TxD输出同步移位脉冲。一帧(8位)数据发送完毕时,各控制端均恢复原状态,只有
TI保持高电平,呈中断申请状态。在再次发送数据前,必须用软件将TI清0。
C
T
S
模式0接收过程:模式0接收时,复位接收中断请求标志RI,即RI=0,置位允许接收控制
位REN=1时启动串行模式0接收过程。启动接收过程后,RxD为串行输入端,TxD为同步脉冲
输出端。串行接收的波特率为SYSclk/12或SYSclk/2(由UART_M0x6/AUXR.5确定是12分频还是
2分频)。其时序图如图8-1中“接收”所示。
当接收完成一帧数据(8位)后,控制信号复位,中断标志RI被置"1",呈中断申请状态。当
再次接收时,必须通过软件将RI清0
工作于模式0时,必须清0多机通信控制位SM2,使不影响TB8位和RB8位。由于波特率固
定为SYSclk/12或SYSclk/2,无需定时器提供,直接由单片机的时钟作为同步移位脉冲。
串行口工作模式0的示意图如图8-1所示
由示意图中可见,由TX和RX控制单元分别产生中断请求信号并置位TI=1或RI =1,经��
“�
或
门�������������������������
“������������������������
送主机请求中断,所以主机响应中断后必须软件判别是TI还是RI请求中断,必须软件清0
中断请求标志位TI或RI。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
269
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
INTERNAL BUS
WRITE
TO
SBUF
DS Q
CL
RxD
OUTPUT FUNCTION
SBUF
ZERO DETECTOR
SYSclk/12
SYSclk/2
START
0
TX CONTROL
SERIAL
PORT
INTERRUPT
1
AUXR.5(UART_M0x6)
REN
RI
TX CLOCK
TI
RX CLOCK
RI
START
SHIFT
SHIFT
SEND
RECEIVE
1 1 1 1 1 1 1 0
INPUT SHIFT REG.
WRITE TO SBUF
C
T
S
.
d
e
t
i
m
RX CONTROL SHIFT
U
C
M
LOAD
SBUF
TxD
OUTPUT FUNCTION
SHIFT
CLOCK
SHIFT
Li
RxD
INPUT FUNCTION
SBUF
READ
SBUF
INTERNAL BUS
SEND
SHIFT
TRANSMIT
RXD(DATA OUT)
D0
D1
D2
D3
D4
D5
D6
D7
TXD(SHIFT CLOCK)
TI
WRITE TO SCON(CLEAR RI)
RI
RECEIVE
RECEIVE
SHIFT
RXD(DATA IN)
D0
D1
D2
D3
D4
D5
D6
D7
TXD(SHIFT CLOCK)
图8-1 串行口1模式0功能结构及时序示意图
270
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
8.2.2 串行口1工作模式1:8位UART,波特率可变
当软件设置SCON的SM0、SM1为�
“01”����������
时,串行口1则以模式1工作。此模式为8位UART
格式,一帧信息为10位:1位起始位,8位数据位(低位在先)和1位停止位。波特率可变,即可
根据需要进行设置。TxD/P3.1为发送信息,RxD/P3.0为接收端接收信息,串行口为全双工接受
/发送串行口。
图8-2为串行模式1的功能结构示意图及接收/发送时序图
模式1的发送过程:串行通信模式发送时,数据由串行发送端TxD输出。当主机执行一条
写�
“SBUF“����������������
的指令就启动串行通信的发送,写�
“SBUF”�����
信号还把�
“1”���������
装入发送移位寄存器
的第9位,并通知TX控制单元开始发送。发送各位的定时是由16分频计数器同步。
移位寄存器将数据不断右移送TxD端口发送,在数据的左边不断移入�
“ 0”�����
作补充。当
数据的最高位移到移位寄存器的输出位置,紧跟其后的是第9位�
“1”����������
,在它的左边各位全为
“0”���������
,这个状态条件,使TX控制单元作最后一次移位输出,然后使允许发送信号�
“SEND”
失效,完成一帧信息的发送,并置位中断请求位TI,即TI=1,向主机请求中断处理。
.
d
e
t
i
m
Li
模式1的接收过程:当软件置位接收允许标志位REN,即REN=1时,接收器便以选定波特
率的16分频的速率采样串行接收端口RxD,当检测到RxD端口从�
“1”��
→�
“0”�������
的负跳变时就启
动接收器准备接收数据,并立即复位16分频计数器,将1FFH植装入移位寄存器。复位16分频
计数器是使它与输入位时间同步。
U
C
M
16分频计数器的16个状态是将1波特率(每位接收时间)均为16等份,在每位时间的7、
8、9状态由检测器对RxD端口进行采样,所接收的值是这次采样直经����������
“���������
三中取二�����
”����
的值,即3
次采样至少2次相同的值,以此消除干扰影响,提高可靠性。在起始位,如果接收到的值不为
“0”��������������������������
(低电平),则起始位无效,复位接收电路,并重新检测�"1"��
→�"0"���������
的跳变。如果接收到
的起始位有效,则将它输入移位寄存器,并接收本帧的其余信息。
C
T
S
接收的数据从接收移位寄存器的右边移入,已装入的1FFH向左边移出,当起始位�"0"��
移到
移位寄存器的最左边时,使RX控制器作最后一次移位,完成一帧的接收。若同时满足以下两
个条件:
·RI=0;
·SM2=0或接收到的停止位为1。
则接收到的数据有效,实现装载入SBUF,停止位进入RB8,置位RI,即RI=1,向主机请
求中断,若上述两条件不能同时满足,则接收到的数据作废并丢失,无论条件满足与否,接收
器重又检测RxD端口上的�"1"��
→�
"0"��������������������������
的跳变,继续下一帧的接收。接收有效,在响应中断后,必
须由软件清0,即RI=0。通常情况下,串行通信工作于模式1时,SM2设置为�"0"�
。
串行通信模式1的波特率是可变的,可变的波特由定时器/计数器1或独立波特率发生器产
生。
串行通信模式1的波特率=2SMOD/32×(定时器/计数器1溢出率或BRT独立波特率发生器溢出率)
当T1x12 = 0时���������
,定时器�����
1的溢出率 = SYSclk/12/( 256 - TH1);
当T1x12 = 1时,��������
定时器�����
1的溢出率 = SYSclk / ( 256 - TH1)
当BRTx12 = 0时����������������
,���������������
BRT独立波特率发生器的溢出率 = SYSclk/12/( 256 - BRT );
当BRTx12 = 1时����������������
,���������������
BRT独立波特率发生器的溢出率 = SYSclk / ( 256 - BRT )
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
271
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
INTERNAL BUS
TB8
Timer 1 or BRT
Overflow
÷2
WRITE
TO
SBUF
DS Q
CL
TxD
ZERO DETECTOR
SMOD
=1
SMOD
=0
SBUF
SHIFT
START
TX CONTROL
÷16
TX CLOCK
SERIAL
PORT
INTERRUPT
SAMPLE
TI
SEND
RI
LOAD
SBUF
.
d
e
t
i
m
÷16
RX CLOCK
START
1-TO-0
TRANSITION
DETECTOR
DATA
Li
RX CONTROL SHIFT
1FFH
CU
BIT
DETECTOR
M
RxD
C
T
S
INPUT SHIFT REG.
(9 BITS)
SHIFT
LOAD
SBUF
SBUF
READ
SBUF
INTERNAL BUS
TX
CLOCK
WRITE TO SBUF
SEND
TRANSMIT
DATA
SHIFT
D0
TXD
START BIT
TI
D1
D2
D3
D4
D5
D6
D7
START BIT
D0
D1
D2
D3
D4
D5
STOP BIT
RX CLOCK
RXD
RECEIVE BIT DETECTOR SAMPLE TIMES
SHIFT
D6
D7
STOP BIT
RI
图8-2 串行口模式1功能结构示意图及接收/发送时序图
272
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
8.2.3 串行口1工作模式2:9位UART,波特率固定
当SM0、SM1两位为10时,串行口1工作在模式2。串行口1工作模式2为9位数据异步通信
UART模式,其一帧的信息由11位组成:1位起始位,8位数据位(低位在先),1位可编程位(第
9位数据)和1位停止位。发送时可编程位(第9位数据)由SCON中的TB8提供,可软件设置为1或
0,或者可将PSW中的奇/偶校验位P值装入TB8(TB8既可作为多机通信中的地址数据标志位,
又可作为数据的奇偶校验位)。接收时第9位数据装入SCON的RB8。TxD/P3.1为发送端口,
RxD/P3.0为接收端口,以全双工模式进行接收/发送。
模式2的波特率为:
串行通信模式2波特率=2SMOD/64×(SYSclk系统工作时钟频率)
上述波特率可通过软件对PCON中的SMOD位进行设置,当SMOD=1时,选择1/32(SYSclk)
;当SMOD=0时,选择1/64(SYSclk) ,故而称SMOD为波特率加倍位。可见,模式2的波特率基
本上是固定的。
.
d
e
t
i
m
Li
图8-3为串行通信模式2的功能结构示意图及其接收/发送时序图。
由图8-3可知,模式2和模式1相比,除波特率发生源略有不同,发送时由TB8提供给移位寄
存器第9数据位不同外,其余功能结构均基本相同,其接收/发送操作过程及时序也基本相同。
U
C
M
当接收器接收完一帧信息后必须同时满足下列条件:
·RI=0
C
T
S
·SM2=0或者SM2=1,并且接收到的第9数据位RB8=1。
当上述两条件同时满足时,才将接收到的移位寄存器的数据装入SBUF和RB8中,并置位
RI=1,向主机请求中断处理。如果上述条件有一个不满足,则刚接收到移位寄存器中的数据无
效而丢失,也不置位RI。无论上述条件满足与否,接收器又重新开始检测RxD输入端口的跳变
信息,接收下一帧的输入信息。
在模式2中,接收到的停止位与SBUF、RB8和RI无关。
通过软件对SCON中的SM2、TB8的设置以及通信协议的约定,为多机通信提供了方便。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
273
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
INTERNAL BUS
TB8
WRITE
TO
SBUF
DS Q
CL
SBUF
TxD
ZERO DETECTOR
SYSclk/2
STOP BIT
START GEN.
MODE 2
÷16
÷2
TX CLOCK
TI
SERIAL
PORT
INTERRUPT
SMOD=1
SMOD=0
DATA
SEND
.
d
e
t
i
m
÷16
SAMPLE
(SMOD IS PCON.7)
SHIFT
TX CONTROL
1-TO-0
TRANSITION
DETECTOR
START
RX
RI
CLOCK
LOAD
SBUF
Li
RX CONTROL SHIFT
1FFH
CU
BIT
DETECTOR
M
RxD
C
T
S
INPUT SHIFT REG.
(9 BITS)
SHIFT
LOAD
SBUF
SBUF
READ
SBUF
INTERNAL BUS
TX
CLOCK
WRITE TO SBUF
SEND
TRANSMIT
DATA
SHIFT
D0
TXD
START BIT
TI
D1
D2
D3
D4
D5
D6
D7
TB8
STOP BIT
START BIT
D0
D1
D2
D3
D4
D5
D6
D7
STOP BIT GEN
RX CLOCK
RECEIVE
RXD
RB8
STOP BIT
BIT DETECTOR SAMPLE TIMES
SHIFT
RI
图8-3 串行口模式2功能结构示意图及接收/发送时序图
274
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
8.2.4 串行口1工作模式3:9位UART,波特率可变
当SM0、SM1两位为11时,串行口1工作在模式3。������
串行通信��
模式3为9位数据异步通信
UART模式��������
,�������
其一帧的信息由11位组成:1位起始位,8位数据位(低位在先),1位可编程位(第
9位数据)和1位停止位。发送时可编程位(第9位数据)由SCON中的TB8提供,可软件设置为1或
0,或者可将PSW中的奇/偶校验位P值装入TB8(TB8既可作为多机通信中的地址数据标志位,
又可作为数据的奇偶校验位)。接收时第9位数据装入SCON的RB8。TxD/P3.1为发送端口,
RxD/P3.0为接收端口,以全双工模式进行接收/发送。
模式3的波特率为:
串行通信模式3波特率=2SMOD/32×(定时器/计数器1的溢出率或BRT独立波特率发生器的溢出率)
当T1x12 = 0时���������
,定时器�����
1的溢出率 = SYSclk/12/( 256 - TH1);
当T1x12 = 1时,��������
定时器�����
1的溢出率 = SYSclk / ( 256 - TH1)
.
d
e
t
i
m
当BRTx12 = 0时����������������
,���������������
BRT独立波特率发生器的溢出率 = SYSclk/12/( 256 - BRT );
当BRTx12 = 1时����������������
,���������������
BRT独立波特率发生器的溢出率 = SYSclk / ( 256 - BRT )
Li
可见,模式3和模式1一样,其波特率可通过软件对定时器/计数器1或独立波特率发生器的
设置进行波特率的选择,是可变的。
U
C
M
图8-4为串行口工作模式3的功能结构示意图及其接收/发送时序图。
由图8-4可知,模式3和模式1相比,除发送时由TB8提供给移位寄存器第9数据位不同外,
其余功能结构均基本相同,其接收����������������
‘���������������
发送操作过程及时序也基本相同。
C
T
S
当接收器接收完一帧信息后必须同时满足下列条件:
·RI=0
·SM2=0或者SM2=1,并且接收到的第9数据位RB8=1。
当上述两条件同时满足时,才将接收到的移位寄存器的数据装入SBUF和RB8中,并置位
RI=1,向主机请求中断处理。如果上述条件有一个不满足,则刚接收到移位寄存器中的数据无
效而丢失,也不置位RI。无论上述条件满足与否,接收器又重新开始检测RxD输入端口的跳变
信息,接收下一帧的输入信息。
在模式3中,接收到的停止位与SBUF、RB8和RI无关。
通过软件对SCON中的SM2、TB8的设置以及通信协议的约定,为多机通信提供了方便。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
275
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
INTERNAL BUS
TB8
TIMER 1 or BRT
OVERFLOW
WRITE
TO
SBUF
DS Q
CL
÷2
SBUF
TxD
ZERO DETECTOR
SMOD
=0
SMOD
=1
SHIFT
START
TX CONTROL
÷16
TX CLOCK
SERIAL
PORT
INTERRUPT
TI
SEND
RI
LOAD
SBUF
RX CLOCK
START
Li
RX CONTROL SHIFT
1FFH
CU
BIT
DETECTOR
M
RxD
C
T
S
.
d
e
t
i
m
÷16
SAMPLE
1-TO-0
TRANSITION
DETECTOR
DATA
INPUT SHIFT REG.
(9 BITS)
SHIFT
LOAD
SBUF
SBUF
READ
SBUF
INTERNAL BUS
TX
CLOCK
WRITE TO SBUF
SEND
TRANSMIT
DATA
SHIFT
D1
D0
TXD
START BIT
TI
D2
D3
D4
D5
D6
D7
TB8
STOP BIT
D1
D2
D3
D4
D5
D6
D7
STOP BIT GEN
RECEIVE
RX CLOCK
÷16 RESET
RXD
START BIT
D0
RB8
STOP BIT
BIT DETECTOR SAMPLE TIMES
SHIFT
RI
图8-4 串行口模式3功能结构示意图及接收/发送时序图
276
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
8.3 串行通信中波特率的设置
STC12C5A60S2系列单片机串行通信的波特率随所选工作模式的不同而异,对于工作模式
0和模式2,其波特率与系统时钟频率SYSclk和PCON中的波特率选择位SMOD有关,而模式1
和模式3的波特率除与SYSclk和PCON位有关外,还与定时器/计数器1或BRT独立波特率发生器
设置有关。通过对定时器/计数器1或BRT独立波特率发生器的设置,可选择不同的波特率,所
以这种波特率是可变的。
串行通信模式0,其波特率与系统时钟频率SYSclk有关 。
当�����������
模式0的通信速度设置�
位UART_M0x6/AUXR.5 = 0时,其波特率 = SYSclk/12。
当�����������
模式0的通信速度设置�
位UART_M0x6/AUXR.5 = 1时,其波特率 = SYSclk/2。
.
d
e
t
i
m
一旦SYSclk选定且UART_M0x6/AUXR.5设置好,则串行通信工作模式0的波特率固定不
变。
Li
串行通信工作模式2,其波特率除与SYSclk有关外,还与SMOD位有关。
其基本表达式为:串行通信模式2波特率=2SMOD/64×(SYSclk系统工作时钟频率)
U
C
M
当SMOD=1时,波特率=2/64(SYSclk)=1/32(SYSclk);
当SMOD=0时,波特率=1/64(SYSclk)。
当SYSclk选定后,通过软件设置PCON中的SMOD位,可选择两种波特率。所以,这种模
式的波特率基本固定。
C
T
S
串行通信模式1和3,其波特率是可变的:
模式1、3波特率=2SMOD/32×(���
定时器/计数器1的溢出率或����������������
BRT�������������
独立波特率发生器的溢出率�)
当T1x12 = 0时���������
,定时器�����
1的溢出率 = SYSclk/12/( 256 - TH1);
当T1x12 = 1时,��������
定时器�����
1的溢出率 = SYSclk / ( 256 - TH1)
当BRTx12 = 0时����������������
,���������������
BRT独立波特率发生器的溢出率 = SYSclk/12/( 256 - BRT );
当BRTx12 = 1时����������������
,���������������
BRT独立波特率发生器的溢出率 = SYSclk / ( 256 - BRT )
通过对定时器/计数器1和BRT独立波特率发生器的设置,可灵活地选择不同的波特率。在
实际应用中多半选用串行模式1或串行模式3。显然,为选择波特率,关键在于定时器/计数器1
和BRT独立波特率发生器的溢出率的计算。SMOD的选择,只需根据需要执行下列指令就可实
现SMOD=0或1;
MOV
MOV
PCON,#00H
PCON,#80H
;使SMOD=0
;使SMOD=1
SMOD只占用电源控制寄存器PCON的最高一位,其他各位的具体设置应根据实际情况而
定。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
277
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
当用户选择定时器/计数器������������������������
1�����������������������
作波特率发生器时,为选择波特率,关键在于定时器/计数器1
的溢出率。下面介绍如何计算定时器/计数器1的溢出率。
定时器/计数器1的溢出率定义为:单位时间(秒)内定时器/计数器1回0溢出的次数,即定
时器/计数器1的溢出率=定时器/计数器1的溢出次数/秒。
STC12C5A60S2系列单片机设有两个定时器/计数器,因定时器/计数器1具有4种工作方式,
而常选用定时器/计数器1的工作方式2(8位自动重装)作为波特率的溢出率。
设置定时器/计数器1工作于定时模式的工作方式2(8位自动重装),TL1的计数输入来
自于SYSclk经12分频或不分频(由T1x12/AUXR.6确定是12分频还是不分频)的脉冲。当T1x12/
AUXR.6=0时,单片机工作在12T模式,TL1的计数输入来自于SYSclk经12分频的脉冲;当
T1x12/AUXR.6=1时,单片机工作在1T模式,TL1的计数输入来自于SYSclk不经过分频的脉冲。
可见,定时器/计数器1的溢出率与SYSclk和自动重装值N有关,SYSclk越大,特别是N越大,
溢出率也就越高。例如:当N=FFN,则每隔一个时钟即溢出一次(极限情况);若N=00H,
则需每隔256个时钟才溢出一次;当SYSclk=6MHz且T1x12/AUXR.6=0时,一个时钟为2µs,
当SYSclk=6MHz且T1x12/AUXR.6=1时,一个时钟约为0.167µs(快12倍)。SYSclk=12MHz且
T1x12/AUXR.6=0时,则一个时钟为1µs, 当SYSclk=6MHz且T1x12/AUXR.6=1时,一个时钟约
为0.083µs(快12倍)。对于一般情况下,
U
C
M
.
d
e
t
i
m
Li
当T1x12/AUXR.6=0时,定时器/计数器1溢出一次所需的时间为:(28—N)×12时钟=(28—N)×12×
当T1x12/AUXR.6=1时,定时器/计数器1溢出一次所需的时间为:(28—N)×1时钟=(28—N)×
C
T
S
1
SYSclk
1
SYSclk
于是得定时器/计数器每秒溢出的次数,即
当T1x12/AUXR.6=0时,定时器/计数器1的溢出率=SYSclk/12×(28-N) (次/秒)
当T1x12/AUXR.6=1时,定时器/计数器1的溢出率=SYSclk×(28-N) (次/秒)
式中SYSclk为系统时钟频率,N为再装入时间常数。
显然,选用定时器/计数器0作波特率的溢出率也一样。选用不同工作方式所获得波特率的
范围不同。因为不同方式的计数位数不同,N取值范围不同,且计数方式较复杂。现以定时器
/计数器1工作于方式2为例,
设: T1x12/AUXR.6=0,SYSclk=6MHz, N=FFH,
定时器/计数器1工作于方式2的溢出率为6×106/{12×(256-255)} = 0.5×106(次/秒);
设: T1x12/AUXR.6=0,SYSclk=12MHz, N=FFH,
定时器/计数器1工作于方式2的溢出率 = 1×106(次/秒);
设: T1x12/AUXR.6=0,SYSclk=12MHz, N=00H,
定时器/计数器1工作于方式2的溢出率 = 12×106/12×256≈3906(次/秒)
设: T1x12/AUXR.6=1,SYSclk=6MHz, N=FFH,
定时器/计数器1工作于方式2的溢出率为6×106/(256-255) = 6×106(次/秒);
设: T1x12/AUXR.6=1,SYSclk=12MHz, N=00H,
定时器/计数器1工作于方式2的溢出率 = 12×106/256 = 46875(次/秒)
278
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
下表给出各种常用波特率与定时器/计数器1各参数之间的关系。
常用波特率与定时器/计数器1各参数关系(T1x12/AUXR.6=0)
常用波特率
系统时钟频率
(MHz)
SMOD
方式0 MAX:1M
12
×
方式2 MAX:375K
62.5K
方式1和3
19.2K
9.6K
4.8K
2.4K
1.2K
137.5
110
110
12
12
11.059
11.059
11.059
11.059
11.059
11.986
6
12
MOV
MOV
MOV
SETB
MOV
MOV
C
T
S
×
方式
×
重新装入值
×
1
1
1
0
0
0
0
0
0
×
0
0
0
0
0
0
0
0
×
2
2
2
2
2
2
2
2
×
FFH
FDH
FDH
FAH
F4H
F8H
1DH
72H
0
0
1
FFFBH
U
C
M
TMOD, #20H
TH1, #××H
TL1, #××H
TR1
PCON, #80H
SCON, #50H
C/T
.
d
e
t
i
m
Li
;设置定时器/计数器1定时、工作方式2
; 设置定时常数N
;
;启动定时器/计数器1
;设置SMOD=1
;设置串行通信方式1
…
…
设置波特率的初始化程序段如下:
定时器1
执行上述程序段后,即可完成对定时器/计数器1的操作方式及串行通信的工作方式和波特
率的设置。
由于用其他工作方式设置波特率计算方法较复杂,一般应用较少,故不一一论述。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
279
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
当用户选择BRT独立波特率发生器作波特率发生器时,为选择波特率,关键在于独立波特
率发生器的溢出率。当用户选择BRT独立波特率发生器作波特率发生器时,定时器/�����
计数器��
1可
以释放出来作为定时器/计数器/时钟输出使用.。
用户在程序中如何具体使用串口1 和独立波特率发生器BRT
1.设置串口1 的工作模式,SCON 寄存器中的SM0 和SM1 两位决定了串口1 的4 种工作模式。
2.设置串口1 的波特率,使用独立波特率发生器寄存器和相应的位:
BRT 独立波特率发生器寄存器,BRTx12 位,SMOD 位
3.启动独立波特率发生器,让BRTR 位为1,BRT 独立波特率发生器寄存器就立即开始计数。
4.设置串口1 的中断优先级,及打开中断相应的控制位是:
PS,PSH,ES,EA
5.如要串口1 接收,将REN 置1 即可
如要串口1 发送,将数据送入SBUF 即可,
接收完成标志RI,发送完成标志TI,要由软件清0。
.
d
e
t
i
m
当串口工作在模式1 和模式3 时,计算相应的波特率需要设置的重装载数,结果送入BRT 寄存器
计算自动重装数 RELOAD (SMOD = 0, SMOD 是 PCON 特殊功能寄存器的最高位):
1. 计算 RELOAD (以下是 SMOD = 0 时的计算公式)
U
C
M
Li
a) 12T 模式的计算公式: RELOAD = 256 - INT(SYSclk/Baud0/32/12 + 0.5)
b) 1T 模式的计算公式: RELOAD = 256 - INT(SYSclk/Baud0/32 + 0.5)
计算出的RELOAD 数直接送BRT 寄存器
C
T
S
式中: INT() 表示取整运算即舍去小数, 在式中加 0.5 可以达到四舍五入的目的
SYSclk = 晶振频率
Baud0 = 标准波特率
2. 计算用 RELOAD 产生的波特率:
a) Baud = SYSclk/(256 - RELOAD)/32/12 12T 模式
b) Baud = SYSclk/(256 - RELOAD)/32 1T 模式
3. 计算误差
error = (Baud - Baud0)/Baud0 * 100%
4. 如果误差绝对值 > 3% 要更换波特率或者更换晶体频率, 重复步骤 1-4
例: SYSclk = 22.1184MHz, Baud0 = 57600 (12T 模式)
1. RELOAD = 256 - INT( 22118400/57600/32/12 + 0.5)
= 256 - INT( 1.5 )
= 256 - 1
= 255
= 0FFH
2. Baud = 22118400/(256-255)/32/12
= 57600
3. 误差等于零
280
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
例: SYSclk = 18.432MHz, Baud0 = 57600 (12T 模式)
1. RELOAD = 256 - INT( 18432000/57600/32/12 + 0.5)
= 256 - INT( 0.833 + 0.5 )
= 256 - INT( 1.333 )
= 256 - 1
= 255
= 0FFH
2. Baud = 18432000/(256-255)/32/12
= 48000
3. error = (48000 - 57600)/57600 * 100%
= -16.66%
4. 误差很大, 要更换波特率或者更换晶体频率, 重新计算请见下一例
例: SYSclk = 18.432MHz, Baud0 = 9600 (12T 模式)
1. RELOAD = 256 - INT( 18432000/9600/32/12 + 0.5)
= 256 - INT( 5.5 )
= 256 - 5
= 251
= 0FBH
2. Baud = 18432000/(256-251)/32/12
= 9600
3. 一目了然, 误差等于零
例: SYSclk = 2.000MHz, Baud = 4800 (1T 模式)
1. RELOAD = 256 - INT( 2000000/4800/32 + 0.5)
= 256 - INT( 13.02 + 0.5 )
= 256 - INT( 13.52 )
= 256 - 13
= 243
= 0F3H
2. Baud = 2000000/(256-243)/32
= 4808
3. error = 0.16%
C
T
S
南通国芯微电子有限公司
U
C
M
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
传真:0513-5501 2969 / 2956 / 2947
281
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
8.4 串行口1的测试程序
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机串行口1功能 (8-bit/9-bit) ----------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
typedef unsigned char
typedef unsigned int
BYTE;
WORD;
U
C
M
#define FOSC 18432000L
#define BAUD 9600
C
T
S
/*Define UART parity mode*/
#define NONE_PARITY 0
#define ODD_PARITY 1
#define EVEN_PARITY 2
#define MARK_PARITY 3
#define SPACE_PARITY 4
#define PARITYBIT
sbit
bit
bit9 = P2^2;
busy;
EVEN_PARITY
.
d
e
t
i
m
Li
//System frequency
//UART baudrate
//None parity
//Odd parity
//Even parity
//Mark parity
//Space parity
//Testing even parity
//P2.2 show UART data bit9
void SendData(BYTE dat);
void SendString(char *s);
void main()
{
#if (PARITYBIT == NONE_PARITY)
SCON = 0x50;
//8-bit variable UART
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
SCON = 0xda;
//9-bit variable UART, parity bit initial to 1
#elif (PARITYBIT == SPACE_PARITY)
SCON = 0xd5;
//9-bit variable UART, parity bit initial to 0
#endif
282
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
TMOD
TH1
TR1
ES
EA
SendString("STC12C5A60S2\r\nUart Test !\r\n");
while(1);
= 0x20;
= TL1 = -(FOSC/12/32/BAUD);
= 1;
= 1;
= 1;
临时技术支持:13922829991
研发顾问:13922809991
//Set Timer1 as 8-bit auto reload mode
//Set auto-reload vaule
//Timer1 start run
//Enable UART interrupt
//Open master interrupt switch
}
/*---------------------------UART interrupt service routine
----------------------------*/
void Uart_Isr() interrupt 4 using 1
{
if (RI)
{
RI = 0;
P0 = SBUF;
bit9 = RB8;
}
if (TI)
{
TI = 0;
busy = 0;
}
}
/*---------------------------Send a byte data to UART
Input: dat (data to be sent)
Output:None
----------------------------*/
void SendData(BYTE dat)
{
while (busy);
ACC = dat;
if (P)
{
#if (PARITYBIT == ODD_PARITY)
TB8 = 0;
#elif (PARITYBIT == EVEN_PARITY)
TB8 = 1;
#endif
}
C
T
S
南通国芯微电子有限公司
.
d
e
t
i
m
Li
//Clear receive interrupt flag
//P0 show UART data
//P2.2 show parity bit
U
C
M
//Clear transmit interrupt flag
//Clear transmit busy flag
//Wait for the completion of the previous data is sent
//Calculate the even parity bit P (PSW.0)
//Set the parity bit according to P
//Set parity bit to 0
//Set parity bit to 1
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
283
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
else
{
#if (PARITYBIT == ODD_PARITY)
TB8 = 1;
#elif (PARITYBIT == EVEN_PARITY)
TB8 = 0;
#endif
}
busy = 1;
SBUF = ACC;
}
临时技术支持:13922829991
研发顾问:13922809991
/*---------------------------Send a string to UART
Input: s (address of string)
Output:None
----------------------------*/
void SendString(char *s)
{
while (*s)
{
SendData(*s++);
}
}
C
T
S
284
南通国芯微电子有限公司
U
C
M
//Set parity bit to 1
//Set parity bit to 0
//Send data to UART buffer
.
d
e
t
i
m
Li
//Check the end of the string
//Send current char and increment string ptr
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机串行口1功能 (8-bit/9-bit) ----------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
;/*Define UART parity mode*/
#define NONE_PARITY 0
#define ODD_PARITY 1
#define EVEN_PARITY 2
#define MARK_PARITY 3
#define SPACE_PARITY 4
#define PARITYBIT
EVEN_PARITY
;----------------------------------------BUSY BIT
20H.0
;----------------------------------------
ORG 0000H
LJMP MAIN
C
T
S
//None parity
//Odd parity
//Even parity
//Mark parity
//Space parity
M
CU
.
d
e
t
i
m
Li
//Testing even parity
;transmit busy flag
ORG 0023H
LJMP UART_ISR
;----------------------------------------
ORG 0100H
MAIN:
CLR BUSY
CLR EA
MOV SP,
#3FH
#if (PARITYBIT == NONE_PARITY)
MOV SCON, #50H
;8-bit variable UART
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
MOV SCON, #0DAH
;9-bit variable UART, parity bit initial to 1
#elif (PARITYBIT == SPACE_PARITY)
MOV SCON, #0D5H
;9-bit variable UART, parity bit initial to 0
#endif
;-------------------------------
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
285
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
MOV TMOD, #20H
MOV A,
#0FBH
MOV TH1,
A
MOV TL1,
A
SETB TR1
SETB ES
SETB EA
;------------------------------
MOV DPTR, #TESTSTR
LCALL SENDSTRING
;------------------------------
SJMP $
;----------------------------------------TESTSTR:
;Test string
DB
"STC12C5A60S2 Uart Test !",
;/*---------------------------;UART2 interrupt service routine
;----------------------------*/
UART_ISR:
PUSH ACC
PUSH PSW
JNB RI,
CHECKTI
CLR RI
MOV P0,
SBUF
MOV C,
RB8
MOV P2.2,
C
CHECKTI:
JNB TI,
ISR_EXIT
CLR TI
CLR BUSY
ISR_EXIT:
POP PSW
POP ACC
RETI
C
T
S
286
南通国芯微电子有限公司
研发顾问:13922809991
;Set Timer1 as 8-bit auto reload mode
;256-18432000/12/32/9600
;Set auto-reload vaule
;Timer1 start run
;Enable UART interrupt
;Open master interrupt switch
;Load string address to DPTR
;Send string
.
d
e
t
i
m
0DH,0AH,0
U
C
M
;/*---------------------------;Send a byte data to UART
;Input: ACC (data to be sent)
;Output:None
;----------------------------*/
SENDDATA:
JB
BUSY, $
MOV ACC, A
JNB P,
EVEN1INACC
临时技术支持:13922829991
Li
;Check RI bit
;Clear RI bit
;P0 show UART data
;P2.2 show parity bit
;Check S2TI bit
;Clear S2TI bit
;Clear transmit busy flag
;Wait for the completion of the previous data is sent
;Calculate the even parity bit P (PSW.0)
;Set the parity bit according to P
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
ODD1INACC:
#if (PARITYBIT == ODD_PARITY)
CLR TB8
#elif (PARITYBIT == EVEN_PARITY)
SETB TB8
#endif
SJMP PARITYBITOK
EVEN1INACC:
#if (PARITYBIT == ODD_PARITY)
SETB TB8
#elif (PARITYBIT == EVEN_PARITY)
CLR TB8
#endif
PARITYBITOK:
SETB BUSY
MOV SBUF, A
RET
C
T
S
南通国芯微电子有限公司
研发顾问:13922809991
;Set parity bit to 0
;Set parity bit to 1
;Set parity bit to 1
;Set parity bit to 0
.
d
e
t
i
m
;Parity bit set completed
Li
;Send data to UART buffer
U
C
M
;/*---------------------------;Send a string to UART
;Input: DPTR (address of string)
;Output:None
;----------------------------*/
SENDSTRING:
CLR A
MOVC A,
@A+DPTR
JZ
STRINGEND
INC DPTR
LCALL SENDDATA
SJMP SENDSTRING
STRINGEND:
RET
;----------------------------------------
END
临时技术支持:13922829991
;Get current char
;Check the end of the string
;increment string ptr
;Send current char
;Check next
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
287
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
8.5 串行口2的相关寄存器
位地址及符号
符号
描述
地址
S2CON
Serial 2 Control register
9AH
S2BUF
Serial 2 Buffer
9BH
xxxx xxxxB
dedicated Baud-Rate Timer 9CH
0000 0000B
BRT
MSB
LSB
S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI
S2RI
独立波特率发生器,装入重装数
AUXR
Auxiliary register
8EH
IE
Interrupt Enable
A8H EA ELVD EADC
IE2
Interrupt Enable 2
AFH
-
IP2
Interrupt Priority 2 Low
B5H
-
Interrupt Priority 2 High B6H
-
IP2H
AUXR1
Auxiliary register1
T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS
A2H
-
-
-
0000 0000B
ET1
EX1
ET0
EX0 0000 0000B
-
-
-
ESPI
ES2
xxxx xx00B
-
-
PSPI
PS2
x000 0000B
-
-
.
d
e
t
i
m
-
Li
PSPIH PS2H 0000 0000B
PCA_P4 SPI_P4 S2_P4 GF2 ADRJ
U
C
M
0000 0000B
ES
-
-
复位值
-
DPS
x000 0x0B
1. 串行口2的控制寄存器S2CON
C
T
S
串行口2控制寄存器S2CON用于确定串行口2的工作方式和某些控制功能。其格式如下:
S2CON : 串行口2控制寄存器
SFR name Address bit
B7
B6
B5
B4
B3
B2
B1
S2CON
9AH name S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI
B0
S2RI
S2SM0:该位和S2SM1一起指定串行口2的工作方式,如下表所示。
其中S2SM0、S2SM1按下列组合确定串行口2的工作方式:
S2SM0 S2SM1 工作方式
0
0
方式0
0
1
方式1
1
0
方式2
1
1
方式3
功能说明
波特率
同步移位串行方
式:移位寄存器
波特率是SYSclk/12
8位UART,波
( 2S2SMOD/32 )×(BRT独立波特率发生器的溢出率)
特率可变
9位UART
(2
S2SMOD
/ 64) x SYSclk系统工作时钟频率
9位UART,波
(2S2SMOD/32 )x(BRT独立波特率发生器的溢出率)
特率可变
当BRTx12 = 0时����������������
,���������������
BRT独立波特率发生器的溢出率 = SYSclk/12/( 256 - BRT );
当BRTx12 = 1时����������������
,���������������
BRT独立波特率发生器的溢出率 = SYSclk / ( 256 - BRT )
288
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
S2SM2:允许方式2或方式3多机通信控制位。
在方式2或方式3时,如果S2SM2位为1且S2REN位为1,则接收机处于地址帧筛选状
态。此时可以利用接收到的第9位(即S2RB8)来筛选地址帧:若S2RB8=1,说明该帧是
地址帧,地址信息可以进入S2BUF,并使S2RI为1,进而在中断服务程序中再进行地址
号比较;若S2RB8=0,说明该帧不是地址帧,应丢掉且保持S2RI=0。在方式2或方式3
中,如果S2SM2位为0且S2REN位为1,接收收机处于地址帧筛选被禁止状态。不论收
到的S2RB8为0或1,均可使接收到的信息进入S2BUF,并使S2RI=1,此时S2RB8通常为校
验位.
方式1和方式0是非多机通信方式,在这两种方式时,要设置S2SM2 应为0。
S2REN:允许/禁止串行口2接收控制位。由软件置位S2REN,即S2REN=1为允许串行接收状
态,可启动串行接收器RxD2,开始接收信息。软件复位S2REN,即S2REN=0,则禁
止接收。
.
d
e
t
i
m
S2TB8:在方式2或方式3,S2TB8为要发送的第9位数据,按需要由软件置位或清0。例如,可
用作数据的校验位或多机通信中表示地址帧/数据帧的标志位。在方式0和方式1中,
该位不用.
Li
S2RB8:在方式2或方式3,S2RB8是接收到的第9位数据,作为奇偶校验位或地址帧/数据帧的
标志位。方式0中不用S2RB8(置S2SM2=0). 方式1中也不用S2RB8(置S2SM2=0, S2RB8
是接收到的停止位)。
U
C
M
S2TI:发送中断请求中断标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置
位,即S2TI=1,向主机请求中断,响应中断后S2TI必须用软件清零,即S2TI=0。在其
他方式中,则在停止位开始发送时由内部硬件置位,即S2TI=1,响应中断后S2TI必须用
软件清零。
C
T
S
S2RI:接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位
S2RI=1,向主机请求中断,响应中断后S2RI必须用软件清零,即S2RI=0。在其他方式
中,串行接收到停止位的中间时刻由内部硬件置位,即S2RI=1,向CPU发中断申请,响
应中断后S2RI必须由软件清零。
S2CON的所有位可通过整机复位信号复位为全�
“ 0”�
。 S2CON的字节地址为9AH,不可
位寻址。串行通信的中断请求:当一帧发送完成,内部硬件自动置位S2TI,即S2TI=1,请求
中断处理;当接收完一帧信息时,内部硬件自动置位S2RI,即S2RI=1,请求中断处理。由于
S2TI和S2RI以�������������������������������
“������������������������������
或逻辑���������������������������
”��������������������������
关系向主机请求中断,所以主机响应中断时事先并不知道是S2TI还是
S2RI请求的中断,必须在中断服务程序中查询S2TI和S2RI进行判别,然后分别处理。因此,
两个中断请求标志位均不能由硬件自动置位,必须通过软件清0,否则将出现一次请求多次响
应的错误。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
289
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 串行口2的数据缓冲寄存器S2BUF
STC12C5A60S2系列单片机的串行口2数据缓冲寄存器(S2BUF)的地址是9BH,实际是2个缓
冲器,写S2BUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操
作分别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器。
串行通道内设有数据寄存器。在所有的串行通信方式中,在写入S2BUF信号(MOV
S2BUF,A)的控制下,把数据装入相同的9位移位寄存器,前面8位为数据字节,其最低位为
移位寄存器的输出位。根据不同的工作方式会自动将�
“1”�
或S2TB8的值装入移位寄存器的第9
位,并进行发送.
串行通道的接收寄存器是一个输入移位寄存器。在方式0时它的字长为8位,其他方式时为
9位。当一帧接收完毕,移位寄存器中的数据字节装入串行数据缓冲器S2BUF中,其第9位则装
入S2CON寄存器中的S2RB8位。如果由于S2SM2使得已接收到的数据无效时,S2RB8和S2BUF
中内容不变.
.
d
e
t
i
m
Li
由于接收通道内设有输入移位寄存器和S2BUF缓冲器,从而能使一帧接收完将数据由移位
寄存器装入S2BUF后,可立即开始接收下一帧信息,主机应在该帧接收结束前从S2BUF缓冲器
中将数据取走,否则前一帧数据将丢失。S2BUF以并行方式送往内部数据总线。
C
T
S
U
C
M
3. 独立波特率发生器寄存器BRT
独立波特率发生器寄存器BRT(地址为9CH,复位值为00H)用于保存重装时间常数。
STC12C5A60S2系列单片机是1T的8051单片机,复位后兼容传统8051单片机。
注意:有串口2的单片机,串口2永远是使用独立波特率发生器作为波特率发生器,串口2不能够
选择定时器1 做波特率发生器,串口1可以选择定时器1做波特率发生器,也可以选择独立波特
率发生器作为波特率发生器�
。
290
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
4. 辅助寄存器AUXR
辅助寄存器AUXR的格式及各位含义如下:
AUXR : 辅助寄存器 (不可位寻址)
SFR name
Address
AUXR
8EH
bit
B7
B6
B5
B4
B3
B2
B1
B0
name T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS
BRTR:独立波特率发生器运行控制位
0,��������������
不允许独立波特率发生器运行;
1�������������
,������������
允许独立波特率发生器运行
S2SMOD:串口2的波特率加倍控制位。
0,串口2的波特率不加倍�
;
1����������
,串口2的波特率加倍
对于�������������������������������������������
STC12C5A60S2�������������������������������
系列单片机,串口�����������������������
2����������������������
只能使用独立波特率发生器作为波特率发生器,不
能够选择定时器1作为波特率发生器;而串口1既可以选择定时器1作为波特率发生器,也可以
选择独立波特率发生器作为波特率发生器。
U
C
M
BRTx12:独立波特率发生器计数控制位。
0,�������������������
独立波特率发生器每12个时钟计数一次;
1�����������������
,����������������
独立波特率发生器每1个时钟计数一次
C
T
S
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
传真:0513-5501 2969 / 2956 / 2947
291
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
5. 与串行口2中断相关的寄存器
串行口2中断允许位ES2位于中断允许寄存器IE2中,中断允许寄存器的格式如下:
IE2 : 中断允许寄存器2 (不可位寻址)
SFR name
Address
bit
B7
B6
B5
B4
B3
B2
B1
B0
IE2
AFH
name
-
-
-
-
-
-
ESPI
ES2
ES2 : 串行口2中断允许位,ES2=1,允许串行口2中断,ES2=0,禁止串行口2中断。
IE : 中断允许寄存器 (可位寻址)
SFR name
Address
bit
B7
IE
A8H
name
EA
B6
B5
ELVD EADC
B4
B3
B2
B1
B0
ES
ET1
EX1
ET0
EX0
.
d
e
t
i
m
EA : CPU的总中断允许控制位,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。
EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受各中断源自
己的中断允许控制位控制。
U
C
M
Li
串行口2中断优先级控制位PS2位和PS2H位分别位于中断优先级控制寄存器IP2和IP2H中,
中断优先级控制寄存器的格式如下:
IP2H : 中断优先级控制寄存器 (不可位寻址)
C
T
S
SFR name
Address
bit
B7
IP2H
B6H
name
-
B6
B5
B4
B3
B2
B1
B0
-
-
-
-
-
PSPIH
PS2H
IP2 : 中断优先级控制寄存器 (不可位寻址)
SFR name
Address
bit
B7
B6
B5
B4
B3
B2
B1
B0
IP2
B5H
name
-
-
-
-
-
-
PSPI
PS2
PS2H, PS2:
292
串行口2中断优先级控制位。
当PS2H=0且PS2=0时,串行口2中断为最低优先级中断(优先级0)
当PS2H=0且PS2=1时,串行口2中断为较低优先级中断(优先级1)
当PS2H=1且PS2=0时,串行口2中断为较高优先级中断(优先级2)
当PS2H=1且PS2=1时,串行口2中断为最高优先级中断(优先级3)
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
6. 辅助寄存器1 AUXR1
通过设置寄存器AUXR1中的S2_P4位,可以将串口2在P1和P4口之间任意切换,AUXR1寄存器
的格式如下:
AUXR1 : 辅助寄存器1 (不可位寻址)
SFR name
Address
bit
B7
AUXR1
A2H
name
-
B6
B5
PCA_P4 SPI_P4
B4
B3
B2
B1
B0
S2_P4
GF2
ADRJ
-
DPS
PCA_P4: 0, 缺省PCA在P1口
1,PCA/PWM从P1口切换到P4口
ECI从P1.2切换到P4.1口
PCA0/PWM0从P1.3切换到P4.2口
PCA1/PWM1 从P1.4切换到P4.3口
SPI_P4:
0, 缺省SPI在P1口
1,SPI从P1口切换到P4口
SCLK从P1.7切换到P4.3口
MISO从P1.6切换到P4.2口
MOSI从P1.5切换到P4.1口
SS从P1.4切换到P4.0口
S2_P4:
0, 缺省UART2在P1口
1,UART2从P1口切换到P4口
TxD2从P1.3切换到P4.3口
RxD2从P1.2切换到P4.2口
GF2: 通用标志位
C
T
S
U
C
M
.
d
e
t
i
m
Li
ADRJ:
0, 10位A/D转换结果的高8位放在ADC_RES寄存器,低2位放在ADC_RESL寄存器
1,10位A/D转换结果的最高2位放在ADC_RES寄存器的低2位,低8位放在ADC_RESL寄存器
DPS: 0, 使用缺省数据指针DPTR0
1,使用另一个数据指针DPTR1
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
293
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
8.6 串行口2工作模式
STC12C5A60S2系列单片机的串行口2有4种工作模式,可通过软件编程对S2CON中的
S2SM0、S2SM1的设置进行选择。其中模式1、模式2和模式3为异步通信,每个发送和接收的
字符都带有1个启动位和1个停止位。在模式0中,串行口被作为1个简单的移位寄存器使用。
串行口2的工作方式0:
串行数据通过RxD2/P1.2(RxD2/P4.2)接收和发送,TxD/P1.3(TxD/P4.3)输出同步移位时钟,
发送接收的是����������������
8���������������
位数据,低位在先,波特率固定在SYSclk/12。串行口������������
2�����������
的模式��������
0�������
操作和串行口�
1
的模式��������
0�������
操作方式相同。
.
d
e
t
i
m
串口2波特率在模式0 = SYSclk系统工作时钟频率 / 12
串行口2的工作方式1:
Li
10�����
位数据通过RxD2/P1.2(RxD2/P4.2)接收,通过TxD/P1.3(TxD/P4.3)发送。一帧数据包含
一个起始位�����������������������������������
(0),8������������������������������
个数据位和一个停止位��������������������
(1)�����������������
。接收时,停止位进入特殊功能寄存器S2CON的
S2RB8位。波特率由独立波特率发生器BRT的溢出率决定。
U
C
M
串口2波特率在模式1 = ( 2S2SMOD / 32 ) x BRT 独立波特率发生器的溢出率
当S2SMOD = 0时,串口2波特率 = BRT 独立波特率发生器的溢出率 / 32,
当S2SMOD = 1时,串口2波特率 = BRT 独立波特率发生器的溢出率 / 16,
BRT独立波特率发生器的溢出率 = SYSclk/12/( 256 - BRT ) ,当BRTx12 = 0时,
BRT独立波特率发生器的溢出率 = SYSclk / ( 256 - BRT ) ,当BRTx12 = 1时
C
T
S
串行口2的工作方式2:
11�����
位数据通过RxD2/P1.2(RxD2/P4.2)接收,通过TxD/P1.3(TxD/P4.3)发送。一帧数据包含一
个起始位������������������������������������������
(0),8�������������������������������������
个数据位,一个可编程的第�������������������������
9������������������������
位和一个停止位�����������������
(1)��������������
。�������������
发送时,第9位数据位来自特
殊功能寄存器S2CON的S2TB8位.接收时,第9位进入特殊功能寄存器S2CON的S2RB8位。波特
率可编程为系统时钟频率:SYSclk / 32 或者SYSclk / 64,串口2工作在模式2和串口1工作在模
式2是相同的。
串口2波特率在模式2 = ( 2S2SMOD / 64 ) x SYSclk 系统工作时钟频率
当S2SMOD = 0时,串口2波特率 = SYSclk 系统工作时钟频率 / 64
当S2SMOD = 1时,串口2波特率 = SYSclk 系统工作时钟频率 / 32
294
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
串行口2的工作方式3:
波特率是可变的,其它和模式2相同11位数据通过TxD2/P1.3(TxD2/P4.3)发送,通过RxD2/
P1.2(RxD2/P4.2)接收。一祯数据包含一个起始位(0),8个数据位,一个可编程的第9位,和一
个停止位(1)。发送时,第9位数据位来自特殊功能寄存器S2CON的S2TB8位.接收时,第9位进
入特殊功能寄存器S2CON的S2RB8位。
串口2波特率在模式3 = ( 2S2SMOD / 32 ) x BRT 独立波特率发生器的溢出率
当S2SMOD = 0时,串口2波特率 = BRT 独立波特率发生器的溢出率 / 32,
当S2SMOD = 1时,串口2波特率 = BRT 独立波特率发生器的溢出率 / 16,
BRT独立波特率发生器的溢出率 = SYSclk/12/( 256 - BRT ),当BRTx12 = 0时,
BRT独立波特率发生器的溢出率 = SYSclk / ( 256 - BRT ), 当BRTx12 = 1时
.
d
e
t
i
m
用户在程序中如何具体使用串口2
1.设置串口2的工作模式,S2CON寄存器中的S2SM0和S2SM1两位决定了串口2的4种工作模式
2.设置串口2的波特率相应的寄存器和位:
BRT独立波特率发生器寄存器,BRTx12位,S2SMOD位
3.启动独立波特率发生器,让BRTR位为1,BRT独立波特率发生器寄存器就立即开始计数。
4.设置串口2的中断优先级,及打开中断相应的控制位是:
PS2, PS2H, ES2, EA
5.如要串口2接收,将S2REN置1 即可
如要串口2发送,将数据送入S2BUF即可,
接收完成标志S2RI,发送完成标志S2TI,要由软件清0。
C
T
S
南通国芯微电子有限公司
U
C
M
总机:0513-5501 2928 / 2929 / 2966
Li
传真:0513-5501 2969 / 2956 / 2947
295
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
8.7 串行口2的测试程序
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机串行口2功能 (8-bit/9-bit) ----------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
typedef unsigned char
typedef unsigned int
BYTE;
WORD;
U
C
M
.
d
e
t
i
m
Li
#define FOSC 18432000L
#define BAUD 115200
//System frequency
//UART baudrate
/*Define UART parity mode*/
#define NONE_PARITY 0
#define ODD_PARITY 1
#define EVEN_PARITY 2
#define MARK_PARITY 3
#define SPACE_PARITY 4
//None parity
//Odd parity
//Even parity
//Mark parity
//Space parity
C
T
S
#define PARITYBIT EVEN_PARITY //Testing even parity
/*Declare SFR associated with the UART2 */
sfr
AUXR = 0x8e;
sfr
S2CON = 0x9a;
sfr
S2BUF = 0x9b;
sfr
BRT = 0x9c;
sfr
IE2
= 0xaf;
//Auxiliary register
//UART2 control register
//UART2 data buffer
//Baudrate generator
//Interrupt control 2
#define
#define
#define
#define
//S2CON.0
//S2CON.1
//S2CON.2
//S2CON.3
S2RI
S2TI
S2RB8
S2TB8
0x01
0x02
0x04
0x08
bit busy;
void SendData(BYTE dat);
void SendString(char *s);
296
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
void main()
{
#if (PARITYBIT == NONE_PARITY)
S2CON = 0x50;
//8-bit variable UART
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
S2CON = 0xda;
//9-bit variable UART, parity bit initial to 1
#elif (PARITYBIT == SPACE_PARITY)
S2CON = 0xd5;
//9-bit variable UART, parity bit initial to 0
#endif
BRT = -(FOSC/32/BAUD);
AUXR = 0x14;
IE2 = 0x01;
EA = 1;
SendString("STC12C5A60S2\r\nUart2 Test !\r\n");
while(1);
}
U
C
M
/*---------------------------UART2 interrupt service routine
----------------------------*/
void Uart2() interrupt 8 using 1
{
if (S2CON & S2RI)
{
S2CON &= ~S2RI;
P0 = S2BUF;
P2 = (S2CON & S2RB8);
}
if (S2CON & S2TI)
{
S2CON &= ~S2TI;
busy = 0;
}
}
C
T
S
//Set auto-reload vaule of baudrate generator
//Baudrate generator work in 1T mode
//Enable UART2 interrupt
//Open master interrupt switch
.
d
e
t
i
m
Li
//Clear receive interrupt flag
//P0 show UART data
//P2.2 show parity bit
//Clear transmit interrupt flag
//Clear transmit busy flag
/*---------------------------Send a byte data to UART
Input: dat (data to be sent)
Output:None
----------------------------*/
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
297
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
void SendData(BYTE dat)
{
while (busy);
ACC = dat;
if (P)
{
#if (PARITYBIT == ODD_PARITY)
S2CON &= ~S2TB8;
#elif (PARITYBIT == EVEN_PARITY)
S2CON |= S2TB8;
#endif
}
else
{
#if (PARITYBIT == ODD_PARITY)
S2CON |= S2TB8;
#elif (PARITYBIT == EVEN_PARITY)
S2CON &= ~S2TB8;
#endif
}
busy = 1;
S2BUF = ACC;
}
C
T
S
298
南通国芯微电子有限公司
研发顾问:13922809991
//Wait for the completion of the previous data is sent
//Calculate the even parity bit P (PSW.0)
//Set the parity bit according to P
//Set parity bit to 0
//Set parity bit to 1
.
d
e
t
i
m
Li
//Set parity bit to 1
//Set parity bit to 0
U
C
M
/*---------------------------Send a string to UART
Input: s (address of string)
Output:None
----------------------------*/
void SendString(char *s)
{
while (*s)
{
SendData(*s++);
}
}
临时技术支持:13922829991
//Send data to UART2 buffer
//Check the end of the string
//Send current char and increment string ptr
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机串行口2功能 (8-bit/9-bit) ----------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
;/*Define UART parity mode*/
#define NONE_PARITY 0
#define ODD_PARITY 1
#define EVEN_PARITY 2
#define MARK_PARITY 3
#define SPACE_PARITY 4
//None parity
//Odd parity
//Even parity
//Mark parity
//Space parity
U
C
M
.
d
e
t
i
m
Li
#define PARITYBIT EVEN_PARITY //Testing even parity
;----------------------------------------;/*Declare SFR associated with the UART2 */
AUXR
EQU 08EH
;Auxiliary register
S2CON
EQU 09AH
;UART2 control register
S2BUF
EQU 09BH
;UART2 data buffer
BRT
EQU 09CH
;Baudrate generator
IE2
EQU 0AFH
;Interrupt control 2
C
T
S
S2RI
EQU 01H
S2TI
EQU 02H
S2RB8
EQU 04H
S2TB8
EQU 08H
;----------------------------------------BUSY
BIT
20H.0
;----------------------------------------
ORG 0000H
LJMP MAIN
;S2CON.0
;S2CON.1
;S2CON.2
;S2CON.3
;transmit busy flag
ORG 0043H
LJMP UART2_ISR
;-----------------------------------------
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
299
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
ORG 0100H
MAIN:
CLR BUSY
CLR EA
MOV SP,
#3FH
#if (PARITYBIT == NONE_PARITY)
MOV S2CON, #50H
;8-bit variable UART
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
MOV S2CON, #0DAH
;9-bit variable UART, parity bit initial to 1
#elif (PARITYBIT == SPACE_PARITY)
MOV S2CON, #0D5H
;9-bit variable UART, parity bit initial to 0
#endif
;------------------------------
MOV BRT,
#0FBH
;Set auto-reload vaule of baudrate generator (256-18432000/32/115200)
MOV AUXR, #14H
;Baudrate generator work in 1T mode
ORL IE2,
#01H
;Enable UART2 interrupt
SETB EA
;------------------------------
MOV DPTR, #TESTSTR
;Load string address to DPTR
LCALL SENDSTRING
;Send string
;------------------------------
SJMP $
;----------------------------------------TESTSTR:
;Test string
DB
"STC12C5A60S2 Uart2 Test !",
0DH,0AH,0
C
T
S
U
C
M
;/*---------------------------;UART2 interrupt service routine
;----------------------------*/
UART2_ISR:
PUSH ACC
PUSH PSW
MOV A,
S2CON
JNB ACC.0, CHECKTI
ANL S2CON, #NOT S2RI
MOV P0,
S2BUF
ANL A,
#S2RB8
MOV P2,
A
CHECKTI:
MOV A,
S2CON
JNB ACC.1, ISR_EXIT
ANL S2CON, #NOT S2TI
CLR BUSY
ISR_EXIT:
POP PSW
POP ACC
RETI
300
南通国芯微电子有限公司
.
d
e
t
i
m
Li
;Read UART2 control register
;Check S2RI bit
;Clear S2RI bit
;P0 show UART data
;Mask S2RB8
;P2.2 show parity bit
;
;Read UART2 control register
;Check S2TI bit
;Clear S2TI bit
;Clear transmit busy flag
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
;/*---------------------------;Send a byte data to UART
;Input: ACC (data to be sent)
;Output:None
;----------------------------*/
SENDDATA:
JB
BUSY, $
MOV ACC, A
JNB P,
EVEN1INACC
ODD1INACC:
#if (PARITYBIT == ODD_PARITY)
ANL S2CON, #NOT S2TB8
#elif (PARITYBIT == EVEN_PARITY)
ORL S2CON, #S2TB8
#endif
SJMP PARITYBITOK
EVEN1INACC:
#if (PARITYBIT == ODD_PARITY)
ORL S2CON, #S2TB8
#elif (PARITYBIT == EVEN_PARITY)
ANL S2CON, #NOT S2TB8
#endif
PARITYBITOK:
SETB BUSY
MOV S2BUF, A
RET
C
T
S
南通国芯微电子有限公司
研发顾问:13922809991
;Wait for the completion of the previous data is sent
;Calculate the even parity bit P (PSW.0)
;Set the parity bit according to P
;Set parity bit to 0
.
d
e
t
i
m
;Set parity bit to 1
U
C
M
;/*---------------------------;Send a string to UART
;Input: DPTR (address of string)
;Output:None
;----------------------------*/
SENDSTRING:
CLR A
MOVC A,
@A+DPTR
JZ
STRINGEND
INC DPTR
LCALL SENDDATA
SJMP SENDSTRING
STRINGEND:
RET
;----------------------------------------
END
临时技术支持:13922829991
Li
;Set parity bit to 1
;Set parity bit to 0
;Parity bit set completed
;Send data to UART2 buffer
;Get current char
;Check the end of the string
;increment string ptr
;Send current char
;Check next
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
301
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
8.8 双机通信
STC12C5A60S2系列单片机的串行通信根据其应用可分为双机通信和多机通信两种。下面
先介绍双机通信。
如果两个8051应用系统相距很近,可将它们的串行端口直接相连(TXD—RXD,RXD—
TXD,GND—GND—�������������������������������
地),即可实现双机通信。为了增加通信距离,减少通道及电源干扰,
可采用RS—232C或RS—422、RS—485标准进行双机通信,两通信系统之间采用光�����
—����
电隔离技
术,以减少通道及电源的干扰,提高通信可靠性。
8051
TxD
RxD
RxD
TxD
GND
GND
U
C
M
.
d
e
t
i
m
8051
Li
为确保通信成功,通信双方必须在软件上有系列的约定通常称为软件通信�������
“������
协议����
”���
。现举
例简介双机异步通信软件�������
“������
协议����
”���
如下:
C
T
S
通信双方均选用2400波特的传输速率,设系统的主频SYSclk=6MHz,甲机发送数据,乙机
接收数据。在双机开始通信时,先由甲机发送一个呼叫信号(例如�
“06H”��������
),以询问乙机是
否可以接收数据;乙机接收到呼叫信号后,若同意接收数据,则发回�
“00H”�������
作为应答信号,
否则发�
“05H”���������������������������
表示暂不能接收数据,;甲机只有在接收到乙机的应答信号�
“00H”����
后才可将
存储在外部数据存储器中的内容逐一发送给乙机,否则继续向乙机发呼叫信号,直到乙机同意
接收。其发送数据格式如下:
字节数n
数据1
数据2
数据3
…
数据n
累加校验和
字节数n:甲机向乙机发送的数据个数;
数据1~数据n:甲机将向乙机发送的n帧数据;
累加校验和:为字节数n、数据1、����
…���
、数据n,这(n+1)个字节内容的算术累加和.
乙机根据接收到的������������
“�����������
校验和��������
”�������
判断已接收到的n个数据是否正确。若接收正确,向甲机回发
“0FH”信号,否则回发“F0H”信号。甲机只有在接收到乙机发回的�
“0FH”���������
信号才算完成发送任
务,返回被调用的程序,否则继续呼叫,重发数据。
不同的通信要求,软件�����������������������������
“����������������������������
协议��������������������������
”�������������������������
内容也不一样,有关需甲、乙双方共同遵守的约定应尽量
完善,以防止通信不能正确判别而失败。
STC12C5A60S2系列单片机的串行通信,可直接采用查询法,也可采用自动中断法。
302
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
(1)������������
查询方式双机通信软件举例
①��������
甲机发送子程序段
下图为甲机发送子程序流程图。
开始
定时器,串行口初始化
发送数据
地址指针DPTR,长度计数器
R7,校验寄存器R6置初值
发送完否?
N
Y
.
d
e
t
i
m
发送校验和
发送呼叫信号06H
Li
等待乙机回答
CU
等待乙机回答
N
是00H?
C
T
S
Y
发字节长度数
M
N
传送正确吗?
Y
返回
甲机发送程序设置:
(a) ��������������������������������������������
波特率设置:选用定时器���������������������������������
/��������������������������������
计数器�����������������������������
1����������������������������
定时模式、工作方式�������������������
2������������������
,计数常数�������������
F3H����������
,���������
SMOD=1���
。波
特率为����������
2400������
(位����
/���
秒);
(b) ��������������������
串行通信设置:异步通信方式�������
1������
,允许接收;
(c) ��������������������������������������������
内部������������������������������������������
RAM���������������������������������������
和工作寄存器设置:������������������������������
31H���������������������������
和��������������������������
30H�����������������������
单元存放发送的数据块首地址;���������
2FH������
单元存放
发送的数据块个数;����������
R6��������
为累加和寄存器。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
303
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
甲机发送子程序清单:
START:
MOV
MOV
MOV
MOV
MOV
SETB
ST-RAM:
MOV
MOV
MOV
MOV
TX-ACK:
MOV
MOV
WAIT1:
JBC
SJMP
RX-YES:
JBC
SJMP
NEXT1:
MOV
CJNE
TX-BYT:
MOV
TMOD,#20H
TH1, #0F3H
TL1, #0F3H
SCON, #50H
PCON, #80H
TR1
;设置定时器/计数器1定时、工作方式2
;设置定时计数常数
;
;串口初始化
;设置SMOD=1
;启动定时
DPH,
DPL,
R7,
R6,
31H
30H
2FH
#00H
;设置外部RAM数据指针
;DPTR初值
;发送数据块数送R7
;累加和寄存器R6清0
A,
#06H
;
SBUF, A
;
T1,
WAIT1
;等待发送完呼叫信号
;未发送完转WATI1
RX – YES
RI,
NEXT1
RX-YES
C
T
S
.
d
e
t
i
m
Li
发送呼叫信号“06H”
U
C
M
;判断乙机回答信号
;未收到回答信号,则等待
A,
A,
SBUF
;接收回答信号送A
#00H, TX-ACK ;判断是否“00H”,否则重发呼叫信号
A,
R7
;
MOV SBUF,
ADD A,
MOV R6,
WAIT2:
JBC
TI,
A
R6
A
; 发送数据块数n
TX-NES
;
JMP
TX-NES:
MOVX
MOV
ADD
MOV
INC
WAIT2
; 等待发送完
A,
SBUF,
A,
R6,
DPTR
@DPTR
A
R6
A
;从外部RAM取发送数据
;发送数据块
304
南通国芯微电子有限公司
;DPTR指针加1
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
WAIT3:
JBC
SJMP
NEXT2:
DJNZ
TX-SUM:
MOV
MOV
WAIT4:
JBC TI,
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
TI,
WAIT3
NEXT2
;判断一数据块发送完否
;等待发送完
R7,
TX-NES
;判断发送全部结束否
A,
R6
SBUF, A
;发送累加和给乙机
RX-0FH
;
SJMP
RX-0FH:
JBC
WAIT4
; 等待发送完
SJMP
IF-0FH:
MOV
RX-0FH
CJNE
RET
RI,
A,
A,
IF-0FH
.
d
e
t
i
m
;
SBUF;
研发顾问:13922809991
; 等待接收乙机回答信号
;
Li
#0FH, ST-RAM ; 判断传输是否正确,否则重新发送
;返回
C
T
S
U
C
M
乙机接收子程序段
接收程序段的设置:
(a) ���������������
波特率设置初始化:同发送程序;
(b) ��������������
串行通信初始化:同发送程序;
(c) ������
寄存器设置:
内部RAM 31H、30H单元存放接收数据缓冲区首地址。
R7——数据块个数寄存器。
R6——累加和寄存器。
(d) ���������
向甲机回答信号:“0FH”为接收正确,“F0H”为传送出错,“00H”为同意接收数
据,“05H”为暂不接收。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
305
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
下图为双机通信查询方式乙机接收子程序流程图。
开始
定时器,串行口初始化
接收数据并存入RAM
地址指针DPTR赋值,
校验寄存器清0
地址指针DPTR加1
数据接收完否?
N
Y
.
d
e
t
i
m
接收呼叫信号
接收校验和
是06H?
Y
N
向甲机回送15H
向甲机回送00H
C
T
S
接收数据块长度
Li
传送正确吗?
U
C
M
Y
N
向甲机回送F0H
向甲机回送0FH
返回
接收子程序清单:
TART:
MOV
MOV
;
TL1, #0F3H
TR1
SCON, #50H
; 定时器/计数器1设置
;启动定时器/计数器1
; 置串行通信方式1,允许接收
MOV
ST-RAM:
MOV
PCON, #80H
; SMOD置位
DPH, 31H
;
DPL, 30H
R6, #00H
; 设置DPTR首地址
;校验和寄存器清0
306
MOV
SETB
MOV
TMOD, #20H
TH1, #0F3H
MOV
MOV
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
RX-ACK:
JBC
RI,
IF-06H
SJMP
RX-ACK
MOV
A,
CJNEA #06H, TX-05H
;判断接收呼叫信号
;等待接收呼叫信号
IF-06H:
SBUF
;呼叫信号送A
;判断呼叫信号正确否?
TX-00H:
MOV
A,
#00H
MOV
WAIT1:
SBUF, A
JBC
TI,
SJMP
WAIT1
;
;
RX-BYS
向甲机发送“00H”,同意接收
;等待应答信号发送完
TX-05H:
MOV
A,
#05H
MOV
SBUF, A
;不正确信号
WAIT2:
JBC
TI,
HAVE1
C
T
S
LJMP RX-ACK
RX-BYS:
JBC
SJMP WAIT2
HAVE1:
RI,
Li
U
C
M
;等待发送完
;因呼叫错,返回重新接收呼叫
HAVE2
SJMP RX-BYS
.
d
e
t
i
m
;向甲机发送“05H”呼叫
;等待接收数据块个数
;
HAVE2:
MOV
A,
SBUF
;
MOV R7,
A
;数据块个数帧送R7,R6
MOV R6,
A
;
RX-NES:
JBC
RI,
HAVE3
SJMP RX-NES
HAVE3:
A,
;
MOV
MOVX @DPTR,A
INC
DPTR
ADD
A,
R6
MOV
DJNZ
R6,
R7,
A
RX-NES
南通国芯微电子有限公司
;
SBUF
接收数据帧
;
;接收到的数据存入外部RAM
;
;
; 形成累加和
;判断数据是否接收完
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
307
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
RX-SUM:
JBC
RI,
HAVE4
SJMP RX-SUM
HAVE4:
;
;
MOV
A,
SBUF
CJNE
TX-RIT:
A,
R6,
MOV
A,
#0FH
MOV
WAIT3:
JBC
SJMP
TX-ERR:
MOV
A,
MOV
SBUF, A
JBC
TI,
;
;
;
#0F0H
LJMP
GOOD:
AGAIN
SJMP WAIT4
AGAIN:
RET
C
T
S
ST-RAM
;
WAIT4:
;
GOOD
WAIT3
TX-ERR
;
SBUF, A
TI,
判断传输是否正确
向甲机发送接收正确信息
.
d
e
t
i
m
等待发送结束
Li
;向甲机发送传输有误信号
U
C
M
等待接收校验和
;等待发送完
;返回重新开始接收
;传输正确返回
(2)中断方式双机通信软件举例
在很多应用场合,双机通信的双方或一方采用中断方式以提高通信效率。由于STC12C5A60S2系列单片机的串行通信是双工的,且中断系统只提供一个中断矢量入口地址,所以
实际上是中断和查询必须相结合,即接收/发送均可各自请求中断,响应中断时主机并不知道
是谁请求中断,统一转入同一个中断矢量入口,必须由中断服务程序查询确定并转入对应的服
务程序进行处理。
这里,任以上述协议为例,甲方(发送方)任以查询方式通信(从略),乙方(接收方)
则改用中断����������
—���������
查询方式进行通信。
在中断接收服务程序中,需设置三个标志位来判断所接收的信息是呼叫信号还是数据块个
数,是数据还是校验和。增设寄存器:内部RAM32H单元为数据块个数寄存器,33H单元为校
验和寄存器,位地址7FH、7EH、7DH为标志位。
308
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
乙机接收中断服务程序清单
采用中断方式时,应在主程序中安排定时器/计数器、串行通信等初始化程序。通信接收的数据存放在外
部RAM的首地址也需在主程序中确定。
主程序:
ORG
AJMP START
ORG
0023H
LIMP
SERVE
0000H
;转至主程序起始处
;转中断服务程序处
·
·
·
.
d
e
t
i
m
START:
MOV
TMOD, #20H
MOV
TH1, #0F3H
MOV
MOV
TL1, #0F3H
SCON, #50H
MOV
PCON, #80H
SETB
TR1
SETB
7FH
SETB
7EH
SETB
7DH
MOV
31H,#10H
MOV
MOV
SETB
SETB
30H,#00H
33H,#00H
EA
ES
C
T
S
;定义定时器/计数器1定时、工作方式2
;
Li
; 设置波特率为2400位/秒
;设置串行通信方式1,允许接收
U
C
M
;设置SMOD=1
;启动定时器
;
;设置标志位为1
;
; 规定接收的数据存储于外部RAM的
; 起始地址1000H
;累加和单元清0
;
; 开中断
·
·
·
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
309
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
中断服务程序:
SERVE:
CLR
EA
;关中断
CLR
RI
;清除接收中断请求标志
PUSH
DPH
;
PUSH DPL
; 现场保护
PUSH A
JB
7FH, RXACK
;判断是否是呼叫信号
JB
7EH, RXBYS
;判断是否是数据块数据
JB
7DH, RXDATA
;判断是否是接收数据帧
MOV
A,
;接收到的校验和
CJNE
A, 33H, TXERR
:判断传输是否正确
MOV
A,
;
;
RXSUM:
SBUF
TXRI:
MOV
WAIT1:
#0FH
SBUF, A
JNB
TI,
WAITI
CLR
TI
SJMP
AGAIN
TXERR:
MOV
MOV
WAIT2:
C
T
S
A,
SBUF, A
JNB
TI,
CLR
TI
SJMP
AGAIN
;等待发送完毕
;转结束处理
;
;
WAIT2
Li
向甲机发送接收正确信号“0FH”
;清除发送中断请求标志位
#0F0H
U
C
M
;
.
d
e
t
i
m
向甲机发送接收出错信号“F0H”
;等待发送完毕
;清除发送中断请求标志
;转结束处理
RXACK:
MOV
A,
SBUF
;判断是否是呼叫信号“06H”
XRL
A,
#06H
;异或逻辑处理
JZ
TXREE
;是呼叫,则转TXREE
TXNACK:
310
MOV
A,
#05H
MOV
SBUF, A
南通国芯微电子有限公司
;接收到的不是呼叫信号,则向甲机发送
;“05H”,要求重发呼叫
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
WAIT3:
JNB
TI,
CLR
TI
SJMP
RETURN
WAIT3
; 等待发送结束
;转恢复现场处理
TXREE:
MOV
A,
MOV
SBUF, A
#00H
JNB
TI,
CLR
TI
CLR
7FH
SJMP
RETURN
;接收到的是呼叫信号,发送“00H”
;接收到的是呼叫信号,发送“00H”
WAIT4:
WAIT4
;等待发送完毕
;清除TI标志
;清除呼叫标志
MOV
A,
MOV
32H, A
ADD
A,
MOV
CLR
33H, A
7EH
SJMP
RETURN
SBUF
33H
U
C
M
;
Li
; 形成累加和
;清除数据块数标志
;转恢复现场处理
MOV
DPH, 31H
MOV
MOV
DPL, 30H
A,
SBUF
;接收到数据块数
;存入32H单元
C
T
S
RXDATA:
;
MOVX @DPTR, A
INC
DPTR
MOV
31H, DPH
MOV
ADD
30H, DPL
A,
33H
MOV
DJNZ
33H, A
32H, RETURN
; 形成累加和
;判断数据接收完否
CLR
7DH
;清数据接收完标志
SJMP
RETURN
南通国芯微电子有限公司
; 设置存储数据地址指针
;读取数据帧
;将数据存外部RAM
.
d
e
t
i
m
;转恢复现场处理
RXBYS:
;地址指针加1
;
;
;
保存地址指针值
;转恢复现场处理
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
311
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
AGAIN:
SETB
7FH
;
SETB
7EH
;恢复标志位
SETB
7DH
;
MOV
33H, #00H
;累加和单元清0
MOV
31H, #10H
;
30H,
;
;
MOV
RETURN:
POP
A
POP
DPL
POP
DPH
SETB
EA
RET1
#00H
恢复接收数据缓冲区首地址
;恢复现场
;
.
d
e
t
i
m
;开中断
;返回
U
C
M
Li
上述程序清单中,ORG为程序段说明伪指令,在程序汇编时,它向汇编程序说明该程序段
的起始地址。
在实际应用中情况多种多样,而且是两台独立的计算机之间进行信息传输。因此,应周密
考虑通信协议,以保证通信的正确性和成功率
C
T
S
312
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
8.9 多机通信
在很多实际应用系统中,需要多台微计算机协调工作。STC12C5A60S2系列单片机的串
行通信方式2和方式3具有多机通信功能,可构成各种分布式通信系统。下图为全双工主从式
多机通信系统的连接框图。
TxD
8051
RxD
TxD
RxD
8051
TxD
8051
U
C
M
.
d
e
t
i
m
Li
RxD
TxD
…
RxD
8051
上图为一台主机和几台从机组成的全双工多机通信系统。主机可与任一台从机通信,而从
机之间的通信必须通过知己转发。
C
T
S
(1)���������
多机通信的基本原理
在多机通信系统中,为保证主机(发送)与多台从机(接收)之间能可靠通信,串行通
信必须具备识别能力。�����������������������������������
MCS-51�����������������������������
系列单片机的串行通信控制寄存器��������������
SCON����������
中设有多机通信选择位
SM2��������������������������������������������
。当程序设置��������������������������������������
SM2=1���������������������������������
,串行通信工作于方式�����������������������
2����������������������
或方式�������������������
8������������������
,发送端通过对�����������
TB8��������
的设置以区别于发
送的是地址帧(�������������������������������������������
TB8=1��������������������������������������
)还是数据帧(�������������������������������
TB8=0��������������������������
),接收端通过对接收到���������������
RB8������������
进行识别:当������
SM2=1�
,
若接收到���������������������������������������������
RB8=1����������������������������������������
,则被确认为呼叫地址帧,将该帧内容装入���������������������
SBUF�����������������
中,并置位������������
RI=1��������
,向������
CPU���
请求中
断,进行地址呼叫处理;若����������������������������������
RB8=0�����������������������������
为数据帧,将不予理睬,接收的信息被丢弃。若��������
SM2=0���
,则无
论是地址帧还是数据帧均接收,并置位�����������������������������
RI=1�������������������������
,向�����������������������
CPU��������������������
请求中断,将该帧内容装入��������
SBUF����
。据此原
理,可实现多机通信。
对于上图的从机式多机通信系统,从机的地址为��������������������
0�������������������
,������������������
1�����������������
,����������������
2���������������
,��������������
…�������������
,������������
n�����������
。实现多机通信的过程如
下:
① 置全部从机的�����������������
�����������������������
SM2=1������������
,处于只接收地址帧状态。
② 主机首先发送呼叫地址帧信息,将����������������������
�������������������������������������
TB8�������������������
设置为����������������
1���������������
,以表示发送的是�������
������
呼叫地址帧。
③ 所有从机接收到呼叫地址帧后,各自将接收到的主机呼叫的地址与本机的地址相比
������������������������������������
较:若比较结果相等,则为被寻址从机,清除�����������������������
SM2=0������������������
,准备接收从主机发送的数据帧,直至全
部数据传输完;若比较不相等,则为非寻址从机,任维持������������������
SM2=1�������������
不变,对其后发来的数据帧不
予理睬,即接收到的数据帧内容不装入����������������������������
SBUF������������������������
,不置位,�������������������
RI=0���������������
,不会产生中断请求,直至被寻址
为止。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
313
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
④ 主机在发送完呼叫地址帧后,接着发送一连串的数据帧,其中的�
�����������������������������
TB8=0��������������
,以表示为数据帧。�����
⑤ 当主机改变从机通信时间则再发呼叫地址帧,寻呼其他从机,原先
�����������������������������
被寻址的从机经分析得知主机在寻呼其他从机时,恢复其����������������
SM2=1�����������
,对其后主机发送的数据
帧不予理睬。
上述过程均在软件控制下实现。
(2)��������
多机通信协议简述
�����������������������������
由于串行通信是在二台或多台各自完全独立的系统之间进行信息传
输这就需要根据时间通信要求制定某些约定,作为通信规范遵照执行,协议要求严格、完
善,不同的通信要求,协议的内容也不相同。在多机通信系统中要考虑的问题较多,协议内容
比较复杂。这里仅例举几条作一说明。
.
d
e
t
i
m
Li
上图的主从式多机通信系统,允许配置����������������
255�������������
台从机,各从机的地址分别为00H~FEH。
① 约定地址��������������������������������������
������������������������������������������
FFH�����������������������������������
为全部从机的控制命令,命令各从机恢复�����������������
SM2=1������������
状态,准备接收主机的地
址呼叫。
② 主机和从机的联络过程约定:主机首先发送地址呼叫帧,被寻址的从机回送本机地址
��������������������������������������
给主机,经验证地址相符后主机再向被寻址的从机发送命令字,被寻址的从机根据命
令字要求回送本机的状态,若主机判断状态正常,主机即开始发送或接收数据帧,发
送或接收的第一帧为传输数据块长度。
U
C
M
C
T
S
③ 约定主机发送的命令字为:
������������
00H�����������
:要求从机接收数据块;
01H�����������
:要求从机发送数据块;
·
·
·
其他:非法命令。
④ 从机的状态字格式约定为:
������������
B7 B6 B5 B4 B3 B2 B1 B0
ERR
0
0
0
0
0
TRDY
RRDY
定义:
���������������������
若����������������
ERR=1�����������
,从机接收到非法命令;
若����������������
�����������������
TRDY=1����������
,从机发送准备就绪;
若����������������
�����������������
RRDY=1����������
,从机接收准备就绪;
⑤ 其他:如传输出错措施等。
������������
314
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
(3)����
程序举例
��������������������������������������
在实际应用中如传输波特率不太高,系统实时性有一定要求以及希望提高通信效率,则
多半采用中断控制方式,但程序调试较困难,这就要求提高程序编制的正确性。采用查询方
式,则程序调试较方便。这里仅以中断控制方式为例简单介绍主�������������
—������������
从机之间一对一通信软件。
① 主机发送程序
������
该主机要发送的数据存放在内部�����������������������������
RAM��������������������������
中,数据块的首地址为����������������
51H�������������
,数据块长度存放做����
50H�
单
元中,有关发送前的初始化、参数设置等采用子程序格式,所有信息发送均由中断服务程序完
成。当主机需要发送时,在完成发送子程序的调用之后,随即返回主程序继续执行。以后只需
查询���������������������������
PSW·5����������������������
的���������������������
F0�������������������
标志位的状态即可知道数据是否发送完毕。
要求主机向���������������������
#5�������������������
从机发送数据,中断服务程序选用工作寄存存器区1的R0~R7。
.
d
e
t
i
m
主机发送程序清单:
ORG
AJMP MAIN
ORG
0023H
;发送中断服务程序入口
LJMP
SERVE
;转中断服务程序
0000H
Li
.
.
.
MAIN: ...
C
T
S
...
.
.
.
ORG 1000H
TXCALL:
;转主程序
U
C
M
;主程序
;发送子程序入口
MOV
TMOD, #20H
MOV
TH1, #0F3H
;设置波特率为2400位/秒
MOV
TL1, #0F3H
;置位SMOD
;设置定时器/计数器1定时、方式2
MOV
PCON, #80H
SETB
TR1
MOV
SCON, #0D8H
SETB
EA
;开中断总控制位
CLR
ES
;禁止串行通信中断
;
;启动定时器/计数器1
;串行方式8,允许接收,TB8=1
TXADDR:
MOV
SBUF, #05H
JNB
TI,
CLR
TI
;发送呼叫从机地址
WAIT1:
南通国芯微电子有限公司
WAIT1
;等待发送完毕
;复位发送中断请求标志
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
315
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
RXADDR:
JNB
RI,
CLR
TI
MOV
A,
SBUF
CJNE
A,
#05H, TXADDR
CLR
TB8
CLR
PSW.5
RXADDR
;等待从机回答本机地址
;复位接收中断请求标志
;读取从机回答的本机地址
;判断呼叫地址符否,否则重发
;地址相符,复位TB8=0,准备发数据
;复位F0=0标志位
MOV
08H, #50H
;发送数据地址指针送R0
MOV
0CH, 50H
;数据块长度送R4
INC
0CH
SETB
ES
RET
;数据块长度加1
;允许串行通信中断
SERVE:
CLR
TI
U
C
M
PUSH PSW
PUSH A
CLR
RS1
Li
;中断服务程序段,清中断请求标志TI
;
;
;
;
C
T
S
.
d
e
t
i
m
;返回主程序
.
.
.
现场入栈保护
SETB
TXDATA:
RS0
MOV
SBUF, @R0
JNB
TI,
CLR
TI
;复位TI=0
INC
R0
;地址指针加1
DJNZ
R4,
SETB PSW.5
;已发送完毕置位F0=1
CLR
ES
;关闭串行中断
WAIT2:
WAIT2
RETURN
选择工作寄存器区1
;发送数据块长度及数据
;等待发送完毕
;数据块未发送完,转返回
RETURN:
POP
A
POP
RETI
PSW
316
南通国芯微电子有限公司
;
;
恢复现场
;返回
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
②������
从机接收程序
主机发送的地址呼叫帧,所有的从机均接收,若不是呼叫本机地址即从中断返回;若是
本机地址,则回送本机地址给主机作为应答,并开始接收主机发送来的数据块长度帧,并存放
于内部RAM的60H单元中,紧接着接收的数据帧存放于61H为首地址的内部RAM单元中,程序
中还选用20·0H、20·1H位作标志位,用来判断接收的是地址、数据块长度还是数据,选用了
2FH、2EH两个字节单元用于存放数据字节数和存储数据指针。#5从机的接收程序如下,供参
考。
#5从机接收程序清单:
ORG
AJMP START
0000H
ORG
0023H
LJMP
SERVE
ORG
0100H
;转主程序段
;从中断入口转中断服务程序
START:
MOV
TMOD, #20H
MOV
TH1, #0F3H
MOV
TL1, #0F3H
MOV
PCON, #80H
C
T
S
MOV
SCON, #0F0H
SETB
TR1
SETB
U
C
M
.
d
e
t
i
m
Li
;主程序段:初始化程序,设置定时
;器/计数器1定时、工作方式2,设
;置波特率为2400位/秒的有关初值
;置位SMOD
;设置串行方式3,允许接收,SM2=1
;启动定时器/计数器1
20·0
;
SETB
SETB
20·1
EA
;
;
置标志位为1
SETB
.
.
.
ES
;
开中断
ORG 1000H
;清接收请求中断标志RI=0
;
SERVE:
CLR
RI
PUSH A
PUSH PSW
CLR
RS1
SETB
JB
RS0
20·0H, ISADDR
; 选择工作寄存器区1
;判断是否是地址帧
JB
20·1H, ISBYTE
;判断是否是数据块长度帧
南通国芯微电子有限公司
;
;
现场保护
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
317
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
ISDATA:
MOV
R0,
2EH
MOV
A,
SBUF
MOV
@R0, A
INC
2EH
DJNZ
2FH, RETURN
SETB
20·0H
;
SETB
20·1H
;恢复标志位
SETB
SM2
SJMP
RETURN
;数据指针送R0
;接收数据
;数据指针加1
;判断数据接收完否?
;
;转入恢复现场,返回
ISADDR:
MOV
A,
SBUF
CJNE
MOV
A,
#05H, RETURN
SBUF, #01H
JNB
TI,
CLR
TI
CLR
20·0H
CLR
SM2
SJMP
RETURN
.
d
e
t
i
m
; 是地址呼叫,判断与本机地址
WAIT:
U
C
M
Li
;等待发送结束
;清0TI,20·0,SM2
;清0TI,20·0,SM2
;清0TI,20·0,SM2
C
T
S
ISBYTES:
WAIT
;
相符否,不符则转返回
;相符,发回答信号“01H”
;转返回
MOV
A,
SBUF
MOV
R0,
#60H
MOV
@R0, A
;将数据块长度存入内部RAM
MOV
2FH, A
;60H单元及2FH单元
MOV
2EH, #61H
CLR
20·1H
;接收数据块长度帧
;
;置首地址61H于2EH单元
;清20·1H标志,表示以后接收的为数据
RETURN:
POP
PSW
POP
RETI
A
;
; 恢复现场
;返回
多机通信方式可多种多样,上例仅以最简单的住一从式作了简单介绍,仅供参考。
对于串行通信工作方式0的同步方式,常用于通过移位寄存器进行扩展并行I/O口,或配置
某些串行通信接口的外部设备。例如,串行打印机、显示器等。这里就不一一举例了。
318
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
第9章 STC12C5A60S2系列单片机的A/D转换器
9.1 A/D转换器的结构
STC12C5A60AD/S2系列带A/D转换的单片机的A/D转换口在P1口�(P1.7-P1.0)�������
,有�����
8����
路���
10�
位
高速A/D转换器������
,�����
速度可达到250KHz(25万次����
/���
秒��
)�
。8路电压输入型A/D,可做温度检测、电池
电压检测、按键扫描、频谱检测等。上电复位后P1口为弱上拉型I/O口,用户可以通过软件设
置将8路中的任何一路设置为A/D转换,不需作为A/D使用的口可继续作为I/O口使用。
STC12C5A60S2系列单片机ADC(A/D转换器���������
)��������
的结构如下图所示。
ADC_CONTR Register
ADC_POWER SPEED1
SPEED0
ADC_FLAG
.
d
e
t
i
m
ADC_START CHS2 CHS1 CHS0
Li
模拟输入信号通道选择
开关CHS2/CHS1/CHS0
A/D转换结果寄存器:
ADC_ RES and ADC_RESL
ADC7/P1.7
U
C
M
ADC6/P1.6
ADC5/P1.5
ADC4/P1.4
C
T
S
ADC3/P1.3
ADC2/P1.2
ADC1/P1.1
ADC0/P1.0
逐次比较
寄存器
+
-
比较器
10-bit DAC
当AUXR.1/ADRJ = 0时,A/D转换结果寄存器格式如下:
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]
当AUXR.1/ADRJ = 1时,A/D转换结果寄存器格式如下:
ADC_RES[1:0]
-
-
-
-
-
-
ADC_B9 ADC_B8
ADC_B7 ADC_B6 ADC_B5 ADC_B4 ADC_B3 ADC_B2 ADC_B1 ADC_B0
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
ADC_RESL[7:0]
传真:0513-5501 2969 / 2956 / 2947
319
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
STC12C5A60S2系列单片机ADC由多路选择开关、比较器、逐次比较寄存器、10位DAC、
转换结果寄存器(ADC_RES和ADC_RESL)以及ADC_CONTR构成。
STC12C5A60S2系列单片机的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位。
当ADRJ=0时,如果取10位结果,则按下面公式计算:
U
C
M
.
d
e
t
i
m
Li
Vin
10-bit A/D Conversion Result:(ADC_RES[7:0], ADC_RESL[1:0]) = 1024 x Vcc
C
T
S
当ADRJ=0时,如果取8位结果,按下面公式计算:
8-bit A/D Conversion Result:(ADC_RES[7:0])= 256 x
Vin
Vcc
当ADRJ=1时,如果取10位结果,则按下面公式计算:
Vin
10-bit A/D Conversion Result:(ADC_RES[1:0], ADC_RESL[7:0]) = 1024 x Vcc
式中,Vin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为
模拟参考电压。
320
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
9.2 与A/D转换相关的寄存器
与STC12C5A60S2系列单片机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 Result high
ADC_RESL ADC Result low
AUXR1
Auxiliary register 1
IE
Interrupt Enable
Interrupt Priority
IP
Low
Interrupt Priority
IPH
High
BDH
BEH
A2H
A8H
MSB
EA
LSB
ET1
EX1
ET0
0000 0000B
0000 0000B
DPS x000 00x0B
EX0 0000 0000B
PT1
PX1
PT0
PX0 0000 0000B
PCA_P4 SPI_P4 S2_P4 GF2 ADRJ
ELVD EADC
ES
-
.
d
te
B8H
PPCA PLVD PADC
B7H
PPCAH PLVDH PADCH PSH PT1H PX1H PT0H
U
C
M
1. P1口模拟功能控制寄存器P1ASF
复位值
PS
i
m
i
L
PX0H
0000 0000B
STC12C5A60S2系列单片机的�����������������������������������
A/D转换������������������������������
通道与���������������������������
P1口(P1.7-P1.0)�������������
复用�����������
,上电复位后P1口为弱
上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不需作为A/D使用的
P1口可继续作为I/O口使用����������������������������������
(建议只作为输入)�������������������������
。需作为A/D使用的口需先将P1ASF特殊功能寄存
器中的相应位置为‘1’,将相应的口设置为模拟功能。��������������
P1ASF寄存器的格式如下:
C
T
S
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
当P1口中的相应位作为A/D使用时,要将P1ASF中的相应位置1.
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使用
南通国芯微电子有限公司
其中P1ASF寄存器地址为:[9DH](不能够进行位寻址)
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
321
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. ADC控制寄存器ADC_CONTR
ADC_CONTR寄存器的格式如下:
ADC_CONTR : ADC控制寄存器
SFR name
Address
bit
B7
ADC_CONTR
BCH
name
ADC_POWER
B6
SPEED1
B5
B4
B3
B2
B1
B0
SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
对ADC_CONTR寄存器进行操作,建议直接用MOV赋值语句,不要用‘与’和‘或’语句�
。
ADC_POWER: ADC电源控制位。
0:关闭A/D转换器电源;
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
转换���������������������
,若能将定时器/串行口/中断系统关闭更好。
SPEED1,SPEED0:模数转换器转换速度控制位
U
C
M
SPEED1 SPEED0 A/D转换所需时间
1
1
1
0
0
1
0
0
.
d
e
t
i
m
Li
90个时钟周期转换一次,CPU工作频率21MHz时,
A/D转换速度约250KHz
C
T
S
180个时钟周期转换一次
360个时钟周期转换一次
540个时钟周期转换一次
STC12C5A60S2系列单片机的A/D转换模块说使用的时钟是内部R/C振荡器所产生的系统时钟,不
使用时钟分频寄存器CLK_DIV对系统时钟分频后所产生的供给CPU工作所使用的时钟.
好处:
这样可以让ADC用较高的频率工作,提高A/D 的转换速度
这样可以让CPU用较低的频率工作,降低系统的功耗
ADC_FLAG: 模数转换器转换结束标志位�����������������������������
,����������������������������
当A/D转换完成后,ADC_FLAG=1,要由软件清0。
不管是A/D转换完成后由该位申请产生中断,还是由软件查询该标志位A/D转换
是否结束��������������������������������
,�������������������������������
当A/D转换完成后,ADC_FLAG = 1,一定要软件清0。
ADC_START:模数转换器(ADC)转换启动控制位,设置为“1”时,开始转换,转换结束后为0
322
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
CHS2/CHS1/CHS0:模拟输入通道选择,CHS2/CHS1/CHS0
CHS2
CHS1 CHS0
Analog Channel Select (模拟输入通道选择)
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输入来用
程序中需要注意的事项:
.
d
e
t
i
m
Li
由于是2套时钟,所以,设置ADC_CONTR控制寄存器后,要加4个空操作延时才可以正确读
到ADC_CONTR寄存器的值,原因是设置ADC_CONTR控制寄存器的语句执行后,要经过4个CPU
时钟的延时,其值才能够保证被设置进ADC_CONTR控制寄存器.
U
C
M
MOV ADC_CONTR, #DATA
NOP
NOP
NOP
NOP
MOV A,
ADC_CONTR
;经过4个时钟延时后,才能够正确读到ADC_CONTR控制寄存器的值
南通国芯微电子有限公司
C
T
S
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
323
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
3. A/D转换结果寄存器ADC_RES、ADC_RESL
特殊功能寄存器ADC_RES和ADC_RESL寄存器用于保存A/D转换结果,其格式如下:
Mnemonic Add
ADC_RES
BDh
B7
Name
B6
B5
B4
B3
B2
B1
B0
S2_P4
GF2
ADRJ
-
DPS
A/D转换结
果寄存器高
A/D转换结
果寄存器低
Auxiliary
A2H
register1
ADC_RESL BEh
AUXR1
-
PCA_P4 SPI_P4
AUXR1寄存器的ADRJ位是A/D转换结果寄存器(ADC_RES,ADC_RESL)的数据格式调整控制位.
.
d
te
当ADRJ=0时,����������������������������������������������
10位A/D转换结果的高8位存放在ADC_RES中,低2位存放在ADC_RESL的低2位中�
。
Mnemonic Add
Name
B7
ADC_RES BDh
A/D转换结果
寄存器高8位
A/D转换结果
寄存器低2位
Auxiliary
A2H
register1
B5
i
m
Li
B4
B3
B2
B1
B0
ADC_RES9 ADC_RES8 ADC_RES7 ADC_RES6 ADC_RES5 ADC_RES4 ADC_RES3 ADC_RES2
ADC_RESL BEh
AUXR1
B6
-
C
T
S
U
C
M
-
-
-
-
-
ADC_RES1 ADC_RES0
ADRJ = 0
此时,如果用户需取完整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为单片机实际工作电压,用单片机工作电压作为
模拟参考电压。
当ADRJ=1时,����������������������������������������������
10位A/D转换结果的高2位存放在ADC_RES����������������������
的���������������������
低2位中,低8位存放在ADC_RESL中�
。
Mnemonic Add
Name
B7
B6
B5
B4
B3
B2
ADC_RES BDh
A/D转换结果
寄存器高2位
-
-
-
-
-
-
A/D转换结果
寄存器低8位
Auxiliary
A2H
register1
ADC_RESL BEh
AUXR1
324
南通国芯微电子有限公司
B1
B0
ADC_RES9 ADC_RES8
ADC_RES7 ADC_RES6 ADC_RES5 ADC_RES4 ADC_RES3 ADC_RES2 ADC_RES1 ADC_RES0
ADRJ = 1
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
此时,如果用户需取完整10位结果,按下面公式计算:
10-bit A/D Conversion Result:(ADC_RES[1:0], ADC_RESL[7:0]) = 1024 x
Vin
Vcc
式中,Vin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为
模拟参考电压。
4. 与A/D中断有关的寄存器
IE : 中断允许寄存器 (可位寻址)
SFR name
IE
Address
A8H
bit
name
B7
EA
B6
ELVD
B5
EADC
B4
ES
B3
ET1
B2
EX1
B1
ET0
.
d
e
t
i
m
B0
EX0
EA : CPU的中断开放标志,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。
EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受各中断源自
己的中断允许控制位控制。
EADC : A/D转换中断允许位。
EADC=1,允许A/D转换中断;
EADC=0,禁止A/D转换中断。
U
C
M
Li
如果要允许A/D转换中断则需要将相应的控制位置1:
1、将EADC置1,允许ADC中断,这是ADC中断的中断控制位。
2、将EA置1,打开单片机总中断控制位,此位不打开,也是无法产生ADC中断的A/D中断服务程
序中要用软件清A/D中断请求标志位ADC_FLAG(也是A/D转换结束标志位)。
C
T
S
IPH : 中断优先级控制寄存器高 (不可位寻址)
SFR name Address
IPH
B7H
bit
B7
B6
B5
B4
B3
B2
B1
B0
name PPCAH PLVDH PADCH PSH PT1H PX1H PT0H PX0H
IP : 中断优先级控制寄存器低 (可位寻址)
SFR name
IP
Address
B8H
PADCH, PADC:
bit
name
B7
PPCA
B6
PLVD
B5
PADC
B4
PS
B3
PT1
B2
PX1
B1
PT0
B0
PX0
A/D转换中断优先级控制位。
当PADCH=0且PADC=0时,A/D转换中断为最低优先级中断(优先级0)
当PADCH=0且PADC=1时,A/D转换中断为较低优先级中断(优先级1)
当PADCH=1且PADC=0时,A/D转换中断为较高优先级中断(优先级2)
当PADCH=1且PADC=1时,A/D转换中断为最高优先级中断(优先级3)
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
‘
325
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
9.3 A/D转换典型应用线路
1
28
Vcc
P2.3
2
27
P2.1
RST
3
26
P2.0
RxD/P3.0
4
25
P1.7/ADC7
TxD/P3.1
5
24
P1.6/ADC6
XTAL2
6
23
P1.5/ADC5
XTAL1
7
22
P1.4/ADC4
INT0/P3.2
8
21
P1.3/ADC3
INT1/P3.3
9
20
P1.2/ADC2
19
P1.1/ADC1
CLKOUT0/ECI/T0/P3.4
10
CLKOUT1/PWM1/PCA1/T1/P3.5
11
P2.4
SOP-28/SKDIP-28
P2.2
18
P1.0/ADC0
12
17
P3.7/PCA0/PWM0
P2.5
13
16
P2.7
Gnd
14
15
P2.6
47pF以上
A/D转换在P1口,P1.0 - P1.7共8路
C
T
S
326
南通国芯微电子有限公司
U
C
M
1K
信号源
.
d
e
t
i
m
Li
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
9.4 A/D做按键扫描应用线路图
P2.2
1
28
Vcc
P2.3
2
27
P2.1
Vcc
3
26
P2.0
4
25
P1.7/ADC7
TxD/P3.1
5
24
P1.6/ADC6
XTAL2
6
XTAL1
7
INT0/P3.2
8
INT1/P3.3
9
SOP-28/SKDIP-28
RST
RxD/P3.0
23
P1.5/ADC5
22
P1.4/ADC4
21
P1.3/ADC3
20
P1.2/ADC2
47pF以上
1/2 Vcc
10K
2/3 Vcc
10K
P1.1/ADC1
18
P1.0/ADC0
12
17
P3.7/PCA0/PWM0
13
16
P2.7
14
15
P2.6
10
11
P2.4
P2.5
Gnd
3/4 Vcc
10K
A/D转换在P1口,P1.0 - P1.7共8路
P2.2
1
28
P2.3
2
27
C
T
S
3
26
RxD/P3.0
4
25
TxD/P3.1
XTAL2
XTAL1
5
6
7
INT0/P3.2
8
INT1/P3.3
9
SOP-28/SKDIP-28
RST
24
U
C
M
Vcc
P1.6/ADC6
P1.5/ADC5
22
P1.4/ADC4
21
P1.3/ADC3
20
P1.2/ADC2
19
P1.1/ADC1
18
P1.0/ADC0
sw1
10
11
P2.4
12
17
P3.7/PCA0/PWM0
P2.5
13
16
P2.7
Gnd
14
15
P2.6
R1
520Ω
47pF
sw1
R2
520Ω
R3
1.8KΩ
R4
R5
R6
3.3KΩ 5.4KΩ 8.2KΩ
sw2
sw3
sw4
0`0.5
0
CLKOUT0/ECI/T0/P3.4
+5V
R1
10KΩ
47pF
CLKOUT1/PWM1/PCA1/T1/P3.5
R0
ADCx 10KΩ
Li
ADCx
P1.7/ADC7
23
.
d
e
t
i
m
5/4 Vcc
+5V
P2.1
P2.0
0V
10K
19
CLKOUT0/ECI/T0/P3.4
CLKOUT1/PWM1/PCA1/T1/P3.5
10K
1K
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
327
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
9.5 A/D转换模块的参考电压源
STC12C5A60S2系列单片机的参考电压源是输入工作电压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
328
南通国芯微电子有限公司
U
C
M
.
d
e
t
i
m
Li
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
9.6 A/D转换测试程序(C程序和汇编程序)
9.6.1 A/D转换测试程序(ADC中断方式)
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机 A/D转换功能-----------------------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
#define FOSC 18432000L
#define BAUD 9600
C
T
S
typedef unsigned char
typedef unsigned int
BYTE;
WORD;
/*Declare SFR associated with the ADC */
sfr
ADC_CONTR = 0xBC;
sfr
ADC_RES
= 0xBD;
sfr
ADC_LOW2
= 0xBE;
sfr
P1ASF
= 0x9D;
U
C
M
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80
#define ADC_FLAG
0x10
#define ADC_START
0x08
#define ADC_SPEEDLL 0x00
#define ADC_SPEEDL 0x20
#define ADC_SPEEDH 0x40
#define ADC_SPEEDHH 0x60
.
d
e
t
i
m
Li
//ADC control register
//ADC hight 8-bit result register
//ADC low 2-bit result register
//P1 secondary function control register
//ADC power control bit
//ADC complete flag
//ADC start control bit
//540 clocks
//360 clocks
//180 clocks
//90 clocks
void InitUart();
void SendData(BYTE dat);
void Delay(WORD n);
void InitADC();
BYTE ch = 0;
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
//ADC channel NO.
传真:0513-5501 2969 / 2956 / 2947
329
STC12C5A60S2系列单片机指南
void main()
{
InitUart();
InitADC();
IE = 0xa0;
}
while (1);
技术支持网站:www.STCMCU.com
SendData(ch);
SendData(ADC_RES);
研发顾问:13922809991
//Init UART, use to show ADC result
//Init ADC sfr
//Enable ADC interrupt and Open master interrupt switch
//Start A/D conversion
/*---------------------------ADC interrupt service routine
----------------------------*/
void adc_isr() interrupt 5 using 1
{
ADC_CONTR &= !ADC_FLAG;
临时技术支持:13922829991
.
d
e
t
i
m
//Clear ADC interrupt flag
Li
//Show Channel NO.
//Get ADC high 8-bit result and Send to UART
U
C
M
//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;
C
T
S
/*---------------------------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
}
/*---------------------------Initial UART
----------------------------*/
void InitUart()
{
SCON = 0x5a;
TMOD = 0x20;
TH1 = TL1 = -(FOSC/12/32/BAUD);
TR1 = 1;
}
330
南通国芯微电子有限公司
//8 bit data ,no parity bit
//T1 as 8-bit auto reload
//Set Uart baudrate
//T1 start running
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
/*---------------------------Send one byte data to PC
Input: dat (UART data)
Output:----------------------------*/
void SendData(BYTE dat)
{
while (!TI);
TI = 0;
SBUF = dat;
}
/*---------------------------Software delay function
----------------------------*/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
南通国芯微电子有限公司
C
T
S
临时技术支持:13922829991
研发顾问:13922809991
//Wait for the previous data is sent
//Clear TI flag
//Send current data
U
C
M
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
传真:0513-5501 2969 / 2956 / 2947
331
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机 A/D转换功能------------------------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
;/*Declare SFR associated with the ADC */
ADC_CONTR EQU 0BCH
ADC_RES
EQU 0BDH
ADC_LOW2 EQU 0BEH
P1ASF
EQU 09DH
;ADC control register
;ADC high 8-bit result register
;ADC low 2-bit result register
;P1 secondary function control register
;/*Define ADC operation const for ADC_CONTR*/
ADC_POWER EQU 80H
ADC_FLAG
EQU 10H
ADC_START
EQU 08H
ADC_SPEEDLL EQU 00H
ADC_SPEEDL EQU 20H
ADC_SPEEDH EQU 40H
ADC_SPEEDHH EQU 60H
;ADC power control bit
;ADC complete flag
;ADC start control bit
;540 clocks
;360 clocks
;180 clocks
;90 clocks
ADCCH
;ADC channel NO.
U
C
M
C
T
S
DATA 20H
.
d
e
t
i
m
Li
;----------------------------------------
ORG 0000H
LJMP MAIN
ORG 002BH
LJMP ADC_ISR
;----------------------------------------
ORG 0100H
MAIN:
MOV SP,
#3FH
MOV ADCCH, #0
LCALL INIT_UART
LCALL INIT_ADC
MOV IE,
#0A0H
SJMP $
332
南通国芯微电子有限公司
;Init UART, use to show ADC result
;Init ADC sfr
;Enable ADC interrupt and Open master interrupt switch
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;/*---------------------------;ADC interrupt service routine
;----------------------------*/
ADC_ISR:
PUSH ACC
PUSH PSW
ANL
MOV
LCALL
MOV
LCALL
ADC_CONTR,
#NOT ADC_FLAG
A,
ADCCH
SEND_DATA
A,
ADC_RES
SEND_DATA
;//if you want show 10-bit result, uncomment next 2 lines
;
MOV A,
ADC_LOW2
;
LCALL SEND_DATA
INC
MOV
ANL
MOV
ORL
MOV
POP
POP
RETI
;Clear ADC interrupt flag
;Send channel NO.
;Get ADC high 8-bit result
;Send to UART
.
d
e
t
i
m
;Get ADC low 2-bit result
;Send to UART
Li
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
C
T
S
U
C
M
;/*---------------------------;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
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
333
STC12C5A60S2系列单片机指南
;/*---------------------------;Initial UART
;----------------------------*/
INIT_UART:
MOV SCON,
MOV TMOD,
MOV A,
MOV TH1,
MOV TL1,
SETB TR1
RET
;/*---------------------------;Send one byte data to PC
;Input: ACC (UART data)
;Output:;----------------------------*/
SEND_DATA:
JNB TI,
CLR TI
MOV SBUF,
RET
技术支持网站:www.STCMCU.com
#5AH
#20H
#-5
A
A
$
A
C
T
S
;/*---------------------------;Software delay function
;----------------------------*/
DELAY:
MOV R2,
CLR A
MOV R0,
MOV R1,
DELAY1:
DJNZ R0,
DJNZ R1,
DJNZ R2,
RET
334
研发顾问:13922809991
;8 bit data ,no parity bit
;T1 as 8-bit auto reload
;Set Uart baudrate -(18432000/12/32/9600)
;Set T1 reload value
;T1 start running
U
C
M
临时技术支持:13922829991
.
d
e
t
i
m
Li
;Wait for the previous data is sent
;Clear TI flag
;Send current data
A
A
A
DELAY1
DELAY1
DELAY1
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
9.6.2 A/D转换测试程序(ADC查询方式)
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机 A/D转换功能------------------------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
#define FOSC 18432000L
#define BAUD 9600
typedef unsigned char
typedef unsigned int
BYTE;
WORD;
C
T
S
/*Declare SFR associated with the ADC */
sfr
ADC_CONTR = 0xBC;
sfr
ADC_RES
= 0xBD;
sfr
ADC_LOW2 = 0xBE;
sfr
P1ASF
= 0x9D;
U
C
M
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80
#define ADC_FLAG
0x10
#define ADC_START
0x08
#define ADC_SPEEDLL 0x00
#define ADC_SPEEDL 0x20
#define ADC_SPEEDH 0x40
#define ADC_SPEEDHH 0x60
.
d
e
t
i
m
Li
//ADC control register
//ADC high 8-bit result register
//ADC low 2-bit result register
//P1 secondary function control register
//ADC power control bit
//ADC complete flag
//ADC start control bit
//540 clocks
//360 clocks
//180 clocks
//90 clocks
void InitUart();
void InitADC();
void SendData(BYTE dat);
BYTE GetADCResult(BYTE ch);
void Delay(WORD n);
void ShowResult(BYTE ch);
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
335
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
void main()
{
InitUart();
InitADC();
while (1)
{
ShowResult(0);
ShowResult(1);
ShowResult(2);
ShowResult(3);
ShowResult(4);
ShowResult(5);
ShowResult(6);
ShowResult(7);
}
}
/*---------------------------Send ADC result to UART
----------------------------*/
void ShowResult(BYTE ch)
{
SendData(ch);
SendData(GetADCResult(ch));
C
T
S
研发顾问:13922809991
//Init UART, use to show ADC result
//Init ADC sfr
//Show Channel0
//Show Channel1
//Show Channel2
//Show Channel3
//Show Channel4
//Show Channel5
//Show Channel6
//Show Channel7
U
C
M
//if you want show 10-bit result, uncomment next line
//
SendData(ADC_LOW2);
}
临时技术支持:13922829991
.
d
e
t
i
m
Li
//Show Channel NO.
//Show ADC high 8-bit result
//Show ADC low 2-bit result
/*---------------------------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
return ADC_RES;
//Return ADC result
}
336
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
/*---------------------------Initial UART
----------------------------*/
void InitUart()
{
SCON = 0x5a;
TMOD = 0x20;
TH1 = TL1 = -(FOSC/12/32/BAUD);
TR1 = 1;
}
临时技术支持:13922829991
研发顾问:13922809991
//8 bit data ,no parity bit
//T1 as 8-bit auto reload
//Set Uart baudrate
//T1 start running
/*---------------------------Initial ADC sfr
----------------------------*/
void InitADC()
{
P1ASF = 0xff;
//Open 8 channels ADC function
ADC_RES = 0;
//Clear previous result
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2);
//ADC power-on and delay
}
/*---------------------------Send one byte data to PC
Input: dat (UART data)
Output:----------------------------*/
void SendData(BYTE dat)
{
while (!TI);
TI = 0;
SBUF = dat;
}
C
T
S
U
C
M
.
d
e
t
i
m
Li
//Wait for the previous data is sent
//Clear TI flag
//Send current data
/*---------------------------Software delay function
----------------------------*/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
337
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机 A/D转换功能------------------------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
;/*Declare SFR associated with the ADC */
ADC_CONTR EQU 0BCH
ADC_RES
EQU 0BDH
ADC_LOW2 EQU 0BEH
P1ASF
EQU 09DH
CU
;/*Define ADC operation const for ADC_CONTR*/
ADC_POWER EQU 80H
ADC_FLAG
EQU 10H
ADC_START
EQU 08H
ADC_SPEEDLL EQU 00H
ADC_SPEEDL EQU 20H
ADC_SPEEDH EQU 40H
ADC_SPEEDHH EQU 60H
C
T
S
M
;----------------------------------------
ORG 0000H
LJMP MAIN
;----------------------------------------
ORG 0100H
MAIN:
LCALL INIT_UART
LCALL INIT_ADC
;------------------------------NEXT:
MOV A,
#0
LCALL SHOW_RESULT
MOV A,#1
LCALL SHOW_RESULT
MOV A,#2
LCALL SHOW_RESULT
338
南通国芯微电子有限公司
.
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
Li
;ADC power control bit
;ADC complete flag
;ADC start control bit
;540 clocks
;360 clocks
;180 clocks
;90 clocks
;Init UART, use to show ADC result
;Init ADC sfr
;Show channel0 result
;Show channel1 result
;Show channel2 result
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
MOV
LCALL
MOV
LCALL
MOV
LCALL
MOV
LCALL
MOV
LCALL
技术支持网站:www.STCMCU.com
A,
#3
SHOW_RESULT
A,
#4
SHOW_RESULT
A,
#5
SHOW_RESULT
A,
#6
SHOW_RESULT
A,
#7
SHOW_RESULT
临时技术支持:13922829991
;Show channel3 result
;Show channel4 result
;Show channel5 result
;Show channel6 result
;Show channel7 result
研发顾问:13922809991
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
C
T
S
U
C
M
;//if you want show 10-bit result, uncomment next 2 lines
;
MOV A,
ADC_LOW2
;
LCALL SEND_DATA
RET
.
d
e
t
i
m
Li
;Show Channel NO.
;Get high 8-bit ADC result
;Show result
;Get low 2-bit ADC result
;Show result
;/*---------------------------;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
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
339
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
;/*---------------------------;Initial ADC sfr
;----------------------------*/
INIT_ADC:
MOV P1ASF, #0FFH
MOV ADC_RES,
MOV ADC_CONTR,
MOV A,
#2
LCALL DELAY
RET
;/*---------------------------;Initial UART
;----------------------------*/
INIT_UART:
MOV SCON,
MOV TMOD,
MOV A,
MOV TH1,
MOV TL1,
SETB TR1
RET
;/*---------------------------;Send one byte data to PC
;Input: ACC (UART data)
;Output:;----------------------------*/
SEND_DATA:
JNB TI,$
CLR TI
MOV SBUF,
RET
#5AH
#20H
#-5
A
A
;/*---------------------------;Software delay function
;----------------------------*/
DELAY:
MOV R2,
CLR A
MOV R0,
MOV R1,
DELAY1:
DJNZ R0,
DJNZ R1,
DJNZ R2,
RET
340
A
研发顾问:13922809991
;Open 8 channels ADC function
#0
;Clear previous result
#ADC_POWER | ADC_SPEEDLL
;ADC power-on and delay
U
C
M
C
T
S
临时技术支持:13922829991
.
d
e
t
i
m
;8 bit data ,no parity bit
;T1 as 8-bit auto reload
;Set Uart baudrate -(18432000/12/32/9600)
;Set T1 reload value
Li
;T1 start running
;Wait for the previous data is sent
;Clear TI flag
;Send current data
A
A
A
DELAY1
DELAY1
DELAY1
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
第10章 STC12C5A60S2系列单片机PCA/PWM应用
STC12C5A60S2�����������������������������������
系列单片机集成了两路可编程计数器阵列(PCA)模块,可用于软件定时器、
外部脉冲的捕捉、高速输出以及脉宽调制(PWM)输出。
10.1 与PCA/PWM应用有关的特殊功能寄存器
STC12C5A60S2系列 1T 8051单片机 PCA/PWM特殊功能寄存器表 PCA/PWM SFRs
符号
描述
地址
位地址及其符号
B7
B6
B5
B4
CF
CR
-
-
-
-
-
复位值
B3
B2
B1
B0
-
-
CCF1
CCF0 00xx,xx00
CPS0
ECF
CCON
PCA Control Register
D8H
CMOD
PCA Mode Register
D9H CIDL
CCAPM0
PCA Module 0 Mode
Register
DAH
-
ECOM0 CAPP0 CAPN0 MAT0 TOG0 PWM0 ECCF0 x000,0000
CCAPM1
PCA Module 1 Mode
Register
DBH
-
ECOM1 CAPP1 CAPN1 MAT1 TOG1 PWM1 ECCF1 x000,0000
CL
PCA Base Timer Low
E9H
CH
PCA Base Timer High
F9H
.
d
e
t
i
m
CPS2 CPS1
Li
U
C
M
0xxx,0000
0000,0000
0000,0000
CCAP0L
PCA Module-0 Capture
EAH
Register Low
CCAP0H
PCA Module-0 Capture
Register High
CCAP1L
PCA Module-1 Capture
EBH
Register Low
0000,0000
CCAP1H
PCA Module-1 Capture
FBH
Register High
0000,0000
C
T
S
FAH
0000,0000
0000,0000
PCA_PWM0
PCA PWM Mode
Auxiliary Register 0
F2H
-
-
-
-
-
-
EPC0H EPC0L xxxx,xx00
PCA_PWM1
PCA PWM Mode
Auxiliary Register 1
F3H
-
-
-
-
-
-
EPC1H EPC1L xxxx,xx00
AUXR1
Auxiliary Register 1
A2H
-
GF2
ADRJ
南通国芯微电子有限公司
PCA_P4 SPI_P4 S2_P4
总机:0513-5501 2928 / 2929 / 2966
-
DPS
x000,00x0
传真:0513-5501 2969 / 2956 / 2947
341
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
1. PCA工作模式寄存器CMOD
PCA工作模式寄存器的格式如下:
CMOD : PCA工作模式寄存器
SFR name
CMOD
Address
D9H
bit
name
B7
B6
B5
B4
B3
B2
B1
B0
CIDL
-
-
-
CPS2
CPS1
CPS0
ECF
CIDL:空闲模式下是否停止PCA计数的控制位。
当CIDL=0时,�����
空闲模式下PCA计数器继续工作�
;
当CIDL=1时,�����
空闲模式下PCA计数器停止工作。
CPS2、CPS1、CPS0:PCA计数脉冲源选择控制位。PCA计数脉冲选择如下表所示。
CPS2
CPS1
CPS0
0
0
0
0,系统时钟/12,SYSclk/12
0
0
1
1,系统时钟/2,SYSclk/2
.
d
e
t
i
m
选择PCA/PWM时钟源输入
Li
0
1
0
2,定时器0的溢出���������������������
脉冲。由于定时器0可以工作在1T模式,所以
可以达到计一个时钟就溢出,从而达到最高频率CPU工作时
钟SYSclk。通过改变定时器0的溢出率,���������
可以实现可调频率的
PWM输出
0
1
1
3,ECI/P1.2(或P4.1)脚输入的外部时钟(最大速率=SYSclk/2)
1
0
0
1
1
1
0
1
1
4,系统时钟,SYSclk
5,系统时钟/4,SYSclk/4
6,系统时钟/6,SYSclk/6
7,系统时钟/8,SYSclk/8
C
T
S
1
0
1
U
C
M
例如,CPS2/CPS1/CPS0 = 1/0/0时,PCA/PWM的时钟源是SYSclk,不用�����
定时器��
0�
,PWM的
频率为SYSclk/256
如果要�����
用����
系统时钟/3来作为PCA的时钟源,应让T0工作在1T模式,��
计�
数3个脉冲即产生溢出.
如果此时使用内部RC作为系统时钟(室温情况下,5V单片机为11MHz ~ 15.5MHz),可以
输出14K ~ 19K频率的PWM。用T0的溢出可对系统时钟进行1 ~ 256级分频.
ECF:PCA计数溢出中断使能�
位。
当ECF = 0时,禁止寄存器CCON中CF位的中断;
当ECF = 1时,允许寄存器CCON中CF位的中断�
。
342
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. PCA控制寄存器CCON
PCA控制寄存器的格式如下:
CCON : PCA控制控制寄存器
SFR name
CCON
Address
D8H
bit
name
B7
B6
B5
B4
B3
B2
B1
B0
CF
CR
-
-
-
-
CCF1
CCF0
CF:PCA计数器阵列溢出标志位。当PCA计数�����
器溢出��
时�
,CF由硬件置位。如果CMOD寄存器
的ECF位置位, �
则CF标志可用来产生中断。CF位可通过硬件或软件置位, 但只可通过
软件清零。
CR:PCA计数器阵列��������������������
运行控制位。该位通过软件置位, 用来起动PCA计数器阵列计数。该位
通过软件清零, 用来关闭PCA计数器。
.
d
e
t
i
m
CCF1:PCA模块1中断标志。当出现匹配或捕获时该位由硬件置位。该位必须通过软件清零。
CCF0:PCA模块0中断标志。当出现匹配或捕获时该位由硬件置位。该位必须通过软件清零。
3. PCA比较/捕获寄存器CCAPM0和CCAPM1
PCA模块0的比较/捕获寄存器的格式如下:
U
C
M
CCAPM0 : PCA模块0的比较/捕获寄存器
SFR name
CCAPM0
Address
DAH
bit
name
C
T
S
B7:保留为将来之用。
B7
-
B6
B5
ECOM0 CAPP0
Li
B4
B3
B2
B1
B0
CAPN0
MAT0
TOG0
PWM0
ECCF0
ECOM0:允许比较器功能控制位�
。
当ECOM0=1时���������
,允许������
比较器功能。
CAPP0: 正捕获����
控制位�
。
当CAPP0=1时���������
,允许������
上升沿捕获。
CAPN0:负������
捕获����
控制位�
。
当CAPN0=1时���������
,允许下降����
沿捕获。
MAT0: 匹配����
控制位�
。
当MAT0=1时,PCA计数值与模块的比较/捕获寄存器的值的匹配将置位CCON寄存
器的中断标志位CCF0。
TOG0: 翻转控制位�
。
当TOG0=1时,工作在PCA高速输出模式,PCA计数器的值与模块的比较/捕获寄存
器的值的匹配将使CCP0脚翻转。
(CCP0/PCA0/PWM0/P1.3或CCP0/PCA0/PWM0/P4.2)
PWM0: 脉宽调节模式。
当PWM0=1时,��
允许CEX0脚用作脉宽调节输出。
(CCP0/PCA0/PWM0/P1.3或CCP0/PCA0/PWM0/P4.2)
ECCF0: 使能CCF0中断。使能寄存器CCON的比较/捕获标志CCF0, 用来产生中断。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
343
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
PCA模块1的比较/捕获寄存器的格式如下:
CCAPM1 : PCA模块1的比较/捕获寄存器
SFR name
CCAPM1
Address
DBH
bit
name
B7
-
B6
B5
ECOM1 CAPP1
B4
B3
B2
B1
B0
CAPN1
MAT1
TOG1
PWM1
ECCF1
B7:保留为将来之用。
ECOM1:允许比较器功能控制位�
。
当ECOM1=1时���������
,允许������
比较器功能。
CAPP1: 正捕获����
控制位�
。
当CAPP1=1时���������
,允许������
上升沿捕获。
CAPN1:负������
捕获����
控制位�
。
当CAPN1=1时���������
,允许下降����
沿捕获。
.
d
e
t
i
m
MAT1: 匹配����
控制位�
。
当MAT1=1时,PCA计数值与模块的比较/捕获寄存器的值的匹配将置位CCON寄存
器的中断标志位CCF1。
U
C
M
Li
TOG1: 翻转控制位�
。
当TOG1=1时,工作在PCA高速输出模式,PCA计数器的值与模块的比较/捕获寄存
器的值的匹配将使CCP1脚翻转。
(CCP1/PCA1/PWM1/P1.4或CCP1/PCA1/PWM1/P4.3)
C
T
S
PWM1: 脉宽调节模式。
当PWM1=1时,��
允许CEX1脚用作脉宽调节输出。
(CCP1/PCA1/PWM1/P1.4或CCP1/PCA1/PWM1/P4.3)
ECCF1: 使能CCF1中断。使能寄存器CCON的比较/捕获标志CCF1, 用来产生中断。
PCA模块��������������
的工作模式设定表如下表所列:
PCA模块工作模式���
设定�
(CCAPMn寄存器,n = 0,1)
- ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn 模块功能
0
0
0
0
0
0
0
无此操作
1
0
0
0
0
1
0
8位PWM,无中断
1
1
0
0
0
1
1
8位PWM输出,由低变高可产生中断
1
0
1
0
0
1
1
8位PWM输出,由高变低可产生中断
8位PWM输出,由低变高或者由高变低均可
1
1
1
0
0
1
1
产生中断
X
1
0
0
0
0
X
16位捕获模式,由CCPn/PCAn的上升沿触发
X
0
1
0
0
0
X
16位捕获模式,由CCPn/PCAn的下降沿触发
X
1
1
0
0
0
X
16位捕获模式 由CCPn/PCAn的跳变触发
1
0
0
1
0
0
X
16位软件定时器
1
0
0
1
1
0
X
16位高速输出
344
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
4. PCA的16位计数器 — 低8位CL和高8位CH
CL和CH地址分别为E9H和F9H,复位值均为00H,用于保存PCA的装载值。
5. PCA捕捉/比较寄存器 — CCAPnL(低位字节)和CCAPnH(高位字节)
当PCA模块用于捕获或比较时,它们用于保存各个模块的16位捕捉计数值;当PCA模块用
于PWM模式时,它们用来控制输出的占空比。其中,n=0、1,分别对应模块0和模块1。复位
值均为00H。它们对应的地址分别为:
CCAP0L — EAH、CCAP0H — FAH:模块0的捕捉/比较寄存器。
CCAP1L — EBH、CCAP1H — FBH:模块1的捕捉/比较寄存器。
.
d
e
t
i
m
6. PCA模块PWM寄存器PCA_PWM0和PCA_PWM1
PCA模块0的PWM寄存器的格式如下:
PCA_PWM0 : PCA模块0的PWM寄存器
SFR name
PCA_PWM0
Address
F2H
bit
name
B7
-
B6
B5
-
-
U
C
M
EPC0H:在PWM模式下,与CCAP0H组成9位数。
Li
B3
B2
-
-
B4
-
B1
B0
EPC0H EPC0L
EPC0L:在PWM模式下,与CCAP0L组成9位数。
C
T
S
PCA模块1的PWM寄存器的格式如下:
PCA_PWM1 : PCA模块1的PWM寄存器
SFR name
PCA_PWM1
Address
F3H
bit
name
B7
B6
B5
B4
B3
B2
-
-
-
-
-
-
B1
B0
EPC1H EPC1L
EPC1H:在PWM模式下,与CCAP1H组成9位数。
EPC1L:在PWM模式下,与CCAP1L组成9位数。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
345
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
7. 将单片机的PCA/PWM功能从P1口设置到P4口的寄存器AUXR1
辅助寄存器1的格式如下:
AUXR1 : 辅助寄存器1
SFR name
AUXR1
Address
A2H
bit
name
B7
-
B6
B5
B4
PCA_P4 SPI_P4 S2_P4
B3
B2
B1
B0
GF2
ADRJ
-
DPS
PCA_P4: 0, 缺省PCA在P1口
1,PCA/PWM从P1口切换到P4口
ECI从P1.2切换到P4.1口
PCA0/PWM0从P1.3切换到P4.2口
PCA1/PWM1从P1.4切换到P4.3口
SPI_P4:
S2_P4:
0, 缺省SPI在P1口
1,SPI从P1口切换到P4口
SPICLK从P1.7切换到P4.3口
MISO从P1.6切换到P4.2口
MOSI从P1.5切换到P4.1口
SS从P1.4切换到P4.0口
U
C
M
0, 缺省UART2在P1口
1,UART2从P1口切换到P4口
TxD2从P1.3切换到P4.3口
RxD2从P1.2切换到P4.2口
C
T
S
GF2: 通用标志位
.
d
e
t
i
m
Li
ADRJ:
0, 10位A/D转换结果的高8位放在ADC_RES寄存器,低2位放在ADC_RESL寄存器
1,10位A/D转换结果的最高2位放在ADC_RES寄存器的低2位,低8位放在ADC_RESL寄存器
DPS: 0, 使用缺省数据指针DPTR0
1,使用另一个数据指针DPTR1
346
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
10.2 PCA/PWM模块的结构
STC12C5A60S2系列单片机有2路可编程计数器阵列PCA/PWM(通过AUXR1寄存器可以设置PCA/
PWM从P1口切换到P4口)。
PCA含有一个特殊的16位定时器,有2个16位的捕获/比较模块与之相连�������
,如下图所示。
P4.2/CCP0/PCA0/PWM0 (AUXR1.6/PCA_P4=1)
模块 0
P1.3/CCP0/PCA0/PWM0 (AUXR1.6/PCA_P4=0)
16位PCA
定时器/计数器
P4.3/CCP1/PCA1/PWM1(AUXR1.6/PCA_P4=1)
模块 1
P1.4/CCP1/PCA1/PWM1(AUXR1.6/PCA_P4=0)
.
d
e
t
i
m
PCA模块结构
Li
每个模块可编程工作在4种模式下:上升/下降沿捕获、软件定时器、高速输出或可调制脉
冲输出。
STC12C5A60S2系列: 模块0连接到P1.3/CCP0(可以切换到P4.2/CCP0/MISO口),
模块1连接到P1.4/CCP1(可以切换到P4.3/CCP1/SCLK口)。
U
C
M
16位PCA定时器/计数器是2个模块的公共时间基准,其结构如下图所示。
C
T
S
SYSclk/1
SYSclk/2
至PCA模块
SYSclk/4
SYSclk/6
CH CL
16位计数器
SYSclk/8
PCA中断
SYSclk/12
定时器0溢出
外部输入ECI(P1.2)
IDLE
CMOD CIDL
CF
-
CR
-
-
CPS2 CPS1 CPS0
-
-
-
-
ECF
CCF1
CCF0
CCON
PCA 定时器/计数器结构
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
347
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
寄存器CH和CL的内容是正在自由递增计数的16位PCA定时器的值。PCA定时器是2个模块的
公共时间基准,可通过编程工作在:1/12���������������������������
系统时钟�����������������������
、1/8�������������������
系统时钟���������������
、1/6�����������
系统时钟�������
、1/4���
系统时
钟�����������������������������
、1/2�������������������������
系统时钟���������������������
、��������������������
系统时钟����������������
、定时器0溢出或ECI脚的输入(STC12C5A60S2系列在P1.2口)。
定时器的计数源由CMOD���������������������������������������
特殊功能寄存器中�������������������������������
的CPS2,CPS1和CPS0位来确定(见CMOD特殊功能寄存
器说明)。
CMOD���������������������������������������
特殊功能寄存器还有������������������������������
2�����������������������������
个位与��������������������������
PCA�����������������������
相关。它们分别是:��������������
CIDL����������
,空闲模式下允许停止
PCA�������������������������������������������������
;������������������������������������������������
ECF���������������������������������������������
,置位时,使能��������������������������������������
PCA�����������������������������������
中断,当�������������������������������
PCA����������������������������
定时器溢出将����������������������
PCA�������������������
计数溢出标志�������������
CF�����������
(����������
CCON.7����
)置位。
CCON������������������������������������������
特殊功能寄存器包含���������������������������������
PCA������������������������������
的运行控制位(�����������������������
CR���������������������
)和�������������������
PCA����������������
定时器标志(����������
CF��������
)以及各个模块的
标志(����������������������������������������������������
CCF1/CCF0�������������������������������������������
)。通过软件置位�����������������������������������
CR���������������������������������
位(�������������������������������
CCON.6�������������������������
)来运行���������������������
PCA������������������
。�����������������
CR���������������
位被清零时����������
PCA�������
关闭。当���
PCA
计数器溢出时,�������������������������������������������
CF�����������������������������������������
位(���������������������������������������
CCON.7���������������������������������
)置位������������������������������
,�����������������������������
如果���������������������������
CMOD�����������������������
寄存器的�������������������
ECF����������������
位置位�������������
,������������
就产生中断。������
CF����
位只可通
过软件清除。�����������������������������������������
CCON�������������������������������������
寄存器的位��������������������������������
0�������������������������������
~������������������������������
3�����������������������������
是����������������������������
PCA�������������������������
各个模块的标志(位����������������
0���������������
对应模块�����������
0����������
,位��������
1�������
对应模块���
1��
),
当发生匹配或比较时由硬件置位。这些标志也只能通过软件清除。所有模块共用一个中断向
量。�������������
PCA����������
的中断系统如图所示。
.
d
e
t
i
m
Li
PCA�����������������������������������������
的每个模块都对应一个特殊功能寄存器。它们分别是:模块���������������
0��������������
对应������������
CCAPM0������
,模块���
1��
对应
CCAPM1,�����������������������
特殊功能寄存器包含了相应模块的工作模式控制位。
U
C
M
当模块发生匹配或比较时,�������������������������������������
ECCFn��������������������������������
位(������������������������������
CCAPMn.0����������������������
,���������������������
n��������������������
=�������������������
0������������������
,�����������������
1����������������
由工作的模块决定)使能�����
CCON
特殊功能寄存器的������������
CCFn��������
标志来产生中断。
C
T
S
PWM���������������������
(��������������������
CCAPMn.1������������
)用来使能脉宽调制模式。
当���������������������������������������������
PCA������������������������������������������
计数值与模块的捕获���������������������������������
/��������������������������������
比较寄存器的值相匹配时,如果������������������
TOG���������������
位(�������������
CCAPMn.2�����
)置位,模
块的������������
CEXn��������
输出将发生翻转。
当���������������������������������������������
PCA������������������������������������������
计数值与模块的捕获���������������������������������
/��������������������������������
比较寄存器的值相匹配时,如果匹配位���������������
MATn�����������
(����������
CCAPMn.3��
)置
位,������������������
CCON��������������
寄存器的����������
CCFn������
位将被置位。
CAPNn�������������������������������������������������
(������������������������������������������������
CCAPMn.4����������������������������������������
)和��������������������������������������
CAPPn���������������������������������
(��������������������������������
CCAPMn.5������������������������
)用来设置捕获输入的有效沿。����������
CAPNn�����
位使能下降
沿有效,���������������������������������������
CAPPn����������������������������������
位使能上升沿有效。如果两位都置位,则两种跳变沿都被使能,捕获可在两种
跳变沿产生。
通过置位�����������������������������������
CCAPMn�����������������������������
寄存器的�������������������������
ECOMn��������������������
位(������������������
CCAPMn.6����������
)来使能比较器功能。
每个��������������������������������������������
PCA�����������������������������������������
模块还对应另外两个寄存器,����������������������������
CCAPnH����������������������
和���������������������
CCAPnL���������������
。当出现捕获或比较时,它们用来
保存�����������������������������������������������������
16���������������������������������������������������
位的计数值。当��������������������������������������������
PCA�����������������������������������������
模块用在�������������������������������������
PWM����������������������������������
模式中时,它们用来控制输出的占空比。����������������
348
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
10.3 PCA模块的工作模式
10.3.1 捕获模式
PCA���������������������������������������
模块工作于捕获模式的结构图如下图所示。要使一个����������������
PCA�������������
模块工作在捕获模式,寄存器
CCAPMn���������������������������������������������
的两位(�����������������������������������������
CAPNn������������������������������������
和�����������������������������������
CAPPn������������������������������
)或其中任何一位必须置�������������������
1������������������
。�����������������
PCA��������������
模块工作于捕获模式时,对模块
的外部�������
CCPn���
输入(CCP0/P1.3,CCP1/P1.4)的跳变进行采样。当采样到有效跳变时,������
PCA���
硬件就
将������������������������������������������������
PCA���������������������������������������������
计数器阵列寄存器(������������������������������������
CH����������������������������������
和���������������������������������
CL�������������������������������
)的值装载到模块的捕获寄存器中(���������������
CCAPnL���������
和��������
CCAPnH��
)。
CF
CR
CCF1
CCF0 CCON (地址:D8H)
.
d
e
t
i
m
PCA中断
Li
CH
CCPn
捕捉
(CCP0/P1.3,
CCP1/P1.4)
U
C
M
ECOMn CAPPn CAPNn MATn
0
0
C
T
S
CL
CCAPnH CCAPnL
TOGn PWMn ECCFn CCAPMn, n=0,1
地址:DAh,DBh
0
0
PCA Capture Mode (PCA捕获模式图)
如果CCON������������������������������������������
特殊功能寄存器中����������������������������������
的位CCFn和CCAPMn���������������������
特殊功能寄存器中�������������
的位ECCFn位被置位,将
产生中断。������������������������������������
可在中断服务程序中判断哪一个模块产生了中断,并注意中断标志位的软件清零问
题。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
349
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
10.3.2 16位软件定时器模式
16位软件定时器模式结构图如下图所示。
先写
Write to CCAPnL
停止比较
0
后写
Write to CCAPnH
恢复比较
1
CF
CCF1 CCF0 CCON
CR
CCAPnH
CCAPnL
PCA中断
(To CCFn)
使能
16-Bit comparator
CH
ECOMn=0,停止比较
ECOMn=1,恢复比较
-
匹配
CL
Li
.
d
e
t
i
m
ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn CCAPMn
U
C
M
0
0
1
0
0
PCA Software Timer Mode / PCA模块的16位软件定时器模式/PCA比较模式
C
T
S
通过置位CCAPMn寄存器的ECOM和MAT位,可使PCA模块用作软件定时器(上图)。
PCA定时器的值与模块捕获寄存器的值相比较,当两者相等时,如果位CCFn(在CCON特殊功
能寄存器中)和位ECCFn(在CCAPMn特殊功能寄存器中)都置位,将产生中断。
[CH,CL]每隔一定的时间自动加1,时间间隔取决于选择的时钟源。例如,当选择的时
钟源为SYSclk/12,每12个时钟周期[CH,CL]加1。当[CH,CL]增加到等于[CCAPnH, CCAPnL]
时,CCFn=1,产生中断请求。如果每次PCA模块中断后,在中断服务程序中断给[CCAPnH,
CCAPnL]增加一个相同的数值,那么下次中断来临的间隔时间T也是相同的,从而实现了定时
功能。定时时间的长短取决于时钟源的选择以及PCA计数器计数值的设置。下面举例说明PCA
计数器计数值的计算方法。
假设,系统时钟频率SYSclk = 18.432MHz,选择的时钟源为SYSclk/12,定时时间T为5ms,则
PCA计数器计数值为:
PCA计数器的计数值 = T / (( 1 / SYSclk )×12 ) = 0.005 / (( 1 / 18432000)×12 ) = 7680 (10进制数)
= 1E00H (16进制数)
也就是说,PCA计时器计数1E00H次,定时时间才是5ms,这也就是每次给[CCAPnH,
CCAPnL]增加的数值(步长)。
350
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
10.3.3 高速输出模式
该模式中(下图),当PCA计数器的计数值与模块捕获寄存器的值相匹配时,PCA模块的CCPn
输出将发生翻转。要激活高速输出模式,CCAPMn��������������������������
寄存器�����������������������
的TOGn,MATn和ECOMn位必须都置位。
先写
Write to CCAPnL
后写
Write to CCAPnH
CF
-
-
CR
-
-
CCF1 CCF0 CCON
PCA中断
停止比较
0
恢复比较
1
CCAPnH
CCAPnL
(To CCFn)
使能
.
d
e
t
i
m
匹配
16位比较器
Toggle
CH
ECOMn=0,停止比较
ECOMn=1,恢复比较
-
ECOMn
U
C
M
CAPPn CAPNn MATn
0
C
T
S
CL
0
1
Li
TOGn PWMn ECCFn
1
CCPn
翻转
CCAPMn
0
PCA High-Speed Output Mode / PCA 高速输出模式
CCAPnL的值决定了PCA模块n的输出脉冲频率。当PCA时钟源是SYSclk/2时,输出脉冲的
频率F为:
f = SYSclk / ( 4×CCAPnL )
其中,SYSclk为系统时钟频率。由此,可以得到CCAPnL的值CCAPnL = SYSclk / ( 4�����
×f ).
如果计算出的结果不是整数,则进行四舍五入取整,即
CCAPnL = INT (SYSclk / ( 4×f ) + 0.5 )
其中,INT( )为取整运算,直接去掉小数。例如,假设SYSclk = 20MHz,要求PCA高速脉
冲输出125kHz的方波,则CCAPnL中的值应为:
CCAPnL = INT (20000000 / ( 4×125000 ) + 0.5 ) = INT ( 40 + 0.5 ) = 40 = 28H
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
351
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
10.3.4 脉宽调节模式(PWM)
脉宽调制(PWM,Pulse Width Modulation)是一种使用程序来控制波形占空比、周期、相位
波形的技术,在三相电机驱动、D/A转换等场合有广泛的应用。STC12C5A60S2系列单片机的
PCA模块可以通过程序设定,使其工作于8位PWM模式。PWM模式的结构如下图所示。
EPCnH
CPS2/CPS1/CPS0 = 1/0/0 时,PCA/PWM的
时钟源是SYSclk,不用Timer0,PWM的频率
为SYSclk/256,如果要使用系统时钟/3来作为
PCA的时钟源,应让T0工作在1T模式,记数3
个脉冲即产生溢出.此时使用内部RC作为系统
时钟,可以输出14K~19K频率的PWM。
用T0的溢出可对系统时钟进行1~256级分频
CCAPnH
EPCnL
CCAPnL
输出0
enable
C
T
S
Li
(0,CL)=(EPCnL,CCPnL)
输出1
CL
CL overflow
-
ECOMn
1
CAPPn
0
CAPNn
0
MATn
TOGn
PWMn
ECCFn
0
0
1
0
CCAPMn, n=0,1
PCA PWM mode / 可调制脉冲宽度输出模式
所有PCA模块都可用作PWM输出(�����������
上����������
图)。输出频率取决于PCA定时器的时钟源。
由于所有模块共用仅有的PCA定时器,所有它们的输出频率相同。各个模块的输出占空
比是独立变化的,与使用的捕获寄存器[EPCnL,CCAPnL]有关。当���
寄存器CL的值小于[EPCnL,
CCAPnL]时,输出为低��������������
;�������������
当������������
寄存器���������
CL的值等于或大于[EPCnL,CCAPnL]时,输出为高。当CL
的值由FF变为00溢出时,[EPCnH,CCAPnH]的内容装载到[EPCnL,CCAPnL]中。这样就可实现
无干扰地更新PWM。要使能PWM模式,模块CCAPMn寄存器的PWMn和ECOMn位必须置位。
由于PWM是8位的,所以�
: PWM的频率=
PCA时钟输入源频率
256
PCA时钟输入源可以从以下8种中选择一种:SYSclk, SYSclk/2, SYSclk/4,SYSclk/6,
SYSclk/8,SYSclk/12,定时器0的溢出,ECI/P3.4输入�
。
352
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
举例:要求PWM输出频率为38KHz,选SYSclk为PCA/PWM时钟输入源,求出SYSclk的值
由计算公式38000=SYSclk/256 ,得到外部时钟频率SYSclk=38000 x 256 x 1=9,728,000
如果要实现可调频率的PWM输出,可选择定时器0的溢出率或者ECI脚的输入作为PCA/PWM
的时钟输入源
当EPCnL = 0及ECCAPnL = 00H时,PWM固定输出高
当EPCnL = 1及CCAPnL = 0FFH时,PWM固定输出低
当某个I/O口作为PWM使用时�������
,������
该口的状态�
:
PWM之前口的状态
PWM输出时口的状态
弱上拉/准双向
强推挽输出/强上拉输出,要加输出限流电阻1K-10K
强推挽输出/强上拉输出
强推挽输出/强上拉输出,要加输出限流电阻1K-10K
仅为输入/高阻
PWM无效
开漏
开漏
限流电阻用10K到1K
普通I/O口
C
T
S
南通国芯微电子有限公司
U
C
M
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
接负载
传真:0513-5501 2969 / 2956 / 2947
353
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
10.4 用PCA功能扩展外部中断的示例程序(C程序和汇编程序)
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示 STC 1T 系列单片机 用PCA功能扩展外部中断 -----------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
/*Declare SFR associated with the PCA */
sfr
CCON
= 0xD8;
sbit
CCF0
= CCON^0;
sbit
CCF1
= CCON^1;
sbit
CR
= CCON^6;
sbit
CF
= CCON^7;
sfr
CMOD
= 0xD9;
sfr
CL
= 0xE9;
sfr
CH
= 0xF9;
sfr
CCAPM0
= 0xDA;
sfr
CCAP0L
= 0xEA;
sfr
CCAP0H
= 0xFA;
sfr
CCAPM1
= 0xDB;
sfr
CCAP1L
= 0xEB;
sfr
CCAP1H
= 0xFB;
sfr
PCAPWM0
= 0xf2;
sfr
PCAPWM1
= 0xf3;
C
T
S
sbit
PCA_LED
= P1^0;
void PCA_isr() interrupt 7 using 1
{
CCF0 = 0;
PCA_LED = !PCA_LED;
}
354
U
C
M
南通国芯微电子有限公司
.
d
e
t
i
m
Li
//PCA control register
//PCA module-0 interrupt flag
//PCA module-1 interrupt flag
//PCA timer run control bit
//PCA timer overflow flag
//PCA mode register
//PCA base timer LOW
//PCA base timer HIGH
//PCA module-0 mode register
//PCA module-0 capture register LOW
//PCA module-0 capture register HIGH
//PCA module-1 mode register
//PCA module-1 capture register LOW
//PCA module-1 capture register HIGH
//PCA test LED
//Clear interrupt flag
//toggle the test pin while CEX0(P1.3) have a falling edge
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
void main()
{
CCON = 0;
CL = 0;
CH = 0;
CMOD = 0x00;
CCAPM0 = 0x11;
//
CCAPM0 = 0x21;
//
CCAPM0 = 0x31;
CR = 1;
EA = 1;
while (1);
}
南通国芯微电子有限公司
研发顾问:13922809991
//Initial PCA control register
//PCA timer stop running
//Clear CF flag
//Clear all module interrupt flag
//Reset PCA base timer
临时技术支持:13922829991
//Set PCA timer clock source as Fosc/12
//Disable PCA timer overflow interrupt
//PCA module-0 capture by a negative tigger on CEX0(P1.3)
//and enable PCA interrupt
//PCA module-0 capture by a rising edge on CEX0(P1.3)
//and enable PCA interrupt
//PCA module-0 capture by a transition (falling/rising edge)
//on CEX0(P1.3) and enable PCA interrupt
C
T
S
//PCA timer start run
U
C
M
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
传真:0513-5501 2969 / 2956 / 2947
355
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示 STC 1T 系列单片机 用PCA功能扩展外部中断 -----------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
;/*Declare SFR associated with the PCA */
CCON
EQU 0D8H
CCF0
BIT
CCON.0
CCF1
BIT
CCON.1
CR
BIT
CCON.6
CF
BIT
CCON.7
CMOD
EQU 0D9H
CL
EQU 0E9H
CH
EQU 0F9H
CCAPM0
EQU 0DAH
CCAP0L
EQU 0EAH
CCAP0H
EQU 0FAH
CCAPM1
EQU 0DBH
CCAP1L
EQU 0EBH
CCAP1H
EQU 0FBH
;PCA control register
;PCA module-0 interrupt flag
;PCA module-1 interrupt flag
;PCA timer run control bit
;PCA timer overflow flag
;PCA mode register
;PCA base timer LOW
;PCA base timer HIGH
;PCA module-0 mode register
;PCA module-0 capture register LOW
;PCA module-0 capture register HIGH
;PCA module-1 mode register
;PCA module-1 capture register LOW
;PCA module-1 capture register HIGH
PCA_LED
;PCA test LED
C
T
S
BIT
P1.0
U
C
M
.
d
e
t
i
m
Li
;----------------------------------------
ORG 0000H
LJMP MAIN
ORG 003BH
PCA_ISR:
CLR CCF0
CPL PCA_LED
RETI
;----------------------------------------
ORG 0100H
356
南通国芯微电子有限公司
;Clear interrupt flag
;toggle the test pin while CEX0(P1.3) have a falling edge
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
MAIN:
MOV CCON, #0
CLR A
MOV CL,
A
MOV CH,
A
MOV CMOD, #00H
MOV CCAPM0,#11H
;
MOV CCAPM0,#21H
;
MOV CCAPM0,#31H
;------------------------------
SETB CR
SETB EA
SJMP $
;----------------------------------------
END
C
T
S
南通国芯微电子有限公司
临时技术支持:13922829991
研发顾问:13922809991
;Initial PCA control register
;PCA timer stop running
;Clear CF flag
;Clear all module interrupt flag
;
;Reset PCA base timer
;
;Set PCA timer clock source as Fosc/12
;Disable PCA timer overflow interrupt
;PCA module-0 capture by a falling edge on CEX0(P1.3)
;and enable PCA interrupt
;PCA module-0 capture by a rising edge on CEX0(P1.3)
;and enable PCA interrupt
;PCA module-0 capture by a transition (falling/rising edge)
;on CEX0(P1.3) and enable PCA interrupt
;PCA timer start run
U
C
M
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
传真:0513-5501 2969 / 2956 / 2947
357
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
10.5 用PCA功能实现定时器的示例程序(C程序和汇编程序)
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示 STC 1T 系列单片机 用PCA功能实现16位定时器 --------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
#define FOSC 18432000L
#define T100Hz (FOSC / 12 / 100)
typedef unsigned char
typedef unsigned int
BYTE;
WORD;
C
T
S
/*Declare SFR associated with the PCA */
sfr
CCON
= 0xD8;
sbit
CCF0
= CCON^0;
sbit
CCF1
= CCON^1;
sbit
CR
= CCON^6;
sbit
CF
= CCON^7;
sfr
CMOD
= 0xD9;
sfr
CL
= 0xE9;
sfr
CH
= 0xF9;
sfr
CCAPM0
= 0xDA;
sfr
CCAP0L
= 0xEA;
sfr
CCAP0H
= 0xFA;
sfr
CCAPM1
= 0xDB;
sfr
CCAP1L
= 0xEB;
sfr
CCAP1H
= 0xFB;
sfr
PCAPWM0
= 0xf2;
sfr
PCAPWM1
= 0xf3;
sbit
PCA_LED
= P1^0;
U
C
M
.
d
e
t
i
m
Li
//PCA control register
//PCA module-0 interrupt flag
//PCA module-1 interrupt flag
//PCA timer run control bit
//PCA timer overflow flag
//PCA mode register
//PCA base timer LOW
//PCA base timer HIGH
//PCA module-0 mode register
//PCA module-0 capture register LOW
//PCA module-0 capture register HIGH
//PCA module-1 mode register
//PCA module-1 capture register LOW
//PCA module-1 capture register HIGH
//PCA test LED
BYTE cnt;
WORD value;
358
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
void PCA_isr() interrupt 7 using 1
{
CCF0 = 0;
CCAP0L = value;
CCAP0H = value >> 8;
value += T100Hz;
if (cnt-- == 0)
{
cnt = 100;
PCA_LED = !PCA_LED;
}
}
void main()
{
CCON = 0;
C
T
S
CR = 1;
EA = 1;
cnt = 0;
while (1);
研发顾问:13922809991
//Clear interrupt flag
//Update compare value
//Count 100 times
//Flash once per second
.
d
e
t
i
m
Li
//Initial PCA control register
//PCA timer stop running
//Clear CF flag
//Clear all module interrupt flag
//Reset PCA base timer
U
C
M
CL = 0;
CH = 0;
CMOD = 0x00;
value = T100Hz;
CCAP0L = value;
CCAP0H = value >> 8;
value += T100Hz;
CCAPM0 = 0x49;
临时技术支持:13922829991
//Set PCA timer clock source as Fosc/12
//Disable PCA timer overflow interrupt
//Initial PCA module-0
//PCA module-0 work in 16-bit timer mode
//and enable PCA interrupt
//PCA timer start run
}
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
359
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示 STC 1T 系列单片机 用PCA功能实现16位定时器 --------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
T100Hz
EQU
3C00H
;(18432000 / 12 / 100)
.
d
e
t
i
m
;/*Declare SFR associated with the PCA */
CCON
EQU 0D8H
CCF0
BIT
CCON.0
CCF1
BIT
CCON.1
CR
BIT
CCON.6
CF
BIT
CCON.7
CMOD
EQU 0D9H
CL
EQU 0E9H
CH
EQU 0F9H
CCAPM0
EQU 0DAH
CCAP0L
EQU 0EAH
CCAP0H
EQU 0FAH
CCAPM1
EQU 0DBH
CCAP1L
EQU 0EBH
CCAP1H
EQU 0FBH
;PCA control register
;PCA module-0 interrupt flag
;PCA module-1 interrupt flag
;PCA timer run control bit
;PCA timer overflow flag
;PCA mode register
;PCA base timer LOW
;PCA base timer HIGH
;PCA module-0 mode register
;PCA module-0 capture register LOW
;PCA module-0 capture register HIGH
;PCA module-1 mode register
;PCA module-1 capture register LOW
;PCA module-1 capture register HIGH
PCA_LED
;PCA test LED
C
T
S
BIT
P1.0
U
C
M
Li
CNT
EQU 20H
;----------------------------------------
ORG 0000H
LJMP MAIN
ORG 003BH
LJMP PCA_ISR
;-----------------------------------------
360
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
MAIN:
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
ORG 0100H
MOV SP,
#3FH
;Initial stack point
MOV CCON, #0
;Initial PCA control register
;PCA timer stop running
;Clear CF flag
;Clear all module interrupt flag
CLR A
;
MOV CL,
A
;Reset PCA base timer
MOV CH,
A
;
MOV CMOD, #00H
;Set PCA timer clock source as Fosc/12
;Disable PCA timer overflow interrupt
;------------------------------
MOV CCAP0L, #LOW T100Hz
;
MOV CCAP0H,#HIGH T100Hz
;Initial PCA module-0
MOV CCAPM0,#49H
;PCA module-0 work in 16-bit timer mode and enable PCA interrupt
;------------------------------
SETB CR
;PCA timer start run
SETB EA
MOV CNT,
#100
U
C
M
SJMP $
;----------------------------------------PCA_ISR:
PUSH PSW
PUSH ACC
CLR CCF0
MOV A,
CCAP0L
ADD A,
#LOW T100Hz
MOV CCAP0L, A
MOV A,
CCAP0H
ADDC A,
#HIGH T100Hz
MOV CCAP0H,A
DJNZ CNT,
PCA_ISR_EXIT
MOV CNT,
#100
CPL PCA_LED
PCA_ISR_EXIT:
POP ACC
POP PSW
RETI
;----------------------------------------
END
C
T
S
南通国芯微电子有限公司
.
d
e
t
i
m
Li
;Clear interrupt flag
;Update compare value
;count 100 times
;Flash once per second
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
361
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
10.6 PCA输出高速脉冲的示例程序(C程序和汇编程序)
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示 STC 1T 系列单片机 PCA输出高速脉冲 --------------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
#define FOSC 18432000L
#define T100KHz (FOSC / 4 / 100000)
typedef unsigned char
typedef unsigned int
BYTE;
WORD;
C
T
S
/*Declare SFR associated with the PCA */
sfr
CCON
= 0xD8;
sbit
CCF0
= CCON^0;
sbit
CCF1
= CCON^1;
sbit
CR
= CCON^6;
sbit
CF
= CCON^7;
sfr
CMOD
= 0xD9;
sfr
CL
= 0xE9;
sfr
CH
= 0xF9;
sfr
CCAPM0
= 0xDA;
sfr
CCAP0L
= 0xEA;
sfr
CCAP0H
= 0xFA;
sfr
CCAPM1
= 0xDB;
sfr
CCAP1L
= 0xEB;
sfr
CCAP1H
= 0xFB;
sfr
PCAPWM0
= 0xf2;
sfr
PCAPWM1
= 0xf3;
sbit
PCA_LED
= P1^0;
U
C
M
.
d
e
t
i
m
Li
//PCA control register
//PCA module-0 interrupt flag
//PCA module-1 interrupt flag
//PCA timer run control bit
//PCA timer overflow flag
//PCA mode register
//PCA base timer LOW
//PCA base timer HIGH
//PCA module-0 mode register
//PCA module-0 capture register LOW
//PCA module-0 capture register HIGH
//PCA module-1 mode register
//PCA module-1 capture register LOW
//PCA module-1 capture register HIGH
//PCA test LED
BYTE cnt;
WORD value;
362
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
void PCA_isr( ) interrupt 7 using 1
{
CCF0 = 0;
CCAP0L = value;
CCAP0H = value >> 8;
value += T100KHz;
}
void main()
{
CCON = 0;
CL = 0;
CH = 0;
CMOD = 0x02;
value = T100KHz;
CCAP0L = value;
CCAP0H = value >> 8;
value += T100KHz;
CCAPM0 = 0x4d;
CR = 1;
EA = 1;
cnt = 0;
while (1);
C
T
S
临时技术支持:13922829991
研发顾问:13922809991
//Clear interrupt flag
//Update compare value
//Initial PCA control register
//PCA timer stop running
//Clear CF flag
//Clear all module interrupt flag
//Reset PCA base timer
.
d
e
t
i
m
Li
//Set PCA timer clock source as Fosc/2
//Disable PCA timer overflow interrupt
U
C
M
//P1.3 output 100KHz square wave
//Initial PCA module-0
//PCA module-0 work in 16-bit timer mode
//and enable PCA interrupt, toggle the output pin CCP0(P1.3)
//PCA timer start run
}
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
363
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示 STC 1T 系列单片机 PCA输出高速脉冲 --------------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
T100KHz
EQU 2EH
;(18432000 / 4 / 100000)
;/*Declare SFR associated with the PCA */
CCON
EQU 0D8H
CCF0
BIT
CCON.0
CCF1
BIT
CCON.1
CR
BIT
CCON.6
CF
BIT
CCON.7
CMOD
EQU 0D9H
CL
EQU 0E9H
CH
EQU 0F9H
CCAPM0
EQU 0DAH
CCAP0L
EQU 0EAH
CCAP0H
EQU 0FAH
CCAPM1
EQU 0DBH
CCAP1L
EQU 0EBH
CCAP1H
EQU 0FBH
;----------------------------------------
ORG 0000H
LJMP MAIN
C
T
S
ORG
PCA_ISR:
PUSH
PUSH
CLR
MOV
ADD
MOV
CLR
ADDC
MOV
364
.
d
e
t
i
m
;PCA control register
;PCA module-0 interrupt flag
;PCA module-1 interrupt flag
;PCA timer run control bit
;PCA timer overflow flag
;PCA mode register
;PCA base timer LOW
;PCA base timer HIGH
;PCA module-0 mode register
;PCA module-0 capture register LOW
;PCA module-0 capture register HIGH
;PCA module-1 mode register
;PCA module-1 capture register LOW
;PCA module-1 capture register HIGH
U
C
M
Li
003BH
PSW
ACC
CCF0
A,
CCAP0L
A,
#T100KHz
CCAP0L, A
A
A,
CCAP0H
CCAP0H,A
南通国芯微电子有限公司
;Clear interrupt flag
;Update compare value
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
PCA_ISR_EXIT:
POP ACC
POP PSW
RETI
;----------------------------------------
ORG 0100H
MAIN:
MOV CCON, #0
CLR A
MOV CL,
A
MOV CH,
A
MOV CMOD, #02H
;------------------------------
MOV CCAP0L, #T100KHz
MOV CCAP0H,#0
MOV CCAPM0,#4dH
;------------------------------
SETB CR
SETB EA
SJMP $
;----------------------------------------
END
C
T
S
南通国芯微电子有限公司
临时技术支持:13922829991
研发顾问:13922809991
;Initial PCA control register
;PCA timer stop running
;Clear CF flag
;Clear all module interrupt flag
;
;Reset PCA base timer
;
;Set PCA timer clock source as Fosc/2
;Disable PCA timer overflow interrupt
.
d
e
t
i
m
Li
;P1.3 output 100KHz square wave
;Initial PCA module-0
;PCA module-0 work in 16-bit timer mode
;and enable PCA interrupt, toggle the output pin CCP0(P1.3)
U
C
M
;PCA timer start run
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
365
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
10.7 PCA输出PWM的示例程序(C程序和汇编程序)
1. C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示 STC 1T 系列单片机 PCA输出PWM -------------------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
#define FOSC
18432000L
typedef unsigned char
typedef unsigned int
BYTE;
WORD;
C
T
S
/*Declare SFR associated with the PCA */
sfr
CCON
= 0xD8;
sbit
CCF0
= CCON^0;
sbit
CCF1
= CCON^1;
sbit
CR
= CCON^6;
sbit
CF
= CCON^7;
sfr
CMOD
= 0xD9;
sfr
CL
= 0xE9;
sfr
CH
= 0xF9;
sfr
CCAPM0
= 0xDA;
sfr
CCAP0L
= 0xEA;
sfr
CCAP0H
= 0xFA;
sfr
CCAPM1
= 0xDB;
sfr
CCAP1L
= 0xEB;
sfr
CCAP1H
= 0xFB;
sfr
PCAPWM0
= 0xf2;
sfr
PCAPWM1
= 0xf3;
366
南通国芯微电子有限公司
U
C
M
.
d
e
t
i
m
Li
//PCA control register
//PCA module-0 interrupt flag
//PCA module-1 interrupt flag
//PCA timer run control bit
//PCA timer overflow flag
//PCA mode register
//PCA base timer LOW
//PCA base timer HIGH
//PCA module-0 mode register
//PCA module-0 capture register LOW
//PCA module-0 capture register HIGH
//PCA module-1 mode register
//PCA module-1 capture register LOW
//PCA module-1 capture register HIGH
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
void main()
{
CCON = 0;
技术支持网站:www.STCMCU.com
CR = 1;
while (1);
}
南通国芯微电子有限公司
C
T
S
研发顾问:13922809991
//Initial PCA control register
//PCA timer stop running
//Clear CF flag
//Clear all module interrupt flag
//Reset PCA base timer
CL = 0;
CH = 0;
CMOD = 0x02;
CCAP0H = CCAP0L = 0x80;
CCAPM0 = 0x42;
CCAP1H = CCAP1L = 0xff;
PCAPWM1 = 0x03;
CCAPM1 = 0x42;
临时技术支持:13922829991
//Set PCA timer clock source as Fosc/2
//Disable PCA timer overflow interrupt
//PWM0 port output 50% duty cycle square wave
//PCA module-0 work in 8-bit PWM mode
//and no PCA interrupt
.
d
e
t
i
m
//PWM1 port output 0% duty cycle square wave
Li
//PCA module-1 work in 8-bit PWM mode
//and no PCA interrupt
U
C
M
//PCA timer start run
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
367
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示 STC 1T 系列单片机 PCA输出PWM -------------------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
;/*Declare SFR associated with the PCA */
CCON
EQU 0D8H
CCF0
BIT
CCON.0
CCF1
BIT
CCON.1
CR
BIT
CCON.6
CF
BIT
CCON.7
CMOD
EQU 0D9H
CL
EQU 0E9H
CH
EQU 0F9H
CCAPM0
EQU 0DAH
CCAP0L
EQU 0EAH
CCAP0H
EQU 0FAH
CCAPM1
EQU 0DBH
CCAP1L
EQU 0EBH
CCAP1H
EQU 0FBH
;----------------------------------------
ORG 0000H
LJMP MAIN
;----------------------------------------
ORG 0100H
MAIN:
MOV CCON, #0
CLR A
MOV CL,
A
MOV CH,
A
MOV CMOD, #02H
;-------------------------------
C
T
S
368
南通国芯微电子有限公司
.
d
e
t
i
m
;PCA control register
;PCA module-0 interrupt flag
;PCA module-1 interrupt flag
;PCA timer run control bit
;PCA timer overflow flag
;PCA mode register
;PCA base timer LOW
;PCA base timer HIGH
;PCA module-0 mode register
;PCA module-0 capture register LOW
;PCA module-0 capture register HIGH
;PCA module-1 mode register
;PCA module-1 capture register LOW
;PCA module-1 capture register HIGH
U
C
M
Li
;Initial PCA control register
;PCA timer stop running
;Clear CF flag
;Clear all module interrupt flag
;
;Reset PCA base timer
;
;Set PCA timer clock source as Fosc/2
;Disable PCA timer overflow interrupt
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
MOV A,
#080H
MOV CCAP0H,A
MOV CCAP0L,A
MOV CCAPM0,#42H
;------------------------------
MOV A,
#0C0H
MOV CCAP1H,A
MOV CCAP1L,A
MOV CCAPM1,#42H
;------------------------------
SETB CR
南通国芯微电子有限公司
研发顾问:13922809991
;
;PWM0 port output 50% duty cycle square wave
;
;PCA module-0 work in 8-bit PWM mode and no PCA interrupt
;
;PWM1 port output 25% duty cycle square wave
;
;PCA module-1 work in 8-bit PWM mode and no PCA interrupt
;PCA timer start run
SJMP $
;----------------------------------------
END
C
T
S
临时技术支持:13922829991
U
C
M
总机:0513-5501 2928 / 2929 / 2966
.
d
e
t
i
m
Li
传真:0513-5501 2969 / 2956 / 2947
369
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
10.8 利用PWM实现D/A功能的典型应用线路图
1
32
VDD
P2.3
2
31
P2.1
RST
3
30
P2.0
RxD/P3.0
4
29
P1.7/ADC7
TxD/P3.1
5
28
P1.6/ADC6
P0.0
6
27
P1.5/ADC5
XTAL2
7
26
P0.3
XTAL1
8
25
P1.4/ADC4
INT0/P3.2
9
24
P1.3/ADC3
P0.1
10
23
P0.2
INT1/P3.3
11
22
P1.2/ADC2/LVD
CLKOUT0/ECI/T0/P3.4
12
21
P1.1/ADC1
CLKOUT1/PWM1/T1/P3.5
13
20
P1.0/ADC0
P2.4
14
19
P3.7/PWM0
P2.5
15
18
P2.7
VSS
16
17
P2.6
C
T
S
370
SOP-32
P2.2
南通国芯微电子有限公司
U
C
M
Li
.
d
e
t
i
m
总机:0513-5501 2928 / 2929 / 2966
10K
10K
104
D/A
104
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
第11章 同步串行外围接口(SPI接口)
STC12C5A60S2系列单片机��������������
还提供另一种高速串行通信接口 —— SPI接口。SPI是一种全双
工、高速、同步的通信总线,有两种操作模式:主模式和从模式。在主模式中支持高达3 Mbps
的速率(工作频率为12MHz时,如果CPU主频采用20MHz到36MHz,则可更高,从模式时速度无
法太快,SYSclk/8以内较好),还具有传输完成标志和写冲突标志保护。
11.1 与SPI功能模块相关的特殊功能寄存器
STC12C5A60S2系列 1T 8051单片机SPI功能模块特殊功能寄存器
地址
SPI Management SFRs
位地址及其符号
.
d
te
符号
描述
SPCTL
SPSTAT
SPDAT
SPI Control Register
SPI Status Register
SPI Data Register
CEH SSIG SPEN DORD MSTR CPOL CPHA SPR1
CDH SPIF WCOL
CFH
SPR0 0000,0100
00xx,xxxx
0000,0000
AUXR1
Auxiliary Register 1
A2H
DPS
B7
1. SPI控制寄存器SPCTL
SPI控制寄存器的格式如下:
C
T
S
SPCTL : SPI控制寄存器
SFR name
SPCTL
Address
CEH
bit
name
B7
SSIG
-
B6
B5
B4
B3
B2
B1
i
m
Li
PCA_P4 SPI_P4 S2_P4
U
C
M
GF2
ADRJ
-
B0
复位值
x000,00x0
B6
B5
B4
B3
B2
B1
B0
SPEN
DORD
MSTR
CPOL
CPHA
SPR1
SPR0
SSIG:SS引脚忽略控制位。
SSIG=1,MSTR(位4)确定器件为主机还是从机;
SSIG=0,SS脚用于确定器件为主机还是从机.SS脚可作为I/O口使用��
(�
见SPI主从选择表�)
SPEN:SPI使能位。
SPEN=1,SPI使能;
SPEN=0,SPI被禁止,所有SPI引脚都作为I/O口使用。
DORD:设定SPI数据���������
发送和接收的位��
顺序。
DORD=1,数据字的LSB(最低位)最先发送;
DORD=0,数据字的MSB(最高位)最先发送�
。
MSTR:主/从模式选择���
位��
(见SPI主从选择表)。
CPOL:SPI时钟极性。
CPOL=1,SPICLK空闲时为高电平。SPICLK的前时钟沿为下降沿而后沿为上升沿。
CPOL=0,SPICLK空闲时为低电平。SPICLK的前时钟沿为上升沿而后沿为下降沿�
。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
371
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
CPHA:SPI时钟相位选择。
CPHA=1,���
数据在SPICLK的前时钟沿驱动,并在后时钟沿采样�
。
CPHA=0,���
数据在SS为低(SSIG=00)时被驱动,在SPICLK的后时钟沿被改变,并在
前时钟沿被采样。(注:SSIG = 1时的操作未定义)
SPR1、SPR0:SPI时钟速率选择控制位。SPI时钟选择如下表所列。
SPI时钟频率的选择
SPR1
SPR0
时钟( SCLK )
0
0
CPU_CLK/4
0
1
CPU_CLK/16
1
0
CPU_CLK/64
1
1
CPU_CLK/128
其中,CPU_CLK是CPU时钟。
2. SPI状态寄存器SPSTAT
SPI状态寄存器的格式如下:
SPSTAT: SPI状态寄存器
SFR name
SPSTAT
C
T
S
Address
CDH
bit
name
B7
SPIF
U
C
M
.
d
e
t
i
m
Li
B6
B5
B4
B3
B2
B1
B0
WCOL
-
-
-
-
-
-
SPIF:SPI传输完成标志。
当一次串行传输完成时,SPIF置位������
。此时,如果SPI中断被打开(即ESPI (IE2.1) 和
EA(IE.7) 都置位),则������
产生中断。当SPI处于主模式且SSIG=0时,如果SS为输入并被驱动
为低电平,SPIF也将置位����������
,表示“模式改变”�
。SPIF标志通过软件向其写入�"1"���
清零。
WCOL:SPI写冲突标志。
在数据传输的过程中如果对SPI 数据寄存器SPDAT执行写操作,WCOL将置位。
WCOL标志通过软件向其写入�"1"���
清零。
3. SPI数据寄存器SPDAT
SPI数据寄存器的格式如下:
SPDAT: SPI数据寄存器
SFR name
SPDAT
Address
CFH
bit
name
B7
B6
B5
B4
B3
B2
B1
B0
SPDAT.7 - SPDAT.0: 传输的数据位Bit7~Bit0
372
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
4. 将单片机的SPI功能从P1口设置到P4口的寄存器AUXR1
辅助寄存器1的格式如下:
AUXR1 : 辅助寄存器1
SFR name
AUXR1
Address
A2H
bit
name
B7
-
B6
B5
B4
PCA_P4 SPI_P4 S2_P4
B3
B2
B1
B0
GF2
ADRJ
-
DPS
PCA_P4: 0, 缺省PCA在P1口
1,PCA/PWM从P1口切换到P4口
ECI从P1.2切换到P4.1口
PCA0/PWM0从P1.3切换到P4.2口
PCA1/PWM1从P1.4切换到P4.3口
SPI_P4:
S2_P4:
0, 缺省SPI在P1口
1,SPI从P1口切换到P4口
SPICLK从P1.7切换到P4.3口
MISO从P1.6切换到P4.2口
MOSI从P1.5切换到P4.1口
SS从P1.4切换到P4.0口
U
C
M
0, 缺省UART2在P1口
1,UART2从P1口切换到P4口
TxD2从P1.3切换到P4.3口
RxD2从P1.2切换到P4.2口
GF2: 通用标志位
C
T
S
.
d
e
t
i
m
Li
ADRJ:
0, 10位A/D转换结果的高8位放在ADC_RES寄存器,低2位放在ADC_RESL寄存器
1,10位A/D转换结果的最高2位放在ADC_RES寄存器的低2位,低8位放在ADC_RESL寄存器
DPS: 0, 使用缺省数据指针DPTR0
1,使用另一个数据指针DPTR1
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
373
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
11.2 SPI接口的结构
STC12C5A60S2系列单片机的SPI功能方框图如下图所示。
S
MISO
P1.6
M
CPU 时钟
M
S
8位移位寄存器
Li
MSTR
M
SPR0
SPR1
CPOL
CPHA
MSTR
DORD
U
C
M
SSIG
WCOL
SPI 状态寄存器
.
d
e
t
i
m
S
时钟逻辑
SPEN
MSTR
SPEN
SPI 控制
SPIF
clock
SPI 时钟(主机)
SPR0
SPR1
选择
读数据缓冲区
MOSI
P1.5
SCLK
P1.7
SS
P1.4
SPEN
分频器
4,16,64,128
管脚
控制
逻辑
SPI 控制寄存器
SPI
中断请求
C
T
S
内部
数据
总线
SPI 功能方框图
SPI的核心是一个8位移位寄存器和数据缓冲器,数据可以同时发送和接收。在SPI数据的
传输过程中,发送和接收的数据都存储在数据缓冲器中。
对于主模式,若要发送一字节数据,只需将这个数据写到SPDAT寄存器中。主模式下SS信
号不是必需的;但是在从模式下,必须在SS信号变为有效并接收到合适的时钟信号后,方可
进行数据传输。在从模式下,如果一个字节传输完成后,SS信号变为高电平,这个字节立即
被硬件逻辑标志为接收完成,SPI接口准备接收下一个数据。
374
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
11.3 SPI接口的数据通信
SPI接口有4个管脚:SCLK/P1.7, MOSI/P1.5, MISO/P1.6和SS/P1.4 。
MOSI ( Master Out Slave In,主出从入):主器件的输出和从器件的输入,用于主器件到
从器件的串行数据传输。根据SPI规范,多个从机共享一根MOSI信号线。在时钟边界的前半周
期,主机将数据放在MOSI信号线上,从机在该边界处获取该数据。
MISO ( Master In Slave Out,主入从出):从器件的输出和主器件的输入,用于实现从器件
到主器件的数据传输。SPI规范中,一个主机可连接多个从机,因此,主机的MISO信号线会连
接到多个从机上,或者说,多个从机共享一根MISO信号线。当主机与一个从机通信时,其他从
机应将其MISO引脚驱动置为高阻状态。
.
d
e
t
i
m
SCLK ( SPI Clock,串行时钟信号):串行时钟信号是主器件的输出和从器件的输入,用于
同步主器件和从器件之间在MOSI和MISO线上的串行数据传输。当主器件启动一次数据传输时,
自动产生8个SCLK时钟周期信号给从机。在SCLK的每个跳变处(上升沿或下降沿)移出一位数
据。所以,一次数据传输可以传输一个字节的数据。
U
C
M
Li
SCLK、MOSI和MISO通常和两个或更多SPI器件连接在一起。数据通过MOSI由主机传送
到从机,通过MISO由从机传送到主机。SCLK信号在主模式时为输出,在从模式时为输入。如
果SPI系统被禁止,即SPEN(SPCTL.6)=0(复位值),这些管脚都可作为I/O口使用。
C
T
S
SS( Slave Select,从机选择信号):这是一个输入信号,主器件用它来选择处于从模式的
SPI模块����������
。���������
主模式和从模式下,SS的使用方法不同。在主模式下,SPI接口只能有一个主机,
不存在主机选择问题。该模式下SS不是必需的。主模式下通常将主机的SS管脚通过10KΩ的电
阻上拉高电平。每一个从机的SS接主机的I/O口,由主机控制电平高低,以便主机选择从机。
在从模式下,不了发送还是接收,SS信号必须有效。因此在一次数据传输开始之前必须将SS
为低电平。SPI主机可以使用I/O口选择一个SPI器件作为当前的从机。��������
在典型的配置中,SPI主
机使用I/O口选择一个SPI器件作为当前的从机。
SPI从器件通过其SS脚确定是否被选择。如果满足下面的条件之一,SS就被忽略:
• 如果SPI系统被禁止,即SPEN(SPCTL.6)= 0(复位值)
• 如果SPI配置为主机,即MSTR(SPCTL.4)=1,并且P1.4配置为输出(通过P1M0.4和P1M1.4)
• 如果SS脚被忽略,即SSIG(SPCTL.7)= 1,该脚配置用于I/O口功能。
注:即使SPI被配置为主机(MSTR = 1),它仍然可以通过拉低SS脚配置为从机(如果
P1.4配置为输入且SSIG=0)。要使能该特性,应当置位SPIF(SPSTAT.7)。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
375
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
11.3.1 SPI接口的数据通信方式
STC12C5A60S2系列单片机的SPI接口的数据通信方式有3种:单主机—从机方式、双器件
方式(器件可互为主机和从机)和单主机—多从机方式。
单主机—单从机方式的连接图如下SPI图1所示。
主机
从机
8位移位寄存器
SPI时钟发生器
MISO
MISO
MOSI
MOSI
SPICLK
SPICLK
8位移位寄存器
Port
.
d
e
t
i
m
SS
SPI图1 SPI单主机—单从机 配置
Li
在上图SPI图1中,从机的SSIG(SPCTL.7)为0,SS用于选择从机。SPI主机可使用任何端口
U
C
M
(包括P1.4/SS)来驱动SS脚。�������������������������������
主机SPI与从机SPI的8位移位寄存器连接成一个循环的16位移
位寄存器。当主机程序向SPDAT寄存器写入一个字节时,立即启动一个连续的8位移位通信过
程:主机的SCLK引脚向从机的SCLK引脚发出一串脉冲,在这串脉冲的驱动下,主机SPI的8位移
位寄存器中的数据移动到了从机SPI的8移位寄存器中。与此同时,从机SPI的8位移位寄存器中
的数据移动到了主机SPI的8位移位寄存器中。由此,主机既可向从机发送数据,又可读从机中
的数据。
C
T
S
双器件方式(器件可互为主机和从机)的连接图如下SPI图2所示。
主机
从机
8位移位寄存器
MISO
MISO
MOSI
MOSI
SPICLK
SPICLK
8位移位寄存器
SPI时钟发生器
SPI时钟发生器
SS
SS
SPI图2 SPI双器件配置(器件可互为主从)
上图SPI图2所示为两个器件互为主从的情况。当没有发生SPI操作时,两个器件都可配
置为主机(MSTR=1),将SSIG清零并将P1.4(SS)配置为准双向模式。当其中一个器件启动传输
时,它可将P1.4配置为输出并驱动为低电平,这样就强制另一个器件变为从机。
376
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
双方初始化时将自己设置成忽略SS脚的SPI从模式。当一方要主动发送数据时,先检测SS
脚的电平,如果SS脚是高电平,就将自己设置成忽略SS脚的主模式。通信双方平时将SPI设置
成没有被选中的从模式。在该模式下,MISO、MOSI、SCLK均为输入,当多个MCU的SPI接口以此
模式并联时不会发生总线冲突。这种特性在互为主/从、一主多从等应用中很有用。
注意:互为主/从模式时,双方的SPI速率必须相同。如果使用外部晶体振荡器,双方的晶
体频率也要相同。
双器件方式(器件可互为主机和从机)的连接图如下SPI图3所示。
主机
从机
MISO
MISO
.
d
e
t
i
m
8位移位寄存器
8位移位寄存器
MOSI
MOSI
SPICLK
SPICLK
SPI时钟发生器
Port
C
T
S
CU
M
Port
Li
SS
MISO
8位移位寄存器
MOSI
SPICLK
SS
SPI图3 SPI 单主机-多从机 配置
在上图SPI图3 中,从机的SSIG(SPCTL.7)为0,从机通过对应的SS信号被选中。SPI主机
可使用任何端口(包括P1.4/SS )来驱动SS脚�
。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
377
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
11.3.2 对SPI进行配置
STC12C5A60S2系列单片机进行SPI通信时,主机和从机的选择由SPEN、SSIG、SS引脚
(P1.4)和MSTR联合控制。下�������������������������
表������������������������
所示为主/从模式的配置以及模式的使用和传输方向。
SPI 主从模式选择
SPEN SSIG
SS脚
MSTR
P1.4
MISO MOSI SPICLK
P1.6 P1.5
P1.7
主或从
模式
备注
0
X
P1.4
X
SPI功能禁止
P1.6
P1.5
P1.7
SPI禁止。P1.4/P1.5/P1.6/P1.7作为普
通I/O口使用
1
0
0
0
从机模式
输出
输入
输入
选择作为从机
1
0
1
0
从机模式
未被选中
高阻
输入
输入
未被选中。MISO为高阻状态,以避
免总线冲突
1
0
0
1—>0
从机模式
0
1
输入
U
C
M
C
T
S
主(空闲)
1
输出
1
输入
主(激活)
Li
输入
高阻
高阻
输出
输出
1
1
P1.4
0
从
输出
输入
输入
1
1
P1.4
1
主
输入
输出
输出
378
南通国芯微电子有限公司
.
d
e
t
i
m
P1.4/SS配置为输入或准双向口。
SSIG为0。如果择SS被驱动为低电
平,则被选择作为从机。当SS变为
低电平时,MSTR将清零。
注:当SS处于输入模式时,如被驱
动为低电平且SSIG=0时,MSTR位
自动清零。
当主机空闲时MOSI和SCLK为高
阻态以避免总线冲突。用户必须
将SCLK上拉或下拉(根据CPOL/
SPCTL.3 的取值)以避免SCLK出现
悬浮状态。
总机:0513-5501 2928 / 2929 / 2966
作为主机激活时,MOSI和SCLK为
推挽输出
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
11.3.3 作为主机/从机时的额外注意事项
作为从机时的额外注意事项
当CPHA=0时,SSIG必须为0,SS脚必须取反并且在每个连续的串行字节之间重新设置
为高电平。如果SPDAT寄存器在SS有效(低电平)时执行写操作,那么将导致一个写冲突错
误。CPHA=0且SSIG=0时的操作未定义。
当CPHA=1时,SSIG可以置位。如果SSIG=0,SS脚可在连续传输之间保持低有效(即一
直固定为低电平)。这种方式有时适用于具有单固定主机和单从机驱动MISO数据线的系统。
作为主机时的额外注意事项
在SPI中,传输总是由主机启动的。如果SPI使能(SPEN=1)并选择作为主机,主机对SPI
数据寄存器的写操作将启动SPI时钟发生器和数据的传输。在数据写入SPDAT之后的半个到一
个SPI位时间后,数据将出现在MOSI脚。
.
d
e
t
i
m
需要注意的是,主机可以通过将对应器件的SS脚驱动为低电平实现与之通信。写入主机
SPDAT�����������������������������������������������
寄存器的数据从����������������������������������������
MOSI������������������������������������
脚移出发送到从机的���������������������������
MOSI�����������������������
脚。同时从机�����������������
SPDAT������������
寄存器的数据从�����
MISO�
脚
移出发送到主机的������
MISO��
脚。
U
C
M
Li
传输完一个字节后,��������������������������������
SPI�����������������������������
时钟发生器停止,传输完成标志(��������������
SPIF����������
)置位并产生一个中断
(如果�����������������������������������������
SPI��������������������������������������
中断使能)。主机和从机���������������������������
CPU������������������������
的两个移位寄存器可以看作是一个���������
16 ������
循环移位寄存
器。当数据从主机移位传送到从机的同时,数据也以相反的方向移入。这意味着在一个移位周
期中,主机和从机的数据相互交换。
C
T
S
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
379
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
11.3.4 通过SS改变模式
如果SPEN=1, SSIG=0且MSTR=1,SPI使能为主机模式。SS脚可配置为输入或准双向模式。
这种情况下,另外一个主机可将该脚驱动为低电平,从而将该器件选择为SPI从机并向其发送
数据。
为了避免争夺总线,SPI系统执行以下动作:
1) MSTR清零并且CPU变成从机。这样SPI就变成从机。MOSI和SCLK强制变为输入模式,
而MISO则变为输出模式。
2) SPSTAT的SPIF标志位置位。如果SPI中断已被使能,则产生SPI中断。
用户软件必须一直对MSTR位进行检测,如果该位被一个从机选择所清零而用户想继续将
SPI�����������������������������
作为主机,这时就必须重新置位���������������
MSTR�����������
,否则就进入从机模式。
11.3.5 写冲突
C
T
S
U
C
M
.
d
e
t
i
m
Li
SPI�������������������������������������
在发送时为单缓冲,在接收时为双缓冲。这样在前一次发送尚未完成之前,不能将新
的数据写入移位寄存器。当发送过程中对数据寄存器进行写操作时,�����
WCOL�
位(SPSTAT.6�)将置位
以指示数据冲突。在这种情况下,当前发送的数据继续发送,而新写入的数据将丢失。
当对主机或从机进行写冲突检测时,主机发生写冲突的情况是很罕见的,因为主机拥有数
据传输的完全控制权。但从机有可能发生写冲突,因为当主机启动传输时,从机无法进行控
制。
接收数据时,接收到的数据传送到一个并行读数据缓冲区,这样将释放移位寄存器以进行
下一个数据的接收。但必须在下个字符完全移入之前从数据寄存器中读出接收到的数据,否
则,前一个接收数据将丢失。
WCOL���������������
可通过软件向其写入������
“1”���
清零。
380
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
11.3.6 数据模式
时钟相位位���������������������������������������
(CPHA)���������������������������������
允许用户设置采样和改变数据的时钟边沿。时钟极性位���������
CPOL�����
允许用户设
置时钟极性。
SPI图�����������������������
4����������������������
~图��������������������
7 ������������������
所示为时钟相位位����������
CPHA������
的不同设定。
1
时钟周期
2
3
4
5
6
7
8
SCLK(CPOL=0)
SCLK(CPOL=1)
MOSI(输入)
DORD=0
DORD=1
MSB
LSB
DORD=0
DORD=1
MISO(输出)
MSB
LSB
6
1
5
2
4
3
3
4
2
5
1
6
6
1
5
2
4
3
3
4
2
5
1
6
LSB
MSB
.
d
e
t
i
m
LSB
MSB
Li
SS(如果SSIG位=0)
未定义
SPI图4 SPI 从机传输格式(CPHA=0)
U
C
M
1
时钟周期
2
SCLK(CPOL=0)
C
T
S
SCLK(CPOL=1)
MOSI(输入)
MISO(输出)
DORD=0
DORD=1
DORD=0
DORD=1
1)
3
4
5
6
7
8
MSB
LSB
6
1
5
2
4
3
3
4
2
5
1
6
LSB
MSB
MSB
LSB
6
1
5
2
4
3
3
4
2
5
1
6
LSB
MSB
1)未定义
SS(如果SSIG位=0)
SPI图5 SPI从机传输格式(CPHA=1)
时钟周期
1
2
3
4
5
6
7
8
SCLK(CPOL=0)
SCLK(CPOL=1)
MOSI(输入)
DORD=0
DORD=1
MISO(输出)
MSB
LSB
DORD=0
DORD=1
MSB
LSB
6
1
5
2
4
3
3
4
2
5
1
6
6
1
5
2
4
3
3
4
2
5
1
6
LSB
MSB
LSB
MSB
SS(如果SSIG位=0)
SPI图6 SPI主机传输格式(CPHA=0)
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
381
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
1
时钟周期
2
临时技术支持:13922829991
3
4
5
6
7
8
6
1
5
2
4
3
3
4
2
5
1
6
6
1
5
2
4
3
3
4
2
5
1
6
研发顾问:13922809991
SCLK(CPOL=0)
SCLK(CPOL=1)
MOSI(输入)
DORD=0
DORD=1
MISO(输出)
DORD=0
DORD=1
MSB
LSB
MSB
LSB
LSB
MSB
LSB
MSB
SS(如果SSIG位=0)
SPI图7 SPI主机传输格式(CPHA=1)
.
d
e
t
i
m
SPI����������������������������������������������
接口的时钟信号线SCLK有Idle和Active两种状态:Idle状态时指在不进行数据传输的
时候(或数据传输完成后)SCLK所处的状态;Active是与Idle相对的一种状态。
Li
时钟相位位(CPHA)允许用户设置采样和改变数据的时钟边沿。时钟极性CPOL允许用户设置
时钟极性。
U
C
M
如果CPOL=0,Idle状态=低电平,Active状态=高电平;
如果CPOL=1,Idle状态=高电平,Active状态=低电平。
C
T
S
主机总是在SCLK=Idle状态时,将下一位要发送的数据置于数据线MOSI上。
从Idle状态到Active状态的转变,称为SCLK前沿;从Active状态到Idle状态的转变,称为
SCLK后沿。一个SCLK前沿和后沿构成一个SCLK时钟周期,一个SCLK时钟周期传输一位数据。
SPI时钟预分频器选择
SPI时钟预分频器选择是通过SPCTL寄存器中的SPR1-SPR0位实现的
SPI时钟频率的选择
SPR1
SPR0
时钟( SCLK )
0
0
CPU_CLK/4
0
1
CPU_CLK/16
1
0
CPU_CLK/64
1
1
CPU_CLK/128
其中,CPU_CLK是CPU时钟。
382
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
11.4 适用单主单从系统的SPI功能测试程序
11.4.1 中断方式
1. C程序
/*----------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- -------------------------------------------*/
/* --- 演示STC 1T 系列单片机 SPI功能(适用单主单从,中断方式)----*/
/* --- Mobile: (86)13922809991 ---------------------------------------------------*/
/* --- Fax: 86-755-82905966 -------------------------------------------------------*/
/* --- Tel: 86-755-82948412 --------------------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, --------------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 --------------*/
/*----------------------------------------------------------------------------------------*/
#include "reg51.h"
#define MASTER
#define FOSC 18432000L
#define BAUD (256 - FOSC / 32 / 115200)
typedef unsigned char
typedef unsigned int
typedef unsigned long
BYTE;
WORD;
DWORD;
C
T
S
AUXR = 0x8e;
sfr
#define
#define
sfr
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
sfr
sbit
SPSTAT = 0xcd;
SPIF 0x80
WCOL 0x40
SPCTL = 0xce;
SSIG 0x80
SPEN 0x40
DORD 0x20
MSTR 0x10
CPOL 0x08
CPHA 0x04
SPDHH 0x00
SPDH 0x01
SPDL 0x02
SPDLL 0x03
SPDAT = 0xcf;
SPISS
= P1^3;
sfr IE2
= 0xAF;
#define ESPI 0x02
南通国芯微电子有限公司
Li
//define:master undefine:slave
U
C
M
sfr
.
d
e
t
i
m
//Auxiliary register
//SPI status register
//SPSTAT.7
//SPSTAT.6
//SPI control register
//SPCTL.7
//SPCTL.6
//SPCTL.5
//SPCTL.4
//SPCTL.3
//SPCTL.2
//CPU_CLK/4
//CPU_CLK/16
//CPU_CLK/64
//CPU_CLK/128
//SPI data register
//SPI slave select, connect to slave' SS(P1.4) pin
//interrupt enable rgister 2
//IE2.1
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
383
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
void InitUart();
void InitSPI();
void SendUart(BYTE dat);
BYTE RecvUart();
临时技术支持:13922829991
研发顾问:13922809991
//send data to PC
//receive data from PC
///////////////////////////////////////////////////////////
void main()
{
InitUart();
InitSPI();
IE2 |= ESPI;
EA = 1;
while (1)
{
#ifdef MASTER
ACC = RecvUart();
SPISS = 0;
SPDAT = ACC;
#endif
}
}
//initial UART
//initial SPI
C
T
S
.
d
e
t
i
m
Li
//for master (receive UART data from PC and send it to slave,
//in the meantime receive SPI data from slave and send it to PC)
U
C
M
//pull low slave SS
//trigger SPI send
///////////////////////////////////////////////////////////
void spi_isr( ) interrupt 9 using 1
{
SPSTAT = SPIF | WCOL;
#ifdef MASTER
SPISS = 1;
SendUart(SPDAT);
#else
SPDAT = SPDAT;
#endif
}
//SPI interrupt routine 9 (004BH)
//clear SPI status
//push high slave SS
//return received SPI data
//for salve (receive SPI data from master and
//
send previous SPI data to master)
///////////////////////////////////////////////////////////
384
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
void InitUart()
{
SCON = 0x5a;
TMOD = 0x20;
AUXR = 0x40;
TH1 = TL1 = BAUD;
TR1 = 1;
}
临时技术支持:13922829991
研发顾问:13922809991
//set UART mode as 8-bit variable baudrate
//timer1 as 8-bit auto reload mode
//timer1 work at 1T mode
//115200 bps
///////////////////////////////////////////////////////////
void InitSPI()
{
SPDAT = 0;
SPSTAT = SPIF | WCOL;
#ifdef MASTER
SPCTL = SPEN | MSTR;
#else
SPCTL = SPEN;
#endif
}
C
T
S
///////////////////////////////////////////////////////////
void SendUart(BYTE dat)
{
while (!TI);
TI = 0;
SBUF = dat;
}
.
d
e
t
i
m
//initial SPI data
//clear SPI status
//master mode
U
C
M
//slave mode
Li
//wait pre-data sent
//clear TI flag
//send current data
///////////////////////////////////////////////////////////
BYTE RecvUart()
{
while (!RI);
RI = 0;
return SBUF;
}
南通国芯微电子有限公司
//wait receive complete
//clear RI flag
//return receive data
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
385
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序
/*----------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- -------------------------------------------*/
/* --- 演示STC 1T 系列单片机 SPI功能(适用单主单从,中断方式)----*/
/* --- Mobile: (86)13922809991 ---------------------------------------------------*/
/* --- Fax: 86-755-82905966 -------------------------------------------------------*/
/* --- Tel: 86-755-82948412 --------------------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, --------------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 --------------*/
/*----------------------------------------------------------------------------------------*/
//#define MASTER
//define:master undefine:slave
AUXR DATA
SPSTAT DATA
SPIF EQU
WCOL EQU
SPCTL DATA
SSIG EQU
SPEN EQU
DORD EQU
MSTR EQU
CPOL EQU
CPHA EQU
SPDHH EQU
SPDH EQU
SPDL EQU
SPDLL EQU
SPDAT DATA
SPISS BIT
08EH
0CDH
080H
040H
0CEH
080H
040H
020H
010H
008H
004H
000H
001H
002H
003H
0CFH
P1.3
;Auxiliary register
;SPI status register
;SPSTAT.7
;SPSTAT.6
;SPI control register
;SPCTL.7
;SPCTL.6
;SPCTL.5
;SPCTL.4
;SPCTL.3
;SPCTL.2
;CPU_CLK/4
;CPU_CLK/16
;CPU_CLK/64
;CPU_CLK/128
;SPI data register
;SPI slave select, connect to slave' SS(P1.4) pin
IE2 EQU
ESPI EQU
0AFH
02H
C
T
S
U
C
M
.
d
e
t
i
m
Li
;interrupt enable rgister 2
;IE2.1
;//////////////////////////////////////////////////////////
ORG 0000H
LJMP RESET
ORG 004BH
SPI_ISR:
PUSH ACC
PUSH PSW
MOV SPSTAT, #SPIF | WCOL
386
南通国芯微电子有限公司
;SPI interrupt routine
;clear SPI status
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
#ifdef MASTER
SETB SPISS
MOV A,
SPDAT
LCALL SEND_UART
#else
MOV SPDAT, SPDAT
#endif
POP PSW
POP ACC
RETI
临时技术支持:13922829991
研发顾问:13922809991
;push high slave SS
;return received SPI data
//for salve (receive SPI data from master and
;
send previous SPI data to master)
;//////////////////////////////////////////////////////////
.
d
e
t
i
m
ORG 0100H
RESET:
LCALL INIT_UART
;initial UART
LCALL INIT_SPI
;initial SPI
ORL IE2,
#ESPI
SETB EA
MAIN:
#ifdef MASTER
//for master (receive UART data from PC and send it to slave,
LCALL RECV_UART
; in the meantimereceive SPI data from slave and send it to PC)
CLR SPISS
;pull low slave SS
MOV SPDAT, A
;trigger SPI send
#endif
SJMP MAIN
C
T
S
U
C
M
Li
;//////////////////////////////////////////////////////////
INIT_UART:
MOV
MOV
MOV
MOV
MOV
SETB
RET
SCON,
TMOD,
AUXR,
TL1,
TH1,
TR1
#5AH
#20H
#40H
#0FBH
#0FBH
;set UART mode as 8-bit variable baudrate
;timer1 as 8-bit auto reload mode
;timer1 work at 1T mode
;115200 bps(256 - 18432000 / 32 / 115200)
;//////////////////////////////////////////////////////////
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
387
STC12C5A60S2系列单片机指南
INIT_SPI:
MOV
MOV
#ifdef MASTER
MOV
#else
MOV
#endif
RET
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
SPDAT, #0
SPSTAT, #SPIF | WCOL
;initial SPI data
;clear SPI status
SPCTL, #SPEN | MSTR
;master mode
SPCTL, #SPEN
;slave mode
研发顾问:13922809991
;//////////////////////////////////////////////////////////
SEND_UART:
JNB TI,
$
CLR TI
MOV SBUF, A
RET
;//////////////////////////////////////////////////////////
U
C
M
RECV_UART:
JNB RI,$
CLR RI
MOV A,
SBUF
RET
RET
C
T
S
.
d
e
t
i
m
;wait pre-data sent
;clear TI flag
;send current data
Li
;wait receive complete
;clear RI flag
;return receive data
;//////////////////////////////////////////////////////////
388
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
11.4.2 查询方式
1. C程序
/*---------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ------------------------------------------*/
/* --- 演示STC 1T 系列单片机 SPI功能(适用单主单从,查询方式)---*/
/* --- Mobile: (86)13922809991 --------------------------------------------------*/
/* --- Fax: 86-755-82905966 ------------------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, --------------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 --------------*/
/*----------------------------------------------------------------------------------------*/
.
d
e
t
i
m
#include "reg51.h"
//#define MASTER
//define:master undefine:slave
#define FOSC
18432000L
#define BAUD
(256 - FOSC / 32 / 115200)
typedef unsigned char
typedef unsigned int
typedef unsigned long
BYTE;
WORD;
DWORD;
C
T
S
U
C
M
sfr
AUXR = 0x8e;
sfr
#define
#define
sfr
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
sfr
sbit
SPSTAT = 0xcd;
SPIF 0x80
WCOL 0x40
SPCTL = 0xce;
SSIG 0x80
SPEN 0x40
DORD 0x20
MSTR 0x10
CPOL 0x08
CPHA 0x04
SPDHH 0x00
SPDH 0x01
SPDL 0x02
SPDLL 0x03
SPDAT = 0xcf;
SPISS
= P1^3;
void
void
void
BYTE
BYTE
InitUart();
InitSPI();
SendUart(BYTE dat);
RecvUart();
SPISwap(BYTE dat);
南通国芯微电子有限公司
Li
//Auxiliary register
//SPI status register
//SPSTAT.7
//SPSTAT.6
//SPI control register
//SPCTL.7
//SPCTL.6
//SPCTL.5
//SPCTL.4
//SPCTL.3
//SPCTL.2
//CPU_CLK/4
//CPU_CLK/16
//CPU_CLK/64
//CPU_CLK/128
//SPI data register
//SPI slave select, connect to slave' SS(P1.4) pin
//send data to PC
//receive data from PC
//swap SPI data between master
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
389
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
///////////////////////////////////////////////////////////
void main()
{
InitUart();
InitSPI();
//initial UART
//initial SPI
while (1)
{
#ifdef MASTER
//for master (receive UART data from PC and send it to slave,
// in the meantime receive SPI data from slave and send it to PC)
SendUart(SPISwap(RecvUart()));
#else
//for salve (receive SPI data from master and
ACC = SPISwap(ACC); //
send previous SPI data to master)
#endif
}
}
///////////////////////////////////////////////////////////
void InitUart()
{
SCON = 0x5a;
TMOD = 0x20;
AUXR = 0x40;
TH1 = TL1 = BAUD;
TR1 = 1;
}
C
T
S
U
C
M
.
d
e
t
i
m
Li
//set UART mode as 8-bit variable baudrate
//timer1 as 8-bit auto reload mode
//timer1 work at 1T mode
//115200 bps
///////////////////////////////////////////////////////////
void InitSPI()
{
SPDAT = 0;
SPSTAT = SPIF | WCOL;
#ifdef MASTER
SPCTL = SPEN | MSTR;
#else
SPCTL = SPEN;
#endif
}
390
南通国芯微电子有限公司
//initial SPI data
//clear SPI status
//master mode
//slave mode
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
///////////////////////////////////////////////////////////
void SendUart(BYTE dat)
{
while (!TI);
TI = 0;
SBUF = dat;
}
//wait pre-data sent
//clear TI flag
//send current data
///////////////////////////////////////////////////////////
BYTE RecvUart()
{
while (!RI);
RI = 0;
return SBUF;
}
///////////////////////////////////////////////////////////
BYTE SPISwap(BYTE dat)
{
#ifdef MASTER
SPISS = 0;
#endif
SPDAT = dat;
while (!(SPSTAT & SPIF));
SPSTAT = SPIF | WCOL;
#ifdef MASTER
SPISS = 1;
#endif
return SPDAT;
}
C
T
S
南通国芯微电子有限公司
//wait receive complete
//clear RI flag
//return receive data
U
C
M
.
d
e
t
i
m
Li
//pull low slave SS
//trigger SPI send
//wait send complete
//clear SPI status
//push high slave SS
//return received SPI data
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
391
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序
/*---------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ------------------------------------------*/
/* --- 演示STC 1T 系列单片机 SPI功能(适用单主单从,查询方式)---*/
/* --- Mobile: (86)13922809991 --------------------------------------------------*/
/* --- Fax: 86-755-82905966 ------------------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, --------------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 --------------*/
/*----------------------------------------------------------------------------------------*/
//#define MASTER
//define:master undefine:slave
AUXR DATA
SPSTAT DATA
SPIF EQU
WCOL EQU
SPCTL DATA
SSIG EQU
SPEN EQU
DORD EQU
MSTR EQU
CPOL EQU
CPHA EQU
SPDHH EQU
SPDH EQU
SPDL EQU
SPDLL EQU
SPDAT DATA
SPISS BIT
;Auxiliary register
;SPI status register
;SPSTAT.7
;SPSTAT.6
;SPI control register
;SPCTL.7
;SPCTL.6
;SPCTL.5
;SPCTL.4
;SPCTL.3
;SPCTL.2
;CPU_CLK/4
;CPU_CLK/16
;CPU_CLK/64
;CPU_CLK/128
;SPI data register
;SPI slave select, connect to slave' SS(P1.4) pin
08EH
0CDH
080H
040H
0CEH
080H
040H
020H
010H
008H
004H
000H
001H
002H
003H
0CFH
P1.3
C
T
S
U
C
M
.
d
e
t
i
m
Li
;//////////////////////////////////////////////////////////
RESET:
392
ORG 0000H
LJMP RESET
ORG 0100H
LCALL INIT_UART
LCALL INIT_SPI
南通国芯微电子有限公司
;initial UART
;initial SPI
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
MAIN:
#ifdef MASTE
//for master (receive UART data from PC and send it to slave, in the meantime
LCALL RECV_UART
;
receive SPI data from slave and send it to PC)
LCALL SPI_SWAP
LCALL SEND_UART
#else
//for salve (receive SPI data from master and
LCALL SPI_SWAP
;
send previous SPI data to master)
#endif
SJMP MAIN
;//////////////////////////////////////////////////////////
INIT_UART:
MOV
MOV
MOV
MOV
MOV
SETB
RET
SCON,
TMOD,
AUXR,
TL1,
TH1,
TR1
#5AH
#20H
#40H
#0FBH
#0FBH
;//////////////////////////////////////////////////////////
C
T
S
;set UART mode as 8-bit variable baudrate
;timer1 as 8-bit auto reload mode
;timer1 work at 1T mode
;115200 bps(256 - 18432000 / 32 / 115200)
U
C
M
INIT_SPI:
MOV SPDAT, #0
MOV SPSTAT, #SPIF | WCOL
#ifdef MASTER
MOV SPCTL, #SPEN | MSTR
#else
MOV SPCTL, #SPEN
#endif
RET
.
d
e
t
i
m
Li
;initial SPI data
;clear SPI status
;master mode
;slave mode
;//////////////////////////////////////////////////////////
SEND_UART:
JNB TI,
$
CLR TI
MOV SBUF, A
RET
;wait pre-data sent
;clear TI flag
;send current data
;//////////////////////////////////////////////////////////
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
393
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
RECV_UART:
JNB RI,
$
CLR RI
MOV A,
SBUF
RET
RET
临时技术支持:13922829991
研发顾问:13922809991
;wait receive complete
;clear RI flag
;return receive data
;//////////////////////////////////////////////////////////
SPI_SWAP:
#ifdef MASTER
CLR
#endif
MOV
WAIT:
MOV
JNB
MOV
#ifdef MASTER
SETB
#endif
MOV
RET
SPISS
;pull low slave SS
SPDAT, A
;trigger SPI send
A,
SPSTAT
ACC.7, WAIT
SPSTAT, #SPIF | WCOL
C
T
S
A,
M
SPDAT
Li
;wait send complete
;clear SPI status
CU
SPISS
.
d
e
t
i
m
;push high slave SS
;return received SPI data
;//////////////////////////////////////////////////////////
394
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
11.5 适用互为主从系统的SPI功能测试程序
11.5.1 中断方式
1. C程序
/*--------------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ------------------------------------------------*/
/* --- 演示STC 1T 系列单片机 SPI功能(适用互为主从系统,中断方式)---*/
/* --- Mobile: (86)13922809991 --------------------------------------------------------*/
/* --- Fax: 86-755-82905966 ------------------------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, --------------------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 --------------------*/
/*----------------------------------------------------------------------------------------------*/
#include "reg51.h"
#define FOSC
#define BAUD
18432000L
(256 - FOSC / 32 / 115200)
typedef unsigned char
typedef unsigned int
typedef unsigned long
C
T
S
sfr
AUXR = 0x8e;
sfr
#define
#define
sfr
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
sfr
sbit
SPSTAT = 0xcd;
SPIF
0x80
WCOL
0x40
SPCTL = 0xce;
SSIG 0x80
SPEN 0x40
DORD 0x20
MSTR 0x10
CPOL 0x08
CPHA 0x04
SPDHH 0x00
SPDH 0x01
SPDL 0x02
SPDLL 0x03
SPDAT =
SPISS =
sfr
IE2
#define ESPI
BYTE;
WORD;
DWORD;
Li
//Auxiliary register
//SPI status register
//SPSTAT.7
//SPSTAT.6
//SPI control register
//SPCTL.7
//SPCTL.6
//SPCTL.5
//SPCTL.4
//SPCTL.3
//SPCTL.2
//CPU_CLK/4
//CPU_CLK/16
//CPU_CLK/64
//CPU_CLK/128
0xcf;
//SPI data register
P1^3;
//SPI slave select, connect to other MCU's SS(P1.4) pin
= 0xAF;
0x02
南通国芯微电子有限公司
U
C
M
.
d
e
t
i
m
//interrupt enable rgister 2
//IE2.1
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
395
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
void InitUart();
void InitSPI();
void SendUart(BYTE dat);
BYTE RecvUart();
//send data to PC
//receive data from PC
bit MSSEL;
//1: master 0:slave
研发顾问:13922809991
///////////////////////////////////////////////////////////
void main()
{
InitUart();
InitSPI();
IE2 |= ESPI;
EA = 1;
//initial UART
//initial SPI
}
while (1)
{
if (RI)
{
}
}
U
C
M
SPCTL = SPEN | MSTR;
MSSEL = 1;
ACC = RecvUart();
SPISS = 0;
SPDAT = ACC;
C
T
S
.
d
e
t
i
m
Li
//set as master
//pull low slave SS
//trigger SPI send
///////////////////////////////////////////////////////////
void spi_isr() interrupt 9 using 1
//SPI interrupt routine 9 (004BH)
{
SPSTAT = SPIF | WCOL;
//clear SPI status
if (MSSEL)
{
SPCTL = SPEN;
//reset as slave
MSSEL = 0;
SPISS = 1;
//push high slave SS
SendUart(SPDAT);
//return received SPI data
}
else
{
//for salve (receive SPI data from master and
SPDAT = SPDAT;
//
send previous SPI data to master)
}
}
///////////////////////////////////////////////////////////
396
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
void InitUart()
{
SCON = 0x5a;
TMOD = 0x20;
AUXR = 0x40;
TH1 = TL1 = BAUD;
TR1 = 1;
}
临时技术支持:13922829991
研发顾问:13922809991
//set UART mode as 8-bit variable baudrate
//timer1 as 8-bit auto reload mode
//timer1 work at 1T mode
//115200 bps
///////////////////////////////////////////////////////////
void InitSPI()
{
SPDAT = 0;
SPSTAT = SPIF | WCOL;
SPCTL = SPEN;
}
///////////////////////////////////////////////////////////
void SendUart(BYTE dat)
{
while (!TI);
TI = 0;
SBUF = dat;
}
C
T
S
//initial SPI data
//clear SPI status
//slave mode
U
C
M
.
d
e
t
i
m
Li
//wait pre-data sent
//clear TI flag
//send current data
///////////////////////////////////////////////////////////
BYTE RecvUart()
{
while (!RI);
RI = 0;
return SBUF;
}
南通国芯微电子有限公司
//wait receive complete
//clear RI flag
//return receive data
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
397
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序
/*--------------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ------------------------------------------------*/
/* --- 演示STC 1T 系列单片机 SPI功能(适用互为主从系统,中断方式)---*/
/* --- Mobile: (86)13922809991 --------------------------------------------------------*/
/* --- Fax: 86-755-82905966 ------------------------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, --------------------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 --------------------*/
/*----------------------------------------------------------------------------------------------*/
AUXR DATA
SPSTAT DATA
SPIF EQU
WCOL EQU
SPCTL DATA
SSIG EQU
SPEN EQU
DORD EQU
MSTR EQU
CPOL EQU
CPHA EQU
SPDHH EQU
SPDH EQU
SPDL EQU
SPDLL EQU
SPDAT DATA
SPISS BIT
08EH
0CDH
080H
040H
0CEH
080H
040H
020H
010H
008H
004H
000H
001H
002H
003H
0CFH
P1.3
IE2 EQU
ESPI EQU
0AFH
02H
MSSEL BIT
C
T
S
20H.0
;Auxiliary register
;SPI status register
;SPSTAT.7
;SPSTAT.6
;SPI control register
;SPCTL.7
;SPCTL.6
;SPCTL.5
;SPCTL.4
;SPCTL.3
;SPCTL.2
;CPU_CLK/4
;CPU_CLK/16
;CPU_CLK/64
;CPU_CLK/128
;SPI data register
;SPI slave select, connect to other MCU's SS(P1.4) pin
U
C
M
.
d
e
t
i
m
Li
;interrupt enable rgister 2
;IE2.1
;1: master 0:slave
;//////////////////////////////////////////////////////////
ORG 0000H
LJMP RESET
ORG 004BH
;SPI interrupt routine
SPI_ISR:
PUSH ACC
PUSH PSW
MOV SPSTAT, #SPIF | WCOL ;clear SPI status
JBC MSSEL, MASTER_SEND
398
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
SLAVE_RECV:
MOV SPDAT, SPDAT
JMP SPI_EXIT
MASTER_SEND:
SETB SPISS
MOV SPCTL, #SPEN
MOV A,
SPDAT
LCALL SEND_UART
SPI_EXIT:
POP PSW
POP ACC
RETI
临时技术支持:13922829991
//for salve (receive SPI data from master and
;
send previous SPI data to master)
;push high slave SS
;
;reset as slave
;return received SPI data
.
d
e
t
i
m
;//////////////////////////////////////////////////////////
RESET:
MAIN:
ORG
0100H
U
C
M
MOV SP,#3FH
LCALL INIT_UART
LCALL INIT_SPI
ORL IE2,#ESPI
SETB EA
C
T
S
JNB RI,
$
MOV SPCTL, #SPEN | MSTR
SETB MSSEL
LCALL RECV_UART
CLR SPISS
MOV SPDAT,A
SJMP MAIN
研发顾问:13922809991
Li
;initial UART
;initial SPI
;wait UART data
; ;set as master
;receive UART data from PC
;pull low slave SS
;trigger SPI send
;//////////////////////////////////////////////////////////
INIT_UART:
MOV
MOV
MOV
MOV
MOV
SETB
RET
SCON,
TMOD,
AUXR
TL1,
TH1,
TR1
南通国芯微电子有限公司
#5AH
#20H
,#40H
#0FBH
#0FBH
;set UART mode as 8-bit variable baudrate
;timer1 as 8-bit auto reload mode
;timer1 work at 1T mode
;115200 bps(256 - 18432000 / 32 / 115200)
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
399
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;//////////////////////////////////////////////////////////
INIT_SPI:
MOV
MOV
MOV
RET
SPDAT, #0
SPSTAT, #SPIF | WCOL
SPCTL, #SPEN
;initial SPI data
;clear SPI status
;slave mode
;//////////////////////////////////////////////////////////
SEND_UART:
JNB TI,
$
CLR TI
MOV SBUF, A
RET
;wait pre-data sent
;clear TI flag
;send current data
;//////////////////////////////////////////////////////////
U
C
M
RECV_UART:
JNB RI,
$
CLR RI
MOV A,
SBUF
RET
RET
C
T
S
.
d
e
t
i
m
Li
;wait receive complete
;clear RI flag
;return receive data
;//////////////////////////////////////////////////////////
400
END
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
11.5.2 查询方式
1. C程序
/*--------------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ------------------------------------------------*/
/* --- 演示STC 1T 系列单片机 SPI功能(适用互为主从系统,查询方式)---*/
/* --- Mobile: (86)13922809991 --------------------------------------------------------*/
/* --- Fax: 86-755-82905966 ------------------------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, --------------------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 --------------------*/
/*----------------------------------------------------------------------------------------------*/
.
d
e
t
i
m
#include "reg51.h"
#define FOSC
#define BAUD
18432000L
(256 - FOSC / 32 / 115200)
typedef unsigned char
typedef unsigned int
typedef unsigned long
BYTE;
WORD;
DWORD;
C
T
S
U
C
M
sfr
AUXR =
sfr
#define
#define
sfr
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
sfr
sbit
SPSTAT =
SPIF
WCOL
SPCTL =
SSIG
SPEN
DORD
MSTR
CPOL
CPHA
SPDHH
SPDH
SPDL
SPDLL
SPDAT =
SPISS
=
void
void
void
BYTE
BYTE
InitUart();
InitSPI();
SendUart(BYTE dat);
RecvUart();
SPISwap(BYTE dat);
南通国芯微电子有限公司
Li
0x8e;
//Auxiliary register
0xcd;
0x80
0x40
0xce;
0x80
0x40
0x20
0x10
0x08
0x04
0x00
0x01
0x02
0x03
0xcf;
P1^3;
//SPI status register
//SPSTAT.7
//SPSTAT.6
//SPI control register
//SPCTL.7
//SPCTL.6
//SPCTL.5
//SPCTL.4
//SPCTL.3
//SPCTL.2
//CPU_CLK/4
//CPU_CLK/16
//CPU_CLK/64
//CPU_CLK/128
//SPI data register
//SPI slave select, connect to slave' SS(P1.4) pin
//send data to PC
//receive data from PC
//swap SPI data between master
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
401
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
///////////////////////////////////////////////////////////
void main()
{
InitUart();
InitSPI();
//initial UART
//initial SPI
while (1)
{
if (RI)
{
SPCTL = SPEN | MSTR;
//set as master
SendUart(SPISwap(RecvUart()));
SPCTL = SPEN;
//reset as slave
}
if (SPSTAT & SPIF)
{
SPSTAT = SPIF | WCOL; //clear SPI status
SPDAT = SPDAT;
//mov data from receive buffer to send buffer
}
}
}
C
T
S
///////////////////////////////////////////////////////////
void InitUart()
{
SCON = 0x5a;
TMOD = 0x20;
AUXR = 0x40;
TH1 = TL1 = BAUD;
TR1 = 1;
}
U
C
M
.
d
e
t
i
m
Li
//set UART mode as 8-bit variable baudrate
//timer1 as 8-bit auto reload mode
//timer1 work at 1T mode
//115200 bps
///////////////////////////////////////////////////////////
void InitSPI()
{
SPDAT = 0;
SPSTAT = SPIF | WCOL;
SPCTL = SPEN;
}
402
南通国芯微电子有限公司
//initial SPI data
//clear SPI status
//slave mode
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
///////////////////////////////////////////////////////////
void SendUart(BYTE dat)
{
while (!TI);
TI = 0;
SBUF = dat;
}
//wait pre-data sent
//clear TI flag
//send current data
///////////////////////////////////////////////////////////
BYTE RecvUart()
{
while (!RI);
RI = 0;
return SBUF;
}
///////////////////////////////////////////////////////////
BYTE SPISwap(BYTE dat)
{
SPISS = 0;
SPDAT = dat;
while (!(SPSTAT & SPIF));
SPSTAT = SPIF | WCOL;
SPISS = 1;
return SPDAT;
}
C
T
S
南通国芯微电子有限公司
//wait receive complete
//clear RI flag
//return receive data
U
C
M
.
d
e
t
i
m
Li
//pull low slave SS
//trigger SPI send
//wait send complete
//clear SPI status
//push high slave SS
//return received SPI data
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
403
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
2. 汇编程序
/*--------------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ------------------------------------------------*/
/* --- 演示STC 1T 系列单片机 SPI功能(适用互为主从系统,查询方式)---*/
/* --- Mobile: (86)13922809991 --------------------------------------------------------*/
/* --- Fax: 86-755-82905966 ------------------------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, --------------------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 --------------------*/
/*----------------------------------------------------------------------------------------------*/
AUXR DATA
SPSTAT DATA
SPIF EQU
WCOL EQU
SPCTL DATA
SSIG EQU
SPEN EQU
DORD EQU
MSTR EQU
CPOL EQU
CPHA EQU
SPDHH EQU
SPDH EQU
SPDL EQU
SPDLL EQU
SPDAT DATA
SPISS BIT
08EH
0CDH
080H
040H
0CEH
080H
040H
020H
010H
008H
004H
000H
001H
002H
003H
0CFH
P1.3
C
T
S
.
d
e
t
i
m
;Auxiliary register
;SPI status register
;SPSTAT.7
;SPSTAT.6
;SPI control register
;SPCTL.7
;SPCTL.6
;SPCTL.5
;SPCTL.4
;SPCTL.3
;SPCTL.2
;CPU_CLK/4
;CPU_CLK/16
;CPU_CLK/64
;CPU_CLK/128
;SPI data register
;SPI slave select, connect to slave' SS(P1.4) pin
U
C
M
Li
;//////////////////////////////////////////////////////////
RESET:
MAIN:
404
ORG 0000H
LJMP RESET
ORG 0100H
LCALL INIT_UART
LCALL INIT_SPI
JB
RI,
;initial UART
;initial SPI
MASTER_MODE
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
SLAVE_MODE:
MOV A,
SPSTAT
JNB ACC.7, MAIN
MOV SPSTAT, #SPIF | WCOL
;clear SPI status
MOV SPDAT, SPDAT
;return received SPI data
SJMP MAIN
MASTER_MODE:
MOV SPCTL, #SPEN | MSTR
;set as master
LCALL RECV_UART
;receive UART data from PC
LCALL SPI_SWAP
;send it to slave, in the meantime, receive SPI data from slave
LCALL SEND_UART
;send SPI data to PC
MOV SPCTL, #SPEN
;
;reset as slave
SJMP MAIN
.
d
e
t
i
m
;//////////////////////////////////////////////////////////
INIT_UART:
MOV
MOV
MOV
MOV
MOV
SETB
RET
SCON,
TMOD,
AUXR,
TL1,
TH1,
TR1
#5AH
#20H
#40H
#0FBH
#0FBH
C
T
S
Li
;set UART mode as 8-bit variable baudrate
;timer1 as 8-bit auto reload mode
;timer1 work at 1T mode
;115200 bps(256 - 18432000 / 32 / 115200)
U
C
M
;//////////////////////////////////////////////////////////
INIT_SPI:
MOV SPDAT, #0
MOV SPSTAT, #SPIF | WCOL
MOV SPCTL, #SPEN
RET
;initial SPI data
;clear SPI status
;slave mode
;//////////////////////////////////////////////////////////
SEND_UART:
JNB TI,
$
CLR TI
MOV SBUF, A
RET
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
;wait pre-data sent
;clear TI flag
;send current data
传真:0513-5501 2969 / 2956 / 2947
405
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;//////////////////////////////////////////////////////////
RECV_UART:
JNB RI,
$
CLR RI
MOV A,
SBUF
RET
RET
;wait receive complete
;clear RI flag
;return receive data
;//////////////////////////////////////////////////////////
SPI_SWAP:
CLR SPISS
MOV SPDAT, A
WAIT:
MOV A,
SPSTAT
JNB ACC.7, WAIT
MOV SPSTAT, #SPIF | WCOL
SETB SPISS
MOV A,
SPDAT
RET
C
T
S
;//////////////////////////////////////////////////////////
406
END
南通国芯微电子有限公司
;pull low slave SS
;trigger SPI send
.
d
e
t
i
m
Li
;wait send complete
;clear SPI status
;push high slave SS
;return received SPI data
U
C
M
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
第12章 STC12C5A60S2系列单片机EEPROM的应用
STC12C5A60S2���������������������������������������
系列单片机内部集成了的EEPROM是与程序空间是分开的,利用ISP/IAP技术
可将内部Data Flash当EEPROM,擦写次数在10万次以上。EEPROM可分为若干个扇区,每个扇区
包含512字节。使用时,建议同一次修改的数据放在同一个扇区,不是同一次修改的数据放在
不同的扇区,不一定要用满。数据存储器的擦除操作是按扇区进行的。
EEPROM可用于保存一些需要在应用过程中修改并且掉电不丢失的参数数据。在用户程序
中,可以对EEPROM进行字节读/字节编程/扇区擦除操作。在工作电压Vcc偏低时,建议不要进
行EEPROM/IAP操作。
需要注意的是:5V单片机在3.7V以上对EEPROM进行操作才有效,3.7V以下对EEPROM进行操
作,MCU不执行此功能,但会继续往下执行程序。3.3V单片机在2.4V以上对EEPROM进行操作才有
效,2.4V以下对EEPROM进行操作,MCU不执行此功能,但会继续往下执行程序.所以建议上电复位
后在初始化程序时加200mS延时��������������������������
。可通过判断LVDF标志位判断Vcc的电压是否正常。
.
d
e
t
i
m
Li
12.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
C2H
C3H
CU
M
MSB
位地址及符号
LSB
1111 1111B
0000 0000B
C4H
C5H
复位值
0000 0000B
-
-
-
-
-
-
MS1
MS0
C6H
xxxx xx00B
xxxx xxxxB
C7H
IAPEN SWBS SWRST CMD_FAIL
87H
SMOD SMOD0 LVDF
总机:0513-5501 2928 / 2929 / 2966
POF
GF1
-
WT2 WT1
GF0
PD
WT0
0000 x000B
IDL
0011 0000B
传真:0513-5501 2969 / 2956 / 2947
407
STC12C5A60S2系列单片机指南
技术支持网站: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 操作时的地址寄存器高八位。�������
该寄存器地址为C3H,复位后值为00H.
IAP_ADDRL : ISP/IAP 操作时的地址寄存器低八位。�������
该寄存器地址为C4H,复位后值为00H.
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)进行字节读/字节编程/扇区擦除
,IAP12C5A62S2/IAP12LE5A62S2等�����������������������
除外,这几个型号可在应用程序区修改应用程序区。
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命令才会生效。
408
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
5. ISP/IAP控制寄存器IAP_CONTR
ISP/IAP控制寄存器IAP_CONTR格式如下:
SFR name
Address
IAP_CONTR
C7H
B7
bit
B6
B5
B4
B3
B2
B1
B0
-
WT2
WT2
WT0
name IAPEN SWBS SWRST CMD_FAIL
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(软复位)
.
d
e
t
i
m
Li
U
C
M
设置等待时间 CPU等待时间(多少个CPU工作时钟 )
Sector Erase
Read/读
Program/编程
WT2 WT1 WT0
扇区擦除
(2个时钟)
(=55us)
(=21ms)
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个时钟
C
T
S
Recommended System Clock
跟等待参数对应的推荐系统时钟
≤ 1MHz
≤ 2MHz
≤ 3MHz
≤ 6MHz
≤ 12MHz
≤ 20MHz
≤ 24MHz
≤ 30MHz
6. 工作电压过低判断,此时不要进行EEPROM/IAP操作
PCON寄存器定义如下:
SFR name Address
PCON
87H
bit
B7
B6
B5
B4
B3
B2
B1
B0
name
SMOD
SMOD0
LVDF
POF
GF1
GF0
PD
IDL
LVDF: 低压检测标志位,当工作电压Vcc低于低压检测门槛电压时,该位置1。该位要由软件清0
当低压检测电路发现工作电压Vcc偏低时,不要进行EEPROM/IAP操作。
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
409
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
利用增加的外部低压检测LVD功能作外部低压检测,判断是否要开始保存数据典型应用线路图
7805
VCC
R1
+
(
(
+
470uF 104
Gnd
P4.6/LVD
R2
单片机/MCU
如交流电在220V时,稳压块7805前端的直流电是11V,当交流电降到160V时,稳压块7805前
端的直流电是8.5V,图中的电阻R1和R2将8.5V的电压分压到低于低压检测门槛电压。此时CPU
可以用查询方式查询,推荐使用中断,在中断服务程序里面,将LVDF位清零,再读LVDF位。如
果为0,则认为是电源抖动,如果为1,则认为电源掉电,立即进行保存现场数据的工作。保存
现场完成后,再将LVDF位清零,再读LVDF位的值。如果为0,则认为电源系统恢复正常,此时
CPU可恢复正常工作,如果为1,继续将LVDF位清0,再读LVDF的值,用此方法,等到电源恢复
正常,或电源彻底掉电,CPU进入复位状态。
U
C
M
.
d
e
t
i
m
Li
注意:
为了防止在电压不稳定的情况下对EEPROM的操作失效,可以在对EEPROM内的数据进行操作
前,先行向IAP_DATA寄存器写入一个已知数,然后读取EEPROM某个已知地址单元内的数据,如
果此时IAP_DATA内的数据依然是刚才写入IAP_DATA寄存器的数,此时可再向IAP_DATA寄存器
写入另外一个已知数,再读刚才的已知地址单元的数据,如果此时读出的数据为仍然为刚刚写
入IAP_DATA寄存器的数,则可判断此时电源电压偏低,此时指令执行EEPROM读写操作无效,因
为此时读出的数据并不是EEPROM里面的数据,而是我们刚才给IAP_DATA赋的值。(5V单片机在
3.7V以下禁止操作EEPROM,而单片机在3.3V以上程序仍可正常运行。3.3V单片机在2.4V以下禁
止操作EEPROM,而单片机在2.2V以上程序仍可运行。)
C
T
S
410
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
12.2 STC12C5A60S2系列单片机EEPROM空间大小及地址
STC12C5A60S2系列单片机内部可用Data Flash(EEPROM)的地址(与程序空间是分开的):
如果对应用程序区进行IAP写数据/擦除扇区的动作,则该语句会被单片机忽略,继续执行下一
句。程序在用户应用程序区(AP区)时,仅可以对Data Flash(EEPROM)进行IAP/ISP操作。
IAP12C5A60S2/AD/PWM���������������������������������������
及��������������������������������������
IAP12LE5A60S2/AD/PWM������������������
等型号���������������
除外,这几个型号可在应用程序区
修改应用程序
STC12C5A60S2/AD/CCP系列单片机内部EEPROM选型一览表
STC12LE5A60S2/AD/CCP系列单片机内部EEPROM选型一览表
EEPROM字节数 扇区数 起始扇区首地址 结束扇区末尾地址
型号
.
d
e
t
i
m
STC12C5A08S2/AD/PWM
8K
16
0000h
1FFFh
STC12C5A16S2/AD/PWM
8K
16
0000h
1FFFh
STC12C5A20S2/AD/PWM
8K
16
0000h
1FFFh
STC12C5A32S2/AD/PWM
28K
56
0000h
6FFFh
STC12C5A40S2/AD/PWM
20K
40
0000h
4FFFh
STC12C5A48S2/AD/PWM
12K
24
0000h
2FFFh
STC12C5A52S2/AD/PWM
8K
16
0000h
1FFFh
STC12C5A56S2/AD/PWM
4K
8
0000h
0FFFh
STC12C560S2/AD/PWM
1K
2
0000h
03FFh
STC12LE5A08S2/AD/PWM
8K
16
0000h
1FFFh
STC12LE5A16S2/AD/PWM
8K
16
0000h
1FFFh
STC12LE5A20S2/AD/PWM
8K
16
0000h
1FFFh
STC12LE5A32S2/AD/PWM
28K
56
0000h
6FFFh
STC12LE5A40S2/AD/PWM
20K
40
0000h
4FFFh
STC12LE5A48S2/AD/PWM
12K
24
0000h
2FFFh
STC12LE5A52S2/AD/PWM
8K
16
0000h
1FFFh
STC12LE5A56S2/AD/PWM
4K
8
0000h
0FFFh
STC12LE560S2/AD/PWM
1K
2
0000h
03FFh
C
T
S
U
C
M
Li
以下系列特殊,可在用户程序区直接修改程序,所有Flash空间均可作EEPROM修改
IAP12C5A62S2/AD/PWM
-
124
0000h
F7FFh
IAP12LE5A62S2/AD/PWM
-
124
0000h
F7FFh
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
411
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
STC12C5A32S2/AD/PWM/CCP单片机的内部EEPROM地址表
STC12LE5A32S2/AD/PWM/CCP单片机的内部EEPROM地址表
第一扇区
第二扇区
第三扇区
第四扇区
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
0000h
1FFh
200h
3FFh
400h
5FFh
600h
7FFh
第五扇区
第六扇区
第七扇区
第八扇区
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
800h
9FFh
A00h
BFFh
C00h
DFFh
E00h
FFFh
第九扇区
第十扇区
第十一扇区
第十二扇区
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
1000h
11FFh
1200h
13FFh
1400h
15FFh
1600h
17FFh
第十三扇区
第十四扇区
第十五扇区
第十六扇区
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
1800h
19FFh
1A00h
1BFFh
1C00h
1DFFh
1E00h
1FFFh
第十七扇区
第十八扇区
.
d
e
t
i
m
第十九扇区
第二十扇区
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
2000h
21FFh
2200h
23FFh
2400h
25FFh
2600h
27FFh
第二十一扇区
第二十二扇区
第二十三扇区
U
C
M
Li
第二十四扇区
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
2800h
29FFh
2A00h
2BFFh
2C00h
2DFFh
2E00h
2FFFH
第二十五扇区
第二十六扇区
起始地址
结束地址
起始地址
结束地址
3000h
31FFh
3200h
33FFh
第二十九扇区
C
T
S
第三十扇区
第二十七扇区
第二十八扇区
起始地址
结束地址
起始地址
结束地址
3400h
35FFh
3600h
37FFH
第三十一扇区
第三十二扇区
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
3800h
39FFh
3A00h
3BFFh
3C00h
3DFFh
3E00h
3FFFH
第三十三扇区
第三十四扇区
第三十五扇区
第三十六扇区
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
4000h
41FFh
4200h
43FFh
4400h
45FFh
4600h
47FFH
第三十七扇区
第三十八扇区
第三十九扇区
结束地址
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
4800h
49FFh
4A00h
4BFFh
4C00h
4DFFh
4E00h
4FFFH
第四十二扇区
第四十三扇区
第四十四扇区
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
5000h
51FFh
5200h
53FFh
5400h
55FFh
5600h
57FFH
第四十五扇区
第四十六扇区
第四十七扇区
第四十八扇区
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
5800h
59FFh
5A00h
5BFFh
5C00h
5DFFh
5E00h
5FFFH
第四十九扇区
第五十扇区
第五十一扇区
第五十二扇区
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
6000h
61FFh
6200h
63FFh
6400h
65FFh
6600h
67FFH
第五十三扇区
第五十四扇区
第五十五扇区
第五十六扇区
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
起始地址
结束地址
6800h
69FFh
6A00h
6BFFh
6C00h
6DFFh
6E00h
6FFFH
412
南通国芯微电子有限公司
建议同一次修
改的数据放在
同一扇区,不
是同一次修改
的数据放在不
同的扇区,不
必用满, 当
然可全用
第四十扇区
起始地址
第四十一扇区
每个扇区
512字节
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
12.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,
;20MHz以下2,12M以下3,6M以下4,3M以下5,2M以下6,1M以下7,
MOV
IAP_ADDRH,
#BYTE_ADDR_HIGH
;送地址高字节
MOV
IAP_ADDRL,
#BYTE_ADDR_LOW
;送地址低字节
MOV
IAP_CONTR,
#WAIT_TIME
;设置等待时间
ORL
IAP_CONTR,
#10000000B
;允许ISP/IAP操作
MOV
IAP_CMD,
#ISP_IAP_BYTE_READ
EQU
C
T
S
;字节读
U
C
M
Li
地址需要改变时
才需重新送地址
此两句可以合成一句,
并且只送一次就够了
;送字节读命令,命令不需改变时,不需重新送命令
�����������������������
MOV
IAP_TRIG,
#5Ah ;先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此
MOV
IAP_TRIG,
#0A5h ;送完A5h后,ISP/IAP命令立即被触发起动
;CPU等待IAP动作完成后,才会继续执行程序。
NOP
A,
ISP_DATA
MOV
南通国芯微电子有限公司
;数据读出到IAP_DATA寄存器后,CPU继续执行程序
;将读出的数据送往Acc
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
413
STC12C5A60S2系列单片机指南
技术支持网站: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
MOV
IAP_CMD,
#ISP_IAP_BYTE_PROGRAM ;送字节编程命令
MOV
IAP_TRIG,
#5Ah
MOV
IAP_TRIG,
#0A5h ;送完A5h后,ISP/IAP命令立即被触发起动
C
T
S
U
C
M
.
d
e
t
i
m
;送地址高字节
Li
;送地址低字节
地址需要改变时
才需重新送地址
;设置等待时间
;允许ISP/IAP操作
此两句可合成
一句,并且只
送一次就够了
;先送5Ah,再送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区,防止误操作
414
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
;扇区擦除,没有字节擦除,只有扇区擦除,512字节/扇区,每个扇区用得越少越方便
;如果要对某个扇区进行擦除,而其中有些字节的内容需要保留,则需将其先读到单片机
;内部的RAM中保存,再将该扇区擦除,然后将须保留的数据写回该扇区,所以每个扇区
;中用的字节数越少越好,操作起来越灵活越快.
;扇区中任意一个字节的地址都是该扇区的地址,无需求出首地址.
MOV
IAP_ADDRH,
#SECTOR_FIRST_BYTE_ADDR_HIGH ;送扇区起始地址高字节
MOV
IAP_ADDRL,
#SECTOR_FIRST_BYTE_ADDR_LOW ;送扇区起始地址低字节
MOV
IAP_CONTR,
ORL
;地址需要改变时才需重新送地址
#WAIT_TIME
;设置等待时间
IAP_CONTR,
#10000000B
;允许ISP/IAP
MOV
IAP_CMD,
#ISP_IAP_SECTOR_ERASE
.
d
e
t
i
m
Li
此两句可以合
成一句,并且只
送一次就够了
;送扇区擦除命令,命令不需改变时,不需重新送命令
U
C
M
MOV
IAP_TRIG,
#5Ah
;先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此
MOV
C
T
S
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,防止误操作
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
415
STC12C5A60S2系列单片机指南
技术支持网站: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触发?
答:是,一定要。
416
南通国芯微电子有限公司
总机:0513-5501 2928 / 2929 / 2966
传真:0513-5501 2969 / 2956 / 2947
STC12C5A60S2系列单片机指南
技术支持网站:www.STCMCU.com
临时技术支持:13922829991
研发顾问:13922809991
12.4 EEPROM测试程序(C程序及汇编程序)
1. C程序:
;STC12C5A60S2系列单片机EEPROM/IAP 功能测试程序演示
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示STC 1T 系列单片机 EEPROM/IAP功能--------------------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
U
C
M
/*Declare SFR associated with the IAP */
sfr IAP_DATA = 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