PIC单片机定时中断
PIC单片机中断程序设计技巧
![PIC单片机中断程序设计技巧](https://img.taocdn.com/s3/m/bf2d12c47c1cfad6195fa7fd.png)
PIC 单片机中断程序设计技巧
所有的中档系列PIC 单片机,PORTB 端口最高的4 个引脚(RB7~RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片
机产生中断。
这就是通常所说的引脚状态变化中断。
在设计引脚中断程序时,有三个需要特别注意的地方。
一是,在清除
P0RTB 中断标志位RBIF 之前,必须安排一条必不可少的,以PORTB 端口数据寄存器PORTB 为源寄存器的读操作指令。
放置这一指令的目的有时并
不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利
清除RBIF 标志位,为下一次中断做好准备。
二是,由于端口PORTB 是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以
必须处理好不需要的虚假中断。
三是,一般都利用PIC 单片机的引脚功能来检测按键,所以必须处理好按键消抖的问题。
引脚中断程序设计
在主程序里先设置有关的寄存器。
◇设置TRISB 寄存器,使RB7~RB4 相关的引脚处于输入状态;
◇如果需要弱上拉,通过OPTION_REG 的第7 位设置;
◇RBIF=O;。
PIC系列单片机的中断资源特点及其应用方法详解
![PIC系列单片机的中断资源特点及其应用方法详解](https://img.taocdn.com/s3/m/fdee83587fd5360cba1adb7c.png)
PIC系列单片机的中断资源特点及其应用方法详解1 PIC单片机简介PIC系列单片机是美国Microchip技术公司推出的高性能价格比的8位嵌入式控制器(Embedded Controller),它采用了精简指令集计算机RISC (Reduced Instruction Set Computer)和哈佛(Harvard)双总线以及两级指令流水线结构。
具有高速度、低工作电压、低功耗等特点和优良的性能价格比,因而PIC系列单片机越来越受到单片机开发与应用工程技术人员的青睐。
该系列独特的结构和中断资源使其在使用时与其它系列的单片机有许多不同之处。
下面以PIC16CXX系列微控制器为例来介绍PIC 系列单片机的中断资源特点以及应用方法。
2 中断资源的开发与屏蔽图1是PIC16C64/64A/65/65A的中断逻辑电路图,其它型号芯睡的中断资源也大致相同,只是资源多少不一而已,但它们的中断入口只有一个(入口地址在004H)。
PIC 单片机的中断大致可以分为两类。
第一类是由中断控制器INTCON直接控制的中断,包括外部引脚中断INT的RB口电平变化中断以及定时器TMRO溢出中断,它们的中断允许位和中断标志都在INTCON寄存器中。
引脚中断INT和定时器TMRO溢出中断与其它微处理器相同。
RB口电平变化中断是PIC 单片机特有的中断,当把RB口高4位I/O口线设置为输入时,只要这4位I/O 口线上的电平发生变化就会引起中断。
RB口的电平中断特性对用户是非常有用的。
用户可以直接利用这些口线的关键部位进行电平检测,并可利用中断进行保护性控制等操作;另一方面,电平中断特性还可以利用RB口的软件控制弱上拉特性组成一个矩阵键盘,并用按键唤醒CPU,这对于那些以电池供电的系统特别有用。
另一类是外围接口中断,包括定时器TMR1溢出中断、TMR溢出或匹配中断、同步串行口中断、异步串行口中断、并行从动口中断和CCP(Capture/Compare/PWM)中断等,而带A/D功能的PIC16C7X系列微处理器还有A/D转换完成中断。
PIC单片机中断系统详细汇总
![PIC单片机中断系统详细汇总](https://img.taocdn.com/s3/m/21bb1880ab00b52acfc789eb172ded630b1c98ed.png)
随着物联网、人工智能等技术的发展,中断系统与其他系 统的融合成为未来的发展方向。
在物联网和人工智能应用中,设备需要实时响应各种事件 ,如传感器数据变化、网络数据包到达等。因此,将中断 系统与操作系统、网络协议栈等其他系统进行融合,可以 实现更高效的事件处理和资源调度,提高系统的实时性和 可靠性。
串行通信中断的配置
需要设置串行通信的波特率、数据位、停止位、奇偶 校验等参数,以及中断触发方式。
串行通信中断的应用
在RS-232、RS-485、SPI等串行通信协议中广泛应 用。
外部事件中断
外部事件中断
01
用于实现外部事件触发中断,例如按键按下、传感器触发等。
外部事件中断的配置
02
需要设置外部事件的检测方式、触发条件以及中断处理程序。
中断的作用:提高CPU的效率,实现对外部事件的实时响应 和处理。
PIC单片机的中断源
外中断
由外部硬件设备产生的中断,例如定 时器溢出、串口接收数据等。
内中断
由单片机内部硬件产生的中断,例如 比较器匹配、捕获比较器等。
中断优先级和向量
中断优先级
用于标识不同中断的优先级,优先级高的中断会优先得到处理。
中断处理程序执行
一旦PIC单片机响应中断,它会跳转 到相应的中断向量表地址,执行中断 处理程序。
中断返回和清除
中断返回
中断处理程序执行完毕后,PIC单片机会自动返回到被中断的程序继续执行。
中断清除
某些中断源在响应后会自行清除中断标志位,而有些则需要手动清除。
03
PIC单片机中断系统的应用
定时器中断
中断处理程序应遵循一定的编写规范,以确 保程序正确、稳定地运行。例如,应避免在 中断处理程序中进行耗时的操作,以减小对 系统性能的影响。
PIC单片机定时器相关用法
![PIC单片机定时器相关用法](https://img.taocdn.com/s3/m/b91a6ec00975f46527d3e1be.png)
PIC单片机定时器相关用法什么是定时器?定时器顾名思义就是用来定时的。
在单片机应用中常常用于各种各样的定时。
比如让LED灯每隔 1S 亮一次。
这个1S 就是由定时器做到的。
指令周期指令周期就是单片机执行一个指令所花费的时间。
这也是定时器定时的最小时间单位。
时钟频率/4=指令频率。
1/指令频率=指令周期。
假设现在的时钟是4MHZ ,4MHz的时钟经过4分频后变成了 1MHz 其周期为0.0000001s也就是1us,这个1us 就是指令周期,这1us也就是定时器定时的最小单位。
定时器与预分频器假设在没有预分频器情况下。
开启定时器每隔一个指令周期定时器就加一。
假设时钟是4MHz 也就是每隔1us 定时器加一。
如果有了预分频器假设预分频器设置成2分频,定时器就每隔2个指令周期定时器加一。
如果预分频器设置成4分频,定时器就每隔4个指令周期定时器加一,以此类推。
定时器中断标志位如: TMR0 这个是8位的定时器,也就是8位的寄存器。
8位的寄存器能代表的数值为0~255.也就是说定时器可以从0开始加一直加到255.到255后再加一就又变成0。
此时TMR0定时器中断标志位 (TMR0IF)变成 1.(如果中断没有开启,并不执行中断程序。
)到底从时钟频率一直到定时器中断溢出之间是什么关系呢?下面我画了一个流程图我们用频率的方式来理解这一切。
假设时钟频率是4MHz ,定时器预分频值为2,定时器初始值为0.1。
首先4MHz 的时钟 4分频后变成 1MHz的指令频率; 2。
然后预分频器 2 分频后变成 0.5MHz的频率供给定时器;3。
定时器经过256分频后变成约1952Hz的频率溢出中断;然后我们再用周期的方式来理解这一切。
1。
首先0.25us时钟周期4分频后变成 1us指令周期; 2。
然后预分频器 2 分频后变成 2us周期供给定时器;3。
定时器每隔2us加一,加到256次256X2us=512us溢出中断 ;希望上面的流程图能帮你梳理一下概念。
pic 中断程序实例
![pic 中断程序实例](https://img.taocdn.com/s3/m/e0bd9b88f021dd36a32d7375a417866fb84ac081.png)
pic 中断程序实例
下面是一个简单的中断程序实例:
#include <avr/io.h>
#include <avr/interrupt.h>
volatile int count = 0;
ISR(TIMER0_COMPA_vect) 定时器0比较匹配中断
{
count++;
}
int main(void)
{
初始化定时器0和比较匹配值
OCR0A = 255; 设置比较匹配值
TCCR0A = (1 << WGM01); CTC模式
TCCR0B = ((1 << CS00) (1 << CS02)); 分频器1024 TIMSK0 = (1 << OCIE0A); 打开比较匹配中断
sei(); 开启中断
while(1)
{
if(count > 1000) 如果计数超过1000
{
执行你想要做的操作
count = 0; 清零计数器
}
}
}
这个程序使用定时器0的比较匹配中断来计数,每次中断发生时,计数器就会加1。
在主循环中,如果计数器超过了1000,程序就会执行一些操作,并且将计数器清零。
要使这个程序工作,你需要连接一个LED或者其他的输出设备到Arduino板的一个数字引脚上,并在中断发生时将其输出高电平。
你还需要调整比较匹配值和分频器以控制中断的频率。
PIC单片机中断系统详细汇总
![PIC单片机中断系统详细汇总](https://img.taocdn.com/s3/m/b4809d24793e0912a21614791711cc7931b778b8.png)
PIC单片机中断系统详细汇总在PIC单片机中,中断系统的实现主要包括以下几个方面的内容:1.中断向量表:PIC单片机中的中断系统采用了向量表的形式来管理不同类型的中断。
向量表是一个存放中断服务子程序入口地址的表格,当中断发生时,单片机根据中断号在向量表中查找相应的中断服务子程序入口地址,并跳转到该地址处执行相应的操作。
2.中断优先级:PIC单片机中的中断系统支持多级中断优先级。
不同的中断可以设置不同的优先级,当多个中断同时发生时,系统会根据优先级的设置,优先处理优先级较高的中断,从而保证重要的中断不会被忽略。
3.中断源:PIC单片机支持多个中断源,包括外部中断(外部引脚上的信号触发的中断)、定时器中断(由定时器溢出或比较事件触发的中断)和串口中断(由串口接收/发送数据触发的中断)等。
每个中断源都有对应的中断标志位,当中断发生时,对应的中断标志位会被设置,以便主程序判断中断类型并做出相应的处理。
4.中断使能和屏蔽:PIC单片机中的中断系统提供了中断使能和屏蔽的功能。
通过设置相应的中断使能和中断屏蔽寄存器的位,可以控制一些中断源的中断是否启用,以及在一些中断源触发中断后,是否允许继续触发该中断。
5.中断服务子程序:PIC单片机的中断系统需要用户自行编写中断服务子程序来处理中断事件。
中断服务子程序是一个与主程序独立的子程序,它会在中断发生时被自动调用,并执行特定的操作。
在编写中断服务子程序时,需要注意子程序的实时性和占用资源的情况,以确保中断的及时响应和系统的稳定性。
6.中断处理流程:PIC单片机中的中断处理流程可以简单描述为:当中断发生时,系统会根据中断号在中断向量表中查找相应的中断服务子程序入口地址,并跳转到该地址处执行中断服务子程序。
在中断服务子程序中,可以对中断事件进行处理,清除中断标志位,并在需要的情况下触发其他操作,比如发送数据、修改相关寄存器等。
当中断服务子程序执行完毕后,系统会自动返回到主程序的执行流程中,继续执行之前的任务。
PIC单片机的远程定时断电复位系统设计
![PIC单片机的远程定时断电复位系统设计](https://img.taocdn.com/s3/m/df54d2db3186bceb19e8bb9a.png)
K e y wo r d s :PI C mi c r o c o n t r o l l e r ;t i mi n g p o we r r e s e t ;E t h e r n e t c o mmu n i c a t i o n;s e r i a l c o mmu n i c a t i o n ;r e s e t p e r i o d
发 生。
关 键 词 :P I C 单 片机 ; 定 时 断 电复 位 ; 以 太 网通 信 ; 串口通 信 ; 复 位 周 期 中 图 分 类 号 :TP 3 9 9 文献 标 识 码 :A
Remo t e Ti mi n g Po wer — o f f Re s e t Sy s t em Bas e d o n PI C Mj c r Oc On t r OI l er
F u J i n g y i , Wu Qu n y i n g
( S c h o o l o f I n f o r ma t i o n S c i e n c e a n d Te c h n o l o g y,Be i j i n g Un i v e r s i t y o f Ch e mi c a l Te c h n o l o g y ,Be i j i n g 1 0 0 0 2 9, Ch i n a )
r i e s mi c r o c o n t r o l l e r wi t h t h e c h a r a c t e r i s t i c s o f a d j u s t a b l e r e s e t p e r i o d , i n t r o d u c e d t h e d e s i g n p r o c e s s o f h a r d wa r e a n d s o f t wa r e ,a n d a l s o
PIC单片机中断系统详细汇总
![PIC单片机中断系统详细汇总](https://img.taocdn.com/s3/m/87452b0f7f1922791788e830.png)
2021/3/7
CHENLI
3
起来(现场保护)。然后再转移到首先必须确定发出中断 请求的中断源,然后再跳转到与该中断源相对 应的程序分支中去执行中断服务程序。
④当中断服务程序执行毕后,必须先恢复被保护 的寄存器的值(现场恢复),再将程序计数器PC 的值从堆栈中恢复(断点恢复) ,使CPU返回断 点处继续执行被中断的程序。
后5个SFR,共有40位,但仅使用了30位来控 制中断,分别与图9.l中的中断逻辑电路的输入信 号成严格的对应关系。
2021/3/7
CHENLI
10
2021/3/7
CHENLI
11
⒈选项寄存器OPTION _REG
OPTION_REG选项寄存器是可读写的, 各位的分布形式:
该寄存器包含了与定时/计数器TMR0、 分频器和端口RB有关的控制位。RB端口引脚 RB0和外部中断INT复用一脚,与该脚有关的一 个控制位含义如下: INTEDG:外部中断INT触发信号边沿选择位:
2021/3/7
CHENLI
7
2021/3/7
CHENLI
8
图中全部的的14个中断源按两个梯队并列 排开,第一梯队中只安排了3个中断源,其余的 中断源全部安排到第二梯队中。
➢ 所有的中断源都受“全局中断屏蔽位”(也称总 屏蔽位)GIE的控制;
➢ 第一梯队的中断源不仅受GIE的控制,还要受 各自中断屏蔽位的控制;
➢ 第二梯队的中断源不仅受到GIE和各自中断屏 蔽位的控制,还要受到一个外设中断屏蔽位 PEIE的控制。
2021/3/7
CHENLI
9
§8.4 中断相关的寄存器
与中断有关的特殊功能寄存器SFR共有6个, 分别是:
PIC单片机的INT中断设计思路及程序设计
![PIC单片机的INT中断设计思路及程序设计](https://img.taocdn.com/s3/m/07644f42581b6bd97f19eadf.png)
PIC单片机的INT中断设计思路及程序设计
1. 设计思路PIC 单片机端口RC 连接8 只发光二极管LED 作为流水灯模拟发光部件。
利用片内的定时器/计数器TMR0 模块和中断逻辑功能部件,使TMR0 工作在定时器模式,并且在超时溢出时向CPU 发送中断请求信号,
外部中断信号输入脚INT 作为电源故障检测端。
电源电压检测模块电路原理图如图1 所示,流水灯电路原理图如图2 所示.
图1 电源电压检测模块电路原理图
图2 流水灯电路原理图
2. 程序设计
程序设计流程如图3~图6 所示。
图3 主程序流程
图4 中断服务程序流程
图5 延时子程序1 流程
图6 延时子程序2 流程tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
PIC实验报告(中断、定时、PWM、AD程序代码)
![PIC实验报告(中断、定时、PWM、AD程序代码)](https://img.taocdn.com/s3/m/b937fe6ea98271fe910ef941.png)
实验一:定时器1. 实验目的:利用定时器0,定时器1,定时2实现4盏流水灯2. 实验内容 a,程序框图定时器0:/************************************************** 计算公式:(256-X)*K*T=25 000us,定时器延时25ms,预分频为K 为64,利用软件编程实现1s 脉冲输出,RB0作为输出 ************************************************/ #include<pic.h>__CONFIG(0x20F1); __CONFIG(0x3F71); #define T0_25MS 61 char a=0;void interrupt ISR() {if(T0IF==1)定时器1定时500MS定时器0定时50MS 、定时器1定时器2定时50MS时间到? 时间到? 时间到?a 的值加1 led 灯循环左移一位 a 的值加1a=20?a=10?a=0,led 灯循环左移一位 a=0,led 灯循环左移一位开始开始开始T0IF=0;TMR0=T0_25MS;a++;if(a==20) //输出1s脉冲{PORTD=(PORTD<<1);a=0;if(PORTD==0x10)PORTD=0x01;}}}void timer0init(){OPTION=0b10000110; //,预分频器给TMR0,TMR0预分频系数为1:64 INTCON=0b10100000; //GIE,PEIE置1}void main(){timer0init();TRISD=0;PORTD=0x01;while(1);}定时器1:/**************************************************计算公式:(65536-X)*K*T=500 000us,定时器延时500ms,预分频为8,利用软件编程实现1s脉冲输出,RB0作为输出************************************************/#include<pic.h>__CONFIG(0x20F1);__CONFIG(0x3F71);#define T1_500MS 3036void interrupt ISR(){if(TMR1IF==1){TMR1IF=0;TMR1H=T1_500MS>>8;TMR1L=T1_500MS;PORTD=(PORTD<<1);if(PORTD==0x10)PORTD=0x01;}void timer1init(){TMR1H=T1_500MS>>8;TMR1L=T1_500MS;TMR1IE=1;INTCON=0b11000000; //GIE,PEIE置1T1CON=0b00110001;; //TMR1预分频系数为1:8}void main(){timer1init();TRISD=0;PORTD=0x01;while(1);}定时器2:/**************************************************计算公式:(PR2+1)*K1*K2*T=50 000us,定时器延时50ms,预分频为K1为16,后分频器K2为15利用软件编程实现1s脉冲输出,RB0作为输出************************************************/#include<pic.h>__CONFIG(0x20F1);__CONFIG(0x3F71);#define LED RB0char a=0;void interrupt ISR(){if(TMR2IF==1){TMR2IF=0;a++;if(a==10) //1秒到了{PORTD=(PORTD<<1);a=0;if(PORTD==0x10)PORTD=0x01;}}}void timer2init()TMR2IE=1;PR2=207;INTCON=0b11000000; //GIE,PEIE置1T2CON=0B001110111; //TMR2预分频系数为1:16,后分频器为1:15 }void main(){timer2init();TRISD=0;PORTD=0x01;while(1);}实验二:RB0中断1.实验目的:a.利用外部中断RB0实现流水灯左移2.程序框图:开始RB0按下?进入中断,led灯循环左移一位程序:#include<pic.h>__CONFIG(0x20F1);__CONFIG(0x3f71);void delaynms(unsigned int n);void interrupt ISR(void);void main(){OPTION=0b00000000;ANS12=0;WPUB0=1;TRISB=0b00000001;INTCON=0b10010000;TRISD=0b00000000;PORTD=0x01;while(1);}void interrupt ISR(void){if(INTF==1){delaynms(30);INTF=0;PORTD=(PORTD<<1);if(PORTD==0x10)PORTD=0x01;}}void delaynms(unsigned int n){unsigned int j;char k;for(j=0;j<n;j++)for(k=246;k>0;k--)NOP();}实验三:AD转换1.实验目的:利用PIC内部AD转换器,AN0通道口采集模拟数据,通过LCD1602显示结果2.程序框图:程序:#include<pic.h>__CONFIG(0x3F39); __CONFIG(0x20F1); #define RS RD4 #define RW RD5 #define E RD6#define uint unsigned int char QW,BW,SW,GW;//8段共阳LED 显示代码,0位-7位分别控制a -h 段const char LED_CODE[]={0b11000000, 0b11111001,0b10100100,0b10110000,0b10011001, 0b10010010,0b10000010,0b11111000,0b10000000,0b10010000,0b01111111}; uint AD_SUB(char k);void init1602(); //1602初始化 void write_com(char com);//写指令 void write_date(char data);//写数据 void delaynms(unsigned int n); void spiinit();void SPI_WRITE(char ); void displayled(); void display1602(); void BCD(uint R1); void main() {uint y;TRISA=0b00000001;选择AD 通道启动ADGODON E=0?数据送1602显示初始化数据送数码管显示 开始ANSEL=0b11111111; //AN0~AN7为模拟输入,上电默认,可不设TRISD=0; //D口设置为输出PORTD=0;spiinit();init1602();while(1){y=AD_SUB(0); //0表示第0个通道BCD(y);displayled();display1602();delaynms(500); //此不不能忽略}}void BCD(uint R1){QW=0;BW=0;SW=0;GW=0;while(R1>=1000){R1-=1000;QW++;}while(R1>=100){R1-=100;BW++;}while(R1>=10){R1-=10;SW++;}GW=R1;}void displayled(){SPI_WRITE(GW); //先发个位SPI_WRITE(SW); //发十位SPI_WRITE(BW); //发百位SPI_WRITE(10); //发小数点SPI_WRITE(QW); //发千位}void display1602(){write_com(0x80);write_date(0x30+QW);write_date(0x2e); //小数点write_date(0x30+BW);write_date(0x30+SW);write_date(0x30+GW);write_date(0x56); //"V"}void SPI_WRITE(char b){char BUF;BUF=LED_CODE[b];SSPBUF=BUF; //发出数据while(BF==0);BUF=SSPBUF;}void spiinit(){TRISC=0b00010000;SSPEN=1;CKP=1;SSPM3=0;SSPM2=0;SSPM1=0;SSPM0=1;SMP=1;CKE=0;}uint AD_SUB(char k){char i;uint temp;float x;ADCON0=0b01000001; //TAD=8TOSC,ADFM=1; //设置成右对齐ADCON0|=(k<<4);for(i=1;i<5;i++)NOP(); //打开AD通道后延时20us左右GODONE=1; //开始AD转换while(GODONE==1); //等待转换完成ADIF=0;temp=ADRESH<<8;temp|=ADRESL;x=temp/1023.0*5.0;temp=x*1000;return(temp);}void init1602(){delaynms(20); //延时时间大于15mswrite_com(0x03);delaynms(5);write_com(0x03);delaynms(5);write_com(0x03);delaynms(5);write_com(0x02); //归HOME位,此不不可少delaynms(5);write_com(0x28); //工作方式设置,4位数据线,2行字符,5*7字体write_com(0x0c); //显示开关设置,画面开,光标消失,禁止闪烁write_com(0x06); //输入方式设置,AC为加一计数器write_com(0x01); //清屏write_com(0x80); //开始显示位置delaynms(2);}void write_com(char com){RS=0; //写指令RW=0;PORTD&=0xf0; //低四位清0E=1; //有效发送PORTD|=((com>>4)&0x0f);//先发高四位delaynms(5);E=0;PORTD&=0xf0;E=1;PORTD|=(com&0x0f);//再发低四位delaynms(5);E=0;}void write_date(char data){RS=1; //写数据RW=0;PORTD&=0xf0;E=1;PORTD|=((data>>4)&0x0f);//先发高四位delaynms(5);E=0;PORTD&=0xf0;E=1;PORTD|=(data&0x0f); //再发低四位delaynms(5);E=0;RS=0;}void delaynms(unsigned int n){unsigned int j;char k;for(j=0;j<n;j++)for(k=246;k>0;k--)NOP();}实验四:PWM1.实验目的:通过PIC单片机输出PWM不同占空比脉冲波形2.程序流程:程序:#include<pic.h>__CONFIG(0x3f3a);char a;void CSH();void interrupt ISR(void);void delaynms(unsigned int n); void main(){CSH();while(1){if(a==0)开始初始化占空比为0.1RB0是否按下进入中断,a加1a=1,则输出占空比0.1 a=2,则输出占空比0.3a=3,则输出占空比0.6a=4,则输出占空比0.9a=5,则a清0,占空比为0.1CSH();}}void CSH(){TRISC2=0;TRISD=0;PR2=249;CCPR1L=0x32;CCP1CON=0x0c;T2CON=0x05;OPTION=0b00000000;ANS12=0;WPUB0=1;TRISB=0b00000001;INTCON=0b10010000;}void interrupt ISR(void){if(INTF==1){delaynms(30);if(RB0==0){INTF=0;a++;switch(a){case 1:CCPR1L=0x19;PR2=249;CCP1CON=0x0c;T2CON=0x05;break; //占空比0.1 case 2:CCPR1L=0x4b;PR2=249;CCP1CON=0x0c;T2CON=0x05;break; //占空比0.3 case 3:CCPR1L=0x96;PR2=249;CCP1CON=0x0c;T2CON=0x05;break; //占空比0.6 case 4:CCPR1L=0xe1;PR2=249;CCP1CON=0x0c;T2CON=0x05;break;// 占空比0.9 case5:a=0;break;}}}}void delaynms(unsigned int n){unsigned int j;char k;for(j=0;j<n;j++)for(k=246;k>0;k--)NOP();}。
PIC单片机定时中断
![PIC单片机定时中断](https://img.taocdn.com/s3/m/718fb4144b73f242326c5f2b.png)
PIC单片机定时中断#INCLUDE”P16F877.inc” ORG 000H GOTO A1 ORG 004H;定时中断入口地址GOTO ZD01; ORG 0CHA1 MOVLW 1;位1 显示数MOVWF 50H; MOVLW 2;位2 显示数MOVWF 51H; MOVLW 3;位3 显示数MOVWF 52H; MOVLW 4;位4 显示数MOVWF 53H; MOVLW 4;显示位数MOVWF 40H; MOVLW B00000001;位码MOVWF 41H; MOVLW 50H; MOVWF FSR ;间接寻址BSF STATUS,RP0;选择体1 BCF STATUS,RP1; MOVLW 00H;1:2TMRO 比例MOVWF OPTION_REG;分频1/2 BCF STATUS,RP0;体0 BCF STATUS,RP1; MOVLW 0FFH; MOVFW TMR0;初值BCF INTCON,T0IF;清定时中断标志BSF INTCON,T0IE;开定时中断BSF INTCON,GIE;开总中断GOTO $ ZD01 BCF INTCON,GIE;关总中断BTFSS INTCON,T0IF;判断是否产生定时中断GOTO ZD03;否跳出是继续执行BCF INTCON,T0IF BSF STATUS,RP0;体1 BCF STATUS,RP1; MOVLW 0; MOVWF TRISB;RB 口设为输出口MOVWF TRISD;RD 口设为输出口BCF STATUS,RP0;体0 BCF STATUS,RP1; MOVLW 0FFH; MOVWF PORTB;RB 口输出高电平MOVLW 0 MOVWF PORTD;RD 口输出低电平起清屏作用MOVFW INDF;间接寻址显示数据CALL Q1;查数据表MOVWF PORTB;显示断码输出到RB 口INCF FSR,1;间接寻址地址加1 MOVFW 41H ;位码MOVWF PORTD;位码输出到RD 口RLF 41H,0;处理C RLF 41H,1;左移位码DECFSZ 40H,1;判断是否显示完4 位GOTO ZD02;否则继续显示MOVLW 4;显示位数MOVWF 40H; MOVLW B00000001;位码MOVWF 41H; MOVLW 50H; MOVWF FSR ;间接寻址ZD02 MOVLW 0FFH; MOVFW TMR0;重装初值ZD03 BSF INTCON,GIE;开总中断RETFIE ;中断返回; ********************************************; 数据表;。
PIC单片机的中断程序
![PIC单片机的中断程序](https://img.taocdn.com/s3/m/08d2fe2b58fafab068dc0214.png)
PIC单片机的中断程序PIC 单片机的中断程序中断是 PIC 高手必须掌握的武器,转贴一篇,还希望大家补充发表对中断应用的见解。
与 51 或者其他系列的单片机相比,PIC 单片机的中断机制有其特殊之处,针对我们一些初学者存在的一些问题和疑惑,我在此做一个个人总结,不当的地方,请站友们指正。
先摘引三个对 PIC 中断理解的回帖,然后我再对中断活动的过程、应该注意的事项、及一个疑惑进行较详细的总结和解释。
--------------- john frank :关于 pic 中断有些不明白的地方借用大虾的程序中断服务代码 btfss INTCONT0IE 判断是否为 T0 中断 goto other_int btfssINTCONT0IF it ?s the time of T0 int goto other_int bcf INTCONT0IF 是T0 中断清除中断标志 movlw 0x10 微秒的高位字节加上定时时间 256x16 分频40960x1000 的高位0x10addwf us1goto end_intother_int 可添加其他中断服务代码nop other isr code can be added end_int 恢复现场假如又有新的中断正好在这段程序中间产生 btfss INTCONT0IFgoto other_intbcf INTCONT0IF 程序岂不是要出错跑飞了 john frank:谢谢你的关注。
我讲一下自己的理解,权做回答,不当之处,还请站友们指点。
pic 中档单片机系列没有“硬件中断优先级别”(请允许我这样说),含义是指:当内核正在处理当前的中断服务 A 时,在这个期间里,其他任何中断的产生,只能使其标志位 xxIF 置 1,不能剥夺当前中断服务对CPU 的占用权(反应在 PC 指针不能被新的中断改变指向),必须等到当前中断服务处理 A 完毕,然后,根据 goto other_int 语句的转向,依次判断。
PIC单片机中断程序的设计技巧
![PIC单片机中断程序的设计技巧](https://img.taocdn.com/s3/m/2e2db74c77c66137ee06eff9aef8941ea66e4b70.png)
PIC单片机中断程序的设计技巧设计PIC单片机中断程序时,需要根据具体的需求和硬件环境进行合理的设计。
下面是一些设计中断程序的技巧:1.确定中断触发源:首先需要确定中断是由什么触发的,例如定时器溢出、外部中断引脚等。
根据不同的触发源,可以选择不同的中断方式,如正边沿触发、负边沿触发等。
2.中断优先级设置:如果系统中存在多个中断源,需要明确中断的优先级。
可以通过优先级控制寄存器来设置不同中断的优先级,确保在同时触发多个中断的情况下,能够正确处理高优先级的中断。
3.中断服务程序的编写:中断服务程序是在中断发生时自动执行的程序,因此需要编写相应的中断服务程序。
中断服务程序的编写需要注意以下几点:-保持中断向量表的正确性:中断向量表保存了中断向量地址,确保中断服务程序被正确调用。
需要在程序中配置中断向量表的地址,并确保中断向量表的内容正确无误。
-快速响应中断并尽快执行中断服务程序:由于中断发生时需要尽快进行响应,所以中断服务程序需要尽可能地简短和高效。
可以通过减少循环次数、使用高效的算法等方式来提高中断服务程序的执行效率。
-使用全局变量:中断服务程序通常会修改全局变量的值,所以需要在设计中考虑全局变量的使用规则,防止数据冲突问题的发生。
可以通过使用互斥机制或者禁止一些中断来解决这个问题。
4.确定中断处理的顺序和时间:如果系统中存在多个中断源,需要明确中断处理的顺序和时间。
不同的中断源可能具有不同的优先级,所以需要在设计中明确不同中断的处理顺序,确保每个中断按照优先级进行处理。
5.合理的中断延迟时间:中断处理需要一定的时间,因此需要根据具体需求和硬件环境来确定合理的中断延迟时间。
如果中断处理时间过长,可能会导致系统响应速度变慢,影响整体性能。
因此需要合理地设置中断延迟时间,确保系统能够及时地响应中断。
6.中断嵌套的处理:在一些情况下,可能会存在中断嵌套的情况,即一些中断服务程序中又发生了另一个中断。
在设计中断程序时,需要考虑到中断嵌套的处理方式,例如设置屏蔽中断或者暂时禁止其他中断的发生,确保中断的处理顺序正确无误。
关于PIC单片机的中断现场保护问题
![关于PIC单片机的中断现场保护问题](https://img.taocdn.com/s3/m/7168348869dc5022aaea00cf.png)
关于PIC单片机的中断现场保护问题
在进入中断服务子程序期间,只有返回地址PC的数值被自动压入堆栈,其他的一些寄存器的内容就得按照程序的需要由我们自己想办法了。
PIC 单片机汇编语言没有象51系列单片机那样的PUSH POP指令,所以我们要用一段程序来实现类似的功能。
因为是用一段程序来实现现场的保护,这样就可能影响到W和STATUS 寄存器,所以我们要在保护现场的时候先把这两个寄存器给保护了。
这些现场保护不是将数据保存在芯片的堆栈中。
而是将其放到RAM中进行保存。
个人认为将这些数据保存在与体选址无关的RAM中,也就是说PIC一般有四个体,无论目前在哪个体里改变其RAM的数据,都可以映射到其他体中,本人认为这样在程序上比较方便,避免了一些弊端和麻烦。
我也是刚接触PIC,如果有说的不对的地方,还请大家提出,我们共同探讨。
先谢了:)
下面引用一段厂家提供的中断现场保护的样例程序:将W,STATUS,和PCLATH寄存器内的内容保存到临时备分寄存器中
(1) MOVWF W_TEMP 复制W到它的临时寄存器W_TEMP中
(2) SWAPF STATUS,W 将STATUS中的高低四位交换后放入W
(3) CLRF STATUS 不管目前在哪个体,都设置成体0为当前体。
PIC单片机timer中断实例
![PIC单片机timer中断实例](https://img.taocdn.com/s3/m/cd77b608bed5b9f3f90f1c70.png)
TMR0=0xAA; /*置初值,定时100us。因为写入TMR0后接着的两个周期不能增量,
中断需要3个周期的响应时间,以及C语言自动进行现场保护要消
耗周期,取修正值15,所以只需要定时100-15=85us
中断需要3个周期的响应时间,以及C语言自动进行现场保护要消
耗周期,取修正值15,所以只需要定时1000-15=985us
初值=65535-985=0xFC26*/
T0CS=0; //timer0工作于定时器方式
PSA=1; //timer0不分频
T0IF=0; //清timer0中断标志
T0IE=1; //timer0中断允许
初值=255-85=0xaa*/
GIE=1; //开总中断
}
//***********************************************************************************
main()
{
__CONFIG(XT&WDTDIS&LVPDIS); //配置,设置为晶振XT方式振荡,禁看门狗,禁低电压编程
IO_init(); //IO初始化
timer0_init(); //定时器0初始化
#define uchar unsigned char
#define uint unsigned int
uint temp1,temp2;
//***********************************************************************************
//timer1初始化
《PIC16系列单片机C程序设计与proteus仿真》学习之2----TMR0定时器中断
![《PIC16系列单片机C程序设计与proteus仿真》学习之2----TMR0定时器中断](https://img.taocdn.com/s3/m/34ebdaf5f90f76c661371a41.png)
/**用TMR0延时中断,产生脉冲**//**设定时器TMR0延时10MS,8位pic单片机晶振4MHZ,则指令周期Tcy=1us,计算如下:1.设预分频比为K,则256*K*Tcy=10_000us,得K=39.06,要取大于此值的最小分频比,即K=642.计算延时常数X,(256-X)*64*Tcy=10_000us,得X=99.75,四舍五入取整,得X=100. */#include<pic.h>__CONFIG(0x3f71);#define LED RB0#define T0_10MS 100 //定义TMR0延时10MS的时间常数char A;void interrupt ISR(void);void main(void){RISB0=0; //设定RB0位输出,其余B口未设置,采用上电默认值,为输入OPTION=0b10000101;//RBPU=1:B口上拉使能,INTEDG=0:下降沿触发,T0CS=0:对内部指令周期计数,T0SE=0:RA4/T0CKI的上升沿计数,PSA=0:预分频分配位给TMRO,PS2PS1PS0=101:TMR0比率为1:64INTCON=0b10100000;//GIE=1:允许全局中断使能,PEIE=0:禁止外设中断使能,T0IE/TMR0IE=1:允许TMR0溢出中断使能,INTE=0:禁止INT引脚中断使能//RBIE=0:禁止RB口高4位电平变化使能,T0IF/TMR0IF=0:TMR0溢出中断标志位--未溢出//INTF=0:未发生INT中断,RBIF=0:RB7:RB4引脚的逻辑状态未发生变化TMR0=T0_10MS; //TMR0赋初值LED=1;A=1;while(1); //原地等待}void interrupt ISR(void){if(T0IF==1){T0IF=0;TMR0=T0_10MS;//TMR0赋初值,必须if(A==1){A=0;LED=0;}else{A=1;LED=1;}}}proteus如下:(已修改)第一步:初步画好仿真图,设置好PIC参数(晶振,配置位)并运行,如下:第二步:设置ANALOGUE ANALYSIS(我们主要看RB0的模拟电压情况),设置方法如下:1.右击---Edit Graph---起始时间50m,终止时间150m---OK2.右击---Add Traces---Name为RB0,Probe P1为RB0---OK3.右击---Edit Graph---Set Y-scales---若此时显示为灰色不可输入状态,那就点确定,会弹出一个窗口“Resimulate?”,点击确定,方波图就出来了,不过默认是0~5V,你现在就可以重新修改Y-scales,如下图:先打勾“Lock values”,在设置Min -1,Max 6----Ok----又会弹出“resimulate?”,确定即可。
PIC 定时器中断1+外部中断0
![PIC 定时器中断1+外部中断0](https://img.taocdn.com/s3/m/2b5760640066f5335a8121df.png)
PIC 定时器中断1+外部中断0PIC的八位单片机只有一个中断入口(16 位和32 位的单片机就有多个)也就只能在程序里只能有一个中断子函数。
如果开了两个或更多的中断那就把两个中断的处理都放在这一个中断子函数中效果:让数码管连续循环显示0~9,当有外部中断产生时,显示暂停5~7 秒这里外部中断0 属于高优先级,定时器中断1 是外设中断系统,属于低优先级。
在这里,外部中断的优先级必须比定时器中断的优先级高,不然在定时时无法对其产生相应的外部中断来控制它停止。
#include__CONFIG(1,XT) ; //晶振为外部4M__CONFIG(2,WDTDIS) ; //看门狗关闭__CONFIG(4,LVPDIS) ; //禁止低电压编程#define uchar unsigned char#define uint unsigned intchar shuma[10] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};int count=0;char sec=0;void interrupt k(void){inti,j;if(TMR1IF==1){TMR1IF=0;TMR1H=0xff;TMR1L=0x06;count++;if(count==4000){count=0;sec++;if(sec>9)sec=0;}}if(INT0IF==1){INT0IF=0;TMR1IE=0;for(i=0;i<=110;i++)for(j=0;j<=3000;j++);TMR1IE=1;}}voiddisplay(){PORTD=shuma[sec];}voidmain(void){ADCON1=0X06;TRISD=0B00000000;IPEN=1; //关闭中断优先级PEIE=1; //允许所有未被关闭的外设中断T1CON=0x01; //使能定时器中断1TMR1IE=1; //使能当前定时器中断1TMR1IF=0; //软件清中断标志位TMR1H=0xff;TMR1L=0x06;INTEDG0=0;INT0IE=1;INT0IF=0;GIE=1; //开总中断while(1){display();}}tips:感谢大家的阅读,本文由我司收集整编。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PIC单片机定时中断
#INCLUDE"P16F877.inc" ORG 000H
GOTO A1
ORG 004H;定时中断入口地址
GOTO ZD01;
ORG 0CH
A1 MOVLW 1;位1显示数
MOVWF 50H;
MOVLW 2;位2显示数
MOVWF 51H;
MOVLW 3;位3显示数
MOVWF 52H;
MOVLW 4;位4显示数
MOVWF 53H;
MOVLW 4;显示位数
MOVWF 40H;
MOVLW B'00000001';位码
MOVWF 41H;
MOVLW 50H;
MOVWF FSR ;间接寻址
BSF STATUS,RP0;选择体1
BCF STATUS,RP1;
MOVLW 00H;1:2TMRO比例
MOVWF OPTION_REG;分频1/2
BCF STATUS,RP0;体0
BCF STATUS,RP1;
MOVLW 0FFH;
MOVFW TMR0;初值
BCF INTCON,T0IF;清定时中断标志
BSF INTCON,T0IE;开定时中断
BSF INTCON,GIE;开总中断
GOTO $
ZD01 BCF INTCON,GIE;关总中断
BTFSS INTCON,T0IF;判断是否产生定时中断 GOTO ZD03;否跳出是继续执行
BCF INTCON,T0IF
BSF STATUS,RP0;体1
BCF STATUS,RP1;
MOVLW 0;
MOVWF TRISB;RB口设为输出口
MOVWF TRISD;RD口设为输出口
BCF STATUS,RP0;体0
BCF STATUS,RP1;
MOVLW 0FFH;
MOVWF PORTB;RB口输出高电平
MOVLW 0
MOVWF PORTD;RD口输出低电平起清屏作用
MOVFW INDF;间接寻址显示数据
CALL Q1;查数据表
MOVWF PORTB;显示断码输出到RB口
INCF FSR,1;间接寻址地址加1
MOVFW 41H ;位码
MOVWF PORTD;位码输出到RD口
RLF 41H,0;处理C
RLF 41H,1;左移位码
DECFSZ 40H,1;判断是否显示完4位
GOTO ZD02;否则继续显示
MOVLW 4;显示位数
MOVWF 40H;
MOVLW B'00000001';位码
MOVWF 41H;
MOVLW 50H;
MOVWF FSR ;间接寻址
ZD02 MOVLW 0FFH;
MOVFW TMR0;重装初值
ZD03 BSF INTCON,GIE;开总中断
RETFIE ;中断返回
;******************************************** ; 数据表
;******************************************** Q1 ADDWF PCL,1
RETLW 00C0H ;0
RETLW 00F9H ;1
RETLW 00A4H ;2
RETLW 00B0H ;3
RETLW 0099H ;4
RETLW 0092H ;5
RETLW 0082H ;6
RETLW 00F8H ;7
RETLW 0080H ;8
RETLW 0090H ;9
RETLW 0088H ;A
RETLW 0083H ;B
RETLW 00C6H ;C
RETLW 00A1H ;D RETLW 0086H ;E RETLW 008EH ;F END。