脉冲测速的程序麻烦大家看看可不可以?
时间:10-02
整理:3721RD
点击:
//A44E的3脚连至P3.2;WT588D连至P3.0;ULN2803连至P3.3
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define lcd_12864 P2
sbit speed_data=P3^2; //外部中断0脉冲计数
sbit dianji=P3^3; // 接直流电机调速
sbit RS=P3^5;
sbit RW=P3^6;
sbit EN=P3^7;
uchar code digit[]={"0123456789"} ;
uchar speed_num=0; //脉冲计数次数
uchar num; // 速度调节标志
uchar a,b;
uchar X;
uchar ge,shi,bai,qian,wan;//分别储存采集的个位,十位,百位,千位,万位数字
void Delay_ms(uint xms)
{
uchar i;
while(xms--)
for(i=0;i<120;i++);
}
/********************************************************
*函数名: xianshi()
*功能:
*数组:
********************************************************/
void xianshi()
{
ge=X%10;
shi=(X%100)/10;
bai=(X%1000)/100;
qian=(X%10000)/1000;
wan=X/10000;
lcd12864_display(2,1," ");
lcd12864_write_data(digit[wan]);
lcd12864_write_data(digit[qian]);
lcd12864_write_data(digit[bai]);
lcd12864_write_data(digit[shi]);
lcd12864_write_data(digit[ge]);
Delay_ms(1000);
}
/******************外部中断0服务程序*****************************/
void INT_0() interrupt 0
{
speed_num++;
}
/***************定时器0中断服务程序*****************************/
void timer_0() interrupt 1
{
uchar counter=0;
TH0=(65536-50000)/256; //重设定时器0初值
TL0=(65536-50000)%256;
counter++;
if(100==counter)
{
a=speed_num; //到5S就计算收到多少个脉冲
counter=0;
}
}
/******************速度检测程序*****************************/
uchar speed_text(uchar a) //5S内计算的转速
{
uchar b;
b=a*12;//1分钟的转速
return b;
}
/************** 下面是主函数 *******************************************/
void main()
{
/**中断初始化**/
EA=1; //打开总中断
EX0=1; //打开外部中断0
IT0=1; //外部中断0脉冲触发方式
TMOD |=0x01; //设定时器0的工作模式1
TH0=(65536-50000)/256; //设定定时器0定时时间为10ms计数初值
TL0=(65536-50000)%256;
TR0=1; //打开定时器0
while(1)
{
lcd12864_init();
X=speed_text(b); //获取速度
xianshi(); //显示速度
lcd12864_display(1,1, "当前速度为:");
Delay_ms(3000);
}
}
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define lcd_12864 P2
sbit speed_data=P3^2; //外部中断0脉冲计数
sbit dianji=P3^3; // 接直流电机调速
sbit RS=P3^5;
sbit RW=P3^6;
sbit EN=P3^7;
uchar code digit[]={"0123456789"} ;
uchar speed_num=0; //脉冲计数次数
uchar num; // 速度调节标志
uchar a,b;
uchar X;
uchar ge,shi,bai,qian,wan;//分别储存采集的个位,十位,百位,千位,万位数字
void Delay_ms(uint xms)
{
uchar i;
while(xms--)
for(i=0;i<120;i++);
}
/********************************************************
*函数名: xianshi()
*功能:
*数组:
********************************************************/
void xianshi()
{
ge=X%10;
shi=(X%100)/10;
bai=(X%1000)/100;
qian=(X%10000)/1000;
wan=X/10000;
lcd12864_display(2,1," ");
lcd12864_write_data(digit[wan]);
lcd12864_write_data(digit[qian]);
lcd12864_write_data(digit[bai]);
lcd12864_write_data(digit[shi]);
lcd12864_write_data(digit[ge]);
Delay_ms(1000);
}
/******************外部中断0服务程序*****************************/
void INT_0() interrupt 0
{
speed_num++;
}
/***************定时器0中断服务程序*****************************/
void timer_0() interrupt 1
{
uchar counter=0;
TH0=(65536-50000)/256; //重设定时器0初值
TL0=(65536-50000)%256;
counter++;
if(100==counter)
{
a=speed_num; //到5S就计算收到多少个脉冲
counter=0;
}
}
/******************速度检测程序*****************************/
uchar speed_text(uchar a) //5S内计算的转速
{
uchar b;
b=a*12;//1分钟的转速
return b;
}
/************** 下面是主函数 *******************************************/
void main()
{
/**中断初始化**/
EA=1; //打开总中断
EX0=1; //打开外部中断0
IT0=1; //外部中断0脉冲触发方式
TMOD |=0x01; //设定时器0的工作模式1
TH0=(65536-50000)/256; //设定定时器0定时时间为10ms计数初值
TL0=(65536-50000)%256;
TR0=1; //打开定时器0
while(1)
{
lcd12864_init();
X=speed_text(b); //获取速度
xianshi(); //显示速度
lcd12864_display(1,1, "当前速度为:");
Delay_ms(3000);
}
}