51学习库(5)--HC_SR04超声波模块

来源:互联网 发布:淘宝靠谱美国代购店铺 编辑:程序博客网 时间:2024/04/27 14:37

学过51单片机的回过头来都会觉得51还是比较简单的,在此我将贴出在我的学习过程中,把对各种外设所进行的操作,封装成函数库的形式,以供新手学习。

注:使用的单片机是stc12c5a60s2,该系列单片机属于加强51,在运行速度上是普通51的8-12倍,有关时序的操作需要加以注意。
注2:使用示例:

void main(){    unsigned char i;    init_SR04();        //初始化超声波    lcd_init();            //初始化液晶12864           while(1)    {                                                    distance=sonic();        //调用函数获取距离        sprintf(juli, "%dmm", (int)distance); //数据处理为lcd要显示的内容        lcd_pos(0, 0);        i = 0;        lcd_wcmd(0x01);    //清屏        while('\0' != juli[i])            lcd_wdat(juli[i++]);        delayms(500);            //0.5秒测一次,也可用定时器                                          }}

申明:本系列全部例程通过单片机开发板,实验亲测有效!

/* hc-sr04 */sbit RX=P3^6;         //echo        接收端sbit TX=P3^5;         //trig         发送端void init_SR04(void){            RX=1;                 //置1,作为输入端查询,(51单片机特性,可查阅相关资料                           //若输入电平为1则1&1=1,若输入0则0&1=0,                          //如果RX=0:则无论引脚输入是1还是0,与原先置为0的RX脚&                            //则得到的总是0,也就无法检测后面输入RX的电平)    TX=0;}void send()                     //发送端TRI发送20us高电平{    TX = 0;    Delay20us();    TX=1;    Delay20us();    TX=0;}void Clr_timer()        //定时器清零{    TH0=0;        TL0=0;    TF0=0;}unsigned int  sonic()        //超声波测距{    unsigned int ceju1,time;    Clr_timer();    Delay20us();     send();                                 while(!RX);   //等待接收端变为高电平    TR0=1;           //启动计数    while(RX);   //等待接收端变为低电平    TR0=0;           //停止计数    if(TF0)    ceju1=9999;    else    {        time=TH0*256+TL0;    //得到距离所用时间          ceju1=time*0.172+0.5; //放大10倍,取一位小数,此处已转化为cm单位,                             //无需再转换,只是放大了10倍,四舍五入取位小数而已      //计算公式distance=time*344/2/1000000=time*0.0172  单位为cm,若为英尺好像是有个58什么来着来着,忘记了,自己百度吧    }    if(ceju1>5000)                       //大于5米,超出测距范围,置为无效数据        ceju1=9999;      return ceju1;}void Delay20us()                //@12.000MHz{    unsigned char i;    i = 57;    while (--i);}
0 0
原创粉丝点击