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

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

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

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

原文地址:https://www.cnblogs.com/bymeet/p/14371965.html