微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 霍尔传感器测速度显示在1602上面的问题!急急急!

霍尔传感器测速度显示在1602上面的问题!急急急!

时间:10-02 整理:3721RD 点击:
本人新手,求各位大神指导!学校留的题目着急用,根据我的程序液晶上面只能显示三个字母,显示不了速度的数字!求指导!
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define C 0.045
sbit EN=P2^5;
sbit RS=P1^0;
sbit RW=P1^1;
sbit BF=P0^7;
sbit DU = P2^6;
sbit WE = P2^7;
sbit HE=P2^1;                 //霍尔传感器的信号引脚
float speed=0.00;
uint m_s;
uchar j,k,l;
uchar table[]={"speed:"};
void cmg88()//关数码管
{
DU=1;  
P0=0X00;
DU=0;
}
void wait(void)                                  //判忙函数
{
        P0=0;
        if(BF==1)
        {
                RS=0;
                RW=1;
                EN=1;
                EN=0;
        }
        EN=0;
}
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void wdat(uchar dat)                   /*写数据*/
{
        wait();
        RS=1;
        RW=0;
        P0=dat;
        delay(5);
        EN=1;
        delay(5);
        EN=0;       
}
void wcmd(uint cmd)
{
        wait();
        RS=0;
        RW=0;
        P0=cmd;
        delay(5);
        EN=1;
        delay(5);
        EN=0;
}
void WriteAddress(unsigned char x)
{
     wcmd(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
}
void string(addr,uchar *p)                           //发送字符串给1602
{
        wcmd(addr);
        while(*p!='\0')
                wdat(*p++);
}
void init()
{
        wcmd(0x38);        //0x38指令码
        wcmd(0x0c);            //开显示,D=1,0x0c
        wcmd(0x06);                // 左移,光标不移动
        wcmd(0x01);                //清屏
}
void main()
{
        init();
        TMOD=0x01;                //设置定时器0工作方式1
        TH0=(65536-10000)/256;    // 256是因为TH0代表高八位,2^8=256            
        TL0=(65536-10000)%256;                                          /*中断一次10ms*/                                                                       
        ET0=1;                    //开定时器0的中断
        EA=1;
        TR0=1;
        while(1)
        {         
                         //1602显示
                while(HE);         //等待霍尔传感器为低电平,高电平等待,低电平程序往下走
                speed=C*1000/m_s;                                                //C*1000为mm    mm/ms=m/s
                m_s=0;
                 string(0x80,table);       
                j=(int)speed%10;             //速度的整数部分
            k=(int)(speed*10)%10;    //小数点后第一位
            l=(int)(speed*100)%10;             //小数点后第二位  
                WriteAddress(0x86);
                wdat(table[j]);
                   wdat(table[k]);
                wdat(table[l]);
                wdat(' ');
                wdat('m');
                wdat('/');
                wdat('s');
                delay(10);
        }
}
void timer0() interrupt 1          
{
        TH0=(65536-10000)/256;                              
        TL0=(65536-10000)%256;
        m_s+=10;                        //中断每10ms一次
}


然后磁钢在霍尔元件附近,液晶上面的那三个字母改变,但是就是没有数字,求解决!

需要可以联系我,点击下面的连接可以找到我

路过点赞,很好玩的事情。

没有看到小编采样时间的编辑呀

我感覺上是霍尔传感器讀程序上有問題。....
我覺得用1.外部中斷計算轉動圈數 (count 遞增)....2  time 0 當時基點......當中斷時間到讀取霍尔传感器的轉動圈數 .
讀取的方法: time 0 當時基點(例如設計每秒)......當中斷時間到讀取霍尔传感器的轉動圈數 (count)存入 DAT 中 並將  (count)清0 以便重新計數
在主程式中運算 DAT的值 既為 每秒有 DAT 值得轉數  .....進而轉換成想要顯示的轉數......

已经解决问题了谢谢

啊呀呀呀,怎么解决的兄台?最近我也要做霍尔测速的,才接触,完全小白,例程能否看看?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top