找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4379|回复: 12
打印 上一主题 下一主题
收起左侧

基于51单片机定时器0计时计数器1计数的霍尔传感器精确测速数码管显示测速的项目工程

  [复制链接]
跳转到指定楼层
楼主
本帖最后由 51黑电子会员 于 2020-4-8 21:32 编辑

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit qiting=P3^0;//定义启停按键
  5. uchar qitingnum;//定义启停次数变量
  6. uint count;//定时器0定时中断次数变量
  7. unsigned long speed;//转速变量
  8. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共阴数码管段码数字0~9字码表,高电平点亮数码管段码数字0~9。
  9. /**ms级延时子程序**/
  10.   void delay(uint x)
  11. {
  12.    uint i,j;                       
  13.    for(i=0;i<x;i++)     
  14.     for(j=0;j<110;j++);
  15.   }
  16. /**转速显示函数**/
  17.   void display(unsigned long speed)
  18. {
  19.    if(speed<=99999)
  20. {
  21.     uchar wan,qian,bai,shi,ge;//定义拆字变量
  22.     wan=speed/10000;//转速/10000得到万位
  23.     qian=speed%10000/1000;//转速/10000的余数/1000得到千位
  24.     bai=speed%1000/100;//取得百位
  25.     shi=speed%100/10;//取得十位数字
  26.     ge=speed%10;//取得个位数字
  27.    
  28.     P2=0xfd;//数码管万位显示位
  29.     P1=table[wan];//数码管万位数值显示
  30.     delay(2);//延时

  31.     P2=0xfb;//数码管千位显示位
  32.     P1=table[qian];//数码管千位数值显示
  33.     delay(2);//延时

  34.     P2=0xf7;//数码管百位显示位
  35.     P1=table[bai];//数码管百位数值显示
  36.     delay(2);//延时

  37.     P2=0xef;//数码管十位显示位
  38.     P1=table[shi];//数码管十位数值显示
  39.     delay(2);//延时

  40.     P2=0xdf;//数码管个位显示位
  41.     P1=table[ge];//数码管个位数值显示
  42.     delay(2);//延时
  43.    }
  44. }
  45. /**按键扫描程序**/  
  46.   void keyscan()//按键扫描函数
  47. {
  48.    if(qiting==0)//判断启停键是否按下
  49. {
  50. //  delay(5);
  51.     display(speed);
  52.     if(qiting==0)//判断启停键是否再次按下
  53.   {
  54.      qitingnum++;//启停次数变量加加
  55. //   while(!qiting);//等待启停键松开
  56.      while(!qiting)//等待启停键松开
  57.      display(speed);
  58. //   lcd_init();//LCD1602液晶显示器初始化函数
  59.    }
  60.   }
  61.    if(qitingnum==1)//判断启停次数变量是否为1
  62. {
  63.    display(speed);//显示速度函数
  64.   }
  65.    if(qitingnum==2)//判断启停次数变量是否为2
  66. {
  67. //  write_1602com(0x08);//关LCD1602液晶显示器显示
  68.     P2=0xff;//关数码管显示位
  69.     P1=0x00;//关数码管数值显示
  70.     qitingnum=0;//启停次数变量置0
  71.    }
  72. }
  73. /**定时器0、计数器1初始化子程序**/
  74.   void Time0_Time1_init()
  75. {
  76.    TMOD=0X51;//模式选定时器0、计数器1,工作方式选定时器0定时模式1、计数器1计数模式1。
  77.    TH0=(65536-50000)/256;//定时器0高8位定时50毫秒
  78.    TL0=(65536-50000)%256;//定时器0低8位定时50毫秒
  79.    TH1=0;//计数器1高8位计数初值为0
  80.    TL1=0;//计数器1低8位计数初值为0
  81.    EA=1;//打开总中断
  82.    ET0=1;//打开定时器0的中断
  83.    TR0=1;//打开定时器0
  84.    ET1=1;//打开计数器1的中断
  85.    TR1=1;//打开计数器1
  86. }
  87. /**主函数**/     
  88.   void main()
  89. {
  90.    Time0_Time1_init();//定时器0、计数器1初始化子程序
  91.    while(1)
  92. {
  93.     keyscan();//按键扫描函数
  94.    }
  95.   }
  96. /**定时器0中断服务子程序**/                                      
  97.   void Timer0() interrupt 1
  98. {
  99.    TH0=(65536-50000)/256;//重装定时器0高8位定时50毫秒
  100.    TL0=(65536-50000)%256;//重装定时器0低8位定时50毫秒
  101.    count++;//定时器0定时中断次数变量加加
  102.    if(count==20)//判断定时器0定时中断次数变量是否等于20,即1秒钟。
  103. {
  104.     count=0;//定时器0定时中断次数变量清0
  105.     TR1=0;//关计数器1,开始统计1秒钟内,霍尔元件发送的脉冲个数。
  106.     speed=TH1*256+TL1;//表示计数器1计数霍尔元件发送的脉冲个数,即转速:转/秒。
  107.     TH1=0;//计数器1高8位计数清0,为了下一次计数。
  108.     TL1=0;//计数器1低8位计数0,为了下一次计数。
  109.     TR1=1;//开计数器1,为了下一次统计1秒钟内,霍尔元件发送的脉冲个数。
  110.    }
  111. }
复制代码


图片10.png (79.3 KB, 下载次数: 52)

图片10.png

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:626079 发表于 2020-4-8 11:42 | 只看该作者
不知楼主有没有用过这个霍尔来测电机的转速。
如果有,咨询一下,霍尔是要检测电机转轴上的磁铁吧? 磁铁用什么磁铁都可以么?磁铁怎么固定在转轴上的呢? 磁铁与这个位置怎么确定呢?如果有实物就最好啦。我一直想弄这个实物进行实验一下。但就是这几个问题不能确定。
回复

使用道具 举报

板凳
ID:171036 发表于 2020-4-8 14:28 | 只看该作者
xmfjfhcel 发表于 2020-4-8 11:42
不知楼主有没有用过这个霍尔来测电机的转速。
如果有,咨询一下,霍尔是要检测电机转轴上的磁铁吧? 磁铁 ...

有试过的哦   一般磁铁可以啦   用一个磁铁粘到套在电机轴上的旋转盘或者其他圆盘  如果有偏心块那最好  偏心块套在电机轴上  再用磁铁粘在偏心块上  至于霍尔传感器  可以上网买霍尔传感器模块就可以啦
回复

使用道具 举报

地板
ID:728262 发表于 2020-4-17 21:24 | 只看该作者
楼主大大可以告诉下接霍尔传感器的哪些电阻用什么用吗
回复

使用道具 举报

5#
ID:171036 发表于 2020-4-18 12:05 | 只看该作者
我是靴子 发表于 2020-4-17 21:24
楼主大大可以告诉下接霍尔传感器的哪些电阻用什么用吗

这些电阻用来限流啊  霍尔传感器测速部分只是模拟  实际上可以购买霍尔传感器模块来代替即可
回复

使用道具 举报

6#
ID:507412 发表于 2020-5-4 20:24 | 只看该作者
不需要写外部中断吗?
回复

使用道具 举报

7#
ID:171036 发表于 2020-5-6 20:01 | 只看该作者
我只是过客 发表于 2020-5-4 20:24
不需要写外部中断吗?

用定时器计数器来做霍尔测速相对于外部中断测速准确的哦
回复

使用道具 举报

8#
ID:507412 发表于 2020-5-7 14:44 | 只看该作者
51黑电子会员 发表于 2020-5-6 20:01
用定时器计数器来做霍尔测速相对于外部中断测速准确的哦

我有霍尔传感器,为什么有时候霍尔传感器感应磁铁时,有触发两次中断呢?是因为磁铁的磁性太强了?一直卡在这里
回复

使用道具 举报

9#
ID:507412 发表于 2020-5-7 23:39 | 只看该作者
太感谢博主了,用定时器计数确实比外部中断准确,点赞
回复

使用道具 举报

10#
ID:507412 发表于 2020-5-7 23:44 | 只看该作者
光电传感器也可以用定时器来计数吧?
回复

使用道具 举报

11#
ID:507412 发表于 2020-5-8 20:43 | 只看该作者
博主,定时1分钟,数据也会不准确吧?霍尔一圈要给多少个脉冲精度才准确?
回复

使用道具 举报

12#
ID:171036 发表于 2020-5-22 08:29 | 只看该作者
我只是过客 发表于 2020-5-8 20:43
博主,定时1分钟,数据也会不准确吧?霍尔一圈要给多少个脉冲精度才准确?

速度一定后 也就是每秒多少转恒定后  每分钟是不是每秒累积出来的速度  会说不准确吗?
回复

使用道具 举报

13#
ID:880793 发表于 2021-4-28 11:02 | 只看该作者
需要对两个电机测速的话,可以T0,T1连接两个霍尔元件进行测速吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表