zoukankan      html  css  js  c++  java
  • 基于51单片机定时器0计时外部中断0计数的霍尔传感器精确测速数码管显示测速的项目工程

    #include<reg52.h>
    #define uchar unsigned char
    #define uint unsigned int
    sbit qiting=P3^0;//定义启停按键
    uchar qitingnum,flag_1s;//定义启停次数变量、1s标志位变量清零
    uint count,pulse,quan;//定时器0定时中断次数变量、脉冲个数变量、圈数变量
    unsigned long speed;//转速变量
    uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共阴数码管段码数字0~9字码表,高电平点亮数码管段码数字0~9。
    /**ms级延时子程序**/
      void delay(uint x)
    {
       uint i,j;                       
       for(i=0;i<x;i++)     
        for(j=0;j<110;j++);
      }
    /**转速显示函数**/
      void display(unsigned long speed)
    {
       if(speed<=99999)
     {
        uchar wan,qian,bai,shi,ge;//定义拆字变量
        wan=speed/10000;//转速/10000得到万位
        qian=speed%10000/1000;//转速/10000的余数/1000得到千位
        bai=speed%1000/100;//取得百位
        shi=speed%100/10;//取得十位数字
        ge=speed%10;//取得个位数字
       
        P2=0xfd;//数码管万位显示位
        P1=table[wan];//数码管万位数值显示
        delay(2);//延时
    
        P2=0xfb;//数码管千位显示位
        P1=table[qian];//数码管千位数值显示
        delay(2);//延时
    
        P2=0xf7;//数码管百位显示位
        P1=table[bai];//数码管百位数值显示
        delay(2);//延时
    
        P2=0xef;//数码管十位显示位
        P1=table[shi];//数码管十位数值显示
        delay(2);//延时
     
        P2=0xdf;//数码管个位显示位
        P1=table[ge];//数码管个位数值显示
        delay(2);//延时
       }
     }
    /**按键扫描程序**/  
      void keyscan()//按键扫描函数
    {
       if(qiting==0)//判断启停键是否按下
     {
    //  delay(5);
        display(speed);
        if(qiting==0)//判断启停键是否再次按下
      {
         qitingnum++;//启停次数变量加加
    //   while(!qiting);//等待启停键松开
         while(!qiting)//等待启停键松开
         display(speed);
    //   lcd_init();//LCD1602液晶显示器初始化函数
       }
      }
       if(qitingnum==1)//判断启停次数变量是否为1
     {
        display(speed);//显示速度函数
        TR0=1;//打开定时器0
      }
       if(qitingnum==2)//判断启停次数变量是否为2
     {
    //  write_1602com(0x08);//关LCD1602液晶显示器显示
        P2=0xff;//关数码管显示位
        P1=0x00;//关数码管数值显示
        qitingnum=0;//启停次数变量置0
        TR0=0;//关闭定时器0
       }
     }
    /**定时器0、外部中断0初始化子程序**/
      void Time0_Int0_init()
    {
       TMOD=0X01;//模式选定时器0工作方式1
       TH0=(65536-50000)/256;//定时器0高8位定时50毫秒
       TL0=(65536-50000)%256;//定时器0低8位定时50毫秒
       EA=1;//打开总中断
       IT0=1;//外部中断0为下降沿中断
       EX0=1;//打开外部中断0
       ET0=1;//打开定时器0的中断
       TR0=0;//关闭定时器0
     }
    /**主函数**/     
      void main()
    {
       Time0_Int0_init();//定时器0、计数器1初始化子程序
       while(1)
     {
        keyscan();//按键扫描函数
        if(flag_1s==1)//判断1s标志位变量是否为1
      {
         flag_1s=0;//1s标志位变量清零
         display(speed);//转速显示函数
        }
       }
      }
    /**外部中断0中断服务子程序**/    
      void Int0() interrupt 0
    {
       pulse++;//脉冲个数变量
       if(pulse==2) //两次外部中断脉冲,电机转一圈。
     {
        quan++;//圈数变量加加
        pulse=0;//脉冲个数变量置0
       }     
     }
    /**定时器0中断服务子程序**/                                      
      void Timer0() interrupt 1
    {
       TH0=(65536-50000)/256;//重装定时器0高8位定时50毫秒
       TL0=(65536-50000)%256;//重装定时器0低8位定时50毫秒
       count++;//定时器0定时中断次数变量加加
       if(count==20)//判断定时器0定时中断次数变量是否等于20,即1秒钟。
     {
        EX0=0;//关闭外部中断0,开始统计1秒钟内,霍尔元件发送的脉冲个数。
        count=0;//定时器0定时中断次数变量清0
        speed=quan;//外部中断0计数霍尔元件发送的脉冲个数为2个算一圈,即转速:转/秒,如果quan乘以60表示转/分。
        quan=0;//初始化圈数,为了下一次统计1秒钟内,霍尔元件发送的脉冲个数。
        flag_1s=1;//1s标志位变量置1
        TH0=(65536-50000)/256;//重装定时器0高8位定时50毫秒
        TL0=(65536-50000)%256;//重装定时器0低8位定时50毫秒              
        EX0=1;//打开外部中断0,开始计算霍尔元件发送的脉冲个数。
       }
     }

  • 相关阅读:
    2018-12-25-dot-net-double-数组转-float-数组
    2018-12-25-dot-net-double-数组转-float-数组
    2019-10-24-dotnet-列表-Linq-的-Take-用法
    2019-10-24-dotnet-列表-Linq-的-Take-用法
    2018-8-10-C#-代码占用的空间
    2018-8-10-C#-代码占用的空间
    2018-4-29-C#-金额转中文大写
    2018-4-29-C#-金额转中文大写
    Java实现 LeetCode 630 课程表 III(大小堆)
    Java实现洛谷 P1072 Hankson 的趣味题
  • 原文地址:https://www.cnblogs.com/AChenWeiqiangA/p/12770381.html
Copyright © 2011-2022 走看看