运算器 + 控制器
晶体振荡器M的频率可在 4~48 MHZ 之间选择,典型值 11.0592 MHZ(设计单片机通信系统时,使用这个频率的晶振可以准确的得到9600bit/s,和 1920 bit/s),电容C1,C2 对时钟频率有微调作用,可在5~100PF 之间选择,典型值47pF。
IAP15W4K58S4单片机最多有62 根 I/O 口线
P0口(8根):P0.0,P0.1,P0.2,P0.3,P0.4,P0.5,P0.6,P0.7
P1口(8根):P1.0,P1.1,P1.2,P1.3,P1.4,P1.5,P1.6,P1.7
P2口(8根):P2.0,P2.1,P2.2,P2.3,P2.4,P2.5,P2.6,P2.7
P3口(8根):P3.0,P3.1,P3.2,P3.3,P3.4,P3.5,P3.6,P3.7
P4口(8根):P4.0,P4.1,P4.2,P4.3,P4.4,P4.5,P4.6,P4.7
P5口(6根):P5.0,P5.1,P5.2,P5.3,P5.4,P5.5
P6口(8根):P6.0,P6.1,P6.2,P6.3,P6.4,P6.5,P6.6,P6.7
P7口(8根):P7.0,P7.1,P7.2,P7.3,P7.4,P7.5,P7.6,P7.7
(黄色部分只有 LQFP64 封装的IAP15W4K58S4单片机有)
这些I/O 口线可设置成 四种模式:
复位后:准双向口/弱上拉模式
每根I/O口线驱动能力均可达到 20mA,但整个芯片最大不得超过 100mA。
许多 I/O 口线复用
IAP15W4K58S4 存储空间主要特点:程序存储器和数据存储器的寻址空间是分开的。
片内集成3个物理上相互独立的存储器空间:
即 内部RAM ,共256个单元,通常分为两部分:低128单元(00H~7FH),高128单元(80H~FFH)
地址范围 | 说明 |
---|---|
30H~7FH | 数据缓冲区(供用户使用的一般RAM区) |
20H~2FH | 位寻址区(00H~7FH)(也可字节寻址) |
18H~1FH | 工作寄存器3区(R7~R0) |
10H~17H | 工作寄存器2区(R7~R0) |
08H~0FH | 工作寄存器1区(R7~R0) |
00H~07H | 工作寄存器0区(R7~R0) |
对IAP15W4K58S4来说,80H~FFH既是高128单元,又是特殊功能寄存器的地址,地址空间重叠,但物理上是独立的,用不同的寻址方式加以区分:
特殊功能寄存器(专用寄存器SFR)
SW位地址 | D7H | D6H | D5H | D4H | D3H | D2H | D1H | D0H |
---|---|---|---|---|---|---|---|---|
节地址 D0H | CY | AC | F0 | RS1 | RS0 | OV | F1 | P |
…
每个口的工作模式由 PnM0 和 PnM1 (n=1,2,3,4,5)的相应位控制
PnM1[7:0] | PnM0[7:0] | I/O口模式 |
---|---|---|
0 | 0 | 准双向口(传统8051单片机I/O口模式),灌电流可达20mA,拉电流为270μA,由于制造误差,实际为270uA~150uA |
0 | 1 | 推挽输入输出(强上拉输出,可达20mA,要加限流电阻,尽量少用) |
1 | 0 | 仅为输入(高阻) |
1 | 1 | 开漏(Open Drain),内部上拉电阻断开,要外加上拉电阻 |
例:P1.7为开漏模式,P1.6为强推挽输入输出模式,P1.4,P1.3,P1.2,P1.1和P1.0为弱上拉模式:
P1M1 = 0xa0; //0xa0=10100000B
P1M0 = 0xc0; //0xc0=11000000B
IAP15W4K58S4单片机的每个I/O口:
…
…
主时钟可以是内部 R/C 时钟,也可以是外部输入的时钟或外部晶振振荡产生的时钟。
系统时钟是指对主时钟进行分频后CPU,串口,SPI,定时器,CCP/PWM/PCA,ADC的实际工作时钟,用 SYSCLK 表示。
分频相关寄存器:
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
CLK_DIV | 97H | SYSCKO_S1 | SYSCKO_S0 | ADRJ | TX_RX | SYSCLKO_2 | CLKS2 | CLKS1 | CLKS0 |
INT_CLKO | 8FH | - | EX4 | EX3 | EX2 | SYSCKO_S2 | T2CLKO | T1CLKO | T0CLKO |
分频关系:
CLKS2 | CLKS1 | CLKS0 | 系统时钟和主时钟的分频关系 |
---|---|---|---|
0 | 0 | 0 | 系统时钟频率 = 主时钟频率,不分频 |
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 |
系统时钟对外输出:
SYSCKO_S2 | SYSCKO_S1 | SYSCKO_S0 | 主时钟的输出频率 |
---|---|---|---|
0 | 0 | 0 | 系统时钟不对外输出 |
0 | 0 | 1 | 输出时钟频率=系统时钟频率 |
0 | 1 | 0 | 输出时钟频率=系统时钟频率/2 |
0 | 1 | 1 | 输出时钟频率=系统时钟频率/4 |
1 | 0 | 0 | 输出时钟频率=系统时钟频率/16 |
注意:??? 串口部分 CLK_DIV 和 定时器章节的 主时钟输出 CLK_DIV, INT_CLKO不一致。
bit
:位变量声明,声明一个位变量或位类型的函数
所有bit类型的变量都被定位在8050片内RAM 的可位寻址区(20H~2FH),共128位。
所以,某范围内最多声明128个 bit 变量
sbit
:位变量声明,声明一个可位寻址变量
RAM 中的可位寻址位,或,特殊寄存器中的可寻址位
sbit flag0=flag^0;//flag的第0位
sfr
:特殊功能寄存器声明,声明一个特殊功能寄存器(8位)
sfr16
:特殊功能寄存器声明,声明一个16位的特殊功能寄存器
包含标准8051单片机所有特殊功能寄存器和他们位定义的头文件 reg51.h 。
stc15.h 包含了标准8051单片机寄存器的定义,编程时只需包含这个。
data
:存储器类型说明,直接寻址的8051内部数据存储器
bdata
:存储器类型说明,可位寻址的8051内部数据存储器
idata
:存储器类型说明,间接寻址的8051内部数据存储器
pdata
:存储器类型说明,“分页”寻址的8051外部数据存储器
xdata
:存储器类型说明,8051外部数据存储器
code
:存储器类型说明,8051程序存储器
interrupt
:中断函数声明,定义一个中断函数
reentrant
:可重入函数声明,定义一个可重入函数
using
:寄存器组定义,指定使用8050的工作寄存器的某一组
void 函数名(void) interrupt 中断号 [using n]
//n为工作寄存器组(共4个),[]表示可省略
{
}
//---------各个子函数的声明-----------
void delay(long delaytime)
{
while(delaytime>0) delaytime--; //子函数的实现代码
}
//---------各个中断函数的实现----------
void INT0_ISR(void) interrupt 0 //外部中断0服务子函数
{
//根据需要填入程序代码
}
void INT1_ISR(void) interrupt 2 //外部中断1服务子函数
{
//根据需要填入程序代码
}
void INT2_ISR(void) interrupt 10 //外部中断2服务子函数
{
//根据需要填入程序代码
}
void INT3_ISR(void) interrupt 11 //外部中断3服务子函数
{
//根据需要填入程序代码
}
void INT4_ISR(void) interrupt 16 //外部中断4服务子函数
{
//根据需要填入程序代码
}
void T0_ISR(void) interrupt 1 //定时器0中断服务子函数
{
//根据需要填入程序代码
}
void T1_ISR(void) interrupt 3 //定时器1中断服务子函数
{
//根据需要填入程序代码
}
void T2_ISR(void) interrupt 12 //定时器2中断服务子函数
{
//根据需要填入程序代码
}
void T3_ISR(void) interrupt 19 //定时器3中断服务子函数
{
//根据需要填入程序代码
}
void T4_ISR(void) interrupt 20 //定时器4中断服务子函数
{
//根据需要填入程序代码
}
void UART1_ISR(void) interrupt 4 //串口1中断服务子函数
{
//根据需要填入程序代码,注意中断请求标志的清零
}
void UART2_ISR (void) interrupt 8 //串口2中断子函数
{
//根据需要填入程序代码,注意中断请求标志的清0
}
void UART3_ISR (void) interrupt 17 //串口3中断子函数
{
//根据需要填入程序代码,注意中断请求标志的清0
}
void UART4_ISR (void) interrupt 18 //串口4中断子函数
{
//根据需要填入程序代码,注意中断请求标志的清0
}
void SPI_ISR (void) interrupt 9 //SPI中断子函数
{
//根据需要填入程序代码,注意中断请求标志的清零
}
void ADC_ISR (void) interrupt 5 //ADC中断服务子函数
{
//根据需要填入程序代码,注意中断请求标志的清零
}
void LVD_ISR (void) interrupt 6 //低电压检测中断子函数
{
//根据需要填入程序代码,注意中断请求标志的清零
}
void COMP_ISR (void) interrupt 21 //比较器模块中断服务子函数
{
//根据需要填入程序代码,注意中断请求标志的清0
}
void PCA_ISR (void) interrupt 7 //PCA中断子函数
{
//根据需要填入程序代码,注意中断请求标志的清零
}
void PWM_ISR (void) interrupt 22 //PWM模块中断服务子函数
{
//根据需要填入程序代码,注意中断请求标志的清0
}
void PWMFLT_ISR (void) interrupt 23 //PWM异常检测模块中断服务子函数
{
//根据需要填入程序代码,注意中断请求标志的清0
}
small ,compact,large
void fun1(void) small
{
}
不可重入的函数,在运行过程中不可被中断
解决函数重入问题:
① 只允许主程序或中断之一调用该函数
#pragma disable
② 说明该函数可重入
(模拟堆栈)
void func (...) reentrant;
注意:
#pragma noaregs
,以禁止编译器使用绝对寄存器寻址,可生成不依赖于寄存器组的代码。中断源是指能发出中断请求,引起中断的装置或事件。
IAP15W4K58S4单片机提供21个中断请求源:
复位后禁止一切中断。禁止由两级控制组成
复位后禁止一切中断。禁止由两级控制组成。总控制由IE寄存器最高位EA控制
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 复位值 |
---|---|---|---|---|---|---|---|---|---|---|
IE | A8H | EA | ELVD | EADC | ES | ET1 | EX1 | ET0 | EX0 | 00000000B |
EA = 1 则总中断允许,还需要看个别中断源的分控制。
外部中断和定时器中断的请求标志在 定时/计数器 T0,T1 的控制寄存器 TCON 中:
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 复位值 |
---|---|---|---|---|---|---|---|---|---|---|
TCON | 88H | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 | 00000000B |
------外部中断0/1-------
① IT0/1:外部中断 INT0/1 触发方式控制位,可由软件置0/1。
② IE0/1:外部中断 INT0/1 请求标志。触发外部中断0后使该位位1,以此向 CPU 请求中断。进入中断后硬件自动置0。
------定时/计数器0/1-------
① TR0/1:定时/计数器 T0/1 启动/停止 控制位。
② TF0/1:定时/计数器 T0/1 的溢出中断标志。进入中断后硬件自动置0,也可软件清0。
注意:
EA = 1 且:
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 复位值 |
---|---|---|---|---|---|---|---|---|---|---|
IE | A8H | EA | ELVD | EADC | ES | ET1 | EX1 | ET0 | EX0 | 00000000B |
IE2 | AFH | - | ET4 | ET3 | ES4 | ES3 | ET2 | ESPI | ES2 | X0000000B |
INT_CLKO | 8FH | - | EX4 | EX3 | EX2 | - | T2CLKO | T1CLKO | T0CLKO | X000X000B |
ET1:定时器1中断允许控制位
EX1:外部中断 INT1中断允许控制位
ET0:定时器0中断允许控制位
EX0:外部中断 INT0中断允许控制位
ET4:定时器4中断允许控制位
ET3:定时器3中断允许控制位
ET2:定时器2中断允许控制位
EX4:外部中断 INT4中断允许控制位
EX3:外部中断 INT3中断允许控制位
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 复位值 |
---|---|---|---|---|---|---|---|---|---|---|
SCON | 98H | SM0/FE | SM1 | SM2 | REN | TB8 | RB8 | TI | RI | 00000000B |
S2CON | 9AH | S2SM0 | - | S2SM2 | S2REN | S2TB8 | S2RB8 | S2TI | S2RI | 0X000000B |
S3CON | ACH | S3SM0 | S3ST3 | S3SM2 | S3REN | S3TB8 | S3RB8 | S3TI | S3RI | 0X000000B |
S4CON | 84H | S4SM0 | S4ST4 | S4SM2 | S4REN | S4TB8 | S4RB8 | S4TI | S4RI | 0X000000B |
------串口1/2/3/4控制寄存器 (S2/3/4)SCON 中的标志位-------
① (S2/3/4)RI:串口1/2/3/4接收中断标志。(接收完毕后置1申请中断),也可用于查询。
② (S2/3/4)TI:串口1/2/3/4发送中断标志。(发送完毕后置1申请中断),也可用于查询。
注意:
EA = 1 且:
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 复位值 |
---|---|---|---|---|---|---|---|---|---|---|
IE | A8H | EA | ELVD | EADC | ES | ET1 | EX1 | ET0 | EX0 | 00000000B |
IE2 | AFH | - | ET4 | ET3 | ES4 | ES3 | ET2 | ESPI | ES2 | X0000000B |
ES:串口1中断允许控制位
ES4:串口4中断允许控制位
ES3:串口3中断允许控制位
ES2:串口2中断允许控制位
电源控制寄存器 PCON:
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 复位值 |
---|---|---|---|---|---|---|---|---|---|---|
PCON | 87H | SMOD | SMOD0 | LVDF | POF | GF1 | GF0 | FD | IDL | 00110000B |
LVDF:是低电压检测标志位,同事也是低电压检测中断请求标志位。
在正常工作和空闲工作状态时,内部工作电压 Vcc 低于低电压检测门槛电压时 LVDF 自动置1,不管低电压检测中断是否被允许。该位只能软件清0,若清0后还是低于门槛电压,该位又被置1。
EA = 1 且:
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 复位值 |
---|---|---|---|---|---|---|---|---|---|---|
IE | A8H | EA | ELVD | EADC | ES | ET1 | EX1 | ET0 | EX0 | 00000000B |
ELVD:低电压检测允许位。
进入掉电工作状态前,若该位=0,则低电压检测电路不工作。若该位=1,则低于门槛电压后产生低电压检测中断并将MCU 从掉电状态唤醒。
PCA控制寄存器 CCON :
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 复位值 |
---|---|---|---|---|---|---|---|---|---|---|
CCON | D8H | CF | CR | - | - | - | - | CCF1 | CCF0 | 00XXXX00B |
① CF:PCA 计数器溢出标志位。
② CCF1/CCF0:PCA 个个模块的中断标志。
EA = 1 且:
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 复位值 |
---|---|---|---|---|---|---|---|---|---|---|
CCAPM0 | DAH | - | ECOM0 | CAPP0 | CAPN0 | MAT0 | TOG0 | PWM0 | ECCF0 | X0000000B |
CCAPM1 | DBH | - | ECOM1 | CAPP1 | CAPN1 | MAT1 | TOG1 | PWM1 | ECCF1 | X0000000B |
CMOD | D9H | CIDL | - | - | - | CPS2 | CPS1 | CPS0 | ECF | 0XXX0000B |
ECCFn(n=0,1):使能 CCFn 中断。
ECF:PCA 计数器溢出中断允许控制位。
SPI 状态寄存器SPSTAT:
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 复位值 |
---|---|---|---|---|---|---|---|---|---|---|
SPSTAT | CDH | SPIF | WCOL | - | - | - | - | - | - | 00XXXXXXB |
SPIF:SPI 传输完成标志。
其余位详见“数据通信”。
EA = 1 且:
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 复位值 |
---|---|---|---|---|---|---|---|---|---|---|
IE2 | AFH | - | ET4 | ET3 | ES4 | ES3 | ET2 | ESPI | ES2 | X0000000B |
ESPI:SPI 中断允许控制位
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 复位值 |
---|---|---|---|---|---|---|---|---|---|---|
ADC_CONTR | BCH | ADC_POWER | SPEED1 | SPEED0 | ASC_FLAG | ADC_START | CHS2 | CHS1 | CHS0 | 00000000B |
ADC_FLAG:A/D 转换结束标志位。
EA = 1 且:
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 复位值 |
---|---|---|---|---|---|---|---|---|---|---|
IE | A8H | EA | ELVD | EADC | ES | ET1 | EX1 | ET0 | EX0 | 00000000B |
EADC:ADC中断允许控制位。
PWM 中断标志寄存器 PWMIF 和 PWM 外部异常控制寄存器 PWMFDCR:
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 复位值 |
---|---|---|---|---|---|---|---|---|---|---|
PWMIF | F6H | - | CBIF | C7IF | C6IF | C5IF | C4IF | C3IF | C2IF | X0000000B |
PWMFDCR | F7H | - | - | ENFD | FLTFLIO | EFDI | FDCMP | FDIO | FDIF | XX000000B |
① CBIF:PWM 计数器回0 中断标志位。PWM 计数器回0时硬件置1,申请中断。
② CnIF(n=2~7):第 n 通道的PWM 中断标志位。PWM 发生翻转时硬件置1,申请中断。
③ FDIF:PWM异常检测中断标志。
注意:
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 复位值 |
---|---|---|---|---|---|---|---|---|---|---|
PWMCR | F5H | ENPWM | ECBI | ENC7O | ENC6O | ENC6O | ENC6O | ENC6O | ENC6O | 00000000B |
PWMFDCR | F7H | - | - | ENFD | FLTFLIO | EFDI | FDCMP | FDIO | FDIF | XX000000B |
ECBI:PWM 计数器回 0 中断允许控制位。
EFDI:PWM 异常检测中断允许控制位。
比较控制寄存器 CMPCR1:
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 复位值 |
---|---|---|---|---|---|---|---|---|---|---|
CMPCR1 | E6H | CMPEN | CMPIF | PIE | NIE | PIS | NIS | CMPOE | CMPRES | 00000000B |
CMPIF:比较器中断标志。
PIE:比较器上升沿中断允许位。
NIE:比较器下降沿中断允许位。
中断优先级寄存器:
寄存器 | 地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 复位值 |
---|---|---|---|---|---|---|---|---|---|---|
IP | B8H | PPCA | PLVD | PADC | PS | PT1 | PX1 | PT0 | PX0 | 00000000B |
IP2 | B5HHH | - | - | - | - | PPWMFD | PPWM | PSPI | PS2 | XXXX0000B |
置1 为高优先级,0为低。
PPCA:PCA
PPLVD:低电压检测
PADC:ADC
PS:串口1
PT1/0:定时器1/0
PX1/0:外部中断 INT1/0
PPWMFD:PWM 异常检测
PPWM:PWM
PSPI:SPI
PS2:串口2
还存在着默认优先级(辅助优先级),即,同时申请中断时,中断号小的优先: