找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 20133|回复: 38
收起左侧

霍尔传感器+单片机+lcd 测速并显示的问题

  [复制链接]
ID:61210 发表于 2014-4-28 12:50 | 显示全部楼层 |阅读模式
程序:
#include <reg51.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char         //宏定义
/*-----------------------端口命名------------------------*/
sbit rs=P2^0;       //LCD的数据/命令选择端
sbit rw=P2^1;       //LCD的读写选择端
sbit e=P2^2;      //LCD的使能信号端  
/*-------------------------------------------------------*/
/*-----------------------定义参数------------------------*/
uint i,z,count,zhuan,msec;     //定义参数
uchar display[]={" speed=     r/min "};     //定义显示参数 /*-------------------------------------------------------*/
/*-----------------------毫秒延时------------------------*/
void delay(uint ms)
{  
uint i,j;      //为延时引入i,j两参数  
for (j=0;j<ms;j++)     //延时第一循环   
for (i=0;i<120;i++);    //延时第二循环  
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602写命令--------------------*/
void write_command(uchar command)
{
rs=0;       //数据、命令选择端0为命令
rw=0;       //读、写选择端0为写
P0=command;      //向LCD写命令
delay(5);      //稍做延迟,代替检测忙状态  
e=1;      //信号使能端高电平
delay(5);      //稍做延迟,代替检测忙状态  
e=0;      //信号使能端低电平
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602写数据--------------------*/
void write_data(uchar data0)
{
rs=1;       //数据、命令选择端 1为数据
rw=0;       //读、写选择端0为写
P0=data0;      //向LCD写数据
delay(5);      //稍做延迟,代替检测忙状态
e=1;      //信号使能端高电平
delay(5);     //稍做延迟,代替检测忙状态
e=0;      //信号使能端低电平
}
/*-------------------------------------------------------*/
/*-------------------外部中断0计数程序-------------------*/
void counter(void) interrupt 0
{   
EX1=0;       //关外部中断1  
count++;  
if(count==2)      //2次循环为发动机转一圈  
{   
count=1;     //初始化计数   
     z++;      //转圈计数加1
  }      //计数+1  
  EX1=1;       //开外部中断1  
     return;
}
/*-------------------------------------------------------*/
/*------------------------LCD显示------------------------*/
void displaytolcd()
{  
  write_command(0x80);     //向LCD1602写命令80H  
  for (i=0;i<sizeof(display)-1;i++)   //循环要传输的字符个数次,每一次传一个字符  
{   
    write_data(display[i]);   
      delay(5);  
  }
} /*-------------------------------------------------------*/  
/*-----------------内部中断0计时计数程序-----------------*/
void Timer_0(void) interrupt 1
{  
   TH0=0x65;      //50ms定时  
   TL0=0xF3;  
   msec++;  
   if(msec==20)      //50*20=1S  
{   
     displaytolcd();   
     msec=0;   
     zhuan=30*z;   
     z=0;  
}
}
/*-------------------------------------------------------*/
/*----------------------端口初始化-----------------------*/
void int_all()
{  
z=0;       //初始化z的值  
count=0;      //初始化count的值  
zhuan=0;      //初始化转的值  
rw=0;       //选择LCD写数据指令  
delay(15);      //延时15ms  
write_command(0x38);     //向LCD1602写命令38H  
delay(5);      //延时5ms  
write_command(0x0e);     //向LCD1602写命令0EH  
delay(5);      //延时5ms  
write_command(0x06);     //向LCD1602写命令06H
TMOD=0x01;      //内部中断定时器选择  
TH0=0x66;      //50ms定时  
TL0=0x50;  
EA=1;       //开中断总开关  
ET0=1;       //开内部中断0
TR0=1;       //计时器开始工作  
IT0=1;       //外部中断0为下降沿触发  
EX0=1;       //开外部中断0
}
/*-------------------------------------------------------*/
/*-----------------------数据处理------------------------*/
void  disp_count()
{  
display[9]=(zhuan/1000+'0');    //转换转速的千位  
display[10]=(zhuan/100%10+'0');    //转换转速的百位  
display[11]=(zhuan/10%10+'0');    //转换转速的十位   
display[12]=(zhuan%10+'0');    //转换转速的个位
}
/*-------------------------------------------------------*/
/*------------------------主函数-------------------------*/
void main()
{  
   int_all();     //全局初始化  
   while(1)  
  {
   disp_count();     //数据处理
   displaytolcd();     //LCD显示  
  }
}
/*-------------------------------------------------------*/
电路图:

单片机测速电路

单片机测速电路

运行时截图

运行时截图
回复

使用道具 举报

ID:61210 发表于 2014-4-28 12:53 | 显示全部楼层
刚学习这方面的知识,请大神们帮忙看看
回复

使用道具 举报

ID:1 发表于 2014-4-28 13:37 | 显示全部楼层
这个程序有什么问题?
回复

使用道具 举报

ID:61200 发表于 2014-4-28 13:41 | 显示全部楼层
看起来好像没发现问题
回复

使用道具 举报

ID:61210 发表于 2014-4-28 16:24 | 显示全部楼层
admin 发表于 2014-4-28 13:37
这个程序有什么问题?

运行结果LCD显示一直是“speed=0000/mi",不知道哪里的问题
回复

使用道具 举报

ID:61210 发表于 2014-4-28 16:25 | 显示全部楼层
一个菜鸟 发表于 2014-4-28 12:53
刚学习这方面的知识,请大神们帮忙看看

运行结果LCD显示一直是“speed=0000/mi",不知道哪里的问题
回复

使用道具 举报

ID:61210 发表于 2014-4-28 16:26 | 显示全部楼层
一个菜鸟 发表于 2014-4-28 12:53
刚学习这方面的知识,请大神们帮忙看看

运行结果LCD显示一直是“speed=0000/mi",不知道哪里的问题
回复

使用道具 举报

ID:61210 发表于 2014-4-28 16:27 | 显示全部楼层
admin 发表于 2014-4-28 13:37
这个程序有什么问题?

运行结果LCD显示一直是“speed=0000/mi",不知道哪里的问题
回复

使用道具 举报

ID:61210 发表于 2014-4-28 16:27 | 显示全部楼层
涟漪 发表于 2014-4-28 13:41
看起来好像没发现问题

运行结果LCD显示一直是“speed=0000/mi",不知道哪里的问题
回复

使用道具 举报

ID:61452 发表于 2014-5-5 12:01 | 显示全部楼层
检查一下硬件hall 中断是否有触发

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:61544 发表于 2014-5-7 20:58 来自手机 | 显示全部楼层
楼主。我也在做这个,我的是测距,交流一下。

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:69244 发表于 2014-11-22 16:37 | 显示全部楼层
我也正在做这个。。。
回复

使用道具 举报

ID:67992 发表于 2014-11-22 20:47 | 显示全部楼层
本帖最后由 dgahz 于 2014-11-22 21:19 编辑

帮我看一下我的能不能用,我不会仿真:
#include <reg51.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char         //宏定义
/*-----------------------端口命名------------------------*/
sbit rs=P2^0;       //LCD的数据/命令选择端
sbit rw=P2^1;       //LCD的读写选择端
sbit e=P2^2;      //LCD的使能信号端  
/*-------------------------------------------------------*/
/*-----------------------定义参数------------------------*/
uint i,z,count,zhuan,msec;     //定义参数
uchar display[]={" speed=     r/min "};     //定义显示参数 /*-------------------------------------------------------*/
/*-----------------------毫秒延时------------------------*/
void delay(uint ms)
{  
        uint i,j;      //为延时引入i,j两参数  
        for (j=0;j<ms;j++)     //延时第一循环   
        for (i=0;i<120;i++);    //延时第二循环  
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602写命令--------------------*/
void write_command(uchar command)
{
        rs=0;       //数据、命令选择端0为命令
        rw=0;       //读、写选择端0为写
        P0=command;      //向LCD写命令
        delay(5);      //稍做延迟,代替检测忙状态  
        e=1;      //信号使能端高电平
        delay(5);      //稍做延迟,代替检测忙状态  
        e=0;      //信号使能端低电平
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602写数据--------------------*/
void write_data(uchar data0)
{
        rs=1;       //数据、命令选择端 1为数据
        rw=0;       //读、写选择端0为写
        P0=data0;      //向LCD写数据
        delay(5);      //稍做延迟,代替检测忙状态
        e=1;      //信号使能端高电平
        delay(5);     //稍做延迟,代替检测忙状态
        e=0;      //信号使能端低电平
}
/*-------------------------------------------------------*/
/*-------------------外部中断0计数程序-------------------*/
void counter(void) interrupt 0
{   

        count++;  
        if(count==2)      //2次循环为发动机转一圈  
        {   
        count=0;     //初始化计数   
             z++;      //转圈计数加1
          }   
     

}
/*-------------------------------------------------------*/
/*------------------------LCD显示------------------------*/
void displaytolcd()
{  
  write_command(0x80);     //向LCD1602写命令80H  
  for (i=0;i<sizeof(display)-1;i++)   //循环要传输的字符个数次,每一次传一个字符  
  {   
    write_data(display);   
      delay(5);  
  }
} /*-------------------------------------------------------*/  
/*-----------------内部中断0计时计数程序-----------------*/
void Timer_0(void) interrupt 1
{  
   TH0=0x3c;      //50ms定时  
   TL0=0xb0;  
   msec++;  
   if(msec==20)      //50*20=1S  
   {   
                 msec=0;
                 zhuan=60*z;
             displaytolcd();   
               
             count=0;   
             z=0;
               
   }
}
/*-------------------------------------------------------*/
/*----------------------端口初始化-----------------------*/
void int_all()
{  
        z=0;       //初始化z的值  
        count=0;      //初始化count的值  
        zhuan=0;      //初始化转的值  
        rw=0;       //选择LCD写数据指令  
        delay(15);      //延时15ms  
        write_command(0x38);     //向LCD1602写命令38H  
        delay(5);      //延时5ms  
        write_command(0x0e);     //向LCD1602写命令0EH  
        delay(5);      //延时5ms  
        write_command(0x06);     //向LCD1602写命令06H
        TMOD=0x01;      //内部中断定时器选择  
        TH0=0x3c;      //50ms定时  
        TL0=0xb0;  
        EA=1;       //开中断总开关  
        ET0=1;       //开内部中断0
        TR0=1;       //计时器开始工作  
        IT0=1;       //外部中断0为下降沿触发  
        EX0=1;       //开外部中断0
}
/*-------------------------------------------------------*/
/*-----------------------数据处理------------------------*/
void  disp_count()
{  
display[9]=(zhuan/1000+'0');    //转换转速的千位  
display[10]=(zhuan/100%10+'0');    //转换转速的百位  
display[11]=(zhuan/10%10+'0');    //转换转速的十位   
display[12]=(zhuan%10+'0');    //转换转速的个位
}
/*-------------------------------------------------------*/
/*------------------------主函数-------------------------*/
void main()
{  
   int_all();     //全局初始化  
   while(1)  
  {
           disp_count();     //数据处理
           displaytolcd();     //LCD显示  
  }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:69264 发表于 2014-11-22 23:53 | 显示全部楼层
不错
回复

使用道具 举报

ID:63924 发表于 2014-12-1 23:42 | 显示全部楼层
可以用啊,程序,没有磁场的显示0000/mi,有磁场的不运动的显示0030/mi然后回到0000/mi,运动的显示相应的速度值,它是靠脉冲计数的。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:70085 发表于 2014-12-7 15:24 | 显示全部楼层
xianxu274 发表于 2014-11-28 10:22
群里是否有人做电子研发  需要PCB焊接的呀  因为是少量的 很多公司不愿意接且价格也比较贵 而我是个人  绝 ...

我仿真的时候怎么不行啊?没有显示啊能指教一下吗?
回复

使用道具 举报

ID:70085 发表于 2014-12-7 15:25 | 显示全部楼层
84533243 发表于 2014-12-1 23:42
可以用啊,程序,没有磁场的显示0000/mi,有磁场的不运动的显示0030/mi然后回到0000/mi,运动的显示相应的 ...

我仿真的时候怎么不行啊,没有显示。能指导一下吗?
回复

使用道具 举报

ID:63924 发表于 2014-12-13 21:03 | 显示全部楼层
哦,仿真不一定能达到要求,可以用实物仿真,有时候实物也不能达到要求,

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:72399 发表于 2015-6-9 22:45 | 显示全部楼层
输入端好像没有定义着,所以没有输入端那肯定只会显示0000了

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:86249 发表于 2015-7-20 14:58 | 显示全部楼层
电路图有问题,光耦后面加一个反相器就好了
QQ截图20150720150140.png

评分

参与人数 1威望 +50 黑币 +50 收起 理由
admin + 50 + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:86249 发表于 2015-7-21 11:07 | 显示全部楼层
程序也有问题,首先定时50ms,在12MHZ晶振下,   
   TH0=0x3c;      //50ms定时  
   TL0=0xb0;
另外计数的时候:
  if(msec==20)      //50*20=1S  
{   
     displaytolcd();   
     msec=0;   
     zhuan=30*z;   
     z=0;  
   TH0=0x3c;      //相比原程序,这里重新计数器赋初值50ms定时  
   TL0=0xb0;
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:105155 发表于 2016-4-30 20:42 | 显示全部楼层
最近在做这个,谢谢源程序
回复

使用道具 举报

ID:59341 发表于 2016-5-9 20:00 | 显示全部楼层
求解:在仿真图中都没看到外部中断1,这程序里怎么有个关和开外部中断1.

void counter(void) interrupt 0
{   
EX1=0;       //关外部中断1  
count++;  
if(count==2)      //2次循环为发动机转一圈  
{   
count=1;     //初始化计数   
     z++;      //转圈计数加1
  }      //计数+1  
  EX1=1;       //开外部中断1  
     return;
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:116962 发表于 2016-5-13 15:43 | 显示全部楼层
楼主好,你有实物图吗?让我看看,我现在也在做这方面的毕业论文,谢谢啦
回复

使用道具 举报

ID:116962 发表于 2016-5-13 15:45 | 显示全部楼层
楼主下午好,你有做实物吗?我现在做这方面的毕业设计,让我看看,谢谢啦
回复

使用道具 举报

ID:124087 发表于 2016-5-30 20:22 | 显示全部楼层
本帖最后由 单片机~+ 于 2016-5-30 20:59 编辑

大神们,我想问一下电路图中为什么要加上光电耦合(外部脉冲对单片机的影响不大呀),还有就是加上光电耦合之后又为什么再加上反相器?
回复

使用道具 举报

ID:124087 发表于 2016-5-30 21:06 | 显示全部楼层
程序我觉得这样写更好!请大神指点一二。
void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        if(++C_50ms>19)
        {
                C_50ms=0;//定时1s之后C_50ms清零
                EX0=0;//关闭外部中断0
                N=60*Z;//计算转速
                Z=0;//初始化圈数
                flag_1s=1;//1s标志位置1
                TH0=0x3c;//重新赋值
                TL0=0xb0;               
                EX0=1;//打开外部中断0,开始计数。
        }
}
回复

使用道具 举报

ID:140977 发表于 2016-9-30 13:35 | 显示全部楼层
           void Timer_0(void) interrupt 1
           {
            TH0=0x3c;    //50ms¶¨ê±
                  TL0=0xb0;
                //msec++;
                if(++msec<20);     //  50*20=1s
                {
                        //displaytolcd();
                  msec=0;
                        //EX0=0;
                  zhuan=60*z;
                  //count=0;
                  z=0;
                        TH0=0x3c;   
                  TL0=0xb0;
                        //EX0=1;
                  }
                  }
把displaytolcd();这条删除即可显示
回复

使用道具 举报

ID:141354 发表于 2016-10-5 11:46 | 显示全部楼层
好像没发现问题
回复

使用道具 举报

ID:149569 发表于 2016-11-22 21:07 | 显示全部楼层
84533243 发表于 2014-12-1 23:42
可以用啊,程序,没有磁场的显示0000/mi,有磁场的不运动的显示0030/mi然后回到0000/mi,运动的显示相应的 ...

大神 怎样给他一个磁场 或是脉冲呢
回复

使用道具 举报

ID:189908 发表于 2017-5-16 17:56 | 显示全部楼层
单片机~+ 发表于 2016-5-30 20:22
大神们,我想问一下电路图中为什么要加上光电耦合(外部脉冲对单片机的影响不大呀),还有就是加上光电耦合 ...

我也想知道这个问题
回复

使用道具 举报

ID:233681 发表于 2017-9-17 17:25 | 显示全部楼层
有stm32的霍尔传感器测速程序吗 ??????求
回复

使用道具 举报

ID:186936 发表于 2017-9-26 20:11 | 显示全部楼层
你好,你的这个程序我有个建议,加一段数据处理,显示当前时速,公里数,钱数,做出一个出租车计价器装在小车上用手机控制
回复

使用道具 举报

ID:186926 发表于 2018-3-13 17:33 | 显示全部楼层
我想问问这是怎么运用的啊  这个霍尔传感器放到哪里啊 难道把整块板子放到车轮那里????
回复

使用道具 举报

ID:330988 发表于 2018-5-16 09:32 | 显示全部楼层
有附件吗
回复

使用道具 举报

ID:336525 发表于 2018-5-23 15:07 | 显示全部楼层
各位大神能帮我看看这个电路有没有问题呢,用了外部中断哦,但传感器好像没有发出脉冲

电器原理图.pdf

250.03 KB, 下载次数: 32

回复

使用道具 举报

ID:405033 发表于 2018-11-27 21:44 | 显示全部楼层
有没有大佬用过这个程序,为什么有时候液晶屏的千位会显示符号?
回复

使用道具 举报

ID:439728 发表于 2018-12-5 14:37 | 显示全部楼层
这个霍尔传感器放到哪里
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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