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];
            }
        }
    }
    测量转速
    作者:儒良设计

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

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

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

  • 相关阅读:
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    mysql备份及恢复
    mysql备份及恢复
    mysql备份及恢复
  • 原文地址:https://www.cnblogs.com/bymeet/p/14371965.html
Copyright © 2011-2022 走看看