PIC定时器的使用

发布者:LovingLife2023最新更新时间:2016-11-04 来源: eefocus关键字:PIC  定时器 手机看文章 扫描二维码
随时随地手机看文章
TIM0  查询法使LED一秒闪烁,未使用预分频

#include

#define uint unsigned int

#define uchar unsigned char

#define input  RA3

#define clk  RA5

#define cs_led  RE0

 

__CONFIG(0x3B31);

 

void init();

void delay(uint);

void write_164(uchar);

uint intnum1,intnum2;

void main()

{

       init();

       while(1)

       {

             

              if(T0IF==1)//判断中断溢出位是否溢出,TOIF是否溢出和总中断是否开启无关系。

              {

                     T0IF=0;//需要软件清零

                     intnum1++;

                     if(intnum1==3906)//一秒钟到了

                     {

                            intnum1=0;

                            intnum2++;

                            cs_led=0;

                            if(intnum2==1)

                            write_164(0xfd);

                            if(intnum2==2)

                            {

                                   intnum2=0;

                                   write_164(0xff);

                           

                            }

                    

                     }

                      

              }

 

       }

}

void init()

{

       TRISA=0b11010111;

       TRISE=0b11111110;

       OPTION=0x08;//使用内部时钟信号,预分频器分配给WDT模块,相当于不给TM0设置预分频,

       //一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。

}

void delay(uint x)

{

       uint a,b;

       for(a=x;a>0;a--)

              for(b=110;b>0;b--);

 

}

void write_164(uchar dt)

{

       uchar i;  

       for(i=0;i<8;i++)

       {

              clk=0;    

             

              if(dt&0x80)

                     input=1;

              else

                     input=0;

              dt=dt<<1;      

                    

              clk=1;          

       }           

}

TIM0  查询法使LED一秒闪烁,使用预分频

#include

#define uint unsigned int

#define uchar unsigned char

#define input  RA3

#define clk  RA5

#define cs_led  RE0

 

__CONFIG(0x3B31);

 

void init();

void delay(uint);

void write_164(uchar);

uint intnum1,intnum2;

void main()

{

       init();

       while(1)

       {

             

              if(T0IF==1)//判断中断溢出位是否溢出,TOIF是否溢出和总中断是否开启无关系。

              {

                     T0IF=0;//需要软件清零

                     TMR0=61;//重新给定时器装初值。

                     intnum1++;

                     if(intnum1==20)//一秒钟到了

                     {

                            intnum1=0;

                            intnum2++;

                            cs_led=0;

                            if(intnum2==1)

                            write_164(0xfd);

                            if(intnum2==2)

                            {

                                   intnum2=0;

                                   write_164(0xff);

                           

                            }

                    

                     }

                      

              }

 

       }

}

void init()

{

       TRISA=0b11010111;

       TRISE=0b11111110;

       OPTION=0x07;//使用内部时钟信号,预分频器分配给TIM0模块,256分频。

       //一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。

       TMR0=61;//256*Y=50000,=>Y=195,256-195=61,这样就是50ms溢出一次,溢出20次就是1s。

}

void delay(uint x)

{

       uint a,b;

       for(a=x;a>0;a--)

              for(b=110;b>0;b--);

 

}

void write_164(uchar dt)

{

       uchar i;  

       for(i=0;i<8;i++)

       {

              clk=0;    

             

              if(dt&0x80)

                     input=1;

              else

                     input=0;

              dt=dt<<1;      

                    

              clk=1;          

       }           

}

TIM0  中断法使LED一秒闪烁,使用预分频

#include

#define uint unsigned int

#define uchar unsigned char

#define input  RA3

#define clk  RA5

#define cs_led  RE0

 

__CONFIG(0x3B31);

 

void init();

void delay(uint);

void write_164(uchar);

uint intnum1,intnum2;

void main()

{

       init();

       while(1)

       {

      

                     if(intnum1==2)//一秒钟到了

                     {

                            intnum1=0;

                            intnum2++;

                            cs_led=0;

                            if(intnum2==1)

                            write_164(0xfd);

                            if(intnum2==2)

                            {

                                   intnum2=0;

                                   write_164(0xff);

                           

                            }                  

                     }           

       }

}

void init()

{

       TRISA=0b11010111;

       TRISE=0b11111110;

       OPTION=0x07;//使用内部时钟信号,预分频器分配给TIM0模块,256分频。

       //一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。

       INTCON=0xa0;//GIE=1,开总中断,T0IE=1,开启T0中断,T0IE是TMR0 溢出中断允许位。

       TMR0=61;//256*Y=50000,=>Y=195,256-195=61,这样就是50ms溢出一次,溢出20次就是1s。

}

void interrupt time0()

{

       T0IF=0;//由于只开启了TMR0中断,所以不用查询是哪个中断,能进来的肯定是TMR0溢出中断,直接将中断溢出标志位清零,

       TMR0=61;

       intnum1++;

}

void delay(uint x)

{

       uint a,b;

       for(a=x;a>0;a--)

              for(b=110;b>0;b--);

 

}

void write_164(uchar dt)

{

       uchar i;  

       for(i=0;i<8;i++)

       {

              clk=0;    

             

              if(dt&0x80)

                     input=1;

              else

                     input=0;

              dt=dt<<1;      

                    

              clk=1;          

       }           

}

TMR1 中断法TIM0  中断法使LED一秒闪烁,不设置预分频。

#include

#define uint unsigned int

#define uchar unsigned char

#define input  RA3

#define clk  RA5

#define cs_led  RE0

 

__CONFIG(0x3B31);

 

void init();

void delay(uint);

void write_164(uchar);

uint intnum1,intnum2;

void main()

{

       init();

       while(1)

       {

      

                     if(intnum1==20)//一秒钟到了

                     {

                            intnum1=0;

                            intnum2++;

                            cs_led=0;

                            if(intnum2==1)

                            write_164(0xfd);

                            if(intnum2==2)

                            {

                                   intnum2=0;

                                   write_164(0xff);

                           

                            }                  

                     }           

       }

}

void init()

{

       TRISA=0b11010111;

       TRISE=0b11111110;

 

       INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断

       PIE1=0x01;//开启定时器1的中断

       TMR1L=(65536-50000)%256;

       TMR1H=(65536-50000)/256;//进入一次中断,是50ms,

 

       T1CON=0x01;//不设置预分频,关闭定时器1晶振使能控制位,与外部时钟同步,选择内部时钟,使能定时器1,

 

}

void interrupt time1()

{

       TMR1IF=0;//将中断溢出标志位清零,

       TMR1L=(65536-50000)%256;

       TMR1H=(65536-50000)/256;

      

       intnum1++;

}

void delay(uint x)

{

       uint a,b;

       for(a=x;a>0;a--)

              for(b=110;b>0;b--);

 

}

void write_164(uchar dt)

{

       uchar i;  

       for(i=0;i<8;i++)

       {

              clk=0;    

             

              if(dt&0x80)

                     input=1;

              else

                     input=0;

              dt=dt<<1;      

                    

              clk=1;          

       }           

}

TMR1 中断法TIM0  中断法使LED400ms闪烁,设置预分频

#include

#define uint unsigned int

#define uchar unsigned char

#define input  RA3

#define clk  RA5

#define cs_led  RE0

 

__CONFIG(0x3B31);

 

void init();

void delay(uint);

void write_164(uchar);

uint intnum1,intnum2;

void main()

{

       init();

       while(1)

       {

      

              /*    if(intnum1==20)//一秒钟到了

                     {

                            intnum1=0;

                            intnum2++;

                            cs_led=0;

                            if(intnum2==1)

                            write_164(0xfd);

                            if(intnum2==2)

                            {

                                   intnum2=0;

                                   write_164(0xff);

                           

                            }                  

                     }*/         

       }

}

void init()

{

       TRISA=0b11010111;

       TRISE=0b11111110;

 

       INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断

       PIE1=0x01;//开启定时器1的中断

       TMR1L=(65536-50000)%256;

       TMR1H=(65536-50000)/256;//如果不设置预分频,进入一次中断,是50ms,现在设置8倍预分频,进入一次中断是400ms。

 

       T1CON=0x31;//设置8倍预分频,关闭定时器1晶振使能控制位,与外部时钟同步,选择内部时钟,使能定时器1,

 

}

void interrupt time1()

{

       TMR1IF=0;//将中断溢出标志位清零,

       TMR1L=(65536-50000)%256;

       TMR1H=(65536-50000)/256;

      

       //intnum1++;

              intnum2++;

                            cs_led=0;

                            if(intnum2==1)

                            write_164(0xfd);

                            if(intnum2==2)

                            {

                                   intnum2=0;

                                   write_164(0xff);

                           

                            }                  

 

}

void delay(uint x)

{

       uint a,b;

       for(a=x;a>0;a--)

              for(b=110;b>0;b--);

 

}

void write_164(uchar dt)

{

       uchar i;  

       for(i=0;i<8;i++)

       {

              clk=0;    

             

              if(dt&0x80)

                     input=1;

              else

                     input=0;

              dt=dt<<1;      

                    

              clk=1;          

       }           

}

TMR2预分频 后分频      

#include

#define uint unsigned int

#define uchar unsigned char

#define input  RA3

#define clk  RA5

#define cs_led  RE0

 

__CONFIG(0x3B31);

 

void init();

void delay(uint);

void write_164(uchar);

uint intnum1,intnum2;

void main()

{

       init();

       while(1)

       {

      

                     if(intnum1==1000)//本来预分频1:1时是200ms到了,现在预分频是4.所以是200*4 ms到了,由于后分频1:2,所以是200*4*2 ms

                     {

                            intnum1=0;

                            intnum2++;

                            cs_led=0;

                            if(intnum2==1)

                            write_164(0xfd);

                            if(intnum2==2)

                            {

                                   intnum2=0;

                                   write_164(0xff);

                           

                            }                  

                     }    

       }

}

void init()

{

       TRISA=0b11010111;

       TRISE=0b11111110;

 

       INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断外围功能模块中断

       PIE1=0x02;//开启定时器2的中断

 

       TMR2=56;

       T2CON=0x0d;//预分频1:4,使能tmr2计数允许/禁止控制位,预分频1:4后分频1:2,

 

}

void interrupt time1()

{

       TMR2IF=0;//将中断溢出标志位清零,

       TMR2=56;

      

       intnum1++;

                           

 

}

void delay(uint x)

{

       uint a,b;

       for(a=x;a>0;a--)

              for(b=110;b>0;b--);

 

}

void write_164(uchar dt)

{

       uchar i;  

       for(i=0;i<8;i++)

       {

              clk=0;    

             

              if(dt&0x80)

                     input=1;

              else

                     input=0;

              dt=dt<<1;      

                    

              clk=1;          

       }           

}

TMR2预分频 后分频 周期寄存器

#include

#define uint unsigned int

#define uchar unsigned char

#define input  RA3

#define clk  RA5

#define cs_led  RE0

 

__CONFIG(0x3B31);

 

void init();

void delay(uint);

void write_164(uchar);

uint intnum1,intnum2;

void main()

{

       init();

       while(1)

       {

      

                     if(intnum1==1000)//本来预分频1:1时是100ms到了,现在预分频是4.所以是100*4 ms到了,由于后分频1:2,所以是100*4*2 ms

                     {

                            intnum1=0;

                            intnum2++;

                            cs_led=0;

                            if(intnum2==1)

                            write_164(0xfd);

                            if(intnum2==2)

                            {

                                   intnum2=0;

                                   write_164(0xff);

                           

                            }                  

                     }    

       }

}

void init()

{

       TRISA=0b11010111;

       TRISE=0b11111110;

 

       INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断外围功能模块中断

       PIE1=0x02;//开启定时器2的中断

 

       TMR2=0;

       PR2=100;//周期寄存器

       T2CON=0x0d;//预分频1:4,使能tmr2计数允许/禁止控制位,预分频1:4后分频1:2,

 

}

void interrupt time1()

{

       TMR2IF=0;//将中断溢出标志位清零,

       //TMR2=56;

      

       intnum1++;

                           

 

}

void delay(uint x)

{

       uint a,b;

       for(a=x;a>0;a--)

              for(b=110;b>0;b--);

 

}

void write_164(uchar dt)

{

       uchar i;  

       for(i=0;i<8;i++)

       {

              clk=0;    

             

              if(dt&0x80)

                     input=1;

              else

                     input=0;

              dt=dt<<1;      

                    

              clk=1;          

       }           

}

关键字:PIC  定时器 引用地址:PIC定时器的使用

上一篇:PIC中断的应用(二)
下一篇:PIC 18XXX PORT LAT

推荐阅读最新更新时间:2024-03-16 15:19

stm32 通用定时器 精确延时程序
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = 1; //自动装载 TIM_TimeBaseStructure.TIM_Prescaler = 7200; //72M分频率到10KHz TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down; //向下计数 TIM_TimeBaseInit(TIM2, &TI
[单片机]
利用单片机定时器实现信号采样和PWM控制
PWM控制方式广泛应用于各种控制系统中,但对脉冲宽度的调节一般采用硬件来实现。如使用PWM控制器或在系统中增加PWM电路 等,则本钱高、响应速度慢,而且PWM控制器与系统之间存在兼容题目。另外,控制系统中的信号采样通常是由A/D转换器来完成,因此检测精度要求较高时,调理电路复杂,而且因A/D的位数高,从而使设计的系统本钱居高不下。 本文以应用于温度控制系统为例,先容利用MOTOROLA公司生产的新型单片机MSP430F413内的定时器Time_A设计可以用时间量进行温度采样以及实现PWM调节的方法。为了可在使用少量外围电路的情况下实现控制系统的高精度丈量和控制,一方面用时间量采样,在省往1片A/D的情况下得到12位的高精度;另
[单片机]
利用单片机<font color='red'>定时器</font>实现信号采样和PWM控制
STM32定时器更新事件可以暂停否?
有人使用STM32的定时器的输出比较功能,具体就是输出4个通道的PWM信号。不过 他需要不定时地调整4个通道的占空比,即调整他们的CCR值。但现在有个小问题,那就是新的CCR值的获得往往会能跨越多个目前定时器的计数周期,这样的话,即使开启各个通道CCR值的预装功能,似乎也很保证做到一次性修改。因为它希望新的CCR值被同时更新。换句话说,他担心不同通道新的CCR值分散在不同计数周期生效,可能给应用带来些麻烦。 我们知道,STM32定时器的预装寄存器的值到影子寄存器的更新往往离不开更新事件。一般来讲,只要启动了定时器,更新事件会随着计数器的溢出而自然产生。 既然这样,比方若是在下面四个时刻获得了新的CCR值,有没有办法让这几个
[单片机]
STM32<font color='red'>定时器</font>更新事件可以暂停否?
【STM32】SysTick滴答定时器(delay延时函数讲解)
STM32F1xx官方资料: 《Cortex-M3权威指南-中文》-第8章最后一个小节:Systick定时器 SysTick定时器 Systick定时器,是一个简单的定时器,对于CM3、CM4内核芯片,都有Systick定时器。Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。 Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使
[单片机]
PIC单片机C语言编程教程(1)
PIC 单片机 C 语言编程简介 用 C 语言来开发单片机系统软件最大的好处是编写代码效率高、软件调试直观、维护升级方便、 代码的重复利用率高、便于跨平台的代码移植等等,因此 C 语言编程在单片机系统设计中已得到越 来越广泛的运用。针对 PIC 单片机的软件开发,同样可以用 C 语言实现。 但在单片机上用 C 语言写程序和在 PC 机上写程序绝对不能简单等同。现在的 PC 机资 源十分丰富,运算能力强大,因此程序员在写 PC 机的应用程序时几乎不用关心编译后的可 执行代码在运行过程中需要占用多少系统资源,也基本不用担心运行效率有多高。写单片机 的 C 程序最关键的一点是单片机内的资源非常有限,控制的
[单片机]
<font color='red'>PIC</font>单片机C语言编程教程(1)
基于PIC16F877单片机的电子秤包装机控制系统
    摘要: 基于单片微处理器PIC16F877研制成功了六嘴回转式电子秤水泥包装机的智能控制器,给出控制系统的硬件电路和软件的设计思想,并阐述了控制器的工作原理。该控制器设计的高精度是本系统的重要性能。中断嵌套是设计软件中的难点。本系统还成功实现了与上位机的通信。     关键词: PIC单片机 A/D转换 中断 通信 包装机系统可用于粉末东颗粒物料(如水泥、化肥、粮食等)的定时包装,自动化程度、计量精度要求越来越高。针对用户的要求,本系统设计了一种基于PIC16F877单片机控制的电子秤水泥包装机控制系统。 控制系统包括调零、调满、设定粗细流阈值、插袋、喂料、压袋、推包、破袋处理等控制功能。另外,对检
[应用]
PIC单片机是什么?
什么是PIC单片机? PIC单片机(Peripheral Interface Controller)是一种用来开发的去控制外围设备的集成电路(IC)。一种具有分散作用(多任务)功能的CPU。与人类相比,大脑就是CPU,PIC 共享的部分相当于人的神经系统。 PIC 单片机是一个小的计算机 PIC单片机有计算功能和记忆内存像CPU并由软件控制允行。然而,处理能力—存储器容量却很有限,这取决于PIC的类型。但是它们的最高操作频率大约都在20MHz左右,存储器容量用做写程序的大约1K—4K字节。 时钟频率与扫描程序的时间和执行程序指令的时间有关系。但不能仅以时钟频率来判断程序处理能力,它还随处理装置的体系结构改变(1*)。如果是
[单片机]
TimerConvert.h头文件下载-AVR定时器参数转换通用头文件
/***************************************************************************** 文件名称:TimerConvert.h 文件标识:_TIMERCONVERT_H_ 摘 要:AVR定时器参数转换通用头文件 当前版本:V1.0 *****************************************************************************/ #ifndef _TIMERCONVERT_H_ #define _TIMERCONVERT_H_ #define WGM0(WGM) (((W
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved