问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

51单片机如何控制超声波传感器 求C语言程序(一定要能用)100追加

发布网友 发布时间:2022-04-26 09:27

我来回答

2个回答

热心网友 时间:2023-10-09 05:37

//超声波模块ME007显示程序
//晶振=8M
//MCU=STC10F04XE
//P0.0-P0.6共阳数码管引脚
//Trig = P1^0
//Echo = P3^2
#include <reg52.h> //包括一个52标准内核的头文件
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
//***********************************************
sfr CLK_DIV = 0x97; //为STC单片机定义,系统时钟分频
//为STC单片机的IO口设置地址定义
sfr P0M1 = 0X93;
sfr P0M0 = 0X94;
sfr P1M1 = 0X91;
sfr P1M0 = 0X92;
sfrP2M1 = 0X95;
sfrP2M0 = 0X96;
//***********************************************
sbit Trig = P1^0; //产生脉冲引脚
sbit Echo = P3^2; //回波引脚
sbit test = P1^1; //测试用引脚

uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9
uint distance[4]; //测距接收缓冲区
uchar ge,shi,,temp,flag,outcomeH,outcomeL,i; //自定义寄存器
bit succeed_flag; //测量成功标志
//********函数声明
void conversion(uint temp_data);
void delay_20us();
//void pai_xu();

void main(void) // 主程序
{ uint distance_data,a,b;
uchar CONT_1;
CLK_DIV=0X03; //系统时钟为1/8晶振(pdf-45页)
P0M1 = 0; //将io口设置为推挽输出
P1M1 = 0;
P2M1 = 0;
P0M0 = 0XFF;
P1M0 = 0XFF;
P2M0 = 0XFF;
i=0;
flag=0;
test =0;
Trig=0; //首先拉低脉冲输入引脚
TMOD=0x11; //定时器0,定时器1,16位工作方式
TR0=1; //启动定时器0
IT0=0; //由高电平变低电平,触发外部中断
ET0=1; //打开定时器0中断
//ET1=1; //打开定时器1中断
EX0=0; //关闭外部中断
EA=1; //打开总中断0

while(1) //程序循环
{
EA=0;
Trig=1;
delay_20us();
Trig=0; //产生一个20us的脉冲,在Trig引脚
while(Echo==0); //等待Echo回波引脚变高电平
succeed_flag=0; //清测量成功标志
EX0=1; //打开外部中断
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //
TR1=1; //启动定时器1
EA=1;

while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断

if(succeed_flag==1)
{
distance_data=outcomeH; //测量结果的高8位
distance_data<<=8; //放入16位的高8位
distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据
distance_data*=12; //因为定时器默认为12分频
distance_data/=58; //微秒的单位除以58等于厘米
} //为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
if(succeed_flag==0)
{
distance_data=0; //没有回波则清零
test = !test; //测试灯变化
}

/// distance[i]=distance_data; //将测量结果的数据放入缓冲区
/// i++;
/// if(i==3)
/// {
/// distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;
/// pai_xu();
/// distance_data=distance[1];

a=distance_data;
if(b==a) CONT_1=0;
if(b!=a) CONT_1++;
if(CONT_1>=3)
{ CONT_1=0;
b=a;
conversion(b);
}
/// i=0;
///}
}
}
//***************************************************************
//外部中断0,用做判断回波电平
INTO_() interrupt 0 // 外部中断是0号
{
outcomeH =TH1; //取出定时器的值
outcomeL =TL1; //取出定时器的值
succeed_flag=1; //至成功测量的标志
EX0=0; //关闭外部中断
}
//****************************************************************
//定时器0中断,用做显示
timer0() interrupt 1 // 定时器0中断是1号
{
TH0=0xfd; //写入定时器0初始值
TL0=0x77;
switch(flag)
{case 0x00:P0=ge; P2=0xfd;flag++;break;
case 0x01:P0=shi;P2=0xfe;flag++;break;
case 0x02:P0=;P2=0xfb;flag=0;break;
}
}
//*****************************************************************
/*
//定时器1中断,用做超声波测距计时
timer1() interrupt 3 // 定时器0中断是1号
{
TH1=0;
TL1=0;
}
*/
//******************************************************************
//显示数据转换程序
void conversion(uint temp_data)
{
uchar ge_data,shi_data,_data ;
_data=temp_data/100 ;
temp_data=temp_data%100; //取余运算
shi_data=temp_data/10 ;
temp_data=temp_data%10; //取余运算
ge_data=temp_data;

_data=SEG7[_data];
shi_data=SEG7[shi_data];
ge_data =SEG7[ge_data];

EA=0;
= _data;
shi = shi_data;
ge = ge_data ;
EA=1;
}
//******************************************************************
void delay_20us()
{ uchar bt ;
for(bt=0;bt<100;bt++);
}
/*
void pai_xu()
{ uint t;
if (distance[0]>distance[1])
{t=distance[0];distance[0]=distance[1];distance[1]=t;} /*交换值
if(distance[0]>distance[2])
{t=distance[2];distance[2]=distance[0];distance[0]=t;} /*交换值
if(distance[1]>distance[2])
{t=distance[1];distance[1]=distance[2];distance[2]=t;} /*交换值
}
*/

我的一个超声波程序
有问题,请问~~

//超声波模块显示程序
#include <reg52.h> //包括一个52标准内核的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
sbit Tx = P3^3; //产生脉冲引脚
sbit Rx = P3^2; //回波引脚
sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚
sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚
sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
unsigned char code string[ ]= {"CHAO SHENG BO"};
//unsigned char code string1[ ]={"QUICK STUDY MCU"};
unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字
//uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9
uint distance[4]; //测距接收缓冲区
uchar ge,shi,,temp,flag,outcomeH,outcomeL,i; //自定义寄存器
bit succeed_flag; //测量成功标志
//********函数声明
void conversion(uint temp_data);
void delay_20us();
void pai_xu();

/*****************************************************
函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
unsigned char BusyTest(void)
{
bit result;
RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1; //E=1,才允许读写
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
result=BF; //将忙碌标志电平赋给result
E=0; //将E恢复低电平
return result;
}
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_(); //空操作两个机器周期,给硬件反应时间
P0=dictate; //将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:指定字符显示的实际地址
入口参数:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=y; //将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
void LcdInitiate(void)
{
delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delay(5); //延时5ms ,给硬件一点反应时间
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x38); //连续三次,确保初始化成功
delay(5);
WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁
delay(5);
WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
delay(5);
WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
delay(5);
}

void main(void) // 主程序
{ uint distance_data,a,b;
uchar CONT_1;
uchar k; //定义变量i指向字符串数组元素
LcdInitiate(); //调用LCD初始化函数
delay(10); //延时10ms,给硬件一点反应时间
WriteAddress(0x01); // 从第1行第3列开始显示
k = 0; //指向字符数组的第1个元素
while(string[k] != '\0')
{
WriteData(string[k]);
k++; //指向下字符数组一个元素
}
i=0;

flag=0;
Tx=0; //首先拉低脉冲输入引脚
TMOD=0x10; //定时器0,定时器1,16位工作方式
//TR0=1; //启动定时器0
IT0=0; //由高电平变低电平,触发外部中断
//ET0=1; //打开定时器0中断
EX0=0; //关闭外部中断
EA=1; //打开总中断0

while(1) //程序循环
{
WriteAddress(0x41); // 从第2行第6列开始显示
WriteData('J'); //将万位数字的字符常量写入LCD
WriteData('U'); //将万位数字的字符常量写入LCD
WriteData('L'); //将万位数字的字符常量写入LCD
WriteData('I'); //将万位数字的字符常量写入LCD
WriteData(':'); //将万位数字的字符常量写入LCD
WriteData(digit[]); //将万位数字的字符常量写入LCD
WriteData(digit[shi]); //将千位数字的字符常量写入LCD
WriteData('.'); //将万位数字的字符常量写入LCD
WriteData(digit[ge]); //将百位数字的字符常量写入LCD
WriteData(' '); //将百位数字的字符常量写入LCD
WriteData('C'); //将万位数字的字符常量写入LCD
WriteData('M'); //将万位数字的字符常量写入LCD
EA=0;
Tx=1;
delay_20us();
Tx=0; //产生一个20us的脉冲,在Tx引脚
while(Rx==0); //等待Rx回波引脚变高电平
succeed_flag=0; //清测量成功标志
EX0=1; //打开外部中断
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //
TR1=1; //启动定时器1
EA=1;

while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断

if(succeed_flag==1)
{
distance_data=outcomeH; //测量结果的高8位
distance_data<<=8; //放入16位的高8位
distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据
distance_data*=12; //因为定时器默认为12分频
distance_data/=58; //微秒的单位除以58等于厘米
} //为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
if(succeed_flag==0)
{
distance_data=0; //没有回波则清零

}

distance[i]=distance_data; //将测量结果的数据放入缓冲区
i++;
if(i==3)
{
distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;

pai_xu();
distance_data=distance[1];

a=distance_data;
if(b==a) CONT_1=0;
if(b!=a) CONT_1++;
if(CONT_1>=3)
{ CONT_1=0;
b=a;
conversion(b);
}
i=0;
}
}
}
//***************************************************************
//外部中断0,用做判断回波电平
INTO_() interrupt 0 // 外部中断是0号
{
outcomeH =TH1; //取出定时器的值
outcomeL =TL1; //取出定时器的值
succeed_flag=1; //至成功测量的标志
EX0=0; //关闭外部中断
}
//****************************************************************
//定时器0中断,用做显示
timer0() interrupt 1 // 定时器0中断是1号
{
// TH0=0xfd; //写入定时器0初始值
// TL0=0x77;

}

//显示数据转换程序
void conversion(uint temp_data)
{
uchar ge_data,shi_data,_data ;
_data=temp_data/100 ;
temp_data=temp_data%100; //取余运算
shi_data=temp_data/10 ;
temp_data=temp_data%10; //取余运算
ge_data=temp_data;

//_data=SEG7[_data];
//shi_data=SEG7[shi_data]&0x7f;
//ge_data =SEG7[ge_data];

EA=0;
= _data;
shi = shi_data;
ge = ge_data ;
EA=1;
}
//******************************************************************

void delay_20us()
{ uchar bt ;
for(bt=0;bt<60;bt++);
}
void pai_xu()
{ uint t;
if (distance[0]>distance[1])
{t=distance[0];distance[0]=distance[1];distance[1]=t;}
if(distance[0]>distance[2])
{t=distance[2];distance[2]=distance[0];distance[0]=t;}
if(distance[1]>distance[2])
{t=distance[1];distance[1]=distance[2];distance[2]=t;}
}

第一个需要修改,你还是试试这个吧!这个你先理解下,修改引脚……显示为1602

热心网友 时间:2023-10-09 05:38

网上找一下 51单片机超声波DIY ,介绍的都能用,还附源程序。
51单片机如何控制超声波传感器 求C语言程序(一定要能用)100追加

//定时器0中断,用做显示timer0() interrupt 1 // 定时器0中断是1号 { // TH0=0xfd; //写入定时器0初始值 // TL0=0x77; }//显示数据转换程序void conversion(uint temp_data) { uchar ge_data,shi_data,bai_data ; bai_data=temp_data/100 ; temp_data=temp_data%100; //取余运算 shi_...

求US-100(模块)超声波测距的C语言程序,基于51单片机的,3Q哦~_百度知 ...

sbit tr=P1^0;sbit ec=P1^1;uint distance,time,tl,th;void delay_20us(void ){ uchar a ;for(a=0;a&lt;100;a++);} void delay(uint a ){ while(a--);} void display(void ){ P2=0xff;P2=0xfe;P0=smg[distance/100];delay(200);P2=0xff;P2=0xfd;P0=smg[distance%100/10];...

51单片机编程 编一个输出100kHz的方波程序(C语言) 需要完整程序最好有...

100K的方波对51来说要求太高了,尽量不要用,这个程序如果频率不对,对 “TH0=0XF6;//初始值246”这句里的0xf6调整下,向上增加数值会提高精度。/ MCU:S52 crystal:24M / include&lt;reg52.h&gt; sbit output=P1^0;//P1.0脚输出100K void timer0_init(){ TMOD=0X02;//定时器0方式2 TH0=0X...

跪求单片机(51的就好了)控制步进电机的舵机控制程序,C语言的,追加200分...

给你我写的舵机程序。这是我大一时候写的,按键部分程序我刚刚加上去的,因为手头上没有51单片机不知道有没有bug,有问题可以问我,我用的是stc12c5a60s2,这款51单片机带pwm发生器。程序有注释,回来你看吧,有不明白的可以问我。程序给你发到附件里,用电脑下载。(虽然我乐意当雷锋有分数更好哦...

51单片机的c语言 左移右移怎么用?想用来控制流水灯,请帮忙写个完整的c...

include "reg51.h" // 包含头文件 define uchar unsigned char void delay02s(void) // 延时0.2s子程序 { unsigned char i,j,k;for ( i=2;i&gt;0;i-- )for (j=200;j&gt;0;j-- )for (k=250;k&gt;0;k-- );} void main (void) // 主函数 { uchar i,j;...

求一个关于单片机的蜂鸣器的C语言程序,如果好,可行的话有追加分~

1. 实验任务 用P1.0输出1KHz和500Hz的音频信号驱动扬声器,作报警信号,要求1KHz信号响100ms,500Hz信号响200ms,交替进行,P1.7接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。2. 电路原理图 图4.6.1 3. 系统板上硬件连线 (1. 把“单片机系统”区域中的P1....

51单片机使用T0和T1外部脉冲计数,C语言如何编程?

使用T0和T1外部脉冲计数,控制两个电机,到1700个脉冲电机停止,--统计脉冲个数,用外部中断更好。--T0和T1,留着定时用。用四个按键控制,按键1控制电机正转,按键2控制电机反转,按键3控制电机1正转,按键4控制电机2正转,怎么用C语言编程?--编程前,要先设计出来电路。

51单片机控制喇叭的程序(c语言)

[功能] 通过单片机演奏音乐 注意:通过了74HC14控制ULN2003 驱动芯片驱动蜂鸣器 /***/ include &lt;REG52.H&gt; include &lt;INTRINS.H&gt; //本例采用89C52, 晶振为11.0592MHZ //关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;//...

51单片机,C语言 产生一个0~100的随机数,怎么生成?求一段能用的代码

以前想过这个问题,用定时器计时100,让定时器一直跑,等用随机数的时候,读出计数器的值,并用总数减去。但是我没试过,不知道行不行。你觉得可以就试试,我也想知道答案。

求51单片机控制步进电机,实现其间歇运动的程序,最好要有C语言的

delayus(zz*100); //100可以改,晶振不同有所不同,直到感觉转动平滑有力为止 } } else { switch(t){ case 1: zz=4;break;case 2: zz=3;break;case 3: zz=2;break;case 4: zz=1;break;} for(i=8;i&gt;=1;i--) //反转 { P1=table1[i];delayus(zz*100);} } } el...

超声波及超声波传感器 单片机C语言程序设计 单片机用什么语言编程 51单片机编程语言 c语言单片机编程教程 单片机c语言编程300例 51单片机c语言编程入门 超声波传感器怎么使用 超声波传感器使用
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
写一篇作文&lt;&lt;歌颂祖国,热爱祖国&gt;&gt;怎么写? 华硕X42JZ 笔记本运行游戏赤壁无法更新? 无锡办暂住证多久 华硕x42jz型号,是win7系统,不小心把一个“散热什么的”删了,想下载过... 华硕X42JZ笔记本fn键驱动怎么激活?官网找不到,系统是XP的 无锡暂住证丢失怎么办理需要多久 无锡暂住证遗失如何办理,需要多久? 下午买了华硕X42JZ ,wi7系统,可拿回后输数字0时出/,打客服无人接,求... ...天气预报软件会有类似这样的提示并且可以负责文字的 天气预报文字版怎么查 ...开机黑屏后左上角一光标一直闪烁 进不了系统 能进bios 光驱 u盘都不... 猫粮买什么好? 君乐宝简醇酸奶怎么样? 怎么配置stc10f04xe串口 stc10f04xe这款芯片串口是不是有问题的单片机12m晶振串口例子 小鹏汽车G3带着闺蜜打卡成都,溢出屏幕的迷人气息 空调遥控器上的“经济”是什么意思? stc10f04xestc51兼容吗 如果想要去成都旅游,需要多少提前准备多少资金呢? 听说牙齿矫正和正畸挺麻烦的,值得做吗? 牙齿矫正多久比较好? 你知道河南郑州有做IFS ERP的公司吗? 问道手游官方是哪一家?正版官方! 长沙IFS名表服务中心被彻夜查处,被查处的原因是什么? 求大神帮我看看这个Excel里的IFS公式哪里不对? 如何将.ico格式的图片改成.jpg或.gif的格式 win10 系统电脑的windows键失灵该怎么办? 为什么我下载微信,不能用QQ号码注册? 用QQ号可以注册吗 请问注册可以用QQ号吗 新申请的QQ为什么注册不了? STC芯片的RST脚的功能,具体点,谢谢 急急急,给STC10F04XE单片机写的C代码可以直接给89S52单片机用吗? 光谱共焦传感器基于什么原理实现其功能的? stc11f32xe引脚怎么定义 现在有什么密室比较好玩呢? STC单片机 ECI引脚如何使用 stc运放351-dip8引脚功能 君乐宝乐臻 谁有这个单片机stc15w408as351-dip16g 的引脚图和资料啊??16脚的 我想问一下贝多芬的降E大调第四钢琴奏鸣曲OP.7是什么程度的曲?大概几级?简单还是难啊?谢谢了。..急 STC10F04XE 单片机写18B20程序不正常,请大师们帮忙看看 考多少分才能去韩国公立学校留学 芯片解密高手,兹重金求STC12LE5A16S2芯片解密高手,谢谢! 在Keil uVision中选择什么型号的单片机与STC10F08XE对应 新手中的新手求助,STC15W201S单片机各引脚的作用是什么 STC11L32XE引脚 我要烧写 STC10F08XE单片机需要买烧录座和烧录器有什么要求吗? 微博怎么弄V字 财务章是哪种章是不是就是发票专用章还是财务章就是公章 在新浪微博上怎么加v