找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1288|回复: 5
收起左侧

单片机+测速传感器—问题求解,不论怎么使电机转动,lcd上都显示0

[复制链接]
ID:628333 发表于 2019-10-22 17:23 | 显示全部楼层 |阅读模式
该测速传感器与单片机相连后,不论怎么使电机转动,lcd上都显示0。求大神,求解。单片机是51单片机
51hei图片20191022171857.jpg
51hei图片20191022171850.jpg

无论怎么遮挡,lcd上都显示0

无论怎么遮挡,lcd上都显示0
回复

使用道具 举报

ID:235200 发表于 2019-10-22 18:35 | 显示全部楼层
应该是传感器位置装的不对,从图上看是红外对管进行检测,需在飞轮上钻一个孔,光从孔中通过,当飞轮转动时测出对管产生的脉冲间隔时间来计算速度的
回复

使用道具 举报

ID:149144 发表于 2019-10-22 19:17 | 显示全部楼层
程序呢 ?
这样问貌似没法回答
回复

使用道具 举报

ID:628333 发表于 2019-10-23 17:56 来自手机 | 显示全部楼层
cuihaodianzi 发表于 2019-10-22 19:17
程序呢 ?
这样问貌似没法回答

#include<reg52.h>//51单片机头文件

#define uchar unsigned char//宏定义
#define uint unsigned int
uchar code digit[]="0123456789";//定义字符数组数字
uchar disp[8];//存储拆开的数
uint cnt;//中断次数
uchar v;//电机0速度
uchar s;//电机1速度
uchar flag;        //计满1秒钟标志位
/////////
sbit rs=P2^6;//数据命令选择
sbit rw=P2^5;//读写控制信号
sbit e=P2^7;//使能信号
///////////////
void delay_50us(uint t)//50us延时函数
{
uchar j;
for(;t>0;t--)
    for(j=19;j>0;j--);
}
/////////////
/*
void delay_50ms(uint t)//50ms延时函数
{
uint j;
   for(;t>0;t--)
   for(j=6245;j>0;j--);
}
/////////
*/
void write_com(uchar com)//写地址
{
e=0;
rs=0;
rw=0;
P0=com;
delay_50us(10);
e=1;
delay_50us(10);
e=0;
}
///////
void write_data(uchar dat)// 写数据
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_50us(10);
e=1;
delay_50us(10);
e=0;
}
//////
void init(void)//液晶初始化
{
  delay_50us(300);
  write_com(0x38);
  delay_50us(100);
  write_com(0x38);
  delay_50us(100);
  write_com(0x38);
  write_com(0x38);
  write_com(0x08);
  write_com(0x01);
  write_com(0x06);
  write_com(0x0c);
}
/////////////
void writeaddress(uchar x)//指定字符的实际地址
{

  write_com(x|0x80);//显示位置的确定方法规定为“80h+地址码x“
}
//////////
void display_sym(void)//显示速度提示符
{
writeaddress(0x00);//写显示地址第一行第一列
write_data('v');//写数据v
write_data('=');//写数据=
writeaddress(0x00+0x40);//写显示地址第一行第一列
write_data('s');//写数据v
write_data('=');//写数据=
}
//////
void dispose()//
{
disp[0]=v/1000;
disp[1]=(v%1000)/100;
disp[2]=(v/100)/10;
disp[3]=v%10;
disp[4]=s/1000;
disp[5]=(s%1000)/100;
disp[6]=(s/100)/10;
disp[7]=s%10;
}
/////////////
void display_val(void)
{
writeaddress(0x02);//写显示地址,第一行第三列
  write_data(digit[disp[0]]);//千
  write_data(digit[disp[1]]);//百
  write_data(digit[disp[2]]);//时
  write_data(digit[disp[3]]);//个
   writeaddress(0x02+0x40);//写显示地址,第2行第三列
  write_data(digit[disp[4]]);//千
  write_data(digit[disp[5]]);//百
  write_data(digit[disp[6]]);//时
write_data(digit[disp[7]]);//个

}   
////////
void display_uint(void)//显示速度单位
{
  writeaddress(0x06);//第1行第7列
  write_data('r');//千
  write_data('/');//百
  write_data('m');//时
  write_data('i');//个
  write_data('n');//个
writeaddress(0x06+0x40);//第2行第7列
  write_data('r');//千
  write_data('/');//百
  write_data('m');//时
  write_data('i');//个
  write_data('n');//个

}
void initial()//初始化
{
TMOD=0x55; //定时器T1工作与计数器模式1,定时器T0工作于计数器模式1
RCAP2H=(65536-50000)/256;
RCAP2L=(65536-50000)%256;
ET2=1;
TR2=1;
EA=1;

}
///////
void main()
{
init();
v=0;
s=0;
initial();
cnt=0;
display_sym();
display_uint();

while(1)
{
TR1=1;
TR0=1;
TH1=0;
TL1=0;
TH0=0;
TL0=0;
flag=0;        // 时间还未满1分钟
while(flag==1);        // 时间未满等待
v=(TH1*256+TL1)*60/20;        // 计算速度,每周产生20个脉冲
s=(TH0*256+TL0)*60/20;        // 计算速度,每周产生20个脉冲
dispose();
display_val();
}
}
//////                                                                                                          
void time2() interrupt 5//定时器T2中断服务程序
{
TF2=0;
cnt++;
if(cnt==20)
{
flag=1;
cnt=0;
}
}
回复

使用道具 举报

ID:628333 发表于 2019-10-23 17:59 | 显示全部楼层
csmyldl 发表于 2019-10-22 18:35
应该是传感器位置装的不对,从图上看是红外对管进行检测,需在飞轮上钻一个孔,光从孔中通过,当飞轮转动时 ...

大神,不是这样的吧,我们是用电机风扇叶来测的,有间隙的啊
回复

使用道具 举报

ID:628333 发表于 2019-10-23 18:00 | 显示全部楼层
cuihaodianzi 发表于 2019-10-22 19:17
程序呢 ?
这样问貌似没法回答

程序来了,大神

#include<reg52.h>//51单片机头文件


#define uchar unsigned char//宏定义
#define uint unsigned int
uchar code digit[]="0123456789";//定义字符数组数字
uchar disp[8];//存储拆开的数
uint cnt;//中断次数
uchar v;//电机0速度
uchar s;//电机1速度
uchar flag;        //计满1秒钟标志位
/////////
sbit rs=P2^6;//数据命令选择
sbit rw=P2^5;//读写控制信号
sbit e=P2^7;//使能信号
///////////////
void delay_50us(uint t)//50us延时函数
{
uchar j;
for(;t>0;t--)
    for(j=19;j>0;j--);
}
/////////////
/*
void delay_50ms(uint t)//50ms延时函数
{
uint j;
   for(;t>0;t--)
   for(j=6245;j>0;j--);
}
/////////
*/
void write_com(uchar com)//写地址
{
e=0;
rs=0;
rw=0;
P0=com;
delay_50us(10);
e=1;
delay_50us(10);
e=0;
}
///////
void write_data(uchar dat)// 写数据
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_50us(10);
e=1;
delay_50us(10);
e=0;
}
//////
void init(void)//液晶初始化
{
  delay_50us(300);
  write_com(0x38);
  delay_50us(100);
  write_com(0x38);
  delay_50us(100);
  write_com(0x38);
  write_com(0x38);
  write_com(0x08);
  write_com(0x01);
  write_com(0x06);
  write_com(0x0c);
}
/////////////
void writeaddress(uchar x)//指定字符的实际地址
{

  write_com(x|0x80);//显示位置的确定方法规定为“80h+地址码x“
}
//////////
void display_sym(void)//显示速度提示符
{
writeaddress(0x00);//写显示地址第一行第一列
write_data('v');//写数据v
write_data('=');//写数据=
writeaddress(0x00+0x40);//写显示地址第一行第一列
write_data('s');//写数据v
write_data('=');//写数据=
}
//////
void dispose()//
{
disp[0]=v/1000;
disp[1]=(v%1000)/100;
disp[2]=(v/100)/10;
disp[3]=v%10;
disp[4]=s/1000;
disp[5]=(s%1000)/100;
disp[6]=(s/100)/10;
disp[7]=s%10;
}
/////////////
void display_val(void)
{
writeaddress(0x02);//写显示地址,第一行第三列
  write_data(digit[disp[0]]);//千
  write_data(digit[disp[1]]);//百
  write_data(digit[disp[2]]);//时
  write_data(digit[disp[3]]);//个
   writeaddress(0x02+0x40);//写显示地址,第2行第三列
  write_data(digit[disp[4]]);//千
  write_data(digit[disp[5]]);//百
  write_data(digit[disp[6]]);//时
write_data(digit[disp[7]]);//个

}   
////////
void display_uint(void)//显示速度单位
{
  writeaddress(0x06);//第1行第7列
  write_data('r');//千
  write_data('/');//百
  write_data('m');//时
  write_data('i');//个
  write_data('n');//个
writeaddress(0x06+0x40);//第2行第7列
  write_data('r');//千
  write_data('/');//百
  write_data('m');//时
  write_data('i');//个
  write_data('n');//个

}
void initial()//初始化
{
TMOD=0x55; //定时器T1工作与计数器模式1,定时器T0工作于计数器模式1
RCAP2H=(65536-50000)/256;
RCAP2L=(65536-50000)%256;
ET2=1;
TR2=1;
EA=1;

}
///////
void main()
{
init();
v=0;
s=0;
initial();
cnt=0;
display_sym();
display_uint();

while(1)
{
TR1=1;
TR0=1;
TH1=0;
TL1=0;
TH0=0;
TL0=0;
flag=0;        // 时间还未满1分钟
while(flag==1);        // 时间未满等待
v=(TH1*256+TL1)*60/20;        // 计算速度,每周产生20个脉冲
s=(TH0*256+TL0)*60/20;        // 计算速度,每周产生20个脉冲
dispose();
display_val();
}
}
//////                                                                                                          
void time2() interrupt 5//定时器T2中断服务程序
{
TF2=0;
cnt++;
if(cnt==20)
{
flag=1;
cnt=0;
}
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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