PIC16F877A单片机 (中断与定时器Timer2)
PIC16F877A单片机 (中断与定时器Timer2)
- 1 基本原理
- 2 实现代码
1 基本原理
2 实现代码
主要根据定时器2的逻辑框图和中断的逻辑框图来编写代码,这样代码的可读性强,也便于理解。但有些寄存器在框图中可能没有说明,所以也需要仔细阅读定时器0的官方文档,即基本原理部分。
/*----------------函数功能:中断 定时器2
--------------------------*/#include<pic.h>// 调用PIC16f87XA单片机的头文件
//#include"delay.h"//调用延时子函数__CONFIG(0xFF32);//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关
//__CONFIG(HS&WDTDIS&LVPDIS);/*-----------宏定义--------------*/
#define uint unsigned int
#define uchar unsigned char
#define V0 RD0uint i;/*-----------子函数声明--------------*//*-----------主函数--------------*/
void main()
{// The corresponding data direction register is TRISA. // Setting a TRISA bit (= 1) will make the corresponding PORTA pi an input. // Clearing a TRISA bit (= 0) will make the corresponding PORTA pin an output.TRISD=0xfe; // 设置数据方向 RD7-RD1为输入,RD0为输出// 1 = Port pin is > VIH,即高电平 ; 0 = Port pin is < VIL,即低电平PORTD=0x00; // 端口赋初值/********定时器TMR1初始化**********/// 只有一个时钟,所以不用时钟选择//TMR2CS=0; // TMR1时钟源选择内部指令周期(fosc/4)// Timer2 is an 8-bit timer with a prescaler and a postscaler//预分频器 The input clock (FOSC/4) has a prescale option of 1:1, 1:4 or 1:16T2CKPS1=1;T2CKPS0=1;//预分频 1:16,对应的编码为1X 1x = Prescaler is 16// The match output of TMR2 goes through a 4-bit postscaler // (which gives a 1:1 to 1:16 scaling inclusive)to generate a TMR2 interrupt//后分频器 Timer2 Output Postscale Select bitsTOUTPS3=0;TOUTPS2=0;TOUTPS1=0;TOUTPS0=0;//后分频 1:1,对应的编码为0000// Timer2 can be shut-off by clearing control bit, TMR2ON// TMR2ON: Timer2 On bit. 1 = Timer2 is on. 0 = Timer2 is offTMR2ON=1; // 打开计数定时器TMR2,状态为ON// Timer2 is an 8-bit timer//8位计数寄存器给初值,在这里没有考虑中断所造成的时钟延迟13个指令周期TMR2=256-250+13; // 定时250us*16(预分频,1:16)*1(后分频,1:1)=4000us. 13怎么来的,见Timer0// The Timer2 module has an 8-bit period register, PR2.// Timer2 increments from 00h until it matches PR2 and then resets to 00h on the next increment cycle.// PR2 is a readable and writable register. The PR2 register is initialized to FFh upon ResetPR2=0xff; // 比较器的初值// The TMR2 interrupt, if enabled,is generated on overflow // which is latched in interrupt flag bit, TMR2IF TMR2IF=0; // 溢出中断标志位清零// This interrupt can be enabled/disabled by setting/clearing TMR2 interrupt enable bit, TMR2IE TMR2IE=1; //溢出中断标志允许位置一PEIE=1; //外设中断允许位置一//*********开全局中断设置//定时器T0设置了中断允许,此处要开全局中断GIE=1; // 总中断允许while(1) // 死循环,单片机初始化后,就一直运行这个死循环{}}/*************中断服务程序***************/
void interrupt ISR(void) // PIC单片机的所有中断都是这样一个入口
{// TMR2IF标志位为在计数寄存器由全1变为全0的时候,自动得到TMR2IF=1.if(TMR2IF==1) // 需要进一步判断是否为定时器1的溢出中断标志位 {//定时器中断后,要重置初值,以备下次中断TMR2=256-250+13; //溢出中断标志位清零 如果TMR2IF出现上升沿,则产生中断,所以中断发生之后要清零。TMR2IF=0; // 执行中断处理程序,执行中断产生时想要执行的功能if(++i>125) //4ms中断1次,125次中断就是5000ms{ i=0;V0=!V0; // 取反 实现一秒的闪烁}}
}
为什么有下面两行语句,这是由中断决定的,如下图所示。
PEIE=1; //外设中断允许位置一GIE=1; //总中断允许
PIC16F877A单片机 (中断与定时器Timer2)相关推荐
- C51单片机——中断与定时器
中断是大多数CPU最精彩的部分之一,下面我们通过讲解和编程练习学习中断和定时器相关概念 目录 1.1.什么是中断 1.2.中断的种类 1.3中断的相关概念 1.4. 51单片机可用中断及相关引脚 1. ...
- 51单片机中断与定时器计数器,基于普中科技HC6800-ESV2.0
目录 寄存器 置位复位 中断系统 中断概念 中断系统 中断系统构造 外部中断 计时器.定时器中段 串口中断 中断允许控制(控制中断方式) 总中断 各个中断 中断请求标志(控制触发方式) 外部中断触发方 ...
- 51单片机中断与定时器计数器,基于普中科技教学视频学习记录
目录 寄存器 置位复位 中断系统 中断概念 中断系统 中断系统构造 外部中断 计时器.定时器中段 串口中断 中断允许控制(控制中断方式) 总中断 各个中断 中断请求标志(控制触发方式) 外部中断触发方 ...
- STC51单片机中断与定时器配置参考
*外中断INT0--------void intsvr0(void) interrupt 0 using 1 *定时/计数器T0-----void timer0(void) interrupt 1 u ...
- PIC16F877A单片机 (中断与定时器Timer1)
PIC16F877A单片机 (中断与定时器Timer1) 1 基本原理 2 实现代码 1 基本原理 上图中,如果RC0左边外接了外部的晶振,那么T1OSCEN必须置一.这个外部的晶振频率一般都比较低. ...
- PIC16F877A单片机 (外部中断)
PIC16F877A单片机 (外部中断) 1 基本原理 2 实现代码 1 基本原理 2 实现代码 /*----------------函数功能:外部中断RB0/INT按下按键(即产生一个中断),此时L ...
- 串口中断和定时器中断_启士 | 蓝桥杯单片机教程12 中断与定时器 (上)
这是 北航士谔书院 的第 949 篇推送 本文介绍中断(interrupt)的基本概念,并演示定时器中断.外部中断的使用方法.如果同学们对文章内容有疑问,或发现文中有任何不妥之处,请点击"阅 ...
- 单片机之魂——定时器、中断
文章目录 一.中断是什么 (1)中断 (2)中断优先级 二.中断的使用 1.外部中断 (2)定时器中断 一.定时器中断使用 二.TMOD与TCON 2.中断服务程序写法 总结 一.中断是什么 中断的控 ...
- 串口中断和定时器中断_51单片机中断机制(定时器/计数器)
单片机中断简介 52单片机一共有6个中断源,它们的符号,名称以及各产生的条件分别如下: INT0 - 外部中断0,由P3.2端口线引入,低电平或下降沿引起 INT1 - 外部中断1,由P3.3端口线引 ...
最新文章
- Struts2中action获取request、response、session的方式
- WebService using Spring throwed org.xml.sax.SAXException: Bad envelope tag: htm
- aac蓝牙编解码协议_蓝牙音频编码哪个音质好?今天我们来逐一解读
- 多线程中使用UNITY变量导致线程执行断掉却又不报错的问题
- mariadb集群初次启动方法
- 解决SQL单用户模式不能转为多用户模式
- 【手把手带你入门深度学习之150行代码的汉字识别系统】学习笔记 ·001 用OpenCV制作数据集
- Vitamix和Blendtec破壁料理机哪个更高端?
- matlab示例程序,matlab示例程序
- Eplan教程——项目检查错误 005013/005014:连接点类型不同
- PPT的默认设置以及快捷键的使用(超级实用的PPT操作)
- kirin710f是什么处理器_麒麟710F处理器怎么样
- 个人信用报告内容组成和解读(七) ---本人声明、异议标注、查询等
- 如何实现有多少人购买了此商品
- USB扫码枪二维码读取(二)——MFC篇
- 2021年JavaScript最新手机号码、电话号码正则表达式
- Python二级考试试题汇总(史上最全)
- BeanCopy 常用工具类
- 【SpringMVC】SpringMVC模型数据+视图解析器
- DVB Project 浅谈
热门文章
- Bitwise Operation
- 对ABAP程序调优的学习(一)select 改 read table
- 工程师文化:BAT为什么不喊老板?
- idea报错 Result Maps collection does not contain value for com.
- 【心电信号】基于matlab心率检测【含Matlab源码 1993期】
- 瑞典皇家理工学院计算机学什么,瑞典皇家理工大学学科设置是怎样的?
- 兰州理工大学计算机科学全国排名,兰州理工大学好吗,全国排名多少?
- 恢复rm -rf 的数据
- 入手评测AMD锐龙r7 6800u和酷睿i7 1260p选哪个 r76800u和i71260p对比
- Git--Git基本使用