牧武工作室 https://bbs.21ic.com/?121502 [收藏] [复制] [RSS] 我喜欢e-DIY。

日志

51的车轮转动周期的测量

已有 833 次阅读2008-4-6 19:26 |系统分类:单片机| 51, 周期测量, 车速


去年做的车轮转动周期测量系统,元器件包括: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();
       
    }

}
   

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)