求单片机高手编一小段AVR程序(用C语言,AVR studio里运行),超声波避障。

求单片机高手编一小段AVR程序(用C语言,AVR studio里运行),超声波避障。,第1张

这本质上就是测周期,你完全可以借鉴移植频率测量程序(低频测量)。

float LF_test(void)//低频测试子程序

{uint ta,tb;

ulong t=0;//中断次数及高电平时间寄存器

DDRD&=~0x40;//ICP1输入

TCCR1B=(0<<CS12)|(0<<CS11)|(1<<CS10)|(1<<ICES1);//不分频,上升沿触发

TCNT1=0;

TIFR=(1<<ICF1);//清输入捕捉中断标志位

while(!(TIFR&0x20));//等待一次上升沿捕捉

TIFR=(1<<ICF1);//清输入捕捉中断标志位

ta=ICR1;//保存捕捉值

TIFR=(1<<TOV1);//清溢出中断标志

while(!(TIFR&0x20)) {if(TIFR&0x04) {TIFR=(1<<TOV1);t++;}}//统计溢出次数,并等待第二次上升沿捕捉 //这个地方要改成下降沿触发,记得修改哦。

tb=ICR1;//存捕捉值

TCCR1B=(0<<CS12)|(0<<CS11)|(0<<CS10);//关闭定时器 T1

t=65536;//溢出次数转换成相应计数次数

t=t+tb-ta;//计算时间

return(80000000/t);//计算结果

}

在这个基础上移植,相信你能成功。

没有VJC的软件,只有VisualBasic的软件。VisualBasic是微软公司开发的编程设计软件,它也是基于Windows *** 作系统可视化编程环境。VisualBasic60[1]因 *** 作简单实用,所以从其问世以来很受专业程序员和编程爱好者的追捧。VisualBasic60由标题栏、菜单栏、工具栏、工具箱、窗体窗口、工程窗口、属性窗口、窗体布局窗口等构成。VisualBasic60的组件有很多,比如编辑器、设计器、属性等开发组件。VisualBasic60还提供了窗口编辑,可直接对窗口进行编辑和预览。VisualBasic60的工具箱由指针、框、标签、文本框、框架、命令按钮、复选框、单选按钮、组合框、列表框、水平滚动条、垂直滚动条、定时器、驱动器列表框、目录列表框、文件列表、形状控件、直线、图像控件、数据控件、OLE容器构成。单击工具栏上的运行按钮,或按F5键,运行这个程序。希望我能帮助你解疑释惑。

有,#include(reg52h)用()是非法的

你可以用#include

"reg52h"只看到这一个错误

由于没有其他程序

无法确定是否有其他错误如果有问题

再追问

建议上传所有代码

各个位平面(0-1二值图像)还是对图像进行二值化得到0-1图像

如果是提取位平面,那语句bitget(A,i)即可,其中A表示某个灰度图像,i表示第i位,一般可取0-8任一值。

例:

A=fix(rand(4)255)

A =

207 161 244 244

230 24 246 123

32 71 40 204

232 139 247 36

>> bitget(A,1)

ans =

1 1 0 0

0 0 0 1

0 1 0 0

0 1 1 0

如果是图像二值化,则可以简单的使用otsu算法

p=unit8(A); %强制类型转换为无符号8位

t=graythresh(p);%求阈值

bw=im2bw(p,t); %二值化

t =

05863

bw =

1 1 1 1

1 0 1 0

0 0 0 1

1 0 1 0

如果只想生成一个任意的m x n的 0-1矩阵,则直接使用

A=round(rand(m,n)) 即可

我的程序,这是超声波测距的程序,检测到物体,你直接让小车左拐,或者右拐就行了:

#include<reg52h>//超声波测距

#include<intrinsh>

#define uint unsigned int

#define uchar unsigned char

uint a,s,time;

sbit tr=P2^1; //发送

sbit re=P2^2; //接收

void delay_us() //延时50us

{

uint i;

for(i=0;i<50;i++)

_nop_();

}

void delay_ms(uint x) //毫秒级延时

{

uint i,j;

for(i=x;i>0;i--)

for(j=110;j>0;j--);

}

void getdistance1()

{

//uint i=2353;//40厘米来回需要的时间(us) (042/340)1000000

TR1=0;

TH1=0;

TL1=0;

re=0;//接收信号端置0

tr=1;//开始触发

delay_us();//延时50微秒

tr=0; //停止触发

while(re==0); //没有信号返回并且在40厘米障碍物信号返回需要的时间前则等待 (无信号即时返回,防止死循环,阻碍其它程序的执行)

TR1=1;

while(re==1);

TR1=0;

time=TH1256+TL1; //读取脉宽长度

TH1=0;

TL1=0;

s=(time17)/100; //算出来是厘米

if(s<30)

P1=0xfe;

else

P1=0xff;

}

void main()

{

TMOD=0x10;//定时器1模式1

TR1=0;

tr=0;

re=0;

while(1)

{

getdistance1();

}

}

inline void rob_control(std::vector<cv::Point> &_contour){

ros::Rate loopRate(10);

int rcount=0;

int lcount=0;

int r_state = 0;

int l_state = 0;

int in_cl = 8;//运动状态改变的阈值

for(unsigned i=0;i<_contoursize();i++)

{

cv::Point p=_contour[i];

PointT pointx=down_cloud->at(pxdownScale,pydownScale);

//todo 安全距离和宽度设定

if(pointxx<03&&pointxx>-025&&pointxz<12)

{

if(pointxx>0)

{

rcount++;

}

else if(pointxx<0)

{

lcount++;

}

pre_imageViewer->addCircle( pxdownScale,pydownScale, 3, 1, 02,01, "contour", 1);

continue;

}

pre_imageViewer->addCircle( pxdownScale,pydownScale, 1, 0, 1,1, "contour", 1);

}

while (ros::ok()){

if(lcount>in_cl&&rcount==0)

{

//turn right

if(l_state == 0)

{

tr();

r_state = 1;

l_state = 0;

std::cout<<"当前路面进行右转。"<<endl;

}

else

{

tl();

l_state = 1;

r_state = 0;

std::cout<<"当前路面进行左转。"<<endl;

}

}

else if(lcount==0&&rcount>in_cl)

{

//turn left

if(r_state == 0)

{

tl();

r_state = 0;

l_state = 1;

}

else

{

tr();

r_state = 1;

l_state = 0;

}

}

else if(lcount>in_cl&&rcount>in_cl)

{

//stop

std::cout<<"复杂情况 : 多个障碍物"<<endl;

st();

tr();

r_state = 1;

l_state = 0;

}

else

{

gs();

l_state= 0;

r_state = 0;

}

}

}

以上就是关于求单片机高手编一小段AVR程序(用C语言,AVR studio里运行),超声波避障。全部的内容,包括:求单片机高手编一小段AVR程序(用C语言,AVR studio里运行),超声波避障。、vjc1.5画一个红外避障的流程图,可有偿、哪位大神能帮我看一下这个单片机at89s52寻迹避障小车程序有没有错误等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10217681.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存