精华内容
下载资源
问答
  • C51单片机运用定时器T0中断实现电子时钟,含有原理图和相关程序设计。
  • 定时器T0中断实现长时间定时
  • 定时器T0中断控制1位LED闪烁
  • 定时器T0中断实现渴望主题曲的播放
  • void t0() interrupt 1 { time0++;//一次中断为277.76us } void int0() interrupt 0 { static uchar i; static bit flag; if(flag) { ES=0; if((time0)&&(time0>32)) i=0;...
  • 解决方法就是用中断,这里采用定时器T0溢出中断,工作方式1, 2ms中断显示一次,这样的话既不影响按键操作,又不影响显示,一举两得。 以下程序是适用于德飞莱51单片机开发板 #includ

    如果直接在主函数中写按键控制数码管0-99显示,不管怎么延时数码管十位上的数都会闪,原因就是单片机的机器周器太快,人的按键速度是ms级的,所以等你人操作完了,单片机早就执行了不知道多少遍。

    解决方法就是用中断,这里采用定时器T0溢出中断,工作方式1, 2ms中断显示一次,这样的话既不影响按键操作,又不影响显示,一举两得。


    以下程序是适用于德飞莱51单片机开发板


    #include <reg52.h>


    #define uint unsigned int
    #define uchar unsigned char
    #define DataPort P0 


    sbit Seg_Latch = P2^2;    //段锁存
    sbit Bit_Latch = P2^3;    //位锁存


    sbit key_up = P1^0;      //数字增加按键
    sbit key_down = P1^1;    //数字减少按键


    uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //数码管显示0-9


    uchar code tab[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};    //数码管位选


    uchar temp[2];   //存放num十位和个位


    void Display(unsigned char FirstBit,unsigned char Num);  //显示函数


    void delay(uchar t)  //延时
    {
    while(--t);
    }


    void DelayMs(uchar z) //ms级延时
    {
    while(z--)
    {
    delay(245);
    delay(245);
    }
    }


    void Time0_init()    //定时器T0溢出中断初始化
    {
    TMOD |= 0x01;      //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
    EA = 1;
    ET0 = 1;
    TR0 = 1;
    }


    char num = 0;         //0-99数字
    uchar key_num = 0;    //按键计数


    void main()
    {
    Time0_init();     //T0中断初始化
    key_up = 1;       //使用前先拉高
    key_down = 1;
    while(1)
    {
    if(!key_up)
    {
    DelayMs(10);
    if(!key_up)
    {
    while(!key_up)
    {
    key_num++;
    DelayMs(10);    //10x100 = 1s 按了1s
    if(key_num == 100)
    {
    key_num = 0;    //清零
    while(!key_up)
    {
    if(num < 99)
    {
    num++;
    }
    temp[0] = table[num / 10];//及时赋值
    temp[1] = table[num % 10];
    DelayMs(50);   //数字跳动快慢
    }
    }
    }
    key_num = 0;   //防止累加造成错误识别
    if(num < 99)
    {
    num++;
    }
    }
    }

    if(!key_down)    //减操作
    {
    DelayMs(10);
    if(!key_down)
    {
    while(!key_down)
    {
    key_num++;
    DelayMs(10);
    if(key_num == 100)
    {
    key_num = 0;
    while(!key_down)
    {
    if(num > 0)
    {
    num--;
    }
    temp[0] = table[num / 10];
    temp[1] = table[num % 10];
    DelayMs(50);
    }
    }
    }
    key_num = 0;
    if(num > 0 )
    {
    num--;
    }
    }
    }
    temp[0] = table[num / 10];   //用完赋值
    temp[1] = table[num % 10];
    }
    }


    void Display(unsigned char FirstBit,unsigned char Num)    //显示
    {
      static unsigned char i = 0;  //静态局部变量,用完后不释放
       DataPort  = 0;   
       Seg_Latch = 1;     
       Seg_Latch = 0;


       DataPort = tab[i+FirstBit]; 
       Bit_Latch=1;     
       Bit_Latch=0;


       DataPort = temp[i]; 
       Seg_Latch=1;     
       Seg_Latch=0;

    i++;
    if(i == Num)
    {
    i = 0;
    }
    }


    void Time0_isr() interrupt 1
    {
    TH0 = (65536 - 2000) / 256;   //取高八位 2ms
    TL0 = (65536 - 2000) % 256;   //取低八位
    Display(0,2);
    }
    展开全文
  • 开发板上的8Mhz晶振X3和匹配电容没有焊接,我自己焊接了外部晶振,然后设置外部晶振作为系统时钟源 ...配置T0中断定时100ms,     T0定时中断函数如下,     结果如下,   ...



    开发板上的8Mhz晶振X3和匹配电容没有焊接,我自己焊接了外部晶振,然后设置外部晶振作为系统时钟源

     

    配置T0中断定时100ms,

     


     

    T0定时中断函数如下,

     


     

    结果如下,

     

    展开全文
  • GD32F350定时器有TIMER0~TIMER5,绝对够用,我是用的是TIMER0,向上计数模式 在这种模式,计数器的计数方向是向上计数。计数器从0开始向上连续计数到自动加载值(定 义在TIMERx_CAR寄存器中),一旦计数器计数到...



    GD32F350定时器有TIMER0~TIMER5,绝对够用,我是用的是TIMER0,向上计数模式
    在这种模式,计数器的计数方向是向上计数。计数器从0开始向上连续计数到自动加载值(定 义在TIMERx_CAR寄存器中),一旦计数器计数到自动加载值,会重新从0开始向上计数。如果 设置了重复计数器,在(TIMERx_CREP+1)次上溢后产生更新事件,否则在每次上溢时都会产 生更新事件。在向上计数模式中,TIMERx_CTL0寄存器中的计数方向控制位DIR应该被设置成 0。 
    当通过TIMERx_SWEVG寄存器的UPG位置1来设置更新事件时,计数值会被清0,并产生更新 事件。 
    如果TIMERx_CTL0寄存器的UPDIS置1,则禁止更新事件。 
    当发生更新事件时,所有的寄存器(重复计数器,自动重载寄存器,预分频寄存器)都将被更新。 
    下面这些图给出了一些例子,当TIMERx_CAR=0x63时,计数器在不同预分频因子下的行为。

     
    1. void nvic_config(void)
    2. {
    3.     nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
    4.     nvic_irq_enable(TIMER0_BRK_UP_TRG_COM_IRQn, 0, 1);
    5. }
    6. /*!
    7.     \brief      configure the TIMER peripheral
    8.     \param[in]  none
    9.     \param[out] none
    10.     \retval     none
    11.   */
    12. void timer_config(void)
    13. {
    14.     /* -----------------------------------------------------------------------
    15.     TIMER0 configuration:
    16.     generate 3 complementary PWM signal.
    17.     TIMER0CLK is fixed to systemcoreclock, the TIMER0 prescaler is equal to 84(GD32F330)
    18.     or 107(GD32F350) so the TIMER0 counter clock used is 1MHz.
    19.     insert a dead time equal to 1us 
    20.     configure the break feature, active at high level, and using the automatic
    21.     output enable feature.
    22.     use the locking parameters level0.
    23.     ----------------------------------------------------------------------- */
    24.     timer_parameter_struct timer_initpara;
    25.  
    26.  
    27.     rcu_periph_clock_enable(RCU_TIMER0);
    28.  
    29.     timer_deinit(TIMER0);
    30.  
    31.     timer_initpara.prescaler         = 4000/50-1;
    32.     timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    33.     timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    34.     timer_initpara.period            = 270/5;
    35.     timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    36. //    timer_initpara.repetitioncounter = 0;
    37.     timer_init(TIMER0,&timer_initpara);
    38.  
    39.     /* TIMER0 channel control update interrupt enable */
    40.     timer_interrupt_enable(TIMER0,TIMER_INT_UP);
    41.  
    42.     /* TIMER0 counter enable */
    43.     timer_enable(TIMER0);
    44. }
    复制代码
    采用内部时钟源108MHz,定时4ms,定时中断如下
    1. extern uint16_t Timer_Count;
    2. extern bool Timer_flag;
    3. void TIMER0_BRK_UP_TRG_COM_IRQHandler(void)
    4. {
    5.  
    6.     timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);
    7.                 Timer_Count++;
    8.                 if(Timer_Count==1)
    9.                 {
    10.                         Timer_Count = 0;
    11.                         Timer_flag = 1;
    12. //                        printf("Timer0\n");
    13.                 }
    14.  
    15.  
    16. }
    复制代码



    使用内部时钟源,时间久了,时间会便宜一点,下次我自己焊接外部晶振8MHz,获取高精度的定时器,敬请期待
    展开全文
  • 定时器T0的应用

    千次阅读 2019-09-10 18:32:57
    定时器T0,方式0 定时器T0,方式1 定时器T0,方式2 定时器T1 ,方式3

    定时器T0,方式0

    当TMOD的M1、M0位为00时,定时器工作在方式0,其为13位计数器。由TLx的低5位和THx的高8位构成。TLx溢出则向THx进位,THx溢出则讲TCON的TFx置1。使用12MHz的晶振,定时器1ms的初值为:THx = (8192-1000) / 32; TLx = (8192-1000) % 32; 因为是13位计数器,TLx为5位,最多装入32个数,所以对32取模;

    • 程序现象:定时器控制LED灯每隔1S状态取反
    • 程序说明:LED连接在P2^0;
    #include <reg52.h>
    
    sbit Led0=P2^0;
    
    int count=0;
    
    void main()
    {
        TMOD |= 0x00; //T1保持不变,T0设置为方式0
        
        TH0 =(8192-1000) / 32;        //定时1ms
        TL0 = (8192-1000) % 32;         
        
        ET0 = 1;  //允许定时器/计数器T0溢出中断(IE)
        EA = 1;  //IE,开启总开关
        TR0=1;   //开启计数(TCON)
        while(1)        //避免退出程序,循环等待
        {
            if(count >= 1000)   //计时1s,即1000次中断
            {
                Led0 = ~Led0;      // LED状态取反
                count = 0;
            }
        }
    }
    
    void Timer0() interrupt 1  //中断服务函数
    {
        TH0 =(8192-1000) / 32;        //定时1ms
        TL0 = (8192-1000) % 32;  //方式0重装初值
        count ++;
    }
    
    

    定时器0,方式1

    当TMOD的M1、M0位为01时,定时器工作在方式1,其为16位计数器。使用12MHz的晶振,定时器1ms的初值为:TH0 = (65536-1000) / 256; TL0 = (65536-1000) % 256; 因为是16位计数器,TL0为8位,最多装入256个数,所以对256取模;

    • 程序现象:定时器控制LED灯每隔1S状态取反
    • 程序说明:LED连接在P2^0;
    #include <reg52.h>
    
    sbit Led0=P2^0;
    
    int count=0;
    
    void main()
    {
        TMOD |= 0x01; //T1保持不变,T0设置为方式1
       
        TH0 = (65536-1000) / 256; //定时1ms
        TL0 = (65536-1000) % 256;         
        
        ET0 = 1;  //允许定时器/计数器T0溢出中断(IE)
        EA = 1;  //IE,开启总开关
        TR0=1;   //开启计数(TCON)
        
        while(1)        //避免退出程序,循环等待
        {
            if(count >= 1000)   //计时1s,即1000次中断
            {
                Led0 = ~Led0;      // LED状态取反
                count = 0;
            }
        }
    }
    
    void Timer0() interrupt 1  //中断服务函数
    {
        TH0 = (65536-1000) / 256;   //定时1ms
        TL0 = (65536-1000) % 256;   //方式1重装初值
       
        count ++;
    }
    
    

    定时器0,方式2

    当TMOD的M1、M0位为10时,定时器工作在方式2,其为8位自动重装计数器。因为方式0、方式1需要手动装入初值,所以就会影响定时器精度。因此方式2可以用做频率发生器。方式2中,TH0为高8位常数缓冲器,当TL0低8位溢出时,TH0将自动填充到TL0中,使TL0初值重新计数
    使用12MHz的晶振,定时100us的初值为:TH0 =(256-100) ; TL0 = (256-100) ; 因为不分高低位输入了,所以不需要取模。

    • 程序现象:定时器控制LED灯每隔1S状态取反
    • 程序说明:LED连接在P2^0;
    #include <reg52.h>
    
    sbit Led0=P2^0;
    
    int count=0;
    
    void main()
    {
        TMOD |= 0x02; //T1保持不变,T0设置为方式2
       
        TH0 = (256-100);        //不需要取模了,定时100us
        TL0 = (256-100);      
        
        ET0 = 1;  //允许定时器/计数器T0溢出中断(IE)
        EA = 1;  //IE,开启总开关
        TR0=1;   //开启计数(TCON)
        
        while(1)        //避免退出程序,循环等待
        {
            if(count >= 10000)   //计时1s,即10000次中断
            {
                Led0 = ~Led0;      // LED状态取反
                count = 0;
            }
        }
    }
    
    void Timer0() interrupt 1  //中断服务函数
    {
        count ++;
    }
    
    

    定时器0 ,方式3

    当TMOD的M1、M0位为11时,定时器工作在方式3,T0为两个独立的8位计数器TH0、TL0。方式3只适用于定时器/计数器T0,定时器/计数器T1设置为方式3时,相当于TR1=0,不工作(T1通常被用作串口波特率发生器)

    名称描述
    TL08位计数器;溢出后TF0置1,同时需要重装初值;
    TH08位计数器;溢出后TF1置1,同时需要重装初值;
    • 注意:因为定时器/计数器T1的中断标志位已被占用,所以定时器/计数器T1不能再用中断

    • 程序现象:定时器控制LED0每隔2S状态取反,LED1每隔0.5S状态取反。LED1亮、灭一次后,LED0亮或者灭

    • 程序说明:LED0连接在P2^0;LED1连接在P2^1

    #include <reg52.h>
    
    sbit Led0 = P2^0;
    sbit Led1 = P2^1;
    
    int count0=0,count1=0;
    
    void main()
    {
        TMOD |= 0x03; //T1设置不变,T0设置为方式3
       
        TH0 = (256-100);  //定时100us
        TL0 = (256-50);      //定时50us
        
        ET0 = 1;  //允许定时器/计数器T0溢出中断(IE)
        ET1 = 1;  //允许定时器/计数器T1溢出中断(IE)
        EA = 1;  //IE,开启总开关
        TR0=1;   //开启定时器/计数器T0计数(TCON)
        TR1=1;   //开启定时器/计数器T1计数(TCON)
        
        while(1)        //避免退出程序,循环等待
        {
            if(count0 >= 20000)   //计时2s,即20000次中断
            {
                Led0 = ~Led0;      // LED状态取反
                count0 = 0;
            }
            if(count1 >= 10000)   //计时0.5s,即10000次中断
            {
                Led1 = ~Led1;      // LED状态取反
                count1 = 0;
            }
        }
    }
    
    void Timer0() interrupt 1  //中断服务函数
    {
        TL0 = (256-100);  //定时100us
        count0 ++;
    }
    void Timer1() interrupt 3  //中断服务函数
    {
        TH0 = (256-50);  //定时50us
        count1 ++;
    }
    
    
    展开全文
  • 定时器T0中断控制8位LED闪烁

    千次阅读 2013-07-18 14:45:45
    #include #define uchar unsigned char #define uint unsigned int uint i; void main() { i=0; EA=1; //打开总中断 TMOD=0x01; //使用定时器T0的工作方式1 ET0=1;
  • 01 - 修改默认定时器T0的场合   为什么要修改RTX Tiny的默认定时器T0,具有以下2个场合:   1、T0已经有用途。在本来已经完成的系统下移植RTX Tiny,本来的系统定时器T0已经有比较复杂的用途,因此不适合使用T0...
  • #include #define uint unsigned int #define uchar unsigned char uint i,j; main(){ ...//定时器T0中断允许 ET1=1;//定时器T1中断允许 TR0=1;// 启动定时器T0 TR1=1;// 启动定时器T1
  • #include #define uint unsigned int #define uchar unsigned char uint i,j; main(){ ...//定时器T0中断允许 ET1=1;//定时器T1中断允许 TR0=1;// 启动定时器T0 TR1=1;// 启动定时器T1
  • 普中51-A2外接晶振为12MHz,则其机械周期=1us。即定时器计一个数就使用1us。 void Timer0Init() ...//打开定时器0中断允许 EA=1;//打开总中断 TR0=1;//打开定时器 } 打开定时器0,赋初值,原程序赋予
  • C51单片机定时器T0,T1的常用基本设置

    万次阅读 2017-05-06 18:30:11
    提醒器计时可以使用单片机的定时器T0、T1来做,计时的定时器用T1来做,工作在方式2(8位自动装载),系统运行提示的定时器用T0来做,工作在方式1(16位定时) 代码如下 #include "reg52.h" #define time_...
  • /********************************************** 方法1:延时法 ...描述:T0用于定时,方式1,定时时间50ms,中断方式,定时时间到,TF1=1,利用模拟串口发送字符0x67 ********************************
  • 先看一下定时器框图: 我们选择图中红色圈出的...我们的T0定时器的初始化函数如下: void TIM0_Init(void) { T0CS = 0; //选择定时模式  PSA =1;//不分配预分频器 T0 = 205; //计数初始值 T0IE =1; AIE = 1;
  • 3、主函数:二、各个定时器和工作方式:方式0:方式2:方式3:借鉴:郭天祥《新概念51单片机C语言教程》一、原理:51单片机,拥有两个定时器,用来中断计数,分别是T0和T1。而52单片机和51单片机的定时器是一样的,...
  • 文件名称:测试T0定时器中断晶振频率:内部16Mhz指令周期:晶振频率/16,即1us文件版本:V1.1文件作者:SWS文件实现的功能描述:采用T0定时器,定时10Ms,计数器变量加一,等加到50次时就是500Ms,每500ms led灯闪烁...
  • 功能说明:红外遥控器解码,只使用定时器T0定时100us进行按键解码,处理按键短按与长按,将解码的数据通过串口打印。 /*************************************** 功能说明:红外遥控器解码,定时器T0定时100us进行...
  • 以上是51开发板74HC138的真值表以及动态数码管的原理图 #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器... 使用定时器中断的时候我忘记打开T0中断许可,导致程序一直运行不了。这个问题要多加注意。
  • 刚学到单片机定时器中断,保存方便以后复习。 #include&amp;lt;reg51.h&amp;gt; #define uchar unsigned char sbit pluse=P1^0; uchar pwm = 0; void int1() interrupt 1 { pwm%=10; if(pwn&amp;lt;8)...
  • 函数功能:定时器T0中断服务程序 **************************************************************/ void int1(void) interrupt 1 //“interrupt”声明函数为中断服务函数 {  if(P34==0){//键盘消抖 ...
  • 简单的T0定时器实现中断,LED灯可接P1.0口 实现一秒钟一闪
  • //用定时器T0查询方式P0口8位控制LED闪烁 T1查询方式P1口8位控制LED闪烁 #include // 包含52单片机寄存器定义的头文件 #define uchar unsigned char #define uint unsigned int /******************************...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,525
精华内容 2,210
关键字:

定时器t0的中断地址