|
本人写了一个电机测速的程序,电机轴上装有传感器,转一圈发送40个脉冲,但是1602始终显示0.
我的程序思路:用INTO和INT1控制加减速,用T0计时0.1毫秒,T1计数脉冲,看一秒收到了多少个脉冲,就测出了转速,1602的头文件已经测试过了没问题,我感觉可能是T1计数出问题,但就是找不出原因
#include <REGX52.H>
#include <lcd1602.h>
unsigned int z=50; //???????
unsigned int counter=0;
unsigned int s=0,j=0;
sbit speed=P3^5;
sbit pwm=P1^3;
sbit k1=P3^2;
sbit k2=P3^3;
void delay(unsigned int t) //延时函数
{
unsigned int t1;
t1=t;
while(t1--);
}
void Int0Init() /配置INT0
{
IT0=1;//????????????????????
EX0=1;//??INT0???ж??????
EA=1;//?????ж?
}
void Int1Init() /配置INT1
{
IT1=1;//????????????????????
EX1=1;//??INT1???ж??????
}
void Timer0Init() /配置T0,计时0.1毫秒
{
TMOD=0X51; /设置TMOD
TH0=0xFF;
TL0=0x9C;
ET0=1;//???????0?ж?????
EA=1;//?????ж?
TR0=1;//???????
}
void Timer1Init()//配置T1,计数
{
TH1=0X00;
TL1=0x00;
TR1=1;//???????
}
void dingshi() interrupt 1 //计时中断
{
TH0=0xFF;
TL0=0x9C;
counter++;
s++;
j++;
}
void jiasu() interrupt 0 //按键加速
{
delay(1000);
if(k1==0)
{
z=z+5;
}
}
void jiansu() interrupt 2 //按键减速
{
delay(1000);
if(k2==0)
{
z=z-5;
}
}
void main()
{
Timer0Init();
Timer1Init();
Int0Init();
Int1Init();
LCD1602_INT(); //1602初始化
while(1)
{
if(j>=100)
{j=0;}
if(j<=z)
{pwm=1;}
else
{pwm=0;}//产生PWM波
if(counter>=10000)//counter循环10000次,也就是10000*0.1毫秒就是1秒
{
counter=0;
speed=TH1*256+TL1;
TH1=0X00;/清零
TL1=0x00;//清零
}
if (s>=10000)//??????????????????
{ s=0;
LCD1602_WC(0X01);/清屏
delay(700);
LCD1602_DISDAT(1,1,speed*1.5);//给1602返回速度
LCD1602_DISCHAR(1,2,'r');
LCD1602_DISCHAR(1,3,'a');
LCD1602_DISCHAR(1,4,'d');
LCD1602_DISCHAR(1,5,'/');
LCD1602_DISCHAR(1,6,'m');
LCD1602_DISCHAR(1,7,'i');
LCD1602_DISCHAR(1,8,'n');
}
}
}
|
|