STC15F2K60S2系列单片机的PCA与PWM 例题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CCF1=0;
//清 0 PCA 模块 1 中断标志
}
}
例 11.4 利用 PCA 模块的软件定时功能,在 P1.5 引脚输出周期为 2S 的方波。设晶振频 率为 18.432MHZ.。
解:通过置位 CCAPM0 寄存器的 ECOM0 位和 MAT0 位,使 PCA 模块 0 工作于软件定 时器模式。定时时间的长短取决于 PCA 模块捕获寄存器(CCAPnH、CCAPnL)的值与 PCA 计数器的时钟源。本例中,系统频率不分频,即系统时钟频率等于晶振频率,所以 fSYS=18.432 MHz,可以选择 PCA 模块的时钟源为 fSYS/12,基本定时时间单位 T 为 5 mS。对 5 mS 计数 200 次,即可实现 1S 的定时,1S 时间到,对 P1.5 输出取反,即可实现在 P1.5 引脚输出周期 为 2S 的方波。通过计算,5 mS 对应的 PCA 计数器计数值为 1E00H,在初始化时,CH、CL 从 0000H 开始计数,将 1E00H 直接传送给 PCA 模块捕获寄存器(CCAPnH、CCAPnL),每 次 5 mS 时间到的中断服务程序中将该值加给(CCAPnH、CCAPnL)。
JC PCA_Interrupt_Exit ;检测是否中断了 200 次(1 秒),若还没到立即跳转退出
MOV Counter,#00H
CPL LED_1S_Flashing
PCA_Interrupt_Exit:
POP PSW
POP ACC
RETI
END
C51 参考程序如下:
#include“stc15f2k60s2.h”
CCAPM1=0x31; //设置 PCA 模块 0 下降沿和上升沿触发捕捉功能,并开放中断
EA=1;
//开放总中断
CR=1;
//启动 PCA 模块计数器计数
while(1);
}
void PCA_ISR(void)interrupt 7
//PCA 中断服务程序
{
if(CCF0)
{
//PCA 模块 0 中断服务程序
CH=0;
CCAP0L=0;
//给 PCA 模块 0 的 CCAP0L 置初值
CCAP0H=0xle;
CCAPM0=0x49; //设置 PCA 模块 0 为 16 位软件定时器
5
EA=1; CR=1; while(1); }
//开放 PCA 模块 0 中断 //开放总中断 //启动 PCA 计数器计数 //原地踏步,等待中断
解:通过置位 CCAPM1 寄存器的 ECOM1、MAT1 和 TOG1 位,使 PCA 模块 1 工作在高 速输出模式。本例中,系统频率不分频,即系统时钟频率等于晶振频率,所以 fSYS=18.432 MHz, 设选择 PCA 模块的时钟源为 fSYS/2,设高速输出所需的计数次数的用 CCAP1H_value 和 CCAP1L_value 表示,则计算如下:
;设置 PCA 模块 0 为 16 位软件定时器
;开放 PCA 模块 0 中断
EA
;开放总中断
CR
;启动 PCA 计数器(CH,CL)计数
RET
PCA_interrupt∶ PUSH ACC PUSH PSW CPL LED_5mS_Flashing
4
;5mS 中断一次, 每次进中断将该灯状态取反
MOV A,#Channe0_5mS_L ;给[CCAP0H,CCAP0L]增加 5mS 所需计数值
cnt=200;
//设置 5mS 计数器的初始值
CMOD=0x80;
//设置 PCA 在 空闲模式下停止 PCA 计数器工作
//PCA 模块的计数器时钟源源为 fSYS/12 //禁止 PCA 计数器溢出中断
CCON=0;
//清零 PCA 各模块中断请求标志位 CCFn
CL=0;
//PCA 计数器从 0000H 开始计数
if(cnt==0)
//如果 cnt 为 0,说明 1S 时间到
{
cnt=200;
//恢复中断计数初值
LED_1S_Flashing=!LED_1S_Flashing; //在 Pl.6 输出脉冲宽度为 1 秒钟的方波
}
}
例 11.5 利用 PCA 模块 1 进行高速输出,从 P1.6 输出频率 f 为 105KHZ 的方波信号。设 晶振频率为 18.432MHZ.。
;设置 PCA 在 空闲模式下停止 PCA 计数器工作
;PCA 模块的计数器时钟源源为 fSYS/10
1
MOV CCON, #00H MOV CL,#00H MOV CH,#00H
;禁止 PCA 计数器溢出中断 ;停止 PCA 计数器计数 ;清 0 PCA 计数器
MOV CCAPM0,#11H ;设置 PCA 模块 0 下降沿触发捕捉功能,
;点亮 MCU 开始工作指示灯
;清 0Counter 计数器 ;调 PCA 模块初始化程序
SJMP PCA_Initiate:
MOV
MOV MOV MOV MOV MOV
SETB SETB
$
CMOD, #80H
;设置 PCA 在 空闲模式下停止 PCA 计数器工作
;PCA 模块的计数器时钟源源为 fSYS/12
ADD A,CCAP0L
MOV CCAP0L,A
MOV A,#Channe0_5mS_H
ADDC A,CCAP0H
MOV CCAP0H, A
CLR CCF0
;清 0PCA 模块 0 的中断请求标志
INC Counter
;中断次数计数器+1
MOV A,Counter
CLR C
SUBB A,#200
;检测过什中断了 200 次(1 秒)
;开放 PCA 模块 0 中断
MOV CCAPM1, #31H ;设置 PCA 模块 1 下降沿和上升沿触发捕捉功能 ;开放 PCA 模块 1 中断
SETB EA
SETB CR
RET PCA_ISR∶
PUSH ACC
PUSH PSW JNB CCF0,NOT_PCA0
;如果 CCF0 为 1,执行 PCA 模块 0 中断服务程序 ;如果 CCF0 为 0,转执行 PCA 模块 1 中断标志判断
//包含 STC15F2K60S2 寄存器定义文件
{
LED_START=0;
CMOD=0x80;
//空闲模式下停止 PCA 模块计数,时钟源为 fSYS/10,
//禁止 PCA 计数器溢出中断
2
CCON=0;
//禁止 PCA 计数器计数
CL=0;
CH=0;
CCAPM0=0xll; //设置 PCA 模块 0 下降沿触发捕捉功能,并开放中断
void PCA_ISR(void)interrupt 7
//PCA 中断服务程序
{
union
//定义一个联合体
{
unsigned int num;
struct
{
//在联合体中定义-个结构
unsigned char Hi, Lo;
}Result;
}temp;
temp. Num=(unsigned int)(CCAP0H<<8)+CCAP0L+0xle00;
P1.7 连接开始工作指示灯,P1.6 连接 5 mS 闪烁指示灯,P1.5 连接 1S 闪烁指示灯,所有 LED 灯都是低电平驱动。
3
汇编语言参考程序如下:
பைடு நூலகம்
$INCLUDE (STC10C5A.INC) ;定义单片机管脚
;包含 STC15F2K60S2 寄存器定义文件
LED_MCU_START EQU Pl. 7
//包含 STC15F2K60S2 寄存器定义文件
sbit LED_MCU_START=Pl^7;
sbit LED_ 5mS_Flashing=Pl^6;
sbit LED_1S_Flashing=Pl^5;
unsigned char cnt;
void main(void)
{
LED_MCU_START=0;
LED_PCA0_INT0=!LED_PCA0_INT0;
//LED_PCA0 取反输出,表示 PCA 模块 0 发生了中断
CCF0=0;
//清 0 PCA 模块 0 中断标志
}
else if(CCF1)
{
//PCA 模块 0 中断服务程序
LED_PCA1_INT1=!LED_PCA1_INT1;
//LED_PCA1 取反输出,表示 PCA 模块 1 发生了中断
LED_ 5mS_Flashing EQU Pl.6
LED_1S_Flashing EQU P1.5 ;定义常量
Channe0_5mS_H Channe0_5mS_L ;定义变量
EQU EQU
1EH ;模块 0 5mS 定时时间常数的高 8 位 00H ;模块 0 5mS 定时时间常数的低 8 位
Counter EQU 30H
ORG 003BH
;PCA 中断的中断矢量地址
LJMP PCA_ISR
ORG 0050H
MAIN∶
MOV SP,#7FH
CLR LED_ START
;点亮开始工作指示灯
LCALL PCA_INITIATE
;调 PCA 模块初始化程序
SJMP $
;原地踏步
PCA_INITIATE∶
MOV CMOD,#80H
汇编语言参考程序如下:
∶定义单片机管脚
$INCLUDE (STC15F2K60S2.INC)
;包含 STC15F2K60S2 寄存器定义文件
LED_ START
EQU P1.7
;定义输出引脚
LED_PCA0_INT0 EQU Pl.6
LED_PCA1_INT1 EQU Pl.5
ORG 0000H
LJMP MAIN
② 设置捕捉寄存器 CCAPnL(低位字节)和 CCAPnH(高位字节)初值。
③ 根据需要,开放 PCA 中断,包括 PCA 定时器溢出中断(ECF)、PCA 模块 0 中断(ECCF0)
和 PCA 模块 1 中断(ECCF1),并将 EA 置 l。
④ 置位 CR,启动 PCA 定时器计数(CH,CL)计数。
CCAP0L=temp.Result.Lo; // 取计算结果的低 8 位
CCAP0H=temp.Result.Hi; // 取计算结果的低 8 位
CCF0=0;
// 清 0PCA 模块 0 中断请求标志
LED_ 5mS_Flashing=!LED_ 5mS_Flashing;
cnt--;
//中断次数计数器减 1
输出驱动工作指示灯。
解:与定时器的使用方法类似,PCA 模块的应用编程主要有两点:一是正确初始化,包
括写入控制字、捕捉常数的设置等;二是中断服务程序的编写,在中断服务程序中编写需要
完成的任务的程序代码。PCA 模块的初始化部分大致如下:
① 设置 PCA 模块的工作方式,将控制字写入 CMOD、CCON 和 CCAPMn 寄存器。
;禁止 PCA 计数器溢出中断
CL,#00H
;设置 PCA 定时器计数的初始值
CH,#00H
CCAP0L,#Channe0_5mS_L ;给 PCA 模块 0 的 CCAP0L 赋定时初值
CCAP0H,#Channe0_5mS_H ;给 PCA 模块 0 的 CCAP0L 赋定时初值
CCAPM0,#49H
CPL LED_PCA1_INT1 CLR CCF1 PCA_ISR_ EXIT∶
;Pl.5 LED 变化一次,表示 PCA 模块 1 发生了一次中断
;清 0 PCA 模块 1 中断请求标志
POP PSW
POP ACC
RETI
END
C51 参考程序如下
#include“STC15F2K60S2.h” sbit LED_PCA0_INT0=Pl^5; sbit LED_PCA1_INT1=Pl^6; sbit LED_START=Pl^7; void main(void)
第 11 章 STC15F2K60S2 单片机 CCP/PCA/PWM 模块
例题
例 11.3 利用 PCA 模块扩展外部中断。将 PCA0(P1.1)引脚扩展为下降沿触发的外部中
断,将 PCA1(Pl.0)引脚扩展为上升沿/下降沿都可触发的外部中断。当 Pl.1 出现下降沿产
生中断时,对 P1.5 取反;当 Pl.0 出现下降沿或上升沿时都会产生中断,对 P1.6 取反。P1.7
CPL LED_PCA0_INT0
;Pl.6 LED 变化一次,表示 PCA 模块 0 发生了一次中断
CLR CCF0
;清 0 PCA 模块 0 中断请求标志
NOT_PCA0∶
JNB CCF1,PCA_ISR_EXIT ;如果 CCF1 为 0,则不是 PCA 模块 1 中断,立即推出
;如果 CCF1 为 1,执行 PCA 模块 1 中断服务程序
;定义一个计数器,用来计数模块 0 5mS 中断的次数
ORG 0000H
LJMP MAIN
ORG 003BH
LJMP PCA_interrupt
MAIN:
ORG 0050H CLR LED_MCU_START MOV SP, #7FH MOV Counter,#0 LCALL PCA_Initiate