/*
功能:超声波测距实验。
功能模块:HC-SR04,测距范围:2cm to 450cm
数码管显示:xxx.x,单位:cm
计算公式如下:
s = v*t/2 = (340m/s)*t(s)/2 = (340um/us)*t(us)/2 = (0.34mm/us)*t(us)/2 = (0.034cm/us)*t(us)/2;;
s(cm) = t(us)*0.017(cm/us).
t is the received Echo high level time from the UltracsonicModule HC-SR04,
it messured by T0 timer, t=(12/11.0592)us*(TH0,TL0), initial (TH0,TL0)=0x00 00
s(cm) =0.0184*(TH0,TL0), (TH0,TL0)max = 24456 for s =450cm
UltracsonicModule HC-SR04 VCC(+5V) connect to VCC;
Gnd connct to GND;
Trig connect to P3.3;
Echo connect to P3.2.
超声波测距范例
数码管显示测距次数(小于255次,超出从0继续计数)和测距结果(单位:cm)
编制:电子科技大学实验中心2022年6月
*/
#include <PCF8591.h>
#include <reg52.h>
sbit LED1 = P1^0; //定义LED1由P1.0控制
//定义I/O接口
sbit PWM_IN1 = P1^4; // 高电平1:左电机后退(反转)
sbit PWM_IN2 = P1^5; // 高电平1:左电机前进(正转)
sbit PWM_IN3 = P1^6; // 高电平1:右电机前进(正转)
sbit PWM_IN4 = P1^7; // 高电平1:右电机后退(反转)
bit show_flag = 0;
sbit PWM_EN1 = P1^2; // 高电平1:使能左电机
sbit PWM_EN2 = P1^3; // 高电平1:使能右电机
bit timer_start_flag= 0 ;
bit timer_start_flag2 = 0 ;
bit start_flag = 1;
bit count_flag = 1;
#define SPEED_MAX 20
//定义PWM级数,分为0~SPEED_MAX-1级
unsigned int Speed_L ;
unsigned int Speed_R ;
unsigned char c = 40; //定义计数值变量的初始值
//定义驱动引脚
sbit Echo = P3^2; //Echo
sbit Trig = P3^3; //Trig
//智能小车数码管按键电路管脚定义
sbit KEY1 = P3^4; //定义按键1,'+'按键,对应核心板上K1
sbit KEY2 = P3^5; //定义按键2,'-'按键,对应核心板上K2
#define LED_seg P0 //8位数码管的段码和位码驱动通过P0端口锁存
#define LED_dig P0
unsigned int distance = 125;
//定义显示缓冲区(由定时中断程序自动扫描)
unsigned char DispBuf[8];
sbit BUZZER = P2^3; //有源蜂鸣器驱动端口,低电平输出响
//智能小车数码管显示电路管脚定义
sbit SS = P2^6; //数码管段选信号
sbit CS = P2^7; //数码管位选信号
unsigned char sec = 0; //100ms计数
unsigned char sec1 = 0;
bit Counter_overflag = 0; //T0定时器溢出标志
bit Echo_Over = 0; //超声波测距完成标志,无论收到回波或没有收到,总要置位一次
unsigned char cnt = 0; //测量次数,每次加一
unsigned int Range = 0;
unsigned int Range1 = 0;
unsigned int Range2 = 0;
unsigned int Range3 = 0;
unsigned long Echo_time = 0; //T0定时器合并数值
unsigned int count_flag2 = 0;
unsigned int count_flag3 = 0;
bit fff = 0;
code unsigned char Tab[] =
{//定义0123456789AbCdEF的数码管字型数据,其他显示字符需自行计算,如‘-’的字形数据为0x40
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71
};
//============================//
/*
函数:Delay()
功能:延时
说明:
晶振频率为11.0592MHz
延时长度 = 1ms * t
*/
void Delay(unsigned int t)
{
unsigned int us_ct;
for (;t > 0;t --) //执行代码消耗CPU时间
for (us_ct = 113;us_ct > 0;us_ct --);
}
/*
函数:EX0INTSVC()
功能:外部中断0中断服务程序
用途:为避免定时中断干扰测距的准确性,采用外部中断触发后立即停止计时
外部中断0优先级高于定时中断,程序尽量短,避免过多干扰定时中断
*/
void EX0INTSVC() interrupt 0
{
TR0 = 0; //停止计时
Echo_time = TH0 * 256 + TL0; //读取定时器0计数值
TH0 = 0; //清除定时器0计数寄存器,为下次计数做准备
TL0 = 0;
Echo_Over = 1; //表示本次超声波测距完成,可以启动下次的测量
EX0 = 0; //关闭外部中断,否则会马上引起下一次中断
}
//============================//
/*
函数:T0INTSVC()
功能:定时器T0的中断服务函数
用途:若超过测距范围,长时间无法收到回波,
已经启动的T0中断会计数溢出,利用定时器溢出标志来判断
*/
void T0INTSVC() interrupt 1
{
TR0 = 0; //停止计时
Counter_overflag = 1; //中断溢出标志,未收到回波
Echo_Over = 1; //表示本次超声波测距完成,可以启动下次的测量
EX0 = 0; //关闭外部中断
}
/*
函数:T1INTSVC()
功能:定时器T1的中断服务函数
*/
void T1INTSVC() interrupt 3 //定时器1的中断号为:3
{
code unsigned char com[] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //显示位的端口控制字节
static unsigned char n = 0; //n: 扫描显示位计数,0-7
static unsigned int counter_1ms = 0; //1ms计�
static unsigned int counter_1ms2 = 0; //1ms计�
static unsigned int t = 0;
unsigned int x = 0;
unsigned int y = 0;
//================数码管定时扫描驱动显示===============
TR1 = 0;
TH1 = 0xFC;
TL1 = 0x66; //可以将FC66换成0000,降低扫描速度,观察和理解动态扫描
TR1 = 1;
P0 = 0xFF; //消隐
CS = 1;
CS = 0;
P0 = DispBuf[n]; //更新扫描显示数据
SS = 1;
SS = 0;
P0 = ~com[n]; //重新显示
CS = 1;
CS = 0;
n++; //指向下一位扫描显示
n &= 0x07;
//====================================================
t++;
if ( t >= SPEED_MAX )
{
t = 0; //PWM波的周期为:SPEED_MAX*1ms = 20ms
}
if(Range >= distance)
{
x = Range - distance;
y=0;
}
else{
y = Range - distance;
x= 1300;
}
if(start_flag == 0)
{
if(x >= 300 && x <= 1200){
Speed_L = 4;
Speed_R = 5 ;
if ( t < Speed_L ) //PWM波高电平时间:(Speed_L)*1ms
{
PWM_IN1 = 0;
PWM_IN2 = 1; //左电机的正转
}
else //PWM波低电平时间:(SPEED_MAX-Speed_L)*1ms
{
PWM_IN1 = 0;
PWM_IN2 = 0; //左电机的停转
}
if ( t < Speed_R ) //PWM波高电平时间:Speed_R*1ms
{
PWM_IN3 = 1;
PWM_IN4 = 0; //右电机的正转
}
else //PWM波低电平时间:(SPEED_MAX-Speed_R)*1ms
{
PWM_IN3 = 0;
PWM_IN4 = 0; //右电机的停转
}
}
if(x <= 300){
count_flag3 ++;
if(count_flag3 == 3)
{
count_flag3 = 0;
Speed_L = 2 ;
Speed_R = 3 ;
if ( t < Speed_L ) //PWM波高电平时间:(Speed_L)*1ms
{
PWM_IN1 = 0;
PWM_IN2 = 1; //左电机的正转
}
else //PWM波低电平时间:(SPEED_MAX-Speed_L)*1ms
{
PWM_IN1 = 0;
PWM_IN2 = 0; //左电机的停转
}
if ( t < Speed_R ) //PWM波高电平时间:Speed_R*1ms
{
PWM_IN3 = 1;
PWM_IN4 = 0; //右电机的正转
}
else //PWM波低电平时间:(SPEED_MAX-Speed_R)*1ms
{
PWM_IN3 = 0;
PWM_IN4 = 0; //右电机的停转
}
}
}
if( x <= 5){
if(count_flag)
{
count_flag = 0;
sec1 = sec;
show_flag = 1;
}
Speed_L = 0;
Speed_R = 0;
if ( t < Speed_L ) //PWM波高电平时间:(Speed_L)*1ms
{
PWM_IN1 = 0;
PWM_IN2 = 1; //左电机的正转
}
else //PWM波低电平时间:(SPEED_MAX-Speed_L)*1ms
{
PWM_IN1 = 0;
PWM_IN2 = 0; //左电机的停转
}
if ( t < Speed_R ) //PWM波高电平时间:Speed_R*1ms
{
PWM_IN3 = 1;
PWM_IN4 = 0; //右电机的正转
}
else //PWM波低电平时间:(SPEED_MAX-Speed_R)*1ms
{
PWM_IN3 = 0;
PWM_IN4 = 0; //右电机的停转
}
}
if( y >= 5){
count_flag2 ++;
if(count_flag2 == 3)
{
Speed_L = 3;
Speed_R = 3;
count_flag2 = 0;
if ( t < Speed_L ) //PWM波高电平时间:(Speed_L)*1ms
{
PWM_IN1 = 1;
PWM_IN2 = 0; //左电机的正转
}
else //PWM波低电平时间:(SPEED_MAX-Speed_L)*1ms
{
PWM_IN1 = 0;
PWM_IN2 = 0; //左电机的停转
}
if ( t < Speed_R ) //PWM波高电平时间:Speed_R*1ms
{
PWM_IN3 = 0;
PWM_IN4 = 1; //右电机的正转
}
else //PWM波低电平时间:(SPEED_MAX-Speed_R)*1ms
{
PWM_IN3 = 0;
PWM_IN4 = 0; //右电机的停转
没有合适的资源?快使用搜索试试~ 我知道了~
电子科技大学现代电子系统综合实验小车工程文件代码
共38个文件
c:6个
h:4个
obj:4个
需积分: 0 30 下载量 127 浏览量
2023-10-25
17:30:45
上传
评论 16
收藏 162KB ZIP 举报
温馨提示
(1)小车开机运行程序,在8位数码管的最右边3位显示小车定位距离,初始值为12.5(单位:cm)并启动超声波测距,将距离值显示在最左边4位(xxx.x cm) ; (2)利用按键设置定位距离,“+”按键每次增加0.5cm,上限为15.0cm; “-”按键每次减少0.5cm,下限为10.0cm;当按下该按键时,蜂鸣器响0.1秒(按键提示音)。 (3)设定好定位距离的小车放置在障碍物1米以外的位置。利用光敏遥控启动小车,同时启动“秒表计时器” 作为小车运行时间计时,并在数码管最右边3位显示时间(要求定时中断实现);尽量保持小车直线前进,要求小车速度至少有两个速度档位,距离障碍物越近,速度越慢。小车第一次进入定位距离范围内,停止计时,要求该时间不大于3.2秒,并记录小车运行时间。 (4)小车运行过程中,数码管上始终实时显示运行时间和小车到障碍物的距离; (5)小车在距离障碍物为定位距离±0.5cm范围内停止行驶,通过速度调节和前进后退等方式使小车精确定位在目标范围,若小车位于(定位距离-0.5cm)以内 ,则声光报警,即用一个发光二极管指示灯闪烁,点亮0.1s,熄灭0.3s;用蜂鸣器响0.1
资源推荐
资源详情
资源评论
收起资源包目录
工程作业.zip (38个子文件)
工程作业
ranging.uvopt 5KB
工程作业
ranging.uvopt 5KB
ranging.uvgui.QHTF 83KB
PCF8591.h 864B
Objects
ranging.build_log.htm 1KB
ranging.lnp 129B
ranging 24KB
PCF8591.obj 9KB
main_ranging.obj 21KB
ranging.hex 7KB
PCF89C51.c 5KB
Listings
main_ranging.lst 26KB
PCF8591.lst 9KB
ranging.m51 35KB
ranging.uvgui.Dell 83KB
PCF89C51.h 864B
PCF8591.c 5KB
ranging.uvgui.Administrator 177KB
ranging.uvproj 14KB
main_ranging.c 14KB
ranging.uvgui.QHTF 83KB
PCF8591.h 864B
Objects
ranging.build_log.htm 1KB
ranging.lnp 129B
ranging 24KB
PCF8591.obj 9KB
main_ranging.obj 21KB
ranging.hex 7KB
PCF89C51.c 5KB
Listings
main_ranging.lst 26KB
PCF8591.lst 9KB
ranging.m51 35KB
ranging.uvgui.Dell 83KB
PCF89C51.h 864B
PCF8591.c 5KB
ranging.uvgui.Administrator 177KB
ranging.uvproj 14KB
main_ranging.c 14KB
共 38 条
- 1
资源评论
DR_Allen
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功