历史上的今天
返回首页

历史上的今天

今天是:2025年02月12日(星期三)

正在发生

2020年02月12日 | 基于单片机和超声波测距模块的距离检测

2020-02-12 来源:51hei

这是我前几天写的一个超声波测距模块程序,超声波测距模块用的是HC-SR04,单片机是STC80C52RC,不过我买的是一块单片机开发板,上面已经装好了液晶,我只需要通过杜邦线把测距模块连接到单片机上即可,具体程序如下,注意,超声波测距模块就四个引脚,很容易看出来怎么和单片机连接,把引脚相对应连接好即可。


下面是完整的程序代码,超声波测距模块工作原理可以参看附件,建议将功能程序模块化,即一个功能用一个函数来描写,这样更加清晰直观。


#include

#define Lcd1602_DB P0

typedef unsigned char uchar;

typedef unsigned int uint;



sbit trig = P1^2;

sbit echo = P1^3;


sbit Lcd1602_RS = P1^0;

sbit Lcd1602_RW = P1^1;

sbit Lcd1602_E = P1^5;


void LcdWaitReady()

{

        uchar sta;

        Lcd1602_DB = 0xff;

        Lcd1602_RS = 0;

        Lcd1602_RW = 1;

        do{

                Lcd1602_E = 1;

                sta = Lcd1602_DB;

                Lcd1602_E = 0;

        }while(sta & 0x80);

}

/*向Lcd602液晶写入一字节命令*/

void LcdWriteCmd(uchar cmd)

{

        LcdWaitReady();

        Lcd1602_RS = 0;

        Lcd1602_RW = 0;

        Lcd1602_DB = cmd;

        Lcd1602_E = 1;

        Lcd1602_E = 0;

}

/*向Lcd602液晶写入一字节数据*/

void LcdWriteDat(uchar dat)

{

        LcdWaitReady();

        Lcd1602_RS = 1;

        Lcd1602_RW = 0;

        Lcd1602_DB = dat;

        Lcd1602_E = 1;

        Lcd1602_E = 0;

}

/*设置显示RAM起始地址,亦即光标位置*/

void LcdSetCursor(uchar x,uchar y)

{

        uchar addr;

        if(y == 0)

                addr = 0x00 + x;

        else

                addr = 0x40 + x;

        LcdWriteCmd(addr | 0x80);

}

/*在液晶上显示字符串*/

void LcdShowStr(uchar x,uchar y,uchar *str)

{

        LcdSetCursor(x,y);//设置起始地址

        while(*str != '')

        {

                LcdWriteDat(*str++);

        }

}

/*液晶输出数字*/

void LCDNumPrint(uint num)

{

        LcdWriteDat(num/1000 + 0x30);//num的千位//因为LCD1602显示的数字0,是用0x30表示的,也可以把0当做字符显示

        LcdWriteDat(num % 1000 / 100 + 0x30);//num的百位

        LcdWriteDat(num % 100 /10 + 0x30);//num的十位

        LcdWriteDat(num % 10 + 0x30);//num的个位

}

/*初始化液晶*/

void InitLcd1602()

{

        LcdWriteCmd(0x38);

        LcdWriteCmd(0x0c);

        LcdWriteCmd(0x06);

        LcdWriteCmd(0x01);//清屏

}

uint GetDistance(void)

{

        uint ss;//用于记录测得的距离

        trig = 1;

        delay(2);

        trig = 0;

        while(!echo);//当echo为高电平的时候,跳出循环

        TH0 = 0;

        TL0 = 0;

        TF1 = 0;//计数溢出标志

        TR0 = 1;//启动定时器0,开启计时

        while(echo);//echo不为0,即脉冲返回结束,计时结束

        TR0 = 0;//停止计时

        ss = ((TH0 * 256 + TL0) * 0.34) / 2;//单位是cm

        TH0 = 0;

        TL0 = 0;

        

        return ss;

}

/*延时ms的函数*/

void delay(uchar ms)

{

        uchar x;

        uchar y;

        for(x = ms;x > 0;x--)

                for(y = 123;y > 0;y--);

}


void main()

{

        uint dist;

        InitLcd1602();

        TMOD = 0x01;

        LcdShowStr(0,0,"The Distance is:")

        LcdShowStr(4,1,"cm");

        while(1)

        {

                dist = GetDistance();

                LcdSetCursor(0,1);

                LCDNumPrint(dist);

        }

        

}

推荐阅读

史海拾趣

Deutron Electronics Corp公司的发展小趣事

随着环保意识的日益提高,Deutron Electronics Corp也积极响应环保号召,致力于实现绿色生产和可持续发展。公司采用环保材料和生产工艺,减少了对环境的污染。同时,公司还加大了对节能减排的投入,提高了资源利用效率。这些努力使得Deutron Electronics Corp在行业内树立了良好的环保形象,也为公司的长期发展奠定了坚实基础。

Benchmarq Microelectronics Inc公司的发展小趣事

在半导体行业中,供应链的稳定性和可靠性对企业的发展至关重要。Benchmarq Microelectronics Inc深知这一点,因此始终注重供应链管理和合作伙伴关系的建立。公司与多家知名供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量可控。同时,公司还加强库存管理和物流配送,确保产品能够及时、准确地送达客户手中。这些努力不仅提升了公司的运营效率和市场竞争力,还为客户提供了更加便捷、高效的服务。

Hirose公司的发展小趣事

在半导体行业中,供应链的稳定性和可靠性对企业的发展至关重要。Benchmarq Microelectronics Inc深知这一点,因此始终注重供应链管理和合作伙伴关系的建立。公司与多家知名供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量可控。同时,公司还加强库存管理和物流配送,确保产品能够及时、准确地送达客户手中。这些努力不仅提升了公司的运营效率和市场竞争力,还为客户提供了更加便捷、高效的服务。

Anvo-Systems公司的发展小趣事

Anvo-Systems在发展过程中始终注重企业文化建设和社会责任履行。公司倡导创新、协作、诚信的企业精神,为员工创造了一个积极向上的工作环境。同时,Anvo-Systems还积极参与社会公益活动,关注环保和可持续发展等问题。通过这些举措,Anvo-Systems不仅提升了企业的社会形象,也为社会的和谐发展做出了积极贡献。


请注意,以上故事纯属虚构,不代表现实中任何公司或行业的真实情况。在实际应用中,应根据具体公司的历史和发展情况进行调整和完善。

EBG RESISTORS LLC公司的发展小趣事

随着技术的不断进步,EBG RESISTORS LLC公司不断投入研发,致力于推动电阻器技术的创新。在XXXX年,公司成功研发出一种新型高精度电阻器,具有更高的稳定性和更低的温度系数。这一创新产品迅速在市场上获得了广泛应用,极大地提升了公司的市场竞争力。

Gauthier Connectique公司的发展小趣事
长期使用或不当操作可能导致元器件损坏。解决方法是检查并更换损坏的元器件。

问答坊 | AI 解惑

ARM7与ARM9的区别

有朋友问我ARM7有ARM9的区别,在此进行解答。 ARM7内核是0.9MIPS/MHz的三级流水线和冯·诺伊曼结构; ARM9内核是5级流水线,提供1.1MIPS/MHz的哈佛结构。 arm7没有mmu,arm720T是MMU的;arm9是有mmu的,arm940T只有Memory protection unit.不是 ...…

查看全部问答>

要求加精:笔记本硬件结构终极教程

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 …

查看全部问答>

警惕!碰到这8种订单客户不要随便接。

]一、           对方要求你免费提供样品的不能接,当对方以各种理由要求寄样品,收到样品后却说产品不过关,让你重新再寄,后面就没有了下文,或者说你的产品报价高了,而对方却拿着你的样品找别的公司做 ...…

查看全部问答>

在AP程序里面,我通过GetForegroundWindow( )函数找到当前顶层的窗体,然后通过PostMessage( )给这个窗体发消息,那个顶层窗体怎么

在AP程序里面,我通过GetForegroundWindow( )函数找到当前顶层的窗体,然后通过PostMessage( )给这个窗体发消息,那个顶层窗体怎么收不到消息啊?都不进顶层窗体的WindowProc( )函数。…

查看全部问答>

bluetooth avrcp

WINCE6.0的系统,支持A2DP, 使用消息队列等待来自蓝牙耳机的命令(播放, 暂停, 下一首,上一首等). 播放器用自己的, 不是Media Player,可以收到暂停, 下一首,上一首的命令,就是收不到播放的命令,另外,耳机端按了暂停之后,耳机端就没声了,主机是收到暂 ...…

查看全部问答>

想学习一下电子方面,谁能介绍下书籍

介绍一下电路基础,数字电路,模拟电路,三本书籍,能够自学用。啰嗦点无所谓,内容清楚就可以,谢谢…

查看全部问答>

置换/转让开发板EK-LM3S8962

本人手上有闲置 原装TI公司的 LM3S8962 Evaluation Kit 开发板(9.9成新),和2.4寸的TFT(带触摸屏)LCD ,等一些电子元件希望和大家置换或转让或赠送。 TI的 LM3S1138(一片) LM3S608(一片)STM8S105K(两片)  ISO124-DIP(两片)  ...…

查看全部问答>

关于DSP的寄存器

DSP中的寄存器怎么对应到它的地址上去的啊?…

查看全部问答>

【MSP430共享】用MSP430 实现基于PCB 的电容式接触传感

摘要: 这个应用报告讨论了如何用MSP430微处理器来设计单接触电容传感器接口的问题。采用具有超低功耗特性和集成外围设备的MSP430,单接触用户接口可以很轻松地实现。这个应用报告提供了技术概述,系统关注的细节和使用MSP430系列进行电容传感器设 ...…

查看全部问答>