STC15系列学习
Posted 拖孩_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STC15系列学习相关的知识,希望对你有一定的参考价值。
51系列
AT89C52基础模块
- AT89C51只有两个定时器、一个串口、两个外部中断
周期
- 时钟周期也称为振荡周期由晶振决定 = 1/fsc
- 状态周期 = 2*时钟周期
- 机器周期 = 6状态周期 = 12时钟周期
- 指令周期:执行一条指令所需的全部时间,不同的指令需要的时间不同。
- 单周期指令:执行指令需要一个机器周期(12MHz => 1us)
- 双周期指令:执行指令需要两个机器周期(12MHz => 2us)
- 四周期指令:执行指令需要四个机器周期(12MHz => 4us)
引脚
- P0(AD0-7):为一个8位漏级开路双向I/O口(需外接上拉电阻)
- P1、P2(A8-15):标准I/O【P1.0/T2,P1.1/T2EX】
- P3特殊功能I/O,也可作为普通I/O
- P3.0/RXD
- P3.1/TXD
- P3.2/INT0*
- P3.3/INT1*
- P3.4/T0
- P3.5/T1
- P3.6/WR*
- P3.7/RD*
- RST:复位引脚
- ALE /
PROG
‾
\\overline\\textPROG
PROG:访问外部数据存储器/程序存储器
-
PSEN
‾
\\overline\\textPSEN
PSEN:程序储存器允许
- EA/VPP:外部访问允许
存储器结构
RAM:0-1F
RAM:20-2F
RAM:30-7F
RAM:80-FF
SFR(红色可位寻址) | 符号 | 字节(物理)地址 | 位名称 |
---|
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|
P0 | P0 | 80H | P0.7 | P0.6 | P0.5 | P0.4 | P0.3 | P0.2 | P0.1 | P0.0 |
---|
堆栈指针 | SP | 81H | | | | | | | | |
---|
数据指针DPTR | DPH | 82H | | | | | | | | |
---|
DPL | 83H | | | | | | | | |
---|
保留3字节 | | 84H-86H | | | | | | | | |
---|
电源和波特率 | PCON | 87H | SMOD | | | | GF1 | GF0 | PD | IDL |
---|
定时器计数器控制寄存器 | TCON | 88H | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
---|
定时器计数器方式控制 | TMOD | 89H | GATE1 | C/T*1 | M1_1 | M1_0 | GATE0 | C/T*0 | M0_1 | M0_0 |
---|
定时器计数器0L | TL0 | 8AH | | | | | | | | |
---|
定时器计数器1L | TL1 | 8BH | | | | | | | | |
---|
定时器计数器0H | TH0 | 8CH | | | | | | | | |
---|
定时器计数器1H | TH1 | 8DH | | | | | | | | |
---|
保留2Byte | | 8EH-8FH | | | | | | | | |
---|
P1 | P1 | 90H | P1.7 | P1.6 | P1.5 | P1.4 | P1.3 | P1.2 | P1.1 | P1.0 |
---|
保留7Byte | | 91H-97H | | | | | | | | |
---|
串行控制 | SCON | 98H | SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
---|
串行缓冲区 | SBUF | 99H | | | | | | | | |
---|
P2 | P2 | A0H | P2.7 | P2.6 | P2.5 | P2.4 | P2.3 | P2.2 | P2.1 | P2.0 |
---|
中断允许 | IE | A8H | EA | | ET2 (reg52.h //8052 only) | ES | ET1 | EX1 | ET0 | EX0 |
---|
P3 | P3 | B0H | P3.7 | P3.6 | P3.5 | P3.4 | P3.3 | P3.2 | P3.1 | P3.0 |
---|
中断优先 | IP | B8H | | | PT2 (reg52.h) | PS | PT1 | PX1 | PT0 | PX0 |
---|
定时器/计数器2 | T2CON | C8H | TF2 | EXF2 | RCLK | TCLK | EXEN2 | TR2 | C/T*2 | CP/RL2 |
---|
定时器/计数器2模式 | T2MOD | C9H | | | | | | | T2OE | DCEN |
---|
捕获 | RCPA2L | CAH | | | | | | | | |
---|
RCPA2H | CBH | | | | | | | | |
---|
定时器/计数器2高低位 | TL2 | CCH | | | | | | | | |
---|
TH2 | CDH | | | | | | | | |
---|
程序状态字 | PSW | D0H | CY | AC | F0 | RS1 | RS0 | OV | | PF |
---|
累加器 | ACC | E0H | | | | | | | | |
---|
寄存器B | B | F0H | | | | | | | | |
---|
定时器
定时器/计数器0、1
定时器计数器控制寄存器 | TCON | 88H | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
---|
定时器计数器方式控制 | TMOD | 89H | GATE1 | C/T*1 | M1_1 | M1_0 | GATE0 | C/T*0 | M0_1 | M0_0 |
---|
中断允许 | IE | A8H | EA | | | ES | ET1 | EX1 | ET0 | EX0 |
---|
定时器计数器0L | TL0 | 8AH | | | | | | | | |
---|
定时器计数器1L | TL1 | 8BH | | | | | | | | |
---|
定时器计数器0H | TH0 | 8CH | | | | | | | | |
---|
定时器计数器1H | TH1 | 8DH | | | | | | | | |
---|
- TCON
- TF:定时器/计数器中断标志-----【硬件置位清零】
- TR:定时器/计数器运行标志
- TMOD
- GATE:门控开关。0:软件启动。1:TR=1的同时还需要外部 INT0、INT1 为1才能启动。
- C/T*:定时器/计数器选择,0:应用为定时器。1:应用为计数器。
- M0、M1:工作模式选择,见下表
M1M0 | 工作方式 | 功能 | 备注 |
---|
00 | 0 | 13位(不可重装) | 高5位加低8位 |
---|
01 | 1 | 16位不可重装 | \\ |
---|
10 | 2 | 8位自动重装 | TH值==>>TL值 |
---|
11 | 3 | 两个8位计数器(只适用于T0) | |
---|
定时器T2
定时器/计数器2 | T2CON | C8H | TF2 | EXF2 | RCLK | TCLK | EXEN2 | TR2 | C/T*2 | CP/RL2 |
---|
定时器/计数器2模式 | T2MOD | C9H | | | | | | | T2OE | DCEN |
---|
定时器/计数器2高低位 | TL2 | CCH | | | | | | | | |
---|
TH2 | CDH | | | | | | | | |
---|
捕获 | RCPA2L | CAH | | | | | | | | |
---|
RCPA2H | CBH | | | | | | | | |
---|
##### ·T2CON - 有两个信号源:①内部时钟溢出TF2。②外部T2EX负跳沿。 - 定时器2有三个工作方式 - 捕获方式 - 自动重装(向上/下计数) - 波特率发生器
RCLK | TCLK | CP/R2 | EXEN2 | 工作方式 |
---|
1 | 1 | x | x | 波特率发生器 |
---|
0 | 0 | 1 | 1 | 外部T2EX*捕获 |
---|
0 | 0 | 1 | 0 | \\ |
---|
0 | 0 | 0 | 1 | 外部T2EX*重装 |
---|
0 | 0 | 0 | 0 | 溢出自动重装 |
---|
- T2CON
- TF2:T2溢出标志,硬件置位,软件清零
- EXF2:定时器2外部标志。当EXEN2=1,且当T2EX引脚上出现负跳变而出现捕获或重装载时,EXF2置位,申请中断.此时如果允许定时器2中断,CPU响应中断,执行定时器2中断服务程序,EXF2必须由软件清除。当定时器2工作在向上或向下计数工作方式时(DCEN=1) , ExF2不能激活中断。
- 串行通信(工作模式1和3下【注:工作模式0、2为波特率不可变】)设置
- RCLK:接收时钟允许。1:用T2溢出脉冲作为串行口的接收时钟。0:用Tl的溢出脉冲作为接收时钟。
- TCLK:发送时钟允许。同上。
- EXEN2:T2外部允许标志。【定时器2未用于作串行口的波特率发生器】
- 1:T2 捕获或重装载
- 0:T2EX端的外部信号无效。
- TR2:定时器2启动、暂停
- C/T*:定时器2计数方式。C模式:下跳沿触发
- CP/RL2:捕获/重装载选择。【与EXEN2关联】
- l:T2EN双端出现负跳变脉冲时发生捕获操作。
- 0:若定时器2溢出或EXEN2=l条件下,T2EN双端出现负跳变脉冲,都会出现自动重装载操作。当RCLK=1或TCLK=1时,该位无效,在定时器2溢出时强制其自动重装载。
定时器/计数器2模式 | T2MOD | C9H | | | | | | | T2OE | DCEN |
---|
- T2OE:T2输出允许位,当T2OE=1的时候,允许时钟输出到P1.0。(仅对80C54/80C58有效)
- DCEN:向下计数允许位。DCEN=1是允许T2向下计数,否则向上计数。
重装模式
捕获模式
- 当EXEN2=0时,只当作一个16bit定时器/计数器。
- 当EXEN2=1,出现T2EN时下跳,将T2H、L装入RCAPH、L
波特率模式
- 用RCAPH、L重装
-
波
特
率
=
振
荡
频
率
32
×
[
65536
−
(
R
C
P
A
2
H
,
R
C
P
A
2
L
)
B
]
波特率=\\frac振荡频率32×[65536-(RCPA2H,RCPA2L)_B]
波特率=32×[65536−(RCPA2H,RCPA2L)B]振荡频率
调用方法
定时器0、1
#include <reg52.h>
char timer0 = ; //T0计数值
char timer0_1 = ; //模式3下另一个计数器
void init_T0();
int main()
Intr_init();
Timer0_init();
while(1)
/* idle process */
;
return 0;
/* 中断初始化 */
void Intr_init()
ET0 = 1; //开T0中断
ET1 = 1; //开T1中断
EA = 1;
/* 定时器初始化 */
void Timer0_init()
//初始化定时器0初值
/*******模式0*********/
TH0 = (8192 - timer0)/255;
TL0 = (8192 - timer0)%255;
/*
*******模式1*********
TH0 = (65536 - timer0)/255;
TL0 = (65536 - timer0)%255;
*******模式2*********
TH0 = 256 - timer0;
TL0 = 256 - timer0;
*******模式3*********
TH0 = 256 - timer0;
TL0 = 256 - timer0_1;
*/
//定时器模式选择
//参考寄存器表
TMOD = 0x00; //模式0:13位
/*
TMOD = 0x01; //模式1:16位
TMOD = 0x02; //模式2:8位自动重装
TMOD = 0x03; //两个8位
TMOD = TMOD | 0x04; //计数器模式
TMOD = TMOD | 0x08; //门控使能
*/
TR0 = 1;
//TR1 = 1;
/* T0中断服务程序 */
void intr_T0() interrupt 1
/* do something */
定时器2
#include <reg52.h>
char timer2 = ;
void init_T2();
int main()
Intr_init();
Timer2_init();
while(1)
;
return 0;
void Intr_init()
PT2 = 1;
EA = 1;
void Timer2_init()
TH0 = (65536 - timer2)/255;
TL0 = (65536 - timer2)%255;
RCAP2L = (65536 - timer2)/255;
RCAP2H = (65536 - timer2)%255;
RCLK = 1;
TCLK = 1;
TR2 = 1;
void intr_T2() interrupt 5
TF2 = 0;
中断
中断号 | 中断地址 | 中断功能 |
---|
0 | 03H | EX0 |
---|
1 | 0BH | T0 |
---|
2 | 13H | EX1 |
---|
3 | 1BH | T1 |
---|
4 | 23H | ES |
---|
5 | 2BH | ET2 |
---|
IP^ | 中断功能 |
---|
0 | EX0 |
---|
1 | T0 |
---|
2 | EX1 |
---|
3 | T1 |
---|
4 | ES |
---|
5 | ET2 |
---|
### 串口UART1
串行控制 | SCON | 98H | SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
---|
串行缓冲区 | SBUF | 99H | | | | | | | | |
---|
SM0-2
- SM2:多机通信控制位
- SM0、SM1:串口工作模式
SM0 | SM1 | 说明 | 波特率 |
---|
0 | 0 | 同步移位寄存器 | Fosc/12 |
---|
0 | 1 | 10bit帧、8bitdata | 定时器T1/T2 |
---|
1 | 0 | 11bit帧、8bit、1bit多机 | Fosc/32或Fosc/64 |
---|
1 | 1 | 11bit帧、8bit、1bit多机 | T1/T2 |
---|
- REN:接收使能
- T、RB8:11bit帧作为第九位
- TI、RI:发送接收中断标志,硬件置位,软件清零
实现方法
非中断方法
#include <reg52.h>
void Intr_init();
void UartInit();
void send_data(unsigned char x);
unsigned char recieve_data();
unsigned char buf = 0;
int main()
Intr_init();
UartInit();
send_data(buf);
buf = recieve_data();
while(1);
return 0;
void Intr_init()
EA = 1;
ES = 0;
void send_data(unsigned char x)
SBUF = x;
while(TI == 0);
TI = 0;
unsigned char recieve_data()
unsigned char x;
while(RI == 0);
x = SBUF;
RI = 0;
return x;
void UartInit()
PCON &= 0x7F;
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TL1 = 0xD9;
TH1 = 0xD9;
ET1 = 0;
TR1 = 1;
中断方法
#include <reg52.h>
void Intr_init();
void UartInit();
char busy = 0;
unsigned char buf = 0;
int main()
Intr_init();
UartInit();
while(1)
if(busy == 0)
SBUF = 0x25;
busy = 1;
;
return 0;
void Intr_init()
EA = 1;
ES = 1;
ET1 = 0;
void UartInit() //9600bps@12.000MHz
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xD9; //设置定时初始值
TH1 = 0xD9; //设置定时重载值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
void Uart_Intr() interrupt 4
if(RI)
RI = 0;
/* do something */
else if(TI)
TI = 0;
busy = 0;
/* do something */
重定向printf
#include <reg52.h>
#include <stdio.h>
void Intr_init();
void UartInit();
char send_busy = 0;
char write_busy = 0;
unsigned char buf = 0;
/* 重定向 */
//UART1 发送串口数据
void UART1_SendData(char dat)
ES=0; //关串口中断
SBUF=dat;
while(TI!=1); //等待发送成功
TI=0; //清除发送中断标志
ES=1; //开串口中断
//重写putchar函数
char putchar(char c)
UART1_SendData(c);
return c;
int main()
Intr_init();
UartInit();
while(1)
printf("字符串");
;
return 0;
void Intr_init()
EA = 1;
ES = 0;
ET1 = 0;
void UartInit() //9600bps@12.000MHz
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xD9; //设置定时初始值
TH1 = 0xD9; //设置定时重载值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
其他功能寄存器
PCON
电源和波特率 | PCON | 87H | SMOD | | | | GF1 | GF0 | PD | IDL |
---|
- PD:掉电工作位
- IDL:空闲工作位
- GF:系统保留通用标志
PSW
- CY:进位标志
- AC:辅助进位标志
- F0、F1:用户定义
- RS1、0:工作寄存器
- OV:溢出标志
- P:奇偶标志:1–>奇
STC15F100系列
- 在AT89C52基础增加
- 【看门狗】
- 【IAP】
- 【可编程时钟输出】
- 【P3 I/O控制寄存器】
- 在AT89C52基础减去
- 修改定时器工作模式0为16位重装载
特殊寄存器映射
SFR | 符号 | 字节(物理)地址 | 位名称 |
---|
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|
电源控制寄存器 | PCON | 87H | - | - | LVDF | - | GF1 | GF0 | PD | IDL |
---|
辅助寄存器0 | AUXR | 8EH | T0*12 | T1*12 | - | - | - | - | - | - |
---|
INT_CLKO | INT_CLKO | 8FH | - | EX4 | EX3 | EX2 | - | - | T1CLKO | T0CLKO |
---|
CLK_DIV | CLK_DIV | 97H | - | - | - | - | - | CLKS2 | CLKS1 | CLKS0 |
---|
P3M1 | P3M1 | B1H | | | | | | | | |
---|
P3M0 | P3M0 | B2H | | | | | | | | |
---|
IRC_CLKO | IRC_CLKO | BBH | - | - | - | - | - | - | IRCS1 | IRCS0 |
---|
WDT_CONR | WDT_CONR | C1H | | | | | | | | |
---|
ISP/IAP Flash数据寄存器 | IAP_DATA | C2H | | | | | | | | |
---|
ISP/IAP Flash地址高8bit | IAP_ADDRH | C3H | | | | | | | | |
---|
ISP/IAP Flash地址低8bit | IAP_ADDRL | C4H | | | | | | | | |
---|
ISP/IAP命令寄存器 | IAP_CMD | C5H | - | - | - | - | - | - | MS1 | MS0 |
---|
ISP/IAP命令触发器 | IAP_TRIG | C6H | | | | | | | | |
---|
ISP/IAP控制寄存器 | IAP_CONTR | C7H | IAPEN | SWBS | SWRST | CMD_FAIL | - | WT2 | WT1 | WT0 |
---|
可编程时钟
系统时钟分频
CLK_DIV | CLK_DIV | 97H | - | - | - | - | - | CLKS2 | CLKS1 | CLKS0 |
---|
CLKS2 | CLKS1 | CLKS0 | 分频系数 |
---|
0 | 0 | 0 | /1 |
---|
0 | 0 | 1 | /2 |
---|
0 | 1 | 0 | /4 |
---|
0 | 1 | 1 | /8 |
---|
1 | 0 | 0 | /16 |
---|
1 | 0 | 1 | /32 |
---|
1 | 1 | 0 | /64 |
---|
1 | 1 | 1 | /128 |
---|
可编程时钟输出
- 有三路可编程时钟输出
- IRC_CLKO/P3.4
- CLK_OUT0/P3.5
- CLK_OUT1/P3.4
- 寄存器
辅助寄存器0 | AUXR | 8EH | T0*12 | T1*12 | - | - | - | - | - | - |
---|
INT_CLKO | INT_CLKO | 8FH | - | EX4 | EX3 | EX2 | - | - | T1CLKO | T0CLKO |
---|
IRC_CLKO | IRC_CLKO | BBH | - | - | - | - | - | - | IRCS1 | IRCS0 |
---|
- AUXR
- T*12:定时器速度是传统51的12倍**【计数时钟为系统(晶振)时钟】**
- INT_CLKO
【关闭定时器中断,定时器工作于方式0或者2】
- T1CLKO:管脚P3.5允许时钟输出【定时器1】
- T0CLKO:管脚P3.4允许时钟输出【定时器0】
- 输出时钟频率= T溢出率 / 2
- IRC_CLKO
IRCS1 | IRCS0 | 输出频率 |
---|
0 | 0 | 无时钟输出 |
---|
0 | 1 | 内部时钟输出不分频 |
---|
1 | 0 | 2分频 |
---|
1 | 1 | 4分频 |
---|
P3口输出模式
P3M1[5:0] | P3M0[5:0] | I/O模式 |
---|
|
0 | 0 | 标准双向I/O |
---|
|
0 | 1 | 推挽 |
---|
|
1 | 0 | 高阻 |
---|
|
1 | 1 | 开漏(外加上拉电阻) |
---|
|
IAP
- 1KB/2KB数据EEPROM
- 每个扇区512(0.5K)字节数据
ISP/IAP Flash数据寄存器 | IAP_DATA | C2H | | | | | | | | |
---|
ISP/IAP Flash地址高8bit | IAP_ADDRH | C3H | | | | | | | | |
---|
ISP/IAP Flash地址低8bit | IAP_ADDRL | C4H | | | | | | | | |
---|
ISP/IAP命令寄存器 | IAP_CMD | C5H | - | - | - | - | - | - | MS1 | MS0 |
---|
ISP/IAP命令触发器 | IAP_TRIG | C6H | | | | | | | | |
---|
ISP/IAP控制寄存器 | IAP_CONTR | C7H | IAPEN | SWBS | SWRST | CMD_FAIL | - | WT2 | WT1 | WT0 |
---|
IAP_CMD
MS1 | MS0 | 命令内容 |
---|
0 | 0 | 待机、无操作 |
---|
0 | 1 | 对数据Flash区读字节 |
---|
1 | 0 | 对数据Flash区进行字节编程 |
---|
1 | 1 | 对数据Flash扇区进行擦除 |
---|
IAP_TRIG
IAP_CONTR
ISP/IAP控制寄存器 | IAP_CONTR | C7H | IAPEN | SWBS | SWRST | CMD_FAIL | - | WT2 | WT1 | WT0 |
---|
- IAPEN:IAP读写擦使能
- SWBS:0:软件选择从用户应用程序启动;1:从系统ISP监控程序区启动
- SWRST:1:软件复位
- CMD_FAIL:触发命令失败标志位,软件清零
- WT2-0:设置等待时间(见下表)
WT2 | WT1 | WT0 | Read | Program | Sector Erase | 推荐系统时钟 |
---|
0 | 0 | 0 | 2个时钟 | 55个时钟 | 21012个时钟 | <=1MHz |
---|
0 | 0 | 1 | 2个时钟 | 110个时钟 | 42024个时钟 | <=2MHz |
---|
0 | 1 | 0 | 2个时钟 | 165个时钟 | 63036个时钟 | <=3MHz |
---|
0 | 1 | 1 | 2个时钟 | 330个时钟 | 126072个时钟 | <=6MHz |
---|
1 | 0 | 0 | 2个时钟 | 660个时钟 | 252114个时钟 | <=12MHz |
---|
1 | 0 | 1 | 2个时钟 | 1100个时钟 | 420240个时钟 | <=20MHz |
---|
1 | 1 | 0 | 2个时钟 | 1320个时钟 | 504288个时钟 | <=24MHz |
---|
1 | 1 | 1 | 2个时钟 | 1760个时钟 | 672384个时钟 | <=30MHz |
---|
#### 调用方法 - 参考STCF100系列指南 ```c #include
typedef unsigned char Byte;
typedef unsigned int Word;
/* 声明ISP功能寄存器地址 */
sfr IAP_DATA = 0xC2;
sfr IAP_ADDRH = 0xC3;
sfr IAP_ADDRL = 0xC4;
sfr IAP_CMD = 0xC5;
sfr IAP_TRIG = 0xC6;
sfr IAP_CONTR = 0xC7;
/* 定义命令 */
#define CMD_IDLE 0 //Stand-By
#define CMD_READ 1 //Byte-READ
#define CMD_PROGRAM 2 //Byte-Program
#define CMD_ERASE 3 //Sector-Erase
/* 定义IAP等待时间 */
#define ENABLE_IAP 0x82 //if SYSCLK<20KHz
#define IAP_ADDRESS 0x0000
void Delay(Byte n);
void IapIdle();
Byte IapReadByte(Word addr);
void IapProgrameByte(Word addr, Byte dat);
void IapEraseSector(Word addr);
void\\ main()
Word i;
P1 = 0xFE; //System Reset OK!
Delay(10);
IapEraseSector(IAP_ADDRESS); //Erase current sector
for(i=0;i<512;i++)
if(IapReadByte(IAP_ADDRESS+i) != 0xFF)
goto Error;
P1 = 0xFC; //Erase Successful
Delay(10);
for(i=0;i<512;i++)
IapProgrameByte(IAP_ADDRESS+i,byByte(i));
P1 = 0xF0; //Verify Successful
while(1);
Error;
P1 &= 0x7F; //IAP Error
while(1);
/* Software delay function */
void Delay(Byte n)
Word x;
while (n–)
x = 0;
while (++x);
/* Disable ISP/IAP/EEPROM function Make MCU in a safe state*/
void IapIdle()
IAP_CONTR = 0;
IAP_CMD = 0;
IAP_TRIG = 0;
IAP_ADDRH = 0x80;
IAP_ADDRL =0x00;
/* Read one byte form ISP/IAP/EEPROM area
Input: addr
Output: Flash data*/
void IapReadByte(Word addr)
Byte dat;
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_READ;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5A;
IAP_TRIG=0xA5;
_nop_();
_nop_();
_nop_();
dat=IAP_DATA;
IapIdle();
return dat;
/* Program one byte to ISP/IAP/EEPROM area
Input: addr dat
Output: -
*/
void IapProgrameByte(Word addr, Byte dat)
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_PROGRAM;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=dat;
IAP_TRIG=0x5A;
IAP_TRIG=0xA5;
nop();
nop();
nop();
IapIdle();
/* Erase sector
Input: addr
Output; -
*/
void IapEraseSector(Word addr)
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5A;
IAP_TRIG=0xA5;
nop();
nop();
nop();
IapIdle();
### 看门狗
- 本质为一个定时器,定时器溢出时将会产生复位。因此必须在定时器计数溢出前将看门狗计数清零,才能保证不产生看门狗复位【也叫做“<font color="red">喂狗</font>”】。
<table>
<tr>
<th colspan="8"> WDT_CTRL</td>
</tr>
<tr>
<td><center>WDT_FLAG</td>
<td> \\ </td>
<td><center>EN_WDT</td>
<td><center>CLR_WDT</td>
<td><center>IDLE_WDT</td>
<td><center>PS[2:0]</td>
</tr>
<tr>
<td><center>看门狗定时器<br>溢出标志</center></td>
<td> \\ </td>
<td>看门狗使能</td>
<td><center>看门狗定时器<br>清零</center></td>
<td><center>空闲模式下<br>看门狗是否工作</center></td>
<td><center>看门狗定时器<br>分频系数</center></td>
</tr>
</table>
```c
void WDT_INIT()
WDT_CONTR = 0x3c;
int main()
WDT_INIT();
while(1)
/* Do Something */
/* ------------ */
/* xxxxxxxxxxxx */
/* ------------ */
WDT_CONTR = 0x3c; //喂狗
非成模块寄存器总结
PCON
电源控制寄存器 | PCON | 87H | - | - | LVDF | POF | GF1 | GF0 | PD | IDL |
---|
- POF:Power On Flag
- LVDF:低电压标志,此时不要进行ISP操作
- GF1、0:用户调用
- PD:掉电模式
- 内部时钟停止,CPU、定时器、看门狗停止
- 外部中断继续工作,可通过外部中断唤醒
- 低压检测电路如果被使能,也继续工作
- IDL:空闲模式
AUXR
INT_CLKO
INT_CLKO | INT_CLKO | 8FH | - | EX4 | EX3 | EX2 | - | - | T1CLKO | T0CLKO |
---|
- EXn:外部中断INT4-2使能 - TnCLK:定时器输出-见可编程时钟输出部分
STC15F2K60S2系列
- 在STC15F100系列上新增
- 【所有I/O模式控制寄存器】
- 【UART2、3、4】
- 【ADC】
- 【SPI】
- 【CCP/PCA/PWM】
- 【T2、3、4】
复位与时钟
复位
复位的方式
- 上电复位
- 无ISP操作:电源电压上电到复位门槛电压后,延迟8192个时钟后进入用户程序。
- 有ISP操作:当MAX810专用复位电路在ISP编程时被允许,则延迟约180ms,复位才解除。
- RST引脚复位
- 内部低电压检测电路复位
- ‘看门狗’复位
- 软件复位
存储单元
寄存器映射
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5LwO9ZxZ-1643465915402)(/assets/STC15F2K60S2_m5t22vtzh.png)]
模块 | 描述 | 符号 | 地址 | 位功能 |
---|
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|
电源、时钟、外围设备【I/O引脚复用设置】 | 电源控制寄存器 | PCON | 85H | SMOD | SMOD0 | LVDF | POF | GF1 | GF0 | PD | IDL |
---|
电源控制寄存器2/时钟分频寄存器 | PCON2/CLK_DIV | 97H | MCKO_S1 | MCKO_S0 | ADRJ | Tx_Rx | Tx2_Rx2 | CLKS2 | CLKS1 | CLKS0 |
---|
辅助寄存器0 | AUXR | 8EH | T0*12 | T1*12 | UART_M0*6 | T2R | T2_C/T* | T2*12 | EXTRAM | SIST2 |
---|
辅助寄存器1/外围设备功能切换控制寄存器1 | AUXR1/P_SW1 | A2H | S1_S1 | S1_S0 | CCP_S1 | CCP_S0 | SPI_S1 | SPI_S0 | 0 | DPS |
---|
辅助寄存器2/外围设备功能切换控制寄存器2 | AUXR2/P_SW2 | 8FH | - | EX4 | EX3 | EX2 | - | T2CLKO | T1CLKO | T0CLKO |
---|
定时器T0~4、掉电唤醒专用定时器 【定时器2控制位在辅助寄存器0 AUXR中】 | 定时器0控制寄存器 | TCON | 88H | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
---|
定时器工作方式寄存器 | TMOD | 89H | GATE1 | C/T*1 | M1.1 | M1.0 | GATE0 | C/T*0 | M0.1 | M0.0 |
---|
定时器0低8bit | TL0 | 8AH | |
---|
定时器1低8bit | TL1 | 8BH | |
---|
定时器0高8bit | TH0 | 8CH | |
---|
定时器1高8bit | TH1 | 8DH | |
---|
定时器3、4控制寄存器 | T4T3M | D1H | T4R | T4_C/T* | T4*12 | T4CLKO | T3R | T3_C/T* | T3*12 | T3CLKO |
---|
定时器4高8bit | TH1 | D2H | |
---|
定时器4低8bit | TH1 | D3H | |
---|
定时器3高8bit | TH1 | D4H | |
---|
定时器3低8bit | TH1 | D5H | |
---|
定时器2高8bit | TH1 | D6H | |
---|
定时器2低8bit | TH1 | D7H | |
---|
掉电专用定时器控制寄存器低8 | WKTCL_CNT | AAH | |
---|
掉电专用定时器控制寄存器低8 | WKTCH_CNT | ABH | WKTEN | | | | | | | |
---|
中断控制寄存器 | 中断允许寄存器0 | IE | A8H | EA | ELVD | EADC | ES | ET1 | EX1 | ET0 | EX0 |
---|
中断允许寄存器1 | IE2 | AFH | | ET4 | ET3 | ES4 | ES3 | ET2 | ESPI | ES2 |
---|
中断优先级寄存器0 | IP | B8H | PPCA | PLVD | PADC | PS | PT1 | PX1 | PT0 | PX0 |
---|
中断优先级寄存器1 | IP2 | B5H | - | - | - | - | - | - | PSPI | PS2 |
---|
UART | 串口4控制寄存器 | S4CON | 84H | S4SM0 | S4ST4 | S4SM2 | S4REN | S4TB8 | S4RB8 | S4TI | S4RI |
---|
串口4数据缓冲器 | S4BUF | 85H | |
---|
串口1控制寄存器 | SCON | 98H | SM0/FE | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
---|
串口1数据缓冲器 | SBUF | 99H | |
---|
串口2控制寄存器 | S2CON | 9AH | S2SM0 | - | S2SM2 | S2REN | S2TB8 | S2RB8 | S2TI | S2RI |
---|
串口2数据缓冲器 | S2BUF | 9BH | |
---|
串口3控制寄存器 | S3CON | ACH | S3SM0 | S3ST4 | S3SM2 | S3REN | S3TB8 | S3RB8 | S3TI | S3RI |
---|
串口3数据缓冲器 | S3BUF | ADH | |
---|
从机地址控制寄存器 | SADDR | A9H | |
---|
从机地址掩码寄存器 | SADEN | B9H | |
---|
ADC | P1模拟通道开关 | P1ASF | 9DH | P17ASF | P16ASF | P15ASF | P14ASF | P13ASF | P12ASF | P11ASF | P10ASF |
---|
A/D转换控制寄存器 | ADC_CONTR | BCH | ADC_POWER | SPEED1 | SPEED0 | ADC_FLAG | ADC_START | CHS2 | CHS1 | CHS0 |
---|
A/D转换结果高8位寄存器 | ADC_RES | BDH | |
---|
A/D转换结果低2位寄存器 | ADC_RESL | BEH | |
---|
SPI | SPI状态寄存器 | SPSTATA | CDH | SIF | WCOL | - | - | - | - | - | - |
---|
SPI控制寄存器 | SPCTL | CEH | SSIG | SPEN | DORD | MSTR | CPOL | CAPHA | SPR1 | SPR0 |
---|
SPI数据寄存器 | SPDAT | CFH | |
---|
PCA/PWM | PCA控制寄存器 | CCON | D8H | CF | CR | - | - | CCF3 | CCF2 | CCF1 | CCF0 |
---|
PCA模式寄存器 | CMOD | D9H | CIDL | - | - | - | - | CPS1 | CPS0 | ECF |
---|
PCA模块0模式寄存器 | CCAPM0 | DAH | - | ECOM0 | CAPP0 | CAPN0 | MAT0 | TOG0 | PWM0 | ECCF0 |
---|
PCA模块1模式寄存器 | CCAPM1 | DBH | - | ECOM1 | CAPP1 | CAPN1 | MAT1 | TOG1 | PWM1 | ECCF1 |
---|
PCA模块0模式寄存器 | CCAPM0 | DCH | - | ECOM2 | CAPP2 | CAPN2 | MAT2 | TOG2 | PWM2 | ECCF2 |
---|
PCA计数器低8位 | CL | E9H | |
---|
PCA计数器高8位 | CH | F9H | |
---|
PCA模块0捕捉寄存器低8位 | CCAP0L | EAH | |
---|
PCA模块1捕捉寄存器低8位 | CCAP1L | EBH | |
---|
PCA模块2捕捉寄存器低8位 | CCAP2L | ECH | |
---|
PCA模块0捕捉寄存器高8位 | CCAP0H | FAH | |
---|
PCA模块1捕捉寄存器高8位 | CCAP1H | FBH | |
---|
PCA模块2捕捉寄存器高8位 | CCAP2H | FCH | |
---|
PCA PWM模式辅助寄存器0 | PCA_PWM0 | F2H | EBS0_1 | EBS0_0 | - | - | - | - | EPC0H | EPC0L |
---|
PCA PWM模式辅助寄存器1 | PCA_PWM1 | F3H | EBS1_1 | EBS1_0 | - | - | - | - | EPC1H | EPC1L |
---|
PCA PWM模式辅助寄存器2 | PCA_PWM0 | F4H | EBS2_1 | EBS2_0 | - | - | - | - | EPC2H | EPC2L |
---|
总线控制寄存器 | BUS_SPEED | A1H | - | - | - | - | - | - | EXRTS1 | EXRTS0 |
---|
中断系统
中断源 | 中断向量 | 中断地址 |
---|
外部中断0 | 0 | 03H |
---|
定时器0 | 1 | 0BH |
---|
外部中断1 | 2 | 13H |
---|
定时器1 | 3 | 1BH |
---|
串口1 | 4 | 23H |
---|
ADC | 5 | 2BH |
---|
LVD | 6 | 33H |
---|
PCA | 7 | 3BH |
---|
串口2 | 8 | 43H |
---|
SPI | 9 | 4BH |
---|
外部中断2 | 10 | 53H |
---|
外部中断3 | 11 | 5BH |
---|
定时器2 | 12 | 63H |
---|
保留 | 13~15 | 6BH~7BH |
---|
外部中断4 | 16 | 83H |
---|
串口3 | 17 | 8BH |
---|
串口4 | 18 | 93H |
---|
定时器3 | 19 | 9BH |
---|
定时器4 | 20 | A3H |
---|
### 定时器T2、3、4 - 定时器2、3、4为固定的16位重装载模式 - T3、4可以作为可编程时钟输出
串UART2、3、4
多机通信原理
- 工作在方式2、3,第九位作为地址帧的识别
- 设置SM2 = 1
- 通信步骤