zoukankan      html  css  js  c++  java
  • STC51六中中断配置点亮一个LED

    一.外部中断0、1(分别點亮一個LED)

     
    
    /*******************************************************************************
    *  标题:                  计数器中断实验                                       *
    
    
    #include <reg52.h>
    #include<intrins.h>
    sbit led1 = P0^0;
    sbit led2 = P0^1;
    
    
    void main(void)
    {  
    
    // IT0=0;       //低电平触发
       IT0=1;       //下降沿触发
       EX0=1;
    
    
       
    // IT1=0;       //低电平触发
       IT1=1;       //下降沿触发
       EX1=1;
       EA=1;
    
    
       while(1);
     }
    /********************************************************
    * INT0中断函数                                          *
    ********************************************************/
    void  counter0(void) interrupt 0  using 1
    {
      
       EX0=0;  
       led1=~led1;
       EX0=1;
    }
    /********************************************************
    * INT1中断函数                                          *
    ********************************************************/
    void  counter1(void) interrupt 2 using 2
    {
       
       EX1=0;
       led2=~led2;
       EX1=1;
    }
    /********************************************************/

    二.定时器计算器中断 0 (1S,LED灯闪烁)

    #include <reg52.h>
    #include <intrins.h>
    
    typedef unsigned char uchar;
    typedef unsigned char uint;
    
    uint num1,num2;
    sbit led1=P2^2;
    
    void system_Ini()
    {
         TMOD = 0x00; //选择模式0  13位计数 最大计数8192
      
       // TH0=0x1C;   //12.000M  预装初值
        //TL0=0x18;    
         TH0 = (8192 - 1000)/32;
         TL0 = (8192 - 1000)%32    ;
         IE = 0x8A;   //中断    
         TR0  = 1;    //开启T0定时器
    
    
    }
    void main()
    {
        system_Ini();
        while(1);    
    }
    
    
    void T0zd(void) interrupt 1      //3定时器1的中断号  1定时器0的中断号 0外部中断1 2外部中断2  4串口中断
    {
         //TH0 = 0xFc;    //12.000
         //TL0 = 0x18;
    
        TH0 = (8192 - 1000)/32    ;
        TL0 = (8192 - 1000)%32;
        num1++;
        if(num1>100)
        {
            num1=0;
            num2++;
            if(num2>10)
            {num2=0;P2=~P2;}    
        }     
    }
     

    三.定时器计算器中断 1(1S,LED灯闪烁)

     
    
     
    
    #include <reg52.h>
    #include <intrins.h>
    
    typedef unsigned char uchar;
    typedef unsigned char uint;
    
    uint USE_C;
    
    void  main()
    {
        TMOD=0x10;   //定时/计数器1工作于方式1
        TH0=0x4C;     //定时器初始值
        TL0=0x00;    //50ms定时常数
        //THO=(65536-45872)/256;   11.0592MHZ
        //TLO=(65536-45872)%256;
        EA=1;        //开总中断
        ET1=1;       //允许定时/计数器1 中断
        TR1=1;       //启动定时/计数器1 中断
     
        while(1);
    } 
    
    
    /*********************************************************
      中断服务函数
    **********************************************************/
    void Time1(void) interrupt 3 // using 0
    {
       TH1=0x4c;               //50ms定时
       TL1=0x00;
       if (++USE_C == 20)      //每隔1秒发声
       { P2=~P2;
         USE_C = 0;
       }
    
       
    }

    四.定时器计算器中断 2(1S,LED灯闪烁)

     
    
    #include <reg52.h>
    #include <intrins.h>
    
    typedef unsigned char uchar;
    typedef unsigned int uint;
    
    uint num;
    
    void main()             // 该中断计数循环3686(晶振11.0592MHZ)次是一秒4000次(12MHZ)
    {
        TMOD=0x02;
        TH0=6;
        TL0=6;         //当低八位记满溢出 TF0标指位为 1 反应给    CPU 申请中断 同时TH0 中数组                       //自动装入(复制)TL0中
        EA=1;
        ET0=1;
        TR0=1;
        while(1)
        {
          if(num==4000)    //     若为11.0592 num=3686
          { P2=~P2;
            num=0;
          }
        }
    }
    void T0_time() interrupt 1 using 2
        {
            num++;
        }
    
    
        

    五.定时器计算器中断 3(1S,0.5s,LED灯闪烁)

    #include <reg52.h>
    #include <intrins.h>
    
    typedef unsigned char uchar;
    typedef unsigned int uint;
    sbit led1=P2^1;
    sbit led2=P2^2;
    uint num1,num2;
    
    void main()
    {
    
        TMOD=0X03;
        TH0=6;
        TL0=6;
        EA=1;
        ET0=1;
        ET1=1;
        TR0=1;
        TR1=1;
         while(1)
        {
            if(num1>=4000)//3686 11.0592 
            {
                num1=0;
                led1=~led1;
            }
            if(num2>=2000)//1843 11.0592 
            {
                num2=0;
                led2=~led2;
            }            
        }    
    }
    void TLO_time() interrupt 1     //低八位用定时器计数器中断0的中断源
    {
        TL0=6;
        num1++;
    }
    void TH0_time() interrupt 3    //高八位用定时器计数器中断1的中断源
    {
        TH0=6;
        num2++;
    }    
     

    六.定时器计数器中断 0 (计数器中断)

    /*******************************************************************************
    *  标题:                  计数器中断实验                                       *
    *                                                                               *
    *                                                                               *
    *  实验说明:用单片机产生的脉冲波,作为T0外部事件的脉冲输入,对于HC6800EM3的型 *
    *            号,可以自带的脉冲发生器作为T0外部事件的脉冲输入                    *
    *  连接方法:参开图片或视频                                                       *
    ********************************************************************************
    *                                                                                   *
    * 请学员认真消化本例程,掌握定时器/计数器中断使用                              *
    ********************************************************************************/
    
    #include <reg52.h>
    #include<intrins.h>
    sbit LED = P0^0;
    sbit Pulse = P1^0;
    
    
    void Timer0() interrupt 1
    {
       TH0 = 0Xa0;  //给计数器装初值
       TL0 = 0X00;
       
       LED = ~LED;    //LED灯取反
    
    
    
    }
    
    void main()
    {
      P0 = 0XFF;                  
      TMOD = 0X05;    //选用计数模式和 选用模式1
      TH0 = 0Xa0;   //给计数器装初值
      TL0 = 0x00;
      EA = 1;         //开发所有中断
      ET0 = 1;       //开启定时器T0中断
      TR0 = 1;         //启动T0定时器
      
      while(1)  
      { 
        Pulse = 0 ;     
          _nop_();   //空指令函数 用于产生方波
        _nop_();
        _nop_();
        _nop_();
        Pulse = 1 ;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
    
      
      }
    
    }

    写于2012年年末


  • 相关阅读:
    Oracle EBS-SQL (PO-3):检查期间手工下达的采购订单记录数.sql
    Oracle EBS-SQL (PO-2):检查当月到货补单的记录数.sql
    Oracle EBS-SQL (PO-1):检查供货比例异常.sql
    Oracle EBS-SQL (MRP-2):检查期间主计划录入记录数.sql
    Oracle EBS-SQL (MRP-1):检查期间内计划完成的任务.sql
    Oracle EBS-SQL (INV-3):检查仓库库存价值明细.sql
    Oracle EBS-SQL (INV-2):检查帐户别名发放记录.sql
    Oracle EBS-SQL (INV-1):检查物料成本为0并且物料状态不是'NEW'的物料.sql
    Oracle EBS-SQL (BOM-13):检查未定义库存分的物料类.sql
    Oracle EBS-SQL (BOM-12):BOM清单查询
  • 原文地址:https://www.cnblogs.com/Ph-one/p/4234356.html
Copyright © 2011-2022 走看看