
去年做的车轮转动周期测量系统,元器件包括:2051、4xLED、霍尔传感器、永磁铁,手机锂电池一块(做电源使用)。上面是电路图,下面是程序,利用了T0中断和INT0中断。
这个程序只是算出周期而已,要算出车速也可以,除以车轮长度就可以得出,有兴趣的话自己可以加进去。
//****************************************************
//*******4 X LED 显示_自行车周期(转速)显示系统******
//****************************************************
//****作者:郭鹏
//****版本:1.0
//****日期:20070829
//****功能:2051对霍尔元件送来低电平信号进行计数,捕捉其持续时间,并送往LED显示。
//****端口定义:
//****P3.7为LED4#片选,
//****P3.5为LED3#片选,
//****P3.4为LED2#片选,
//****P3.3为LED1#片选,
//****P1为LED数据输入端口
//****P3.2为外部中断信号的输入口。
//****用到定时器T0。
//****计数格式为:XXX(s),XXX(ms),XXX(us)
//****需要的是 :00X(s),XXX(ms),000(us)
//****比如最后在LED上显示的是:1234ms;所以这期间有个数的转换问题,为了编程方便,
//****取计数到1ms为一个单位,依此累加到第四位,最大显示9999ms。
#include "reg51.h"
#define uchar unsigned char
#define data_port P1 //定义LED显示数据端口
sbit LED_1=P3^7;
sbit LED_2=P3^5;
sbit LED_3=P3^4;
sbit LED_4=P3^3;
sbit SIGNEL_INPUT=P3^2; //霍尔器件低电平信号输入端。
bit flag;
uchar a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar b[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
//********************************************************
int temp_data;//temp_data_back, //存储计数
//********************************************************
uchar first; //送显示的首位
uchar second; //送显示的第二位
uchar three; //送显示的第三位
uchar fourth; //送显示的第四位
//*********************************************
//**************开机延时子程序*****************
//*********************************************
void delay()
{
uchar i=50,j=10;
while(i--)
{
while(j--);
j=10;
}
}
//*********************************************
//************** 定时器中断0计数子程序*********
//*********************************************
void count_t0() interrupt 1 using 0
{
TH0=0xFC;
TL0=0x18; //确定初始值,溢出时计数达到1000,
temp_data++;
}
//*********************************************
//************** 外部中断0计数子程序***********
//*********************************************
void count_int0() interrupt 0 using 2
{
int uuu;
TR0=0; //关闭定时器0,开始处理数据。避免重复响应。
EX0=0; //关闭外部中断0,避免重复响应
uuu=temp_data;
//千位显示
first=uuu/1000;
//百位显示
uuu=uuu%1000;
second=uuu/100;
//十位显示
uuu=uuu%100;
three=uuu/10;
//各位显示
uuu=uuu%10;
fourth=uuu;
//********************************************
while(SIGNEL_INPUT==1); //等待低电平到来。
temp_data=0; //计数变量清零,开始下一轮计数。
TR0=1; //开启定时器0。
EX0=1; //当保证了定时器0能工作并且工作完后,才中断允许再次响应。
}
//********************************************
//*******************主程序*******************
//********************************************
void main()
{
temp_data=0;
first=0x00;
second=0x00;
three=0x00;
fourth=0x00;
data_port=0xFF;
LED_1=1;
LED_2=1;
LED_3=1;
LED_4=1;
delay();
EA=1;
//******************************************************
IT0=1; //边沿触发
EX0=1; //开启外部中断0
// PX0=1;
//*****************************************************************************
TMOD=0x09; //GATE=1,工作模式1,计数方式,外部中断0控制计数开始和结束。
TH0=0xFC;
TL0=0x18; //确定初始值,溢出时计数达到1000,
ET0=1;
TR0=1;
//*****************************************************************************
while(1)
{
data_port=b[first];
LED_1=0;
LED_2=1;
LED_3=1;
LED_4=1;
delay();
data_port=a[second];
LED_1=1;
LED_2=0;
LED_3=1;
LED_4=1;
delay();
data_port=a[three];
LED_1=1;
LED_2=1;
LED_3=0;
LED_4=1;
delay();
data_port=a[fourth];
LED_1=1;
LED_2=1;
LED_3=1;
LED_4=0;
delay();
}
}