zoukankan      html  css  js  c++  java
  • STC15系列/STC15F2K60S2/STC15W4K32S4系列读取超声波测距模块HC-SR04距离串口显示代码提供源码下载

    STC15系列/STC15F2K60S2/STC15W4K32S4系列读取超声波测距模块HC-SR04距离串口显示代码 源码

    STC15系列读取超声波测距模块HC-SR04距离显示程序代码

    调试通过,复制粘贴便可调试使用,晶振:24MHZ、波特率:115200、定时器:100KHZ
    为方便大家调试,特附该程序的项目文件,下载打开即可调试,下载地址: https://www.90pan.com/b1908857

    //*********************************************************************
    //STC15系列、STC15W4K32S4、STC15F2K60S2单片机读取超声波HC-SR04测距程序
    //调试通过,复制粘贴便可调试使用,晶振:24MHZ、波特率:115200、定时器:100KHZ
    //版本:2.0        时间:2017-08-16
    //*********************************************************************
    
    
    #include <STC15W4K32S4.H>                                           ///引用STC15系列头文件,百度上搜索下载
    #include <INTRINS.H>
    
    //常量声明
    #define MAIN_Fosc               24000000UL                          //主时钟,不同的晶振频率可以直接修改
    
    #define Main_Fosc_1T_LOWFREQ    (65536)                             //24M-366HZ
    #define Main_Fosc_1T_100HZ      (MAIN_Fosc / 100)                   //频率1T-100HZ,1T模式下不能用100HZ
    #define Main_Fosc_1T_500HZ      (MAIN_Fosc / 500)                   //频率1T-500HZ
    #define Main_Fosc_1T_1KHZ       (MAIN_Fosc / 1000)                  //频率1T-1KHZ
    #define Main_Fosc_1T_10KHZ      (MAIN_Fosc / 10000)                 //频率1T-10KHZ
    #define Main_Fosc_1T_100KHZ     (MAIN_Fosc / 100000)                //频率1T-100KHZ
    #define Main_Fosc_1T_200KHZ     (MAIN_Fosc / 200000)                //频率1T-200KHZ
    #define Main_Fosc_1T_500KHZ     (MAIN_Fosc / 500000)                //频率1T-500KHZ
    #define Main_Fosc_1T_1MHZ       (MAIN_Fosc / 1000000)               //频率1T-1MHZ
    #define Main_Fosc_1T_2MHZ       (MAIN_Fosc / 2000000)               //频率1T-2MHZ
    
    #define serial_one_baud_rate        115200L                         //串口波特率,波特率可以直接修改
    #define Timer1_Reload_Usart         (65536UL -(MAIN_Fosc / 4 / serial_one_baud_rate))
    
    #define Timer0_Freque           Main_Fosc_1T_100KHZ                 //定时器0频率,可根据需要直接修改
    #define Timer0_Reload           (65536UL - Timer0_Freque)           //Timer0重装值
    
    //IO口设置
    #define     ECHO_IO     P10                                         //ECHO接P1.0
    #define     TRIG_IO     P11                                         //TRIG接P1.1
    
    //函数声明
    
    void Delay_ms(unsigned int ms);                                 //延时程序,毫秒
    void Delay10us();                                                   //@24.000MHz,10微秒
    void Uart_Init();                                                   //串口初始化
    void serial_one_send_byte(unsigned char dat);                       //串口发送字节
    void serial_one_send_string(unsigned char *dat);                    //串口发送字符串
    void serial_one_send_number(long num);                              //串口发送数组
    void Timer0_Init();                                                 //定时器初始化
    
    //变量定义
    unsigned long Timer_Count_0 = 0;                                    //定时器0中断计数变量
    int  Num_Distance  = 0;                                 //距离,毫米
    
    void main()
    {
        Delay_ms(200);
        Uart_Init();                                                    //串口初始化
        Timer0_Init();                                                  //定时器初始化
        ECHO_IO = 1;
        TRIG_IO = 0;
        Delay_ms(200);
        while(1)
        {
            TRIG_IO = 1;
            Delay10us();                                                //@24.000MHz,10微秒
            TRIG_IO = 0;
            Timer_Count_0 = 0;
            while(ECHO_IO == 0 && Timer_Count_0 < 50);                  //500微秒超时
            Timer_Count_0 = 0;
            while(ECHO_IO == 1 && Timer_Count_0 < 2000);                //20毫秒超时
            Num_Distance = (int)((float)Timer_Count_0 / 100 * 340 / 2); //计算距离:距离(毫米)=时间(ms)*速度(340mm/ms)/2
    
            serial_one_send_string("测试距离:");
            serial_one_send_number(Num_Distance);
            serial_one_send_string("毫米
    ");
    
            Delay_ms(1000);                                             //延时1000ms
    
        }
    }
    
    //延时程序,毫秒
    void Delay_ms(unsigned int ms)//24MHz
    {
        unsigned char i, j;
    
        while(ms--)
        {
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
    
            i = 24;
            j = 85;
            do
            {
                while (--j);
            } while (--i);
        }
    }
    
    void Delay10us()        //@24.000MHz,10微秒
    {
        unsigned char i;
    
        _nop_();
        _nop_();
        i = 65;
        while (--i);
    }
    
    //定时器初始化
    void Timer0_Init()
    {
        TR0          =       (0x00);        //停止计数
        ET0          =       (0x00);        //禁止中断
        PT0          =       (0x00);        //低优先级中断
        TMOD        &=       (0xF0);        //初始化T0:定时模式, 16位自动重装
        AUXR        |=       (0x80);        //1T
        ET0         &=      ~(0x01);       //不允许中断
        PT0          =       (0x01);        //高优先级中断
        TMOD        |=       (0x00);        //工作模式,0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 16位自动重装, 不可屏蔽中断
        INT_CLKO    |=       (0x01);        //不输出时钟 INT_CLKO |=  0x01;  //P35输出时钟
        TMOD        &=      ~(0x04);       //定时模式,TMOD |=  0x04;       //对外计数或分频
        TH0          =       (unsigned char)(Timer0_Reload >> 8);
        TL0          =       (unsigned char)(Timer0_Reload);
        ET0          =       (0x01);        //允许中断
        EA           =       (0x01);        //允许全局中断
        TR0          =       (0x01);        //开始运行
    }
    
    //串口初始化
    void Uart_Init()
    {
        SCON |= 0x40;               //8位数据
        P_SW1 &=  ~0xc0;       //UART1 使用P30 P31口  默认
        TR1 = 0;                        //关闭定时器1
        AUXR &= ~0x01;         //串口1波特率使用定时器1
        TMOD &= ~(1<<6);       //Timer1 set As Timer
        TMOD &= ~0x30;         //16位自动重装
        AUXR |=  (1<<6);        //定时器使用1T模式
        TH1 = (unsigned char)(Timer1_Reload_Usart >> 8);
        TL1 = (unsigned char)Timer1_Reload_Usart;
        TR1 = 1;                        //打开定时器1
        PS  = 1;                        //高优先级中断
        REN = 1;                        //允许接收
        ES  = 1;                        //允许中断
        EA  = 1;                        //允许全局中断
    }
    
    //========================================================================
    // 函数: serial_one_send_byte(unsigned char dat)
    // 描述: 串口1发送一个字节.
    // 参数: dat:字符(无符号八位整型数据).
    // 返回: none.
    // 版本: V1.0, 2017-06-22
    //========================================================================
    void serial_one_send_byte(unsigned char dat)
    {
        SBUF = dat;
        while(!TI);
        TI = 0; 
    }
    
    //========================================================================
    // 函数: serial_one_send_string(u8 *dat)
    // 描述: 串口1发送字符串.
    // 参数: dat:字符串.
    // 返回: none.
    // 版本: V1.0, 2017-06-22
    //========================================================================
    void serial_one_send_string(unsigned char *dat)
    {
        while(*dat)
            serial_one_send_byte(*dat++);
    }
    
    //========================================================================
    // 函数: void serial_one_send_number(long num)
    // 描述: 串口1发送整型数据.
    // 参数: num:整型数值.
    // 返回: none.
    // 版本: V1.0, 2017-06-22
    //========================================================================
    void serial_one_send_number(long num)
    {
        long dat = 0;
        unsigned char  length = 0;
        if(num < 0)                                     //当数值为负数时
        {
            serial_one_send_byte('-');  //输出负号
            num = -num;                                 //将数值取相反数
        }
    
        if(num == 0)                                    //当数值为0时
            serial_one_send_byte('0');  //输出字符0
        else                                            //当数值不为0时
        {
            while(num)                                  //将数值倒过来
            {
                dat = dat * 10;
                dat = dat + num % 10;
                num = num / 10;
                length++;
            }
    
            while(length--)                         //从第一位开始输出倒过来的数值
            {
                serial_one_send_byte(dat % 10 + '0');
                dat = dat / 10;
            }
        }
    }
    
    //串口中断
    void Uart1_Int (void) interrupt 4
    {
        if(RI)
            RI = 0;
    }
    
    //定时器0中断函数
    void Timer0_Int (void) interrupt 1
    {
        Timer_Count_0++;
    }
  • 相关阅读:
    Android教程 -07 Activity的任务栈和启动模式
    ViewPager封装工具类: 轻松实现APP导航或APP中的广告栏
    hdu 5900 区间dp
    状压dp入门
    poj 3280
    hdu 4745 two Rabits
    食了智,过来水一发
    poj 2142 the Balance
    hdu 6188 Duizi and Shunzi
    hdu 6186 CS Course
  • 原文地址:https://www.cnblogs.com/liyu3519/p/13042546.html
Copyright © 2011-2022 走看看