单片机脉冲信号计数程序不知道哪里不对,我用32码线的光栅盘测速直流电机

2019-07-15 08:37发布

#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==40) //50*40=2S
{
displaytolcd();
msec=0;
zhuan=(z*1.3)/32;
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(0x0c); // 向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 显示
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。