我是一个学习单片机的新手,最经遇到了一个直流电机测速的问题,还请大家帮帮忙!!具体如下~~
现在我的试验系统是:一个小型的直流电机,在直流电机的转轴上安置一个小转盘,在转盘的边缘上有8个小孔,在电机的底座上有个槽型光耦传感器,当电机转动时,带动转盘转动,在转盘转...
现在我的试验系统是:一个小型的直流电机,在直流电机的转轴上安置一个小转盘,在转盘的边缘上有8个小孔,在电机的底座上有个槽型光耦传感器,当电机转动时,带动转盘转动,在转盘转动时,槽型光耦就会输出一个脉冲信号,然后用51单片机的外中断0去采集传感器输出的信号,先计算电机所转的圈数,最终得出电机的速度,在12864显示屏上显示出来。本人现在编写了一个程序,但好像是错的,不知道错在哪里了,请高手多多指教指教!!给我一个程序也行!!谢谢~~
本人在言语方面表达的可能有问题,还请大家原谅!!
我本人的程序如下,我的程序是仅仅将电机的圈数计算出来!!!请大家帮帮忙!!!
#define _0007_C_
#include "reg51.h"
#include "0007.h"
#define p2 P2
sbit rst=P1^0;
sbit cs2=P1^1;
sbit cs1=P1^2;
sbit e=P1^3;
sbit rw=P1^4;
sbit rs=P1^5;
sbit kai=P1^6;
unsigned char quanshu;
//这里时显示汉字和数字的自摸信息,由于字数太长了,本人已经删除了!!
void delay(unsigned char z)
{
while (z--);
}
void zhiling(unsigned char zhi)
{
rw=0;
rs=0;
delay(1);
p2=zhi;
e=1; //液晶下降沿触发
e=0; //液晶的使能信号是下降沿有效
}
void shuju(unsigned char shu)
{
rw=0; //对液晶是写操作
rs=1; //送入的是显示的数据
delay(1);
p2=shu;
e=1; //大液晶的使能信号是下降沿有效
e=0; //下降沿有效
}
void chushihua()
{
rst=0;
delay(200);
rst=1; //硬件复位完成
zhiling(0x3f); //开显示
zhiling(0x40); //设置 y 的 地址
zhiling(0xb8); //设置 x 的 地址
zhiling(0xc0); //设置 z 的 地址
}
void qingping()
{
unsigned char j,k;
for (j=0;j<8;j++)
{
zhiling(0xb8+j);
for (k=0;k<64;k++)
{
shuju(0x00);
}
}
}
void xianshi(unsigned char ye1,lie1,kuan,gao,daxiao,unsigned char *wenzi)
{
unsigned char j,k;
unsigned char ye,lie;
unsigned char n;
ye=0xb8+ye1;
lie=0x40+lie1;
for (j=0;j<gao;j++)
{
zhiling(ye+j);
for (k=0;k<kuan;k++)
{
zhiling(lie+k);
shuju(wenzi[n]);
n++;
if (n==daxiao)
{
n=0;
}
}
}
}
void in0()
{
IT0=1; //低电平触发
EA=1; //开总中断
EX0=1; //开外中断0
}
void main()
{
unsigned char j;
unsigned char shu[16];
char a1=0;
quanshu=0;
cs1=cs2=1;
chushihua();
qingping();
in0();
kai=0; //电机启动
while (1)
{
cs1=1;cs2=0;
xianshi(3,0,16,2,32,hanzi1); //显示 当
xianshi(3,0+16,16,2,32,hanzi2); //显示 前
xianshi(3,0+16+16,16,2,32,hanzi3); //显示 已
xianshi(3,0+16+16+16,16,2,32,hanzi4);//显示 转
cs1=0;cs2=1;
xianshi(3,0,16,2,32,hanzi5); //显示 圈
xianshi(3,0+16,16,2,32,hanzi6); //显示 数
xianshi(3,0+16+16,16,2,32,hanzi7); //显示 :
//------------------------------------------------------------
a1=quanshu/8;
for (j=0;j<16;j++)
{
shu[j]=shuzi[a1/10][j];
}
xianshi(3,0+16+16+16,8,2,16,shu);
for (j=0;j<16;j++)
{
shu[j]=shuzi[a1%10][j];
}
xianshi(3,0+16+16+16+8,8,2,16,shu);
}
}
void duan0() interrupt 0 using 1
{
quanshu++;
}
我设计的测速系统是不是错误的???是不是具有不妥的地方?要是有的话请问怎么改进?? 展开
本人在言语方面表达的可能有问题,还请大家原谅!!
我本人的程序如下,我的程序是仅仅将电机的圈数计算出来!!!请大家帮帮忙!!!
#define _0007_C_
#include "reg51.h"
#include "0007.h"
#define p2 P2
sbit rst=P1^0;
sbit cs2=P1^1;
sbit cs1=P1^2;
sbit e=P1^3;
sbit rw=P1^4;
sbit rs=P1^5;
sbit kai=P1^6;
unsigned char quanshu;
//这里时显示汉字和数字的自摸信息,由于字数太长了,本人已经删除了!!
void delay(unsigned char z)
{
while (z--);
}
void zhiling(unsigned char zhi)
{
rw=0;
rs=0;
delay(1);
p2=zhi;
e=1; //液晶下降沿触发
e=0; //液晶的使能信号是下降沿有效
}
void shuju(unsigned char shu)
{
rw=0; //对液晶是写操作
rs=1; //送入的是显示的数据
delay(1);
p2=shu;
e=1; //大液晶的使能信号是下降沿有效
e=0; //下降沿有效
}
void chushihua()
{
rst=0;
delay(200);
rst=1; //硬件复位完成
zhiling(0x3f); //开显示
zhiling(0x40); //设置 y 的 地址
zhiling(0xb8); //设置 x 的 地址
zhiling(0xc0); //设置 z 的 地址
}
void qingping()
{
unsigned char j,k;
for (j=0;j<8;j++)
{
zhiling(0xb8+j);
for (k=0;k<64;k++)
{
shuju(0x00);
}
}
}
void xianshi(unsigned char ye1,lie1,kuan,gao,daxiao,unsigned char *wenzi)
{
unsigned char j,k;
unsigned char ye,lie;
unsigned char n;
ye=0xb8+ye1;
lie=0x40+lie1;
for (j=0;j<gao;j++)
{
zhiling(ye+j);
for (k=0;k<kuan;k++)
{
zhiling(lie+k);
shuju(wenzi[n]);
n++;
if (n==daxiao)
{
n=0;
}
}
}
}
void in0()
{
IT0=1; //低电平触发
EA=1; //开总中断
EX0=1; //开外中断0
}
void main()
{
unsigned char j;
unsigned char shu[16];
char a1=0;
quanshu=0;
cs1=cs2=1;
chushihua();
qingping();
in0();
kai=0; //电机启动
while (1)
{
cs1=1;cs2=0;
xianshi(3,0,16,2,32,hanzi1); //显示 当
xianshi(3,0+16,16,2,32,hanzi2); //显示 前
xianshi(3,0+16+16,16,2,32,hanzi3); //显示 已
xianshi(3,0+16+16+16,16,2,32,hanzi4);//显示 转
cs1=0;cs2=1;
xianshi(3,0,16,2,32,hanzi5); //显示 圈
xianshi(3,0+16,16,2,32,hanzi6); //显示 数
xianshi(3,0+16+16,16,2,32,hanzi7); //显示 :
//------------------------------------------------------------
a1=quanshu/8;
for (j=0;j<16;j++)
{
shu[j]=shuzi[a1/10][j];
}
xianshi(3,0+16+16+16,8,2,16,shu);
for (j=0;j<16;j++)
{
shu[j]=shuzi[a1%10][j];
}
xianshi(3,0+16+16+16+8,8,2,16,shu);
}
}
void duan0() interrupt 0 using 1
{
quanshu++;
}
我设计的测速系统是不是错误的???是不是具有不妥的地方?要是有的话请问怎么改进?? 展开
2个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询