在好例子网,分享、交流、成长!
您当前所在位置:首页Others 开发实例一般编程问题 → 基于单片机超声波测距仪

实例介绍

【实例简介】

【实例截图】

from clipboard

【核心代码】#include <reg52.h>             //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义    变量范围0~255
#define uint  unsigned int     //无符号整型 宏定义    变量范围0~65535
#include <intrins.h>
uchar a_a;


//数码管段选定义      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};

//数码管位选定义
sbit smg_we1 = P3^4;        //数码管位选定义
sbit smg_we2 = P3^5;
sbit smg_we3 = P3^6;
sbit smg_we4 = P3^7;

sbit c_send   = P3^2;        //超声波发射
sbit c_recive = P3^3;        //超声波接收

sbit beep = P2^3;   //蜂鸣器IO口定义
uchar smg_i = 3;    //显示数码管的个位数
bit flag_300ms ;

long distance;            //距离
uint set_d;                //距离
uchar flag_csb_juli;    //超声波超出量程
uint  flag_time0;       //用来保存定时器0的时候的

uchar menu_1;           //菜单设计的变量


/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
    uint i,j;
    for(i=0;i<q;i )
        for(j=0;j<120;j );
}

/***********************处理距离函数****************************/
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的等待时间
sfr ISP_DATA=0xe2;  //寄存器申明
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;

/* ================ 打开 ISP,IAP 功能 ================= */
void ISP_IAP_enable(void)
{
     EA = 0;       /* 关中断   */
     ISP_CONTR = ISP_CONTR & 0x18;       /* 0001,1000 */
     ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */
     ISP_CONTR = ISP_CONTR | 0x80;       /* ISPEN=1  */
}
/* =============== 关闭 ISP,IAP 功能 ================== */
void ISP_IAP_disable(void)
{
     ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
     ISP_TRIG = 0x00;
     EA   =   1;   /* 开中断 */
}
/* ================ 公用的触发代码 ==================== */
void ISPgoon(void)
{
     ISP_IAP_enable();   /* 打开 ISP,IAP 功能 */
     ISP_TRIG = 0x46;  /* 触发ISP_IAP命令字节1 */
     ISP_TRIG = 0xb9;  /* 触发ISP_IAP命令字节2 */
     _nop_();
}
/* ==================== 字节读 ======================== */
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; /* 写入读命令 */
     ISPgoon();       /* 触发执行  */
     ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
     EA  = 1;
     return (ISP_DATA);    /* 返回读到的数据 */
}
/* ================== 扇区擦除 ======================== */
void SectorErase(unsigned int sector_addr)
{
     unsigned int iSectorAddr;
     iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
     ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
     ISP_ADDRL = 0x00;
     ISP_CMD = ISP_CMD & 0xf8;   /* 清空低3位  */
     ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3  */
     ISPgoon();       /* 触发执行  */
     ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
}
/* ==================== 字节写 ======================== */
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;  /* 写命令2 */
     ISP_DATA = original_data;   /* 写入数据准备 */
     ISPgoon();       /* 触发执行  */
     ISP_IAP_disable();     /* 关闭IAP功能 */
     EA =1;
}


/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
    SectorErase(0x2000);
    byte_write(0x2000, set_d % 256);
    byte_write(0x2001, set_d / 256);
    byte_write(0x2058, a_a);    
}

/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
    set_d  = byte_read(0x2001);
    set_d <<= 8;
    set_d  |= byte_read(0x2000);
    a_a      = byte_read(0x2058);
}

/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
    read_eeprom();        //先读
    if(a_a != 1)        //新的单片机初始单片机内问eeprom
    {
        set_d = 50;
        a_a = 1;
        write_eeprom();       //保存数据
    }    
}

/********************独立按键程序*****************/
uchar key_can;     //按键值

void key()     //独立按键程序
{
    static uchar key_new;
    key_can = 20;                   //按键值还原
    P2 |= 0x07;
    if((P2 & 0x07) != 0x07)        //按键按下
    {
        delay_1ms(1);             //按键消抖动
        if(((P2 & 0x07) != 0x07) && (key_new == 1))
        {                        //确认是按键按下
            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;    
}

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警