霍尔传感器测速度显示在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一次
}
#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 值得轉數 .....進而轉換成想要顯示的轉數......
已经解决问题了谢谢
啊呀呀呀,怎么解决的兄台?最近我也要做霍尔测速的,才接触,完全小白,例程能否看看?