久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9297|回復: 8
收起左側

霍爾測速傳感器+51單片機+lcd1602屏+直流電機 測速并顯示的問題

[復制鏈接]
ID:113311 發表于 2016-4-10 18:35 | 顯示全部樓層 |閱讀模式
直流電機的pwm控制+l298n驅動的程序我寫出來了。在protues上仿真也能行。現在想求問大神怎么加個霍爾測速模塊。并且動態實時顯示當前的轉速。1602的驅動屏程序我用的管理員那個程序。 TB2lD7flFXXXXciXpXXXXXXXXXX_!!373154785.jpg
上圖是霍爾測速模塊。能如何編個程序顯示當前的轉速呢。求大神,求管理員解答。跪謝。



回復

使用道具 舉報

ID:111316 發表于 2016-5-6 15:10 | 顯示全部樓層
加我qq 1134033211
回復

使用道具 舉報

ID:118863 發表于 2016-5-6 15:41 | 顯示全部樓層
QQ130428432
回復

使用道具 舉報

ID:148546 發表于 2016-11-17 22:47 | 顯示全部樓層
挺好的啊 ,實用
回復

使用道具 舉報

ID:187130 發表于 2017-4-16 23:03 | 顯示全部樓層
可以求教樓主PWM控制的程序嗎?感謝
回復

使用道具 舉報

ID:82765 發表于 2017-4-17 05:44 | 顯示全部樓層
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

ID:256915 發表于 2017-12-18 19:52 | 顯示全部樓層
我也需要,求全部代碼和仿真結果
回復

使用道具 舉報

ID:419294 發表于 2018-11-2 09:52 | 顯示全部樓層
利用中斷和定時器
回復

使用道具 舉報

ID:419294 發表于 2018-11-24 12:43 | 顯示全部樓層
#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

#include "Data.h"
#include "DS1302.h"
#include "AT24C02.h"

sbit COUNT_IN=P3^2;

//定義1602相關管腳
sbit rs=P1^4;
sbit en=P1^0;

//鍵盤定義
sbit K1=P3^4;        //設置時間
sbit K3=P3^6;        //減按鍵
sbit K2=P3^5;        //加按鍵
sbit K4=P3^7;        //設置半徑安全距離
sbit BEEP=P3^0;

uint count;
unsigned long Velocity,Mileage;

uchar code tab1[]={"  /  /     :    "}; //14/09/10 16:34 3          
uchar code tab2[]={"  0.000km 00km/h"};        //000.000km 00km/h
uchar code tab3[]={"Wheel Radius  cm"};
uchar code tab4[]={"Safe Speed  km/h"};
uchar code tab5[]={"Sec :           "};
                                                  
uchar Mode=0;
uchar bike_set=0;
uchar a;
char RADIUS,SAFE_SPEED;
bit LED_SEC;
uchar before_sec;       

//自定義字符
uchar code num[]={
                                                0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//1         
                                                0x1f,0x01,0x01,0x1f,0x10,0x10,0x1f,0x00,//2
                                                0x1f,0x01,0x01,0x1f,0x01,0x01,0x1f,0x00,//3         
                                                0x11,0x11,0x11,0x1f,0x01,0x01,0x01,0x00,//4
                                                0x1f,0x10,0x10,0x1f,0x01,0x01,0x1f,0x00,//5         
                                                0x1f,0x10,0x10,0x1f,0x11,0x11,0x1f,0x00,//6
                                                0x1f,0x01,0x01,0x01,0x01,0x01,0x01,0x00,//7        
};
void READS();
void SETS();
void delay(uint x)
{
        uint i,j;
        for(i=0;i<x;i++)
        for(j=0;j<110;j++);
}
void init()
{
        IT0=1;        //INT0負跳變觸發       
    TMOD=0x01;//定時器工作于方式1
        TH0=0x3c;          //50ms
        TL0=0xb0;
        EA=1; //CPU開中斷總允許
        ET0=1;//開定時中斷
        EX0=1;//開外部INTO中斷
    TR0=1;//啟動定時
}
/********液晶寫入指令函數與寫入數據函數,以后可調用**************/

void write_1602com(uchar com)//****液晶寫入指令函數****
{
        rs=0;//數據/指令選擇置為指令
        P0=com;//送入數據
        delay(1);
        en=1;//拉高使能端,為制造有效的下降沿做準備
        delay(1);
        en=0;//en由高變低,產生下降沿,液晶執行命令

}


void write_1602dat(uchar dat)//***液晶寫入數據函數****
{
        rs=1;//數據/指令選擇置為數據
        P0=dat;//送入數據
        delay(1);
        en=1; //en置高電平,為制造下降沿做準備
        delay(1);
        en=0; //en由高變低,產生下降沿,液晶執行命令
}
//自定義字符集
void Lcd_ram()      
{
        uint i,j,k=0,temp=0x40;
        for(i=0;i<7;i++)
        {
           for(j=0;j<8;j++)
           {
            write_1602com(temp+j);
            write_1602dat(num[k]);
            k++;
           }
           temp=temp+8;
        }
}

void lcd_init()//***液晶初始化函數****
{
        Lcd_ram();
        write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據
        write_1602com(0x0c);//開顯示不顯示光標
        write_1602com(0x06);//整屏不移動,光標自動右移
        write_1602com(0x01);//清顯示

        write_1602com(0x80);//顯示固定符號從第一行第1個位置之后開始顯示
        for(a=0;a<16;a++)
        {
                write_1602dat(tab1[a]);//向液晶屏寫固定符號部分
        }
        write_1602com(0x80+0x40);//顯示固定符號寫入位置,從第2個位置后開始顯示
        for(a=0;a<16;a++)
        {
                write_1602dat(tab2[a]);//寫顯示固定符號
        }
}

void display()
{
        //                        1km/h=100m/0.1h                   360s
        //                        10km/h=100m/0.01h          36s
        //                        100km/h=100m/0.001h  3.6s
        if(Mode==0&&bike_set==0)
        {
                //讀時間
                        Ds1302_Read_Time();
                        //顯示時間
                        write_1602com(0x80);
                        write_1602dat(0x30+time_buf1[1]/10);
                        write_1602dat(0x30+time_buf1[1]%10);
                        write_1602com(0x80+3);
                        write_1602dat(0x30+time_buf1[2]/10);
                        write_1602dat(0x30+time_buf1[2]%10);
                        write_1602com(0x80+6);
                        write_1602dat(0x30+time_buf1[3]/10);
                        write_1602dat(0x30+time_buf1[3]%10);
                        write_1602com(0x80+9);
                        write_1602dat(0x30+time_buf1[4]/10);
                        write_1602dat(0x30+time_buf1[4]%10);
                        write_1602com(0x80+12);
                        write_1602dat(0x30+time_buf1[5]/10);
                        write_1602dat(0x30+time_buf1[5]%10);
                        write_1602com(0x80+15);
                        write_1602dat(time_buf1[7]-1);               

                        if(before_sec!=time_buf1[6])
                        {
                                before_sec=time_buf1[6];
                                write_1602com(0x80+11);
                                write_1602dat(':');
                                LED_SEC=1;
                        }
                        if(LED_SEC==0)
                        {
                                write_1602com(0x80+11);
                                write_1602dat(' ');       
                        }

                        write_1602com(0x80+0x40);
                        if(Mileage/1000000==0)
                        write_1602dat(' ');
                        else
                        write_1602dat(0x30+Mileage/1000000);//數字+0x30得到該數字的LCD1602顯示碼
                        if(Mileage%1000000/100000==0)
                        write_1602dat(' ');
                        else       
                        write_1602dat(0x30+Mileage%1000000/100000);//數字+0x30得到該數字的LCD1602顯示碼
                        write_1602dat(0x30+Mileage%1000000%100000/10000);//數字+0x30得到該數字的LCD1602顯示碼
                        write_1602com(0x80+0x40+4);
                        write_1602dat(0x30+Mileage%1000000%100000%10000/1000);//數字+30得到該數字的LCD1602顯示碼
                        write_1602dat(0x30+Mileage%1000000%100000%10000%1000/100);//數字+30得到該數字的LCD1602顯示碼
                        write_1602dat(0x30+Mileage%1000000%100000%10000%1000%100/10);//數字+30得到該數字的LCD1602顯示碼
                        SETS();
       
                        write_1602com(0x80+0x40+10);
                        write_1602dat(0x30+Velocity/10);
                        write_1602dat(0x30+Velocity%10);//數字+30得到該數字的LCD1602顯示碼
        }
        else if(Mode!=0)
        {
                switch(Mode)
                {
                        case 1:       
                                write_1602com(0x80+0x40);//顯示固定符號寫入位置
                                for(a=0;a<16;a++)
                                {
                                        write_1602dat(tab5[a]);//寫顯示固定符號
                                }
                                write_1602com(0x80+0x40+14);
                                write_1602dat(0x30+time_buf1[6]/10);
                                write_1602dat(0x30+time_buf1[6]%10);       
                                write_1602com(0x0F);         //打開閃爍
                                write_1602com(0x80+1);
                                break;                                                  
                        case 2:
                                write_1602com(0x80+4);
                                break;
                        case 3:
                                write_1602com(0x80+7);
                                break;
                        case 4:
                                write_1602com(0x80+10);
                                break;
                        case 5:
                                write_1602com(0x80+13);
                                break;
                        case 6:
                                write_1602com(0x80+0x40+15);
                                break;
                        case 7:
                                write_1602com(0x80+15);
                                break;
                        case 8:
                                write_1602com(0x0c);
                                write_1602com(0x80);//顯示固定符號從第一行第1個位置之后開始顯示
                                for(a=0;a<16;a++)
                                {
                                        write_1602dat(tab1[a]);//向液晶屏寫固定符號部分
                                }
                                write_1602com(0x80+0x40);//顯示固定符號寫入位置,從第2個位置后開始顯示
                                for(a=0;a<16;a++)
                                {
                                        write_1602dat(tab2[a]);//寫顯示固定符號
                                }
                                break;
                }
        }
        else if(bike_set!=0)
        {
                switch(bike_set)
                {
                        case 1:       
                                write_1602com(0x80);//顯示固定符號寫入位置
                                for(a=0;a<16;a++)
                                {
                                        write_1602dat(tab3[a]);//寫顯示固定符號
                                }
                                write_1602com(0x80+0x40);//顯示固定符號寫入位置
                                for(a=0;a<16;a++)
                                {
                                        write_1602dat(tab4[a]);//寫顯示固定符號
                                }
                                write_1602com(0x80+12);
                                write_1602dat(0x30+RADIUS/10);                   //車輪半徑
                                write_1602dat(0x30+RADIUS%10);
                                write_1602com(0x80+0x40+10);
                                write_1602dat(0x30+SAFE_SPEED/10);                   //安全速度
                                write_1602dat(0x30+SAFE_SPEED%10);       
                                write_1602com(0x0F);         //打開閃爍
                                write_1602com(0x80+13);
                                break;                                                  
                        case 2:
                                write_1602com(0x80+0x40+11);
                                break;
                        case 3:
                                write_1602com(0x0c);
                                write_1602com(0x80);//顯示固定符號從第一行第1個位置之后開始顯示
                                for(a=0;a<16;a++)
                                {
                                        write_1602dat(tab1[a]);//向液晶屏寫固定符號部分
                                }
                                write_1602com(0x80+0x40);//顯示固定符號寫入位置,從第2個位置后開始顯示
                                for(a=0;a<16;a++)
                                {
                                        write_1602dat(tab2[a]);//寫顯示固定符號
                                }
                                break;
                }
        }       
}

void KEY()
{       
        if(bike_set==0&&K1==0)
        {
                delay(20);
                if(bike_set==0&&K1==0)
                {
                        BEEP=0;
                        delay(50);
                        BEEP=1;
                        Mode++;
                        display();
                        if(Mode>=8)
                        {
                                Mode=0;
                                Ds1302_Write_Time();
                        }
                }
                while(bike_set==0&&K1==0);
        }
        if(K4==0&&Mode==0)
        {
                delay(20);
                if(K4==0&&Mode==0)
                {
                        BEEP=0;
                        delay(50);
                        BEEP=1;
                        bike_set++;
                        display();
                        if(bike_set>=3)
                        {
                                bike_set=0;
                                SETS();
                        }
                }
                while(Mode==0&&K4==0);
        }

        //+
        if(K2==0&&(Mode!=0||bike_set!=0))
        {
                delay(20);
                //調時
                if(K2==0&&(Mode!=0||bike_set!=0))
                {
                        BEEP=0;
                        delay(50);
                        BEEP=1;       
                        switch(Mode)
                        {
                                case 1:
                                        time_buf1[1]++;
                                        if(time_buf1[1]>=100)
                                                time_buf1[1]=0;
                                        write_1602com(0x80);
                                        write_1602dat(0x30+time_buf1[1]/10);
                                        write_1602dat(0x30+time_buf1[1]%10);
                                        write_1602com(0x80+1);
                                        break;
                                case 2:
                                        time_buf1[2]++;
                                        if(time_buf1[2]>=13)
                                                time_buf1[2]=1;
                                        write_1602com(0x80+3);
                                        write_1602dat(0x30+time_buf1[2]/10);
                                        write_1602dat(0x30+time_buf1[2]%10);
                                        write_1602com(0x80+4);
                                        break;
                                case 3:
                                        time_buf1[3]++;
                                        if(time_buf1[3]>=YDay(time_buf1[1],time_buf1[2])+1)
                                                time_buf1[3]=1;
                                        write_1602com(0x80+6);
                                        write_1602dat(0x30+time_buf1[3]/10);
                                        write_1602dat(0x30+time_buf1[3]%10);
                                        write_1602com(0x80+7);
                                        break;
                                case 4:
                                        time_buf1[4]++;
                                        if(time_buf1[4]>=24)
                                                time_buf1[4]=0;
                                        write_1602com(0x80+9);
                                        write_1602dat(0x30+time_buf1[4]/10);
                                        write_1602dat(0x30+time_buf1[4]%10);
                                        write_1602com(0x80+10);
                                        break;
                                case 5:
                                        time_buf1[5]++;
                                        if(time_buf1[5]>=60)
                                                time_buf1[5]=0;
                                        write_1602com(0x80+12);
                                        write_1602dat(0x30+time_buf1[5]/10);
                                        write_1602dat(0x30+time_buf1[5]%10);
                                        write_1602com(0x80+13);
                                        break;
                                case 6:
                                        time_buf1[6]++;
                                        if(time_buf1[6]>=60)
                                                time_buf1[6]=0;
                                        write_1602com(0x80+0x40+14);
                                        write_1602dat(0x30+time_buf1[6]/10);
                                        write_1602dat(0x30+time_buf1[6]%10);
                                        write_1602com(0x80+0x40+15);
                                        break;
                                case 7:
                                        time_buf1[7]++;
                                        if(time_buf1[7]>=8)
                                                time_buf1[7]=1;
                                        write_1602com(0x80+15);
                                        write_1602dat(time_buf1[7]-1);
                                        write_1602com(0x80+15);
                                        break;
                        }
                        switch(bike_set)
                        {
                                case 1:
                                        RADIUS++;
                                        if(RADIUS>=71)
                                        RADIUS=0;
                                        write_1602com(0x80+12);
                                        write_1602dat(0x30+RADIUS/10);
                                        write_1602dat(0x30+RADIUS%10);
                                        write_1602com(0x80+13);
                                        break;
                                case 2:
                                        SAFE_SPEED++;
                                        if(SAFE_SPEED>=100)
                                        SAFE_SPEED=0;
                                        write_1602com(0x80+0x40+10);
                                        write_1602dat(0x30+SAFE_SPEED/10);
                                        write_1602dat(0x30+SAFE_SPEED%10);
                                        write_1602com(0x80+0x40+11);
                                        break;
                        }
                }
                while(K2==0);
        }

        //-
        if(K3==0&&(Mode!=0||bike_set!=0))
        {
                delay(20);
                //調時
                if(K3==0&&(Mode!=0||bike_set!=0))
                {
                        BEEP=0;
                        delay(50);
                        BEEP=1;
                        switch(Mode)
                        {
                                case 1:
                                        time_buf1[1]--;
                                        if(time_buf1[1]<0)
                                                time_buf1[1]=99;
                                        write_1602com(0x80);
                                        write_1602dat(0x30+time_buf1[1]/10);
                                        write_1602dat(0x30+time_buf1[1]%10);
                                        write_1602com(0x80+1);
                                        break;
                                case 2:
                                        time_buf1[2]--;
                                        if(time_buf1[2]<=0)
                                                time_buf1[2]=12;
                                        write_1602com(0x80+3);
                                        write_1602dat(0x30+time_buf1[2]/10);
                                        write_1602dat(0x30+time_buf1[2]%10);
                                        write_1602com(0x80+4);
                                        break;
                                case 3:
                                        time_buf1[3]--;
                                        if(time_buf1[3]<=0)
                                                time_buf1[3]=YDay(time_buf1[1],time_buf1[2]);
                                        write_1602com(0x80+6);
                                        write_1602dat(0x30+time_buf1[3]/10);
                                        write_1602dat(0x30+time_buf1[3]%10);
                                        write_1602com(0x80+7);
                                        break;
                                case 4:
                                        time_buf1[4]--;
                                        if(time_buf1[4]<0)
                                                time_buf1[4]=23;
                                        write_1602com(0x80+9);
                                        write_1602dat(0x30+time_buf1[4]/10);
                                        write_1602dat(0x30+time_buf1[4]%10);
                                        write_1602com(0x80+10);
                                        break;
                                case 5:
                                        time_buf1[5]--;
                                        if(time_buf1[5]<0)
                                                time_buf1[5]=59;
                                        write_1602com(0x80+12);
                                        write_1602dat(0x30+time_buf1[5]/10);
                                        write_1602dat(0x30+time_buf1[5]%10);
                                        write_1602com(0x80+13);
                                        break;
                                case 6:
                                        time_buf1[6]--;
                                        if(time_buf1[6]<0)
                                                time_buf1[6]=59;
                                        write_1602com(0x80+0x40+14);
                                        write_1602dat(0x30+time_buf1[6]/10);
                                        write_1602dat(0x30+time_buf1[6]%10);
                                        write_1602com(0x80+0x40+15);
                                        break;
                                case 7:
                                        time_buf1[7]--;
                                        if(time_buf1[7]<1)
                                                time_buf1[7]=7;
                                        write_1602com(0x80+15);
                                        write_1602dat(time_buf1[7]-1);
                                        write_1602com(0x80+15);
                                        break;
                        }
                        switch(bike_set)
                        {
                                case 1:
                                        RADIUS--;
                                        if(RADIUS<0)
                                        RADIUS=70;
                                        write_1602com(0x80+12);
                                        write_1602dat(0x30+RADIUS/10);
                                        write_1602dat(0x30+RADIUS%10);
                                        write_1602com(0x80+13);
                                        break;
                                case 2:
                                        SAFE_SPEED--;
                                        if(SAFE_SPEED<0)
                                        SAFE_SPEED=99;
                                        write_1602com(0x80+0x40+10);
                                        write_1602dat(0x30+SAFE_SPEED/10);
                                        write_1602dat(0x30+SAFE_SPEED%10);
                                        write_1602com(0x80+0x40+11);
                                        break;
                        }
                }
                while(K3==0);
        }       
        if(K2==0&&K3==0&&Mode==0&bike_set==0)
        {
                BEEP=0;
                delay(100);
                BEEP=1;
                delay(100);
                BEEP=0;
                delay(100);
                BEEP=1;
                delay(100);
                Mileage=0;
                SETS();
                while(K2==0&&K3==0);
        }
}
void BJ_SAFE()
{
        if(Velocity>SAFE_SPEED)
        {
                BEEP=0;
        }
        else
        {
                BEEP=1;
        }
}

void main()
{
        //初始化
        Ds1302_Init();
        lcd_init();
        initeeprom();
        //讀取初始參數
        READS();
        //定時器初始化
//        InitTimer0();
        init();
        lcd_init();
        before_sec=time_buf1[6];
        while(1)
        {
                if(Mode==0&&bike_set==0)
                {
                        display();
                        BJ_SAFE();
                }
                KEY();
        }
}

void EXINT0() interrupt 0
{
        count++;
}

void time0() interrupt 1
{
        uchar m,n;
        TH0=0x3c;
        TL0=0xb0;         //50ms
        m++;
        if(LED_SEC==1)
        {
                n++;
                if(n>=10)
                {
                        n=0;
                        LED_SEC=0;
                }
        }
       
        if(m>=10)
        {
                m=0;
                Mileage=Mileage+10*(Velocity/3.6)/2;                 //里程m=里程+速度km/h/3.6/2
                Velocity=count *2*3.14*RADIUS /100000*2*3600  /40;//將500ms的距離經過運算得到km/h,將速度/100,方便顯示
                count=0;       
        }
}

//讀初值
void READS()
{
        uchar Mileage_H,Mileage_M,Mileage_L;
        delay(10);
        RADIUS=read_add(0x01);
        delay(10);
        SAFE_SPEED=read_add(0x02);

        delay(10);
        Mileage_H=read_add(0x03);
        delay(10);
        Mileage_M=read_add(0x04);
        delay(10);
        Mileage_L=read_add(0x05);

        Mileage=Mileage_H*100000+Mileage_M*1000+Mileage_L*10;
}


//寫初值
void SETS()
{
        delay(10);
        write_add(0x01,RADIUS);
        delay(10);
        write_add(0x02,SAFE_SPEED);

/*        Mileage_H=Mileage/10000;                         //123.4560
        Mileage_M=Mileage%10000/100;
        Mileage_L=Mileage%10000%100; */
        delay(10);
        write_add(0x03,Mileage/100000);
        delay(10);
        write_add(0x04,Mileage%100000/1000);
        delay(10);
        write_add(0x05,Mileage%100000%1000/10);
}



















回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品海角社区在线观看 | 日韩在线观看中文字幕 | 国产精品夜夜春夜夜爽久久电影 | 波多野结衣一区二区 | 中文字幕高清视频 | 91亚洲国产成人精品一区二三 | 中文字幕av网址 | 香蕉久久久 | 伊人网综合 | 欧美视频一区二区三区 | 一区二区三区小视频 | 91av导航 | 欧美一区视频 | 亚洲国产日韩欧美 | 日本中文字幕一区 | 日韩一区二区三区在线 | 亚洲 欧美 另类 日韩 | 国产一级片精品 | 亚洲永久精品国产 | 国产精品1区 | 精品欧美一区二区三区免费观看 | 婷婷开心激情综合五月天 | 国产精品视频导航 | 亚洲国产精品久久 | 日韩一区二区三区在线看 | 亚洲欧美国产视频 | 日操操夜操操 | 日韩一区二区在线播放 | 男女网站在线观看 | 欧美日韩美女 | 久草视频网站 | 欧美性极品xxxx做受 | 国产99久久精品一区二区永久免费 | 亚洲iv一区二区三区 | 成人在线视频免费观看 | 国产福利在线 | 亚洲国产一区二区在线 | 尹人av| 视频一区在线 | 久久伊人一区二区 | 在线一区 |