第7章中断控制定时计数器及PCAPWM的应用
定时器和中断

定时器和中断的应用前景
工业自动化
定时器和中断在工业自动化领域具有广泛 的应用前景,如生产线控制、机器人控制
等。
智能交通
在智能交通领域,定时器和中断可以实现 交通信号灯的智能控制和车辆的自动化调
度。
智能家居
在智能家居领域,定时器和中断可以实现 家电的智能控制和自动化管理,提高生活 品质。
医疗设备
在医疗设备领域,定时器和中断可以实现 医疗设备的自动化控制和精确计时,提高 医疗设备的可靠性和安全性。
定义
中断是一种硬件或软件事件,它能够打断正在执行的程序,并将其控制权交给 中断处理程序。
作用
中断是计算机系统中非常重要的机制,它使得CPU能够响应各种突发事件,如 硬件故障、外部信号、定时器超时等,从而实现多任务并发处理和实时性要求。
中断的分类
硬件中断
由硬件设备产生的中断,如键 盘输入、时钟中断等。
中断
用于需要实时响应的场景,如键盘输 入、串口通信等。
04
定时器的应用
BIG DATA EMPOWERS TO CREATE A NEW
ERA
定时器的使用场景
01
02
03
04
时间基准和同步
用于提供稳定的时间基准,如 系统时钟。
任务调度
用于安排任务在特定时间执行 。
性能测试和测量
用于测量代码执行时间或系统 性能。
网络定时器
用于网络通信的定时器, 如用于数据包发送间隔控 制的定时器。
定时器的工作原理
硬件定时器工作原理
基于硬件电路的定时器通常由振荡器和计数器组成,振荡器产生固定频率的脉冲信号,计 数器对脉冲信号进行计数,当计数达到预设值时,产生中断或触发信号。
PWM模块应用

PWM模块及应用本文介绍的PWM模块是基于TMS320F2808。
对其模块的主要构成和功能进行了介绍,并利用该模块产生了给定频率的SPWM波。
F2808ePWM模块包含2组完整的ePWM模块:ePWMxA和ePWMxB。
如下图所示,这些ePWM模块通过一个同步时钟信号联系在一起,当需要的时候可以将这些模块看做是分开对立的系统。
对于产生单相的SPWM波,使用ePWM1模块即可。
ePWM模块包含以下子模块:时基子模块、计数子模块、动作限定子模块、死区生成子模块、PWM输出断路器子模块、TZ子模块、事件触发子模块。
每个ePWM模块的详细电路框图如下:1、 时基子模块与PWM 周期的确定每个ePWM 都有自己独立的时基子模块这些时基子模块确定了每个ePWM 模块的事件时间。
这些ePWM 模块在同步时钟下是独立的系统。
PWM 的周期和频率由时基周期寄存器(TPBRD )的值和时基计数器的模式共同的决定。
选择连续增减计数模式则周期为:TBCLK T TPBRD T ⨯⨯=2对于一个调制波为30Hz 的正弦波,开关频率为20KHz ,令时基时钟的分频值等于系统时钟的值为100MHz 。
此时TPBRD 的值应该为2500。
时基相位寄存器设置为0。
2、比较计数子模块比较数子模块将时基计数器的值与比较计数器的值进行比较,当时基计数器的值与比较计数器的值相等时,比较计数子模块将产生相应的事件。
比较计数子模块通过2个比较计数器来产生2个独立的比较事件,对于增减计数模式,当比较计数器的值在0-TPBRD之间时,每个周期发生两次比较事件。
这些事件将送到动作限定子模块去。
对于SPWM的生成,通过改变计数比较器的值就产生了正弦的调制波。
利用这两个比较器变可以产生单相的SPWM波。
3、动作限定子模块对于SPWM的生成,通过改变计数比较器的值就产生了正弦的调制波。
利用这两个比较器变可以产生单相的SPWM波。
动作限定子模块对PWM波形的产生有重要的作用,它将不同的事件转换为不同的动作,产生不同波形的ePWM输出。
PWM的控制

第14章
PWM的控制
14.4 程序编写 案例:是一个LED 灯从亮到暗,再从 暗到亮。
流程图如 右图
THANK YOU VERY MUCH !
本章到此束, 谢谢您的临!
PWM的控制
面积等效原理:
分别将如图1所示的电压窄脉冲加在一阶惯性 环节(R-L电路)上,如图2a所示。其输出电流 i(t)对不同窄脉冲时的响应波形如图2b所示。从 波形可以看出,在i(t)的上升段,i(t)的形状也略 有不同,但其下降段则几乎完全相同。脉冲越窄, 各i(t)响应波形的差异也越小。如果周期性地施 加上述脉冲,则响应i(t)也是周期性的。用傅里 叶级数分解后将可看出,各i(t)在低频段的特性 将非常接近,仅在高频段有所不同。
位
7
6
CR
5
-
4
-
3
-
2
-
1
0
符号 CF
CCF1 CCF0
第14章
PWM的控制
描述 PCA计数器阵列溢出标志 PCA计数器阵列运行控制位
CCON 寄存器的具体描述
位 7 6 1 0 符号 CF CR
5-2 -
保留为将来之用
CCF1 PCA模块1中断标志 CCF0 PCA模块0中断标志
第14章
PWM的控制
4
3 2 1 0
CAPNn 负捕获。下降沿有效
MATn T0Gn PWMn 匹配 翻转 脉宽调制模式。
ECCFn 使能CCFn中断
第14章
PWM的控制
(2)STC12C5410AD单片机实现PWM的原理 当CL SFR的值小于{EPCnL,CCAPnL}时,输出 为低。当PCA CL SFR的值大于或等于 {EPCnL,CCAPnL}时,输出为高。当CL的值由 FF变为00溢出时, {EPCnH,CCAPnH}的内容装 载到{EPCnL,CCAPnL}中。这样就可以实现无干 扰地更新PWM,要使用PWM模式,模块 CCAPMn寄存器PWMn和ECOMn位必须复位。
宏晶科技STC12C5410AD系列单片机器件手册说明书

STC12C5410AD系列单片机器件手册 --- 1个时钟/机器周期8051 ---无法解密 ---低功耗,超低价 ---高速,高可靠 ---强抗静电,强抗干扰STC12C5412, STC12C5412ADSTC12C5410, STC12C5410ADSTC12C5408, STC12C5408ADSTC12C5406, STC12C5406ADSTC12C5404, STC12C5404ADSTC12C5402, STC12C5402ADSTC12LE5412,STC12LE5412ADSTC12LE5410,STC12LE5410ADSTC12LE5408,STC12LE5408ADSTC12LE5406,STC12LE5406ADSTC12LE5404,STC12LE5404ADSTC12LE5402,STC12LE5402AD技术支援:宏晶科技(深圳) www.MCU-Memory.com support@MCU-Memory.comUpdate date: 2006-4-15 (请随时注意更新)宏晶科技:专业单片机/存储器供应商 www.MCU-Memory.com STC12C5410AD系列 1T 8051单片机中文指南2领导业界革命 覆盖市场需求宏晶科技是新一代增强型8051单片机标准的制定者,致力于提供满足中国市场需求的世界级高性能单片机技术,在业内处于领先地位,销售网络覆盖全国。
在保证质量的基础上,以极低的价格和完善的服务赢得了客户的长期信赖。
在广受欢迎的STC89C51全系列单片机的基础上,现全力推出“1个时钟/机器周期”的单片机,全面提升8051单片机性能。
欢迎海内外厂家前来洽谈合作!新客户请直接联系深圳,以获得更好的技术支持与服务。
STC 12C5410AD系列 1T 8051 单片机 新客户请直接联系深圳以获得更好的技术支持和服务 欢迎海内外厂家前来洽谈合作 传真至深圳申请STC单片机 样片及ISP下载线/编程工具●高速:1个时钟/机器周期,RISC型8051内核,速度比普通8051快12倍●宽电压:5.5~3.4V,2.0~3.8V(STC12LE5410AD系列)●低功耗设计:空闲模式,掉电模式(可由外部中断唤醒)●工作频率:0~35MHz,相当于普通8051:0~420MHz ---实际可到48MHz,相当于8051: 0~576MHz●时钟:外部晶体或内部RC振荡器可选,在ISP下载编程用户程序时设置●12K/10K/8K/6K/4K/2K字节片内Flash程序存储器,擦写次数10万次以上●512字节片内RAM数据存储器●芯片内E2PROM功能●ISP / IAP,在系统可编程/在应用可编程,无需仿真器●10位ADC,8通道,STC12C2052AD系列为8位ADC●4通道捕获/比较单元(PWM/PCA/CCU),STC12C2052AD系列为2通道 ---也可用来再实现4个定时器或4个外部中断(支持上升沿/下降沿中断)●2个硬件16位定时器,兼容普通8051的定时器。
单片机中断系统和定时计数器

单片机中断系统和定时计数器在单片机的世界里,中断系统和定时计数器就像是两个得力的助手,为单片机的高效运行和精确控制发挥着至关重要的作用。
接下来,让我们一起深入了解一下这两个重要的概念。
首先,咱们来聊聊中断系统。
想象一下,单片机正在专心致志地执行着一个任务,突然有个紧急情况发生了,比如外部设备传来了一个重要的数据需要立即处理。
这时候,中断系统就像是一个“紧急警报器”,让单片机暂停当前的任务,迅速去处理这个紧急情况。
处理完之后,再回到原来被中断的地方继续执行之前的任务。
中断系统的好处那可太多了。
它大大提高了单片机的工作效率。
要是没有中断,单片机就得一直按照顺序依次执行任务,可能会错过一些关键的信息或者无法及时响应紧急事件。
有了中断,单片机就能在多个任务之间灵活切换,做到“分身有术”。
中断系统一般由中断源、中断允许控制、中断优先级控制和中断响应等部分组成。
中断源就是那些能引起中断的事件,比如外部中断、定时器中断、串口中断等等。
中断允许控制就像是一道“开关”,决定了是否允许某个中断源发出中断请求。
中断优先级控制则是用来确定当多个中断同时发生时,先处理哪个中断,后处理哪个中断。
再来说说定时计数器。
在很多实际应用中,我们经常需要对时间进行精确的测量和控制,这时候定时计数器就派上用场了。
比如说,我们要控制一个小灯每隔1 秒钟闪烁一次,或者要统计外部脉冲的个数,都可以用定时计数器来实现。
定时计数器的工作原理其实并不复杂。
它就像是一个不断计数的“小闹钟”。
可以设置为定时模式或者计数模式。
在定时模式下,它根据单片机内部的时钟信号进行计数,当计数值达到设定的值时,就会产生一个定时中断。
在计数模式下,它对外部输入的脉冲进行计数,当计数值达到设定值时,也会产生中断。
比如说,我们要实现一个 1 毫秒的定时,假设单片机的时钟频率是12MHz,那么一个机器周期就是 1 微秒。
如果我们要定时 1 毫秒,就需要设置定时计数器的初值,让它经过 1000 个机器周期后产生中断。
STCMCU的软件和硬件PCAPWM输出

STCMCU的软件和硬件PCAPWM输出软件⽅式输出PWMPWM⽤于输出强度的控制, 例如灯的亮度, 轮⼦速度等, STC89/90系列没有硬件PWM, 需要使⽤代码模拟使⽤纯循环的⽅式实现PWM⾮中断的实现(SDCC环境编译)#include <8052.h>#define Led10 P0_7typedef unsigned int u16;int atime = 64;// 仅作为延时, pms取值区间为 0 - 64void delay(u16 pms) {u16 x, y;for (x=pms; x>0; x--) {for (y=11; y>0; y--);}}// 这⾥控制占空⽐, i取值区间为 0 - 64,// i越⼤脉冲宽度越低, 因为输出是低位点亮, 所以i越⼤LED越亮void ledfade(u16 i) {Led10 = 0;delay(i);Led10 = 1;delay(atime-i);}int main(void) {u16 a, b;// 每个循环, ⼩灯while(1) {// a增⼤, 脉冲宽度降, 亮度增for (a=0; a<atime; a++) {for (b=0; b < (atime - a)/4; b++) {ledfade(a);}}// a减⼩, 脉冲宽度增, 亮度降for (a=atime; a>0; a--) {for (b=0; b < (atime - a)/4; b++) {ledfade(a);}}}}使⽤中断的⽅式因为需要PWM输出的场景, ⼀般都不会仅仅有PWM输出, 所以通常会做到定时器中断中, 由中断来实现将1和0的时间宽度设置为定时器, 直接做到定时器中断⾥⾯这个代码中1. pwm_flag代表了输出的0和1, 每次定时器中断时进⾏切换, 并设置下⼀次中断的时间宽度2. 缺点: ⽤TR0做开关, 但是这种停⽌⽅式, 停⽌后输出可能还是1/* Global variables and definition */#define PWMPIN P1_0unsigned char pwm_width;bit pwm_flag = 0;void pwm_setup(){TMOD = 0; // Timer mode 0, 13bitpwm_width = 160;EA = 1;ET0 = 1;TR0 = 1;}/* Timer 0 Interrupt service routine */void timer0() interrupt 1{if (!pwm_flag) { /* Start of High level */pwm_flag = 1; /* Set flag */PWMPIN = 1; /* Set PWM o/p pin */TH0 = pwm_width; /* Load timer */TF0 = 0; /* Clear interrupt flag */} else { /* Start of Low level */pwm_flag = 0; /* Clear flag */PWMPIN = 0; /* Clear PWM o/p pin */TH0 = 255 - pwm_width; /* Load timer */TF0 = 0; /* Clear Interrupt flag */}}void pwm_stop(){TR0 = 0; /* Disable timer to disable PWM */}使⽤定时器模式2和中断实现的PWM输出使⽤定时器⼯作模式2定时器通过对变量tt做计数, 与scale做⽐较, 确定是否翻转电压这⾥scale分10个等级, scale=1时占⽐1/10个PWM周期(250us * 10 = 2.5ms), 在主循环⾥改变scale因为是低电平点亮LED, 所以tt<=scale的时间LED是暗的, scale增⼤时亮度变⼩, 这个可以根据⾃⼰电路的情况调整这样存在的问题是修改scale的值时, 可能正好在tt计数范围的中间, 导致输出出现⽑刺, 可以通过增加⼀个中间变量来解决, 在tt计数时⽐较的是这个中间变量, 在周期结束时再⽤新值更新这个中间变量#include<reg51.h>sbit P10 = P1^0;sbit P11 = P1^1;unsigned int scale; //占空⽐控制变量void main(void) {unsigned int n; //延时循环变量TMOD = 0x02; //定时器0,⼯作模式2, 8位定时, TL0溢出时⾃动重载TH0中的值TH0 = 0x06; //定时, 250us⼀个中断 (12M晶振, 12分频后1MHz, 单次1us)TL0 = 0x06; //初始值TR0 = 1; //启动定时器0ET0 = 1; //启动定时器0中断EA = 1; //开启总中断while(1) {for(n = 0; n < 50000; n++); //延时50msscale++; //占空⽐控制, ⾃增if(scale == 10) scale = 0; //使占空⽐从0-10循环变化}}timer0() interrupt 1 {static unsigned int tt; //tt⽤来保存当前时间在⼀个时钟周期的位置tt++; //每中断⼀次,即每经过250us,tt的值⾃加1if (tt == 10) { //中断10次定时2.5mstt = 0; //使tt=0,开始新的周期,达到循环的效果P10 = 0; //点亮LED}if (tt <= scale) { //如果占空⽐与中断次数相同时,此时输出⾼电平P10 = 1; //熄灭LED灯}}使⽤定时器模式2和中断实现的多路PWM输出实现多路PWM输出的思路1. 使⽤⼀个基础定时器, 定时器时间不能太⼤, 例如设置为100us, 可以⽤定时器模式2, 这样初始值能⾃动重置2. 设定⼀个PWM周期, 这个周期就是定时器间隔的整数倍, 例如10倍定时器周期, 就是1000us = 1ms3. 对于每个PWM通道设置⼀个计数, 计数在达到PWM周期时置零, 这是实现PWM周期的基础设置⼀个初始输出, ⾼电平或低电平设置⼀个输出宽度, 计数达到这个宽度值时翻转. 这个宽度决定了输出翻转的时间, ⽤于控制占空⽐4. 因为每个指令的执⾏时间需要1-2个CPU周期, 所以当通道数增加后, 误差会增⼤代码例⼦: 这⾥⽤8个位指定4个轮⼦的PWM输出, 每个轮⼦两位是为了控制轮⼦的正反向#include <reg52.h>typedef unsigned int u16;typedef unsigned char u8;// Wheel 0sbit P1_0 = P1^0;sbit P1_1 = P1^1;// Wheel 1sbit P1_2 = P1^2;sbit P1_3 = P1^3;// Wheel 2sbit P1_4 = P1^4;sbit P1_5 = P1^5;// Wheel 3sbit P1_6 = P1^6;sbit P1_7 = P1^7;/*Duty Cycle = Toogle_P1_x / PWM_Period;*/u8 PWM_Period = 128; // PWM Period = N * Timer delay(100us), between 10 - 254 u8 Toggle_W0 = 0; // Toggle of Wheel 0u8 Dir_W0 = 0; // Direction, 0:P1_0=0,P1_1=PWM, 1:P1_1=0,P1_0=PWMu8 Toggle_W1 = 0; // Toggle of Wheel 1u8 Dir_W1 = 0; // Direction, 0:P1_2=0,P1_3=PWM, 1:P1_3=0,P1_2=PWMu8 Count_W0, Count_W1;void Time0_Init(void){TMOD = 0x02; // Mode 2, 8-bit and auto-reloadTH0 = 0x9C; // 0x9c = 156, timer of 100us (12MHz OSC)TL0 = 0x9C;ET0 = 1;EA = 1;TR0 = 1;EX0 = 1; EX1 = 1; // Enable external interrupt 0 and 1IT0 = 1; IT1 = 1; // Toggle = jump}void main(){Time0_Init();while(1);}void Timer0_IT() interrupt 1{// W0if(Count_W0 == Toggle_W0) {if (Dir_W0 == 0) { // P1_1=PWMP1_1 = 0;} else { // P1_0=PWMP1_0 = 0;}}if(Count_W0 == PWM_Period - 1) {Count_W0 = 0;if (Dir_W0 == 0) {P1_0 = 0;P1_1 = 1;} else {P1_0 = 1;P1_1 = 0;}} else {Count_W0++;}// W1if(Count_W1 == Toggle_W1) {if (Dir_W1 == 0) { // P1_3=PWMP1_3 = 0;} else { // P1_2=PWMP1_2 = 0;}}if(Count_W1 == PWM_Period - 1) {Count_W1 = 0;if (Dir_W1 == 0) {P1_2 = 0;P1_3 = 1;} else {P1_2 = 1;P1_3 = 0;}} else {Count_W1++;}}// W0 dir0->maxvoid W0_dir0(void){if (Dir_W0 == 0) {Toggle_W0++;if(Toggle_W0 > PWM_Period) { Toggle_W0 = PWM_Period; }} else {Toggle_W0--;if(Toggle_W0 == 0) {Dir_W0 = 0;}}}// W0 dir1->maxvoid W0_dir1(void){if (Dir_W0 == 0) {Toggle_W0--;if(Toggle_W0 == 0) {Dir_W0 = 1;}} else {Toggle_W0++;if(Toggle_W0 > PWM_Period) { Toggle_W0 = PWM_Period; }}}// W1 dir0->maxvoid W1_dir0(void){if (Dir_W1 == 0) {Toggle_W1++;if(Toggle_W1 > PWM_Period) { Toggle_W1 = PWM_Period; }} else {Toggle_W1--;if(Toggle_W1 == 0) {Dir_W1 = 0;}}}// W1 dir1->maxvoid W1_dir1(void){if (Dir_W1 == 0) {Toggle_W1--;if(Toggle_W1 == 0) {Dir_W1 = 1;}} else {Toggle_W1++;if(Toggle_W1 > PWM_Period) { Toggle_W1 = PWM_Period; }}}void IT0_INT() interrupt 0{W1_dir0();}void IT1_INT() interrupt 2{W1_dir1();}硬件PWM51系列单⽚机的增强型版本, 有些带PCA(Programmable Counter Array 可编程计数序列)模块, 可以通过PCA实现PWM的输出.PCA介绍PCA其实就是⼀个增强型的计数器, 这个计数器中的⼀些元素是可以在代码中设置的, 例如可以设置的计数脉冲源, 可以来⾃于系统时钟, 系统时钟可以是不分频, 2分频, 4分频, 6分频, 8分频等; 来⾃计数器; 来⾃外部输⼊的时钟可以设置计数的触发条件, 上升沿还是下降沿, 或者都计数. 最后这个计数⽅式, 可以⽤来计算脉宽可以设置16位的⽐较值不占⽤CPU资源, 这点很重要, 可以使输出更加精确和稳定因为上⼀点, 有些型号可以做到在CPU处于IDLE状态时继续计数(输出)可以⽤PCA实现PWM输出功能STC12C5A60S2系列PCA实现的PWM参考STC12C5A60S2的⼿册有两路输出, 默认PWM0:P1.3, PWM1:P1.4, 可以换到P4⼝: PWM0:P4.2, PWM1:P4.3这个在AUXR1⾥⾯控制两路共⽤PCA定时器, 定时器的频率由CMOD控制因为PWM输出是8位的, 所以定时器的频率/256就是PWM频率两路输出的占空⽐是独⽴变化的, 与当前的[EPCnL, CCAPnL]的值有关前者的值在 PCA_PWM0 PCA_PWM1 ⾥控制后者的值在 CCAP0L,CCAP0H 和 CCAP1L,CCAP1H ⾥控制先输出低, 当CL的值⼤于等于[EPCnL, CCAPnL]时, 输出为⾼当CL由FF变为00时, 输出变低, 同时⾃动将[EPCnH, CCAPnH]的值装载到[EPCnL, CCAPnL], 实现⽆⼲扰更新PWM占空⽐下⾯的代码中, CCAP1H 控制的就是装载值, CCAP1L 控制的是⽐较值, PCA_PWM1 控制的是EPCnH 和 EPCnL如果 EPCnL = 0, 那么正常输出如果 EPCnL = 1, 那么会⼀直输出低电平#include <STC12C5A60S2.H>void main() {CCON = 0; // Initial PCA control register// PCA timer stop running// Clear CF flag// Clear all module interrupt flagCL = 0; // Reset PCA base timerCH = 0;CMOD = 0x02; // Set PCA timer clock source as Fosc/2// Disable PCA timer overflow interruptCCAP0H = CCAP0L = 0x80; // PWM0 port output 50% duty cycle suquare waveCCAPM0 = 0x42; // PCA module-0 as 8-bit PWM, no PAC interruptCCAP1H = CCAP1L = 0xFF; // PWM1port output 0% duty cycle square wavePCA_PWM1 = 0x03; // PWM will keep low levelCCAPM1 = 0x42; // PCA module-0 as 8-bit PWM, no PAC interruptCR = 1; // PCA timer start runwhile(1);}对PCA_PWM1的说明;PCA_PWMn: 7 6 5 4 3 2 1 0; EBSn_1 EBSn_0 - - - - EPCnH EPCnL;B5-B2: 保留;B1(EPCnH): 在PWM模式下,与CCAPnH组成9位数。
物联网应用实训-PWM占空比控制

应用技术基础训练
PWM占空比控制程序设计
能力目标: 1.掌握PWM概念与工作原理 2.能够采用定时器中断方式实现PWM及占空比 3.能够采用内置PWM控制器实现PWM及占空比 4.能够在LED上实现呼吸灯效果 5.能够在直流电机上实现速度控制
一、PWM的概念与工作原理
PWM (脉冲宽度调制),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用 微处理器的数字输出来对模拟电路进行控制的 一种非常有效的技术,广泛应用在从测量、通 信、功率控制与变换的许多领域中。
定时器/计数器基本结构图
定时器/计数器工作原理
在作定时器使用时,输入的时钟脉冲是由晶体 振荡器的输出经12分频后得到的。实际上,定 时器就是单片机机器周期的计数器。因为每个 机器周期包含晶体振荡器的12个振荡周期,而 每一个机器周期定时器加1,故其频率为晶振 频率的1/12。如果晶振频率为12MHz,则定时 器每接收一个输入脉冲的时间为1μs。 选择计数器工作方式时,计数脉冲来自相应的 外部输入引脚T0(P3.4)或T1(P3.5)。在这 种情况下,当检测到输入引脚上的电平由高跳 变到低时,计数器就加1。
PWM的概念
简而言之,PWM是一种对模拟信号电平进行数 字编码的方法。通过高分辨率计数器的使用, 方波的占空比被调制用来对一个具体模拟信号 的电平进行编码。 PWM信号仍然是数字的,因为在给定的任何时 刻,满幅值的直流供电要么完全有(ON),要么 完全无(OFF)。电压或电流源是以一种通(ON) 或断(OFF)的重复脉冲序列被加到模拟负载上 去的。通的时候即是直流供电被加到负载上的 时候,断的时候即是供电被断开的时候。只要 带宽足够,任何模拟值都可使用PWM进行编码。
中断定时计数器课件

例 5 编写一段程序,功能要求为:当P1.0引脚的电平正跳变时,对P1.1的输入脉冲 进行计数;当P1.2引脚的电平负跳变时,停止计数,并将计数值写入R0、R1(高位 存R1,低位存R0)。 解答:将P1.1的输入脉冲接入INT0,即使用T0计数器完成对P1.1口的脉冲计数。编写程 序如下: ORG 0000H LJMP MAIN ORG 000BH LJMP IT0P MAIN: JNB P1.0,MAIN MOV TMOD,#05H ;定 时器/计数器T0为计数方式1 SETB TR0 ;启动T0,开 始计数 SETB ET0 ;允许T0中断 SETB EA ;CPU开中断 WAIT: JB CLR CLR MOV MOV AJMP INC RETI P1.2,WAIT EA TR0 R1,TH0 R0,TL0 $ R2
ORG 000BH CPL P1.0 MOV TL0, #9CH RETI ORG 001BH CPL P1.1 MOV TH0, #38H RETI ;TL0 中断服务程序 ;P1.0 取反 ;重新装入计数初值 ;中断返回 ;TH0 中断服务程序 ;P1.1取反 ;重新装入计数初值 ;中断返回
AJMP DEL REP:CPL P1.0 AJMP DEL ; ;若计数溢出,则输出取反
TINT0: JNB 20H.0,NEXT MOV TL0,#0B5H MOV TH0,#0FFH CLR P1.1 CPL 20H.0 SJMP LAST NEXT: MOV TL0,#0CEH MOV TH0,#0FFH SETB P1.1 CPL 20H.0 LAST:RETI
方法二: 采用方式2 定时器中断 加延时程序
ORG 0000H LJMP MAIN ORG 000BH LJMP IT0P MAIN: MOV TMOD,#02H;定时器/ 计数器T0为定时方式2 IT0P:CLR EA MOV TL0,#4AH;定时 CLR P1.0 ;关中断 364μs初值赋值 MOV R0,#9 ;延时26μs SETB TR0;启动T0,开始 DLY:DJNZ R0,DLY MOV TL0,#4AH ;定时364μs 计数 初值赋值 SETB ET0;允许T0中断 SETB P1.0 SETB EA;CPU开中断 SETB EA RETI SETB P1.0 WAIT: AJMP WAIT
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
11
中断优先级控制寄 7.2中断系统的结构 存器IP、IP2和 IPH、IP2H
12
7.3中断寄存器
D7 PPCA D6 PLVD
IP寄存器的地址为 B8H,可进行位寻 址 2.中断优先级控制寄存器IP、IP2和IPH、IP2H
D5 PADC
D4 PS
D3 PT1
D2 PX1
D1
D0
IPH寄存器的地址 为B7H PT0,不能进行 PX0 位寻址
4
中断的作用:
• • • 对突发事故,做出紧急处理。 根据现场随时变化的各种参数、信息,做出实时监控。
CPU与外部设备并行工作,以中断方式相联系,提高工作效率。
•
•
解决快速CPU与慢速外设之间的矛盾。
在多项外部设备同时提出中断请求情况下,CPU能根据轻重 缓急响应外设的中断请求。
5
7.1 中断的概念
9
7.2中断系统的结构
10
7.2中断系统的结构
• STC系列单片机复位后,IE和IE2寄存器的各位均 被清0,即所有中断源均处于禁止状态,由用户程 序对寄存器IE和IE2相应的位置1或清0,实现允许 或禁止各中断源的中断请求。 • 要改变IE寄存器各控制位的状态既可以用字节操 作指令MOV IE,#DATA来实现,也可用位操作指 令SETB或CLR实现。 • 改变IE2寄存器的各控制位,只能用字节操作指令 来实现,如:MOV IE2,#DATA。
23
7.5外部中断
IT0
IE0
注意:如果外部中断设置为下降沿触发方式时,必须在该外 部中断输入引脚至少保持1个系统时钟周期的高电平及1个时钟 周期的低电平,才能保证CPU检测到该下降沿。同样,如果外 部中断为低电平触发,则须在该引脚至少保持2个系统时钟周期 的低电平,这样才能保证CPU能够检测到该低电平信号。
D1 PD
D0 IDL
SMOD SMOD0 LVDF
POF
GF1
GF0
烧写程序时可以将P4.6引脚 若烧写程序时没有将 P4.6 引脚 设置为第二复位引脚 RST2 , 设置为第二复位引脚RST2, P4.6为低压检测中断引脚 EX_LVD
注意:上电复位后 ,电源控制寄存器PCON中的外部低压检测标 当外部供电电压产生波动时,无法保证单片机正常工作,可 志位 LVDF为1,要由软件清零(注意该位不可位寻址),建议清 以在单片机的外部低压检测中断服务程序中保存相关数据,避 零后,再读一次该位,若仍然为 1,说明电源还未达到正常值, 21 免掉电后数据丢失。 应再次将该位清零,直至检测到该位为0时再转入正常运行
7.5外部中断
外部中断0输入引脚
外部中断1输入引脚
22
7.5外部中断
TCON寄存器的地址为88H,可进行位寻址 D7 D6 D5 D4 D3 D2 D1 D0
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
IT1:外部中断1触发方式选择位。若 外部中断1请求中断标志。若外部中断 1输入引 外部中断 0请求中断标志。若外部中断 0输入引脚 IT1=0 , 引脚输入低电平信号触发中 外部中断 0 触发方式选择位。若 IT0=0, 脚产生外部触发信号时,硬件将 IE1, 位置 1,外 产生外部触发信号时,硬件将 IE0位置1,外部中 断;若 IT1=1 引脚为下降沿触发方 引脚输入低电平信号触发外部中断;若 部中断1设置为下降沿触发方式时, CPU响应 断0设置为下降沿触发方式时,当 CPU响应该中 式 IT0=1 , 引脚为下降沿触发方式 该中断时由硬件自动将 IE1位清0,如果设置为 断时由硬件自动将 IE0清0 ,如果设置为低电平触 低电平触发方式,必须在程序中通过指令清 0 发方式,必须在程序中通过指令清 0
2.中断优先权控制 当有中断请求 3. 中断允许与中断屏蔽 CPU同一时间只能响应一个中断 时,如果CPU 正在执行某一 请求。若同时来了两个或两个以 4. 中断响应与中断返回 在中断系统中,有一 条指令,需要 上 中断 请求,就必须有先有 个总中断使能位控制 执行完当前指 后。 !!! 所有中断是否允许, 令后再响应中 断,如果正在 另外每个中断源还有 执行RETI,或 各自的中断使能位控 者是访问IE、 制该中断是否允许, IP寄存器指令 时,需要执行 只有在总的中断允许 完当前指令后, 及相应中断也允许时, 再执行一条指 CPU才能响应中断。另 令才响应中断。 外,当有高优先级中 断正在响应时,也会 屏蔽同级中断和低优 先级中断。
8
7.3中断寄存器
1.中断允许寄存器IE2 IE2的地址为AFH,不能进行位寻址
D7
-
D6
-
D5
-
D4
-
D3
-
D2
-
D1
ESPI
D0
ES2
串行口2中断允许控制位。 SPI串行通信中断允许位。 当ES2= 0时,禁止串行口 2 ESPI=0时,禁止 SPI 中断; 中断;当 ES2 =1时,允许 当ESPI=1 ,允许SPI 中断 串行口2中断
第7章 中断控制、定时/计数器及 PCA/PWM的应用
2
主要内容
• • • • • • • • • 7.1 中断的概念 7.2中断系统的结构 7.3中断寄存器 7.4低压检测中断 7.5外部中断 7.6定时/计数器T0、T1的工作方式 7.7定时/计数器T0、T1的应用举例 7.8定时/计数器T2的工作方式及应用 7.9 PCA/PWM模块的结构及应用
6
中断允许寄 7.2中断系统的结构 存器IE和IE2
中断源、 中断请 求
7
7.3中断寄存器
1.中断允许寄存器IE IE寄存器的地址为A8H,可进行位寻址
D7
EA
D6
ELVD
D5
EADC
D4
ES
D3
ET1
D2
EX1
D1
ET0
D0
EX0
CPU的中断允许控制位,当EA=0时,所 外部中断 0中断允许控制位。 低压检测中断允许位。当 A/D转换中断允许位。当 ELVD = EADC 0 定时/计数器 T0溢出中断允 串行口 1 中断允许控制位。 外部中断 1 中断允许控制位。 有的中断源请求均被屏蔽;当 EA=1 时,允 定时 /计数器 T1溢出中断允许 当EX0 =0 时,禁止外部中 时,禁止低压检测中断;当 =0时,禁止 A/D 转换中断;当 ELVD 许控制位。当 ET0 = 0时, 当 ES = 0 时,禁止串行口 1 当EX1 许CPU检测中断源的标志位。 EA的作用使 控制位。当 ET1= =0 0时,禁止外部中断 时,禁止 断0中断;当 EX0 =1时,允 =1,允许低压检测中断。 EADC= 1时,允许 A/D 转换结 禁止 T0 中断;当 ET0= 1时, 中断;当 ES = 1 时,允许串 1 中断;当 EX1 = 1 时,允许 T1中断;当ET1=1时,允许 中断允许形成两级控制,即各中断源首先 许外部中断 0中断 束时中断。 允许T0 中断 行口 1 中断。 外部中断 1 中断 受EA控制,其次还受各中断源自己的中断 T1中断 允许控制位控制。
就是中断号
中断查询序号 0 1 2 3 4 5 6 7 8 9
中断源 INT0 T0 INT1 T1 URAT1 ADC LVD PCA UART2 SPI
中断服务程序的入口地址 0003H 000BH 0013H 001BH 0023H 002BH 0033H 003BH 0043H 004BH
17
13
7.3中断寄存器
D7 D6
IP2寄存器的地址 为B5H,不能进行 2.中断优先级控制寄存器IP、IP2和IPH、IP2H 位寻址
D5
D4
D3
D2
D1
D0
D7 -
D6 -
D5 -
D4 -
D3 -
D2 -
IP2H寄存器的地 址为PSPI B6H,不能进 PS2 行位寻址
D1
D0
PSPIH PS2H
执行中断任务 关中断
恢复现场
在低优先级中断服务 程序中, 保护和恢复现 场之后的开中断, 是为 了允许更高级的中断 嵌套。
开中断 中断返回
19
以外部中断1为例,其中断服务处理程序
INT1: ORG 0013H LJMP INT1 …… CLR EA PUSH PUSH PUSH PUSH …… PSW ACC DPH DPL ;外部中断1的入口地址 ;在中断入口处放一条长转移指令
中断处理的流程图
置位中断优先级触发器
硬件完成
保存断点 转入中断服务子程序 保护现场
用户编程 完成
执行中断服务程序 恢复现场 清除中断优先级触发器 中断返回
RETI 指令 完成
18
中断服务程序的流程图
关中断 保护现场 开中断
在低优先级中断服 务程序中,保护现场 和恢复现场的过程, 不允许高优先级的中 断源中断,以免现场 遭到破坏。
PS2H 为串行口2中断 PSPIH, PSPI、 为PS2 SPI串行口 优先级的高、低位 中断优先级的高、低位
14
IPH.X、 IP.X、 或IP2H.X 、IP2.X 为 IPH.X IP.X 或 IP2H.X 、 7.2中断系统的结构 IPH.X IP.X 或IP2H.X 、 为 IPH.X 、、 IP.X 或IP2H.X 、IP2.X 11时为最高优先级中断 IP2.X 为10为 时为 2 级中断 IP2.X 01 时为 1级中断 00时为最低优先级中断
D7
PPCAH
D6
PLVDH
D5
PADCH
D4
PSH
D3
PT1H
D2
PX1H
D1
PT0H