一个星期做的设计,没加温补,感兴趣的可以自己加上,亲自测试过,没任何问题,附件里有原理图代码
制作出来的实物图如下:
电路原理图如下:
单片机源程序如下:
- /*************************************************
- *STC15单片机超声波测距数码管显示:
- *定时器0用于测量时间
- *定时器2用于数码管扫描
- *
- *模块工作原理:
- *1、采用(I0触发测距、给至少10us的高电平信号)
- *2、模块自动发送8个40khz的方波、自动检测是否有信号返回
- *3、有信号返回、通过I0输出一高电平、高电平持续的时间就是超声波从发射到返回的时间、
- * 测试距离=(高电平时间*声速(340M/s)/2)
- *
- *
- *
- *
- */
- #include <stc15.h>
- #include <intrins.h>
- #include "oled.h"
- #define SETDISTANCE 10 //设置报警值,低于此值,蜂鸣器报警
- int count = 0,count1=0;
-
- sbit BEEP = P3^4; //蜂鸣器接口
- sbit ECHO = P0^0; //ECHO
- sbit TRIG = P0^1; //Trig
- unsigned int time=0; //用于定时时间
- unsigned int time0=0; //用于定时器计数
- unsigned long S=0; //存放计算出来的距离
-
- bit flag =0; //定时器0溢出标志位
- //bit Beepflag =0;
-
-
- /* 函数声明 */
- void Display(void);
- void Conut(void);
- void Start_modle(void);
- //void delay_ms(int);
- void Timer0Init(void) //定时器0初始化
- {
- TMOD=0x01; //设定定时器模式
- TH0=0X00; //定时器0初值为0
- TL0=0X00;
- ET0=1; //开启定时器0中断
- TR0=0; //先不开启定时器0
- EA=1; //开总中断
- }
- void Timer2Init(void) //定时器2初始化
- {
- AUXR &= 0xFB; //定时器时钟为12T模式
-
- T2L = 0XCD; //设定定时器初值 2Ms
- T2H = 0XF8;
- AUXR |= 0x10; //开启定时2中断
- IE2 =0X04; //启动定时器2
- }
- /*************主函数*******************************************/
- void main( void )
- {
- OLED_Init(); //初始化OLED
- // OLED_On();
- // delay_ms(800);
- OLED_Clear();
- OLED_ShowCHinese(20,2,0);//
- OLED_ShowCHinese(38,2,1);//
- OLED_ShowString(56,2,"1901",16);//1901
- OLED_ShowCHinese(20,4,2);//姓
- OLED_ShowCHinese(38,4,3);//名
- OLED_ShowString(56,4,":",16);//:
- OLED_ShowCHinese(66,4,4);//
- OLED_ShowCHinese(82,4,5);//
- delay_ms(800); //清屏时间
- OLED_Clear();
- Timer0Init();
- Timer2Init();
- while(1)
- {
- Start_modle();
- while(!ECHO); //当ECHO为零时等待
- TR0=1; //开启计数
- while(ECHO==1);//&&(flag==0)); //当ECHO为1计数并等待
- TR0=0; //关闭计数
- Conut(); //计算
- }
- }
- /**********************启动模块*********************************/
- void Start_modle(void)
- {
- TRIG = 1; //拉高TRIG
- _nop_(); //延时10us以上
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- TRIG = 0; //拉低TRIG
- }
-
- /**********************计算距离方法*******************************/
- void Conut(void)
- {
- unsigned char a,b,c;
- time=TH0*256+TL0; //计算高电平时间
- TH0=0; //复位定时器0的数值
- TL0=0;
-
- OLED_ShowCHinese(0,4,6);//距
- OLED_ShowCHinese(16,4,7);//离
- OLED_ShowString(32,4,":",16);//:
-
- OLED_ShowCHinese(0,2,8);//超
- OLED_ShowCHinese(16,2,9);//声
- OLED_ShowCHinese(32,2,10);//波
- OLED_ShowCHinese(48,2,11);//测
- OLED_ShowCHinese(64,2,12);//距
-
- S=(time*1.7)/100; //换算成M
- if((S>=400)||flag==1) //如果测量超时
- {
- flag=0;
- OLED_ShowString(42,4,"-",16);
- OLED_ShowString(52,4,"-",16);
- OLED_ShowString(62,4,"-",16);
- OLED_ShowString(72,4,"-",16);
- }
- else
- {
- a=S%1000/100;
- b=S%1000%100/10;
- c=S%1000%10 %10;
- OLED_ShowNum(42,4,a,1,16);
- OLED_ShowString(52,4,".",16);
- OLED_ShowNum(62,4,b,1,16);
- OLED_ShowNum(72,4,c,1,16);
- OLED_ShowString(82,4,"M/S",16);
- }
- }
-
- /********************* 定时器0中断函数***********************************/
- void Timer0Interrupt(void) interrupt 1
- {
- flag = 1;
- }
- /**************定时器2中断函数*****************/
- void Timer2Interrupt(void) interrupt 12
- {
- time0++; //用于定时时间
- count++;
- if(count >=100)
- {
- count = 0;
- if(S<SETDISTANCE) //判断距离是否小于设定值
- {
- BEEP = ~BEEP ;
- }
- else
- BEEP = 1;
- }
- if(time0>=400) //每800ms启动一次
- {
- time0=0;
- Start_modle();
- }
- }
复制代码
Keil代码下载:
STC15超声波测距OLED显示.7z
(54.15 KB, 下载次数: 71)
|