如何用pic单片机写TMR2定时器的应用,让LED一秒一秒的闪

供稿:hz-xin.com     日期:2025-01-15
如何用pic单片机写用中断法,让16位定时器TMR1 ,让LED一秒闪

#include//16位定时器TMR1的应用,用中断法,让LED一秒闪
//在使用定时计数器时一定要设置使能寄存器(PIE1)和中断控制寄存器(INTCON)
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x3B31);
uint initnum;//定义一个溢出中断的变量
void init()//初始化接LED的RD端口为输出,及设置OPTION寄存器关闭TMR0定时计时器
{
TRISD=0;//输出状态
INTCON=0xc0;//设置中断控制寄存器为11000000,始终只用到两个位开总中断,开第一外设允许中断
PIE1=0x01;//使能定时器1为00000001开中断,始终只用一最后一个其他的不用理会
TMR1L=(65536-50000)%256;//装初傎,因为定时器1是16位的,要装满65536个数后才满加1(也就是65536us),如果设50ms(50000us)就加1,则要先装一个初值65536-50000
TMR1H=(65536-50000)/256;//又因为要将初值分开装在低八位和高位里,而八位只有256个数,所以对256求模得整数看有多少个256装在高八位,余下的属于低八位的就求余
T1CON=0x01;//00000001在初始化中只用到最后一位就是开始启到动定时器1(设置预分频器和后分频器)
}
void main()//在主函数里中断函数不需要调用和判断是否产生中断溢出标志T0IF,因为从一上电就自动运行,一到50ms中断会自动溢出加1
{
init();
while(1)
{
if(initnum==20)//它每50ms产生溢出中断,20次则是一秒
{
initnum=0;//到了1s后清零
RD0=!RD0;//取反,再到第二次溢出又取反电平
}
}
}
void interrupt time0()//定时器的程序,后面不用写和51单片机那样的序号,也不用就算写在主函数的后面也不用声明
{ //例如:如果是TMR1IF置位才能知用是TMR0定时器,如果是T1IF置位才能知道是TMR1定时器
TMR1IF=0;//先清零,同时知道是用TMR1定时器
TMR1L=(65536-50000)%256;//也要重新装一次初值,从这个初值的基础上加
TMR1H=(65536-50000)/256;
initnum++;//加一
}

#include//用中断法,让TMR0的T0IF是否有溢出中断,让LED二极管一秒钟闪动,因为PIC单片机如果写有定时计数器则从一上电开始计时
//在使用定时计数器时一定要设置选项寄存器(OPTION_REG)和中断控制寄存器(INTCON)
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x3B31);
uint initnum;//定义一个溢出中断的变量
void init()//初始化接LED的RD端口为输出,及设置OPTION寄存器关闭TMR0定时计时器
{
TRISD=0;//输出状态
PORTD=0;//关闭
OPTION=0x07;//设置选项寄存器为00000111是设置PSA选择为0,PS2-PS0为111:分频比是1:256其他的为零
INTCON=0xa0;//设置中断控制寄存器为10100000,开总中断,开允许中断,和T0IF在初始化中还不能溢出
TMR0=61;//因为PIC单片机定时计数器从一上电开始计时了,我们设置它每50ms产生溢出中断即是50000除以256等于195,也就说加了195个数后就到50ms了,那么要溢出就得加满所以要先装256-195=61个数
}
void main()//在主函数里中断函数不需要调用和判断是否产生中断溢出标志T0IF,因为从一上电就自动运行,一到50ms中断会自动溢出加1
{
init();
while(1)
{
if(initnum==20)//它每50ms产生溢出中断,20次则是一秒
{
initnum=0;//到了1s后清零
RD0=!RD0;//取反,再到第二次溢出又取反电平
}
}
}
void interrupt time0()//定时器的程序,后面不用写和51单片机那样的序号,也不用就算写在主函数的后面也不用声明
{ //例如:如果是T0IF置位才能知用是TMR0定时器,如果是T1IF置位才能知道是TMR1定时器
T0IF=0;//先置零,同时知道是用TMR0定时器
TMR0=61;//也要重新装一次初值
initnum++;//加一
}

#include<pic.h>//TMR2定时器的应用,让LED一秒一秒的闪
//在使用定时计数器时一定要设置选项寄存器(OPTION_REG)和中断控制寄存器(INTCON)
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x3B31);
uint initnum;//定义一个溢出中断的变量
void init()//初始化接LED的RD端口为输出,及设置OPTION寄存器关闭TMR0定时计时器
{
TRISD=0;//输出状态
INTCON=0xc0;//设置中断控制寄存器为11000000,始终只用到两个位开总中断,开第二外设允许中断
PIE1=0x02;//使能定时器1为00000010开中断,始终只用一最后一个其他的不用理会
TMR2=56;//装初值,定时器2是8位的寄存器有256个数但是可以设定一个周期寄存器到了就可以溢出,如果不设周期寄存器就为256溢出,初值56则200us溢出
T2CON=0x04;//设置预分频器和后分频器就是开始启到动定时器2;这里都是1:1的比例
// T2CON=0x05;//设置预分频器1:4和后分频器就是开始启到动定时器2;这时候的时间是乘以后4倍,原本以200us产生一次中断现在则以800us产生一次中断,即800*1000的时间闪动
// T2CON=0x0d;//设置预分频器1:4和后分频器1:2就是开始启到动定时器2;这时候的时间是乘以后4倍,再乘以2倍,原本以200us产生一次中断现在则以1600us产生一次中断即1600*1000的时间闪动
// PR2=100;设置周期寄存器,值设为100,到了就溢出,同时要将其初值设置为零才够精确,这也叫作PWM脉宽调制信号
}
void main()//在主函数里中断函数不需要调用和判断是否产生中断溢出标志T0IF,因为从一上电就自动运行,一到50ms中断会自动溢出加1
{
init();
while(1)
{
if(initnum==1000)//它每200us产生溢出中断,1000次则是200ms
{
initnum=0;//到了1s后清零
RD0=!RD0;//取反,再到第二次溢出又取反电平
}
}
}
void interrupt time0()//定时器的程序,后面不用写和51单片机那样的序号,也不用就算写在主函数的后面也不用声明
{ //例如:如果是TMR2IF置位才能知用是TMR2定时器,如果是T1IF置位才能知道是TMR1定时器
TMR2IF=0;//先清零,同时知道是用TMR2定时器
TMR2=56;
initnum++;//加一
}

如何用pic单片机写TMR2定时器的应用,让LED一秒一秒的闪
PIE1=0x02;\/\/使能定时器1为00000010开中断,始终只用一最后一个其他的不用理会 TMR2=56;\/\/装初值,定时器2是8位的寄存器有256个数但是可以设定一个周期寄存器到了就可以溢出,如果不设周期寄存器就为256溢出,初值56则200us溢出 T2CON=0x04;\/\/设置预分频器和后分频器就是开始启到动定时器2;这里...

PIC单片机的TIMER1和TIMER2的问题求助!!!
pic 单片机的中断程序入口,只有一个(关键字:interrupt),程序需自行判断选择哪个中断。如:void interrupt Servers(){ if(TMR1IF && TMR1IE){}\/\/IF需软件清零 if(TMR2IF && TMR2IE){}\/\/IF需软件清零 } Timer1采用的是给初值,计数到溢出(16位)就中断。timer2采用的是给目标值(8位)...

一个简单的pic中断测试程序,只能执行一次,执行到第二次循环的时候,中断...
OPTION_REG=0x07;\/\/定时器0 0000 0111 256分频 TMR0=0; \/\/定时器0 INTCON=0x80; \/\/1000 0000 } 展开  我来答 分享 微信扫一扫 新浪微博 QQ空间 举报 浏览16 次 可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。 pic 测试 循环 搜索资料 本地图片 图片链接...

...它的那个计算公式:[(PR2)+1]×4×Tosc×(TMR2预分频值)
周期确实是PR2,但是通常我们知道我们想设定的周期却不知道PR2该根据我们的周期设定什么样的值,好比说我们想设定一个PWM的周期为1s的pwm波,我们不能直接就给PR2写个1,给你解释一下这个公式:这个公式是算PWM周期的,但我们通常知道我们想设置的PWM周期用它来推PR2的值,Tosc是晶振的振荡周期也就是...

单片机 (二)
26、TMR0定时器\/计数器产生中断的必要条件,有以下几点,但( )除外 A、GIE=1 27、对于一次中断申请,中断服务程序内容的执行顺序比较合理的是( )B、 查询中断源、保护现场、处理中断、清除标志 28、PIC单片机中作为数据传送桥梁的寄存器是( )C、RAM 29、PIC16F877单片机的I\/O端口共有...

单片机pid算法控制步进电机的电路图和程序
int lyn_1,lyn_2;int vl1,vl2; \/\/反馈左轮速度值(取样周期内的方波数)int lfz; \/\/运算后赋给PWM的值 int lyn,lynn;int lun=0,lun_1=0; \/\/偏差校正值 即校正PWM输出 int lunp,luni,lund; \/\/PID 校正值 int or; \/\/右轮给定值 int ren;int ren_1,ren_2;int ryn_1,ryn_2;...

EN8F677E是什么牌子的单片机啊?最近听到很多人在说这个型号?有没有知...
-EEPROM 写完成中断  比较器模块  A\/D 转换模块: 13 通道10 位AD 模块  TMR0: 8-bit 定时器\/计数器  TMR1: 16-bit 定时器\/计数器  TMR2: 8-bit 定时器  通过配置OPTION 可选择6 种类型的时钟:EC-外部时钟直接接入驱动...

将2-4译码器拓展成8输出数据分配器
需要说明的是不同的数字系统其引脚锁定是不一样的,为了便于在实验箱验证蒀JFD2004标题:图1定时器\/计数器1的电路结构篇名:PIC16F87X单片机异步计数器的应用说明:定时器\/计数器1的电路结构如图1.当TMR1CS=1时选择计数器工作方式,当TMR1CS=0时选择定时器工作方式.在计数器工作方式下外部计数信号的...

急!请教RS485串口通讯的问题
Private Sub TmrComm_Timer()'采用轮循法采集数据 Dim Rx_buff() As ByteDim okstring As StringDim ReceivedLen As IntegerOn Error GoTo ErrorHandlerTmrComm.Enabled = False '关闭定时器If commport.InBufferCount > 0 ThenReceivedLen = commport.InBufferCountRx_buff = commport.Inputokstring = StrConv(...

单片机16*16LED点阵怎样让文字从上到下显示出来 求程序
void TIME2_INT(void) \/\/定时器2用于配置SMB的时钟频率{ TMR2CN=0x00; CKCON |= 0x00; TMR2RLL = 0xef; TMR2RLH = 0xff; TMR2L = 0xef; TMR2H = 0xff; TMR2CN |= 0x0c;}void TIME3_INT(void)\/\/用于I2C的超时检测{ TMR3CN = 0x00; \/\/定时器3为16位自动重载 CKCON &= ~0x40;...