欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

基于51開(kāi)發(fā)版的超聲波測(cè)距電路

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:292005 發(fā)表于 2018-4-17 08:07 來(lái)自觸屏版 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)源程序如下#include <reg52.h>       //調(diào)用單片機(jī)頭文件
#define uchar unsigned char//無(wú)符號(hào)字符型 宏定義    變量范圍0~255
#define uintunsigned int   //無(wú)符號(hào)整型 宏定義    變量范圍0~65535
#include <intrins.h>
uchar a_a;


//數(shù)碼管段選定義  0 1  2  3  4  5    6   7    8     9   
uchar code smg_du[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0,
                   0x60,0x25,0x39,0x26,0x31,0x71,0xff};   //斷碼


uchar dis_smg[8] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};

//數(shù)碼管位選定義
sbit smg_we1 = P3^4;    //數(shù)碼管位選定義
sbit smg_we2 = P3^5;
sbit smg_we3 = P3^6;
sbit smg_we4 = P3^7;

sbit c_send = P3^2;        //超聲波發(fā)射
sbit c_recive = P3^3;        //超聲波接收

sbit beep = P2^3; //蜂鳴器IO口定義
uchar smg_i = 3;  //顯示數(shù)碼管的個(gè)位數(shù)
bit flag_300ms ;

long distance;      //距離
uint set_d;        //距離
uchar flag_csb_juli;  //超聲波超出量程
uintflag_time0;   //用來(lái)保存定時(shí)器0的時(shí)候的

uchar menu_1;   //菜單設(shè)計(jì)的變量


/***********************1ms延時(shí)函數(shù)*****************************/
void delay_1ms(uint q)
{
    uint i,j;
    for(i=0;i<q;i++)
        for(j=0;j<120;j++);
}

/***********************處理距離函數(shù)****************************/
void smg_display()
{
    dis_smg[0] = smg_du[distance % 10];
    dis_smg[1] = smg_du[distance / 10 % 10];
    dis_smg[2] = smg_du[distance / 100 % 10] & 0xdf; ;   
}


#define RdCommand 0x01 //定義ISP的操作命令
#define PrgCommand 0x02
#define EraseCommand 0x03
#define Error 1
#define Ok 0
#define WaitTime 0x01 //定義CPU的等待時(shí)間
sfr ISP_DATA=0xe2;//寄存器申明
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;

/* ================ 打開(kāi) ISP,IAP 功能 ================= */
void ISP_IAP_enable(void)
{
   EA = 0;   /* 關(guān)中斷 */
   ISP_CONTR = ISP_CONTR & 0x18;   /* 0001,1000 */
   ISP_CONTR = ISP_CONTR | WaitTime; /* 寫(xiě)入硬件延時(shí) */
   ISP_CONTR = ISP_CONTR | 0x80;   /* ISPEN=1*/
}
/* =============== 關(guān)閉 ISP,IAP 功能 ================== */
void ISP_IAP_disable(void)
{
   ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
   ISP_TRIG = 0x00;
   EA = 1; /* 開(kāi)中斷 */
}
/* ================ 公用的觸發(fā)代碼 ==================== */
void ISPgoon(void)
{
   ISP_IAP_enable(); /* 打開(kāi) ISP,IAP 功能 */
   ISP_TRIG = 0x46;/* 觸發(fā)ISP_IAP命令字節(jié)1 */
   ISP_TRIG = 0xb9;/* 觸發(fā)ISP_IAP命令字節(jié)2 */
   _nop_();
}
/* ==================== 字節(jié)讀 ======================== */
unsigned char byte_read(unsigned int byte_addr)
{
    EA = 0;
   ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址賦值 */
   ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
   ISP_CMD = ISP_CMD & 0xf8; /* 清除低3位*/
   ISP_CMD = ISP_CMD | RdCommand; /* 寫(xiě)入讀命令 */
   ISPgoon();   /* 觸發(fā)執(zhí)行*/
   ISP_IAP_disable();  /* 關(guān)閉ISP,IAP功能 */
   EA= 1;
   return (ISP_DATA);  /* 返回讀到的數(shù)據(jù) */
}
/* ================== 扇區(qū)擦除 ======================== */
void SectorErase(unsigned int sector_addr)
{
   unsigned int iSectorAddr;
   iSectorAddr = (sector_addr & 0xfe00); /* 取扇區(qū)地址 */
   ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
   ISP_ADDRL = 0x00;
   ISP_CMD = ISP_CMD & 0xf8; /* 清空低3位*/
   ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3*/
   ISPgoon();   /* 觸發(fā)執(zhí)行*/
   ISP_IAP_disable();  /* 關(guān)閉ISP,IAP功能 */
}
/* ==================== 字節(jié)寫(xiě) ======================== */
void byte_write(unsigned int byte_addr, unsigned char original_data)
{
   EA= 0;
//   SectorErase(byte_addr);
   ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 取地址*/
   ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
   ISP_CMD= ISP_CMD & 0xf8;  /* 清低3位 */
   ISP_CMD= ISP_CMD | PrgCommand;/* 寫(xiě)命令2 */
   ISP_DATA = original_data; /* 寫(xiě)入數(shù)據(jù)準(zhǔn)備 */
   ISPgoon();   /* 觸發(fā)執(zhí)行*/
   ISP_IAP_disable(); /* 關(guān)閉IAP功能 */
   EA =1;
}


/******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
void write_eeprom()
{
    SectorErase(0x2000);
    byte_write(0x2000, set_d % 256);
    byte_write(0x2001, set_d / 256);
    byte_write(0x2058, a_a);   
}

/******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來(lái)*****************/
void read_eeprom()
{
    set_d= byte_read(0x2001);
    set_d <<= 8;
    set_d|= byte_read(0x2000);
    a_a  = byte_read(0x2058);
}

/**************開(kāi)機(jī)自檢eeprom初始化*****************/
void init_eeprom()
{
    read_eeprom();        //先讀
    if(a_a != 1)        //新的單片機(jī)初始單片機(jī)內(nèi)問(wèn)eeprom
    {
        set_d = 50;
        a_a = 1;
        write_eeprom();     //保存數(shù)據(jù)
    }   
}

/********************獨(dú)立按鍵程序*****************/
uchar key_can;   //按鍵值

void key()   //獨(dú)立按鍵程序
{
    static uchar key_new;
    key_can = 20;       //按鍵值還原
    P2 |= 0x07;
    if((P2 & 0x07) != 0x07)        //按鍵按下
    {
        delay_1ms(1);         //按鍵消抖動(dòng)
        if(((P2 & 0x07) != 0x07) && (key_new == 1))
        {                        //確認(rèn)是按鍵按下
            key_new = 0;
            switch(P2 & 0x07)
            {
                case 0x06: key_can = 3; break;     //得到k2鍵值
                case 0x05: key_can = 2; break;     //得到k3鍵值
                case 0x03: key_can = 1; break;     //得到k4鍵值
            }
        }            
    }
    else
        key_new = 1;   
}

/****************按鍵處理顯示函數(shù)***************/
void key_with()
{
    if(key_can == 1)        //設(shè)置鍵
    {
        menu_1 ++;
        if(menu_1 >= 2)
        {
            menu_1 = 0;
            smg_i = 3;        //只顯示3位數(shù)碼管
        }
        if(menu_1 == 1)
        {
            smg_i = 4;     //只顯示4位數(shù)碼管
        }
    }
    if(menu_1 == 1)            //設(shè)置報(bào)警
    {
        if(key_can == 2)
        {
            set_d ++ ;        //加1
            if(set_d > 400)
                set_d = 400;
        }
        if(key_can == 3)
        {
            set_d -- ;        //減1
            if(set_d <= 1)
                set_d = 1;
        }
        dis_smg[0] = smg_du[set_d % 10];       //取小數(shù)顯示
        dis_smg[1] = smg_du[set_d / 10 % 10] ;   //取個(gè)位顯示
        dis_smg[2] = smg_du[set_d / 100 % 10] & 0xdf ; //取十位顯示
        dis_smg[3] = 0x60;      //a
        write_eeprom();             //保存數(shù)據(jù)
    }   
}

/****************報(bào)警函數(shù)***************/
void clock_h_l()
{
    static uchar value;
    if(distance <= set_d)
    {
        value ++;//消除實(shí)際距離在設(shè)定距離左右變化時(shí)的干擾
        if(value >= 2)
        {
            beep = ~beep;     //蜂鳴器報(bào)警   
        }
    }
    else
    {
        value = 0;
        beep = 1;        //取消報(bào)警
    }   
}

/***********************數(shù)碼位選函數(shù)*****************************/
void smg_we_switch(uchar i)
{
    switch(i)
    {
        case 0: smg_we1 = 0;smg_we2 = 1; smg_we3 = 1;smg_we4 = 1; break;
        case 1: smg_we1 = 1;smg_we2 = 0; smg_we3 = 1;smg_we4 = 1; break;
        case 2: smg_we1 = 1;smg_we2 = 1; smg_we3 = 0;smg_we4 = 1; break;
        case 3: smg_we1 = 1;smg_we2 = 1; smg_we3 = 1;smg_we4 = 0; break;
    }   
}

/***********************數(shù)碼顯示函數(shù)*****************************/
void display()
{
    static uchar i;
    i++;
    if(i >= smg_i)
        i = 0;   
    smg_we_switch(i);       //位選
    P1 = dis_smg[i];       //段選      
}

/******************小延時(shí)函數(shù)*****************/
void delay()
{
    _nop_();            //執(zhí)行一條_nop_()指令就是1us
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}


/*********************超聲波測(cè)距程序*****************************/
void send_wave()
{
    c_send = 1;           //10us的高電平觸發(fā)
    delay();
    c_send = 0;   
    TH0 = 0;          //給定時(shí)器0清零
    TL0 = 0;
    TR0 = 0;                //關(guān)定時(shí)器0定時(shí)
    while(!c_recive);        //當(dāng)c_recive為零時(shí)等待
    TR0=1;
    while(c_recive)          //當(dāng)c_recive為1計(jì)數(shù)并等待
    {
        flag_time0 = TH0 * 256 + TL0;
        if((flag_time0 > 40000))  //當(dāng)超聲波超過(guò)測(cè)量范圍時(shí),顯示3個(gè)888
        {
            TR0 = 0;
            flag_csb_juli = 2;
            distance = 888;
            break ;        
        }
        else
        {
            flag_csb_juli = 1;   
        }
    }
    if(flag_csb_juli == 1)
    {   
        TR0=0;                           //關(guān)定時(shí)器0定時(shí)
        distance =flag_time0;           //讀出定時(shí)器0的時(shí)間
        distance *= 0.017;     // 0.017 = 340M / 2 = 170M = 0.017M 算出來(lái)是米
        if((distance > 500))               //距離 = 速度 * 時(shí)間
        {   
            distance = 888;               //如果大于3.8m就超出超聲波的量程
        }
    }
}


/*********************定時(shí)器0、定時(shí)器1初始化******************/
void time_init()   
{
    EA= 1;       //開(kāi)總中斷
    TMOD = 0X11;    //定時(shí)器0、定時(shí)器1工作方式1
    ET0 = 0;        //關(guān)定時(shí)器0中斷
    TR0 = 1;        //允許定時(shí)器0定時(shí)
    ET1 = 1;        //開(kāi)定時(shí)器1中斷
    TR1 = 1;        //允許定時(shí)器1定時(shí)   
}



/***************主函數(shù)*****************/
void main()
{
    beep = 0;       //開(kāi)機(jī)叫一聲
    delay_1ms(150);
    P0 = P1 = P2 = P3 = 0xff;     //初始化單片機(jī)IO口為高電平
    send_wave();    //測(cè)距離函數(shù)
    smg_display();    //處理距離顯示函數(shù)

3D5185CB-8F81-4A55-B6D0-67BE9C1778C2.png (75.19 KB, 下載次數(shù): 64)

3D5185CB-8F81-4A55-B6D0-67BE9C1778C2.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:320380 發(fā)表于 2018-5-2 13:19 | 只看該作者
求完整的主函數(shù)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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