zoukankan      html  css  js  c++  java
  • Keil C51学习 12 测量电机转速

    #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
    sbit btn=P3^2;
    sbit led=P1^0;
    #include<intrins.h>
    #include <absacc.h>             //包含绝对地址访问库函数
    #define SEG1 XBYTE[0xffec]
    #define SEG2 XBYTE[0xffed]
    #define SEG3 XBYTE[0xffee]
    #define SEG4 XBYTE[0xffef]
    typedef unsigned char uint8;
    typedef unsigned int  uint16;
    //共阳
     uint8 code smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9
    #define CMD 0x00
    #define DAT 0x01
    #define DataPort P0//LCD数据口
    
    uint16 N=0;
    uint8 C_50ms;
    uint8 Z=0;
    uint8 count=0;//储存定时器T0中断次数
    bit flag_1s=0;//计满1秒钟标志位
    /**ms级延时子程序**/
    void delay(uint16 t)
    {
            uint16 a;
            for(;t>0;t--)
                    for(a=123;a>0;a--);
    }
    void all_init()
    {
            TMOD=0x01;//设置T0位工作方式1——作为16位定时器
            ET0=1;//打开定时器0的中断
            TR0=1;//打开定时器0
            TH0=(65536-50000)/256;//装入初值
            TL0=(65536-50000)%256;
            IT0=1;//外部中断0为下降沿中断
            EX0=1;//打开外部中断               
            EA=1;//打开总中断
    }    
    /*------------------------------------------------
                     外部中断程序
    ------------------------------------------------*/
    /**定时器0中断服务子程序**/                                          
    void timer0() interrupt 1
    {
            
                    C_50ms++;
            if(C_50ms==20)
            {
                    EX0=0;//关闭外部中断0
                    C_50ms=0;//定时1s之后C_50ms清零
                    N=Z*60;//计算转速
                    Z=0;//初始化圈数
                    flag_1s=1;//1s标志位置1
                    TH0=0x3c;//重新赋值
                    TL0=0xb0;               
                    EX0=1;//打开外部中断0,开始计数。
            }
                    TH0=(65536-50000)/256;
            TL0=(65536-50000)%256;
    }
    void wai0() interrupt 0
    {
            count++;
            if(count==2) //两次外部脉冲,电机转一圈。
            {
                    Z++;//转圈+1
                    count=0;//初始计数值
            }
           
    }
    
    /*------------------------------------------------
                        主程序
    ------------------------------------------------*/
    main()
    {
     all_init();
      while(1){
          if(flag_1s==1)
            {
                flag_1s=0;//1s标志位清零
                     SEG4 = smg[N%10];
                SEG3 = smg[N/10%10];    
                SEG2 = smg[N/100%10];
                SEG1 = smg[N/1000%10];
            }
        }
    }
    测量转速
    作者:儒良设计

    -------------------------------------------

    个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!

    万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!

  • 相关阅读:
    [置顶] 怎么对待重复的代码
    AIX和Linux中wtmp的不同处理方式
    Visio 下载,及密钥
    全局变量和局部变量
    UNIX网络编程--IPV4 IPV6 ICMPV4 ICMPV6
    Android XML文档解析(一)——SAX解析
    rnqoj-30- [stupid]愚蠢的矿工-树形DP
    linux 文件内容的复制
    主流视音频平台参数
    FTP原理
  • 原文地址:https://www.cnblogs.com/bymeet/p/14371965.html
Copyright © 2011-2022 走看看