#include 我这样写的中断服务行吗?不知为什么总是只能测2-20cm的超过20cm就会发神经。大神帮帮忙。
#define uint unsigned int
#define uchar unsigned char
#define sm unsigned char
sbit gnd1=P1^0;
sbit gnd2=P1^1;
sbit rx=P1^2;
sbit tx=P1^3;
sbit rs=P2^6; //命令
sbit rw=P2^5; //读写
sbit lcde=P2^7; //时钟
uchar code zf2[]="0123456789 abcdefghijklmnopqrxtuvwxyz .,?!<>=+-();*/%~#_[]{} ";
uchar k;num;ge;shi;bai;qian;
void delay_short(uchar x)
{
uint i;
for(i=x;i>0;i--);
}
void delay_long(uchar y)
{
uint i,j;
for(i=y;i>0;i--)
for(j=120;j>0;j--);
}
void write_com(uchar com)
{
rs=0;
rw=0;
P0=com;
delay_short(400);
lcde=1;
delay_short(1);
lcde=0;
}
void write_dat(uchar dat)
{
rs=1;
rw=0;
P0=dat;
delay_short(1);
lcde=1;
delay_short(1);
lcde=0;
}
void init()
{
gnd1=0;
gnd2=0;
write_com(0x38); //设置显示模式
write_com(0x0c); //开显示且光标不显示
write_com(0x01); //清屏
write_com(0x06);
for(num=0;num<1;num++)
{
write_com(0x18);
delay_long(1);
}
}
void xscx()
{
write_com(0x80+0x01); //地址
write_dat(zf2[qian]); //内容
write_com(0x80+0x02);
write_dat(zf2[bai]);
write_com(0x80+0x03);
write_dat(zf2[shi]);
write_com(0x80+0x04);
write_dat(zf2[41]);
write_com(0x80+0x05);
write_dat(zf2[ge]);
write_com(0x80+0x06);
write_dat(zf2[13]);
write_com(0x80+0x07);
write_dat(zf2[23]);
}
超声波测距程序问题
答案:2 悬赏:30 手机版
解决时间 2021-02-20 16:01
- 提问者网友:杀手的诗
- 2021-02-20 12:36
最佳答案
- 五星知识达人网友:怙棘
- 2021-02-20 13:18
我贴一个测试成功的51程序,试了多个超声波模块,可以测试0到5米距离。测试结果从串口反馈到PC,也有从数码管显示的。有疑问欢迎Q我。QQ号在最后:
#include
#include "stdio.h"
#include "MCU_UART.H"
#define uchar unsigned char
#define uint unsigned int
sbit Trig = P1^0 ;
sbit Echo = P3^2 ;
uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};
//
int timeH = 0;
int timeL = 0;
int succeed_flag;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//
void delay_20us()
{
uchar a ;
for(a=0;a<100;a++);
//for(a=0;a<5;a++);
}
/
}
//***************************************************************
void main()
{
uint distance;
int test;
char str[5];
int discount=0;
int MaxCount = 10;
int minDistance = 90000;//最小距离是90000米
float distforeachcyle = 0.172*1.085; //fosc=11.0592
int time;
init_uart();
test =0;
Trig=0; //首先拉低脉冲输入引脚
EA=1; //打开总中断0
TMOD=TMOD|0x01; //定时器0,16位工作方式
printu("Begin Ceju.\r\n");
while(1)
{
EA=0; //关总中断
Trig=1; //超声波输入端
delay_20us(); //延时20us
Trig=0; //产生一个20us的脉冲
while(Echo==0); //等待Echo回波引脚变高电平
succeed_flag=0; //清测量成功标志
EA=1;
TH0=0; //定时器1清零
TL0=0; //定时器1清零
TF0=0; //计数溢出标志
EX0=1; //打开外部中断0
TR0=1; //启动定时器1
delay(40); //等待测量的结果
TR0=0; //关闭定时器1
EX0=0; //关闭外部中断0
if(succeed_flag==1)
{
time=timeH*256+timeL;
//distance=time*0.172; //12MHz晶振,每个机器周期是1us,单位应该是毫米 声速340m/s,1us往返距离是0.34mm,1us单程距离是0.17mm
distance=time*distforeachcyle; //11.0592MHz晶振,每个机器周期是1us,单位应该是毫米 声速340m/s,1us往返距离是0.34mm,1us单程距离是0.17mm
//display(distance);
if (discount < MaxCount) //取20次的最小值作为结果
{
discount++ ;
if (distance display(minDistance); //取一段时间的最小距离作为测距结果,在数码管显示出来
}
else
{
if (minDistance<90000) display(minDistance); //取一段时间的最小距离作为测距结果,在数码管显示出来
discount=0;
minDistance = 90000;//最小距离是90000米
printu("The distance is:");
sprintf(str, "%d\r\n", distance);//
printu(str);
}
}
if(succeed_flag==0)
{
distance=0; //没有回波则清零
test = !test; //测试灯变化
}
//delay(200); //延迟再开始下一次测量
}
}
//***************************************************************
//外部中断0,用做判断回波电平
void exter() interrupt 0 // 外部中断0是0号
{
timeH =TH0; //取出定时器的值
timeL =TL0; //取出定时器的值
succeed_flag=1;//至成功测量的标志
EX0=0; //关闭外部中断
}
//****************************************************************
//定时器0中断,用做超声波测距计时
void timer0() interrupt 3 //
{
TH0=0;
TL0=0;
}
QQ:1041539926
全部回答
- 1楼网友:患得患失的劫
- 2021-02-20 14:28
导火索粉红色说得好豆腐干豆腐干
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯