进坛子就得发个有技术的帖子 折煞我们这些菜鸟啊,就把曾经的曾经的DIY5位测速计拿来给大家露个脸 还望大家支持,早日成为KC的鬼子
好了 开工………………
五位速速计主要是来测我的电机主轴的速度,带一个红外发射接收的反射头,已经成型了的
废话不多说 上原理图
源代码 欢迎山寨欢迎复制
#include <reg51.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
bit FLAG=0;
uchar code seg[]={ 0x0C,0xDD,0x34,0x94,0xC5,0x86,0x06,0x9D,0x04,0x84, };
//0,1,2,3,4,5,6,7,8,9
uchar disbuf[]={0,0,0,0,0};
sbit led1=P3^0;
sbit led2=P3^1;
sbit led3=P3^2;
sbit led4=P3^3;
sbit led5=P3^5;
uint discount=0;
uint timecount=0;//定时的次数
uint x;
void delay(void){
unsigned char i=10;
while(i--);
}
void t1_serv() interrupt 3
{
TH1=236;//(65536-tm)/256;uint tm=5000;//5000 wei dingshide shijian
TL1=120;//(65536-tm)%256; 244/72/304
timecount++;
//200 次为1秒计数 600则相对于3秒钟的计数,那么测1min时则要乘以20
if(timecount==600)
{
FLAG=1;
TR0=0; //关闭定时器
timecount=0;
}
}
void main()
{
uint i=0;
TMOD=0x15;
TH0=0;
TL0=0;
TH1=244;//(65536-tm)/256;
TL1=72;//(65536-tm)%256;
TR0=1;
TR1=1;
ET0=1;
ET1=1;
EA=1;
while(1)
{
if(FLAG==1)
{
FLAG=0;
x=TH0<<8|TL0;
x=x*20; //对应上面定时器的值
/******** 数据修正,由于晶振的偏差,所以需要更精准的转速需要在这里进行数据修正
比如在我测试的时候晶振是12.031416M,那么他的偏差就是1500转/min时少1,那么我就在
下面进行加1处理,加600是因为考虑到4舍5入的道理,比如当测到1400转时很接近1500了
那么应该加1的,但1400/1500是为0没有起到修正的作用,所以1500×60%=900时可以考虑
加1,那么数据需要加600刚好达到1500.所以加600的4舍5入值。见下修正值。其他晶振值
时可以通过类似方法进行修正。
****************/
x=x+(x+600)/1500 ;// 数据修正
for(i=0;i<5;i++) disbuf
=0;
i=0;
while(x/10) /*数字逐个赋值给数组*/
{
disbuf=x%10;
x=x/10;
i++;
} /* */
disbuf=x;
TH0=0;
TL0=0;
TR0=1;
}
led1=0;
P1=seg[disbuf[0]];
led5=1;
delay(); //延时
led5=0;
P1=seg[disbuf[1]];
led4=1;
delay(); //延时
led4=0;
P1=seg[disbuf[2]];
led3=1;
delay(); //延时
led3=0;
P1=seg[disbuf[3]];
led2=1;
delay(); //延时
led2=0;
P1=seg[disbuf[4]];
led1=1;
delay(); //延时
}
}
200字以内,仅用于支线交流,主线讨论请采用回复功能。