找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1994|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

各位大神,自行車測速要不要加入霍爾傳感器的代碼程序?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:582452 發(fā)表于 2019-9-6 20:11 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我用的51單片機。
#include <reg51.h>
#include <intrins.h>


sbit LCM_RS=P2^6;
sbit LCM_RW=P2^5;
sbit LCM_EN=P2^7;

#define BUSY                  0x80              //常量定義
#define DATAPORT         P0
#define uchar                 unsigned char
#define uint                   unsigned int
#define L                        50

uchar str0[16],str1[16],count;
uint speed;
unsigned long time;

void ddelay(uint);
void lcd_wait(void);
void display();
void initLCM();
void WriteCommandLCM(uchar WCLCM,uchar BusyC);
void STR();
void account();


/*********延時K*1ms,12.000mhz**********/

void int0_isr(void) interrupt 0         /*遙控使用外部中斷0,接P3.2口*/
{
    unsigned int temp;
        time=count;
    TR0=0;
        temp=TH0;
        temp=((temp << 8) | TL0);
    TH0=0x3c;
    TL0=0xaf;
        count=0;
    TR0=1;
        time=time*50000+temp;
}

void time0_isr(void) interrupt 1        /*遙控使用定時計數(shù)器1 */
{
   TH0=(65536-10000)/ 256;
        TL0=(65536-10000)% 256;   //設(shè)定定時器的初值,使得沒10ms中斷一次
   count++;
}

void main(void)
{
           TMOD=0x01;                       /*TMOD T0選用方式1(16位定時) */
    IP|=0x01;                           /*INT0 中斷優(yōu)先*/
    TCON|=0x11;                         /*TCON  EX0下降沿觸發(fā),啟動T0*/
    IE|=0x83;  
    TH0=(65536-10000)/ 256;
        TL0=(65536-10000)% 256;   //設(shè)定定時器的初值,使得沒10ms中斷一次

        initLCM();
           WriteCommandLCM(0x01,1);                    //清顯示屏
        for(;;)
        {
                account();
                display();
        }
}

void account()
{
        unsigned long a;
        if (time!=0)
        {
                a=L*360000000/time;
        }
        speed=a;
}



void STR()
{
        str0[0]='S';
        str0[1]='p';
        str0[2]='e';
    str0[3]='e';
        str0[4]='d';
        str0[5]=' ';        
        str0[6]=(speed%100000)/10000+0x30;
        str0[7]=(speed%10000)/1000+0x30;
        str0[8]=(speed%1000)/100+0x30;
        str0[9]='.';
        str0[10]=(speed%100)/10+0x30;
        str0[11]=speed%10+0x30;
        str0[12]='k';
        str0[13]='m';
        str0[14]='/';
        str0[15]='h';
}


void ddelay(uint c)   //誤差 0us
{
    uchar a,b;
        for (; c>0; c--)
        {
                 for (b=199;b>0;b--)
                 {
                          for(a=1;a>0;a--);
                 }      
        }           }
/**********寫指令到LCD子函數(shù)************/

void WriteCommandLCM(uchar WCLCM,uchar BusyC)
{
    if(BusyC)lcd_wait();
        DATAPORT=WCLCM;
    LCM_RS=0;                   /* 選中指令寄存器*/
    LCM_RW=0;                       // 寫模式
    LCM_EN=1;
        ddelay(5);
        
    LCM_EN=0;

}

/**********寫數(shù)據(jù)到LCD子函數(shù)************/

void WriteDataLCM(uchar WDLCM)
{
    lcd_wait( );            //檢測忙信號
        DATAPORT=WDLCM;
    LCM_RS=1;               /* 選中數(shù)據(jù)寄存器  */
        ddelay(1);
    LCM_RW=0;                   // 寫模式
        ddelay(1);
    LCM_EN=1;
        ddelay(1);

    LCM_EN=0;
}

/***********lcd內(nèi)部等待函數(shù)*************/

void lcd_wait(void)
{
    DATAPORT=0xff;             //讀LCD前若單片機輸出低電平,而讀出LCD為高電平,則沖突,Proteus仿真會有顯示邏輯黃色
        LCM_EN=1;   
        LCM_RS=0;        
    LCM_RW=1;
        ddelay(5);

    while(DATAPORT&BUSY)
        {  LCM_EN=0;
           ddelay(5);
           LCM_EN=1;
           ddelay(5);
        }
           LCM_EN=0;

}

/**********LCD初始化子函數(shù)***********/
void initLCM( )
{
        DATAPORT=0;
        ddelay(15);
        WriteCommandLCM(0x38,0);    //三次顯示模式設(shè)置,不檢測忙信號
    ddelay(5);
    WriteCommandLCM(0x38,0);
    ddelay(5);
    WriteCommandLCM(0x38,0);
    ddelay(5);

    WriteCommandLCM(0x38,1);    //8bit數(shù)據(jù)傳送,2行顯示,5*7字型,檢測忙信號
    WriteCommandLCM(0x08,1);    //關(guān)閉顯示,檢測忙信號
    WriteCommandLCM(0x01,1);    //清屏,檢測忙信號
    WriteCommandLCM(0x06,1);    //顯示光標右移設(shè)置,檢測忙信號
    WriteCommandLCM(0x0c,1);    //顯示屏打開,光標不顯示,不閃爍,檢測忙信號
}

/****顯示指定坐標的一個字符子函數(shù)****/

void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
    Y&=1;
    X&=15;
    if(Y)X|=0x40;               //若y為1(顯示第二行),地址碼+0X40
    X|=0x80;                    //指令碼為地址碼+0X80
    WriteCommandLCM(X,0);
    WriteDataLCM(DData);
}

/*******顯示指定坐標的一串字符子函數(shù)*****/

void DisplayListChar(uchar X,uchar Y,uchar *DData)
{
    uchar ListLength=0;
    Y&=0x01;
    X&=0x0f;
    while(X<16)
    {
        DisplayOneChar(X,Y,DData[ListLength]);
        ListLength++;
        X++;
    }
}


void display()
{

        STR();
        DisplayListChar(0,0,str0);
           DisplayListChar(0,1,str1);
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:607752 發(fā)表于 2019-9-8 16:07 | 只看該作者
我覺得你可以加進去試一下
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表