这本质上就是测周期,你完全可以借鉴移植频率测量程序(低频测量)。
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寻迹避障小车程序有没有错误等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)