1. 用c语言程序实现步进电机的正反转加减速的编程
内容:1、本程序用于测试4相步进电机常规驱动
2、需要用跳帽或者杜邦线把信号输出端和对应的步进电机信号输入端连接起来
3、速度不可以调节的过快,不然就没有力矩转动了
4、按s4(设置成独立按键模式)可以控制正反转
------------------------------------------------*/
#include <reg52.h>
bit Flag;//定义正反转标志位
unsigned char code F_Rotation[4]={0xf1,0xf2,0xf4,0xf8}; //正转表格
unsigned char code B_Rotation[4]={0xf8,0xf4,0xf2,0xf1}; //反转表格
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void Delay(unsigned int i)//延时
{
while(--i);
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
main()
{
unsigned char i;
EX1=1; //外部中断0开
IT1=1; //边沿触发
EA=1; //全局中断开
while(!Flag)
{
P0=0x71;//显示 F 标示正转
for(i=0;i<4;i++) //4相
{
P1=F_Rotation[i]; //输出对应的相 可以自行换成反转表格
Delay(500); //改变这个参数可以调整电机转速 ,数字越小,转速越大
}
}
while(Flag)
{
P0=0x7C;//显示 b 标示反转
for(i=0;i<4;i++) //4相
{
P1=B_Rotation[i]; //输出对应的相
Delay(500); //改变这个参数可以调整电机转速 ,数字越小,转速越大
}
}
}
/******************************************************************/
/* 中断入口函数 */
/******************************************************************/
void ISR_Key(void) interrupt 2 using 1
{
Delay(300);
Flag=!Flag; //s3按下触发一次,标志位取反
}
2. C51 C语言怎么实现42步进电机加速、减速控制
42步进电机是一个两相电机,一般控制可以分为全步或半步控制,全步控制,每一切换相序,步进电机走1.8度,半步控制则走0.9度。
全步控制相序分配为:A,/A,B,/B
半步控制相序分配为:A,AB,B,B/A,/A,/A/B,/B,/BA
加速的话,就使相序切换快一点就可以;当然减速就是相序切换慢点就行。举例如下:
#include<reg51.h>
#define uchar unsigned char
uchar stepd[]={0x01,0x03,0x02,0x06,0x04,0xc0,0x08,0x09};
uchar num=0,fx=0;
sbit keyup=P3^0;
sbit keydn=P3^1;
sbit keyfx=P3^2;
int speed=10000;
void t0isr() interrupt 1
{
TH0=(65536-speed)/256;
TL0=(65536-speed)%256;
P2=stepd[num];
if(fx==0){num++;num%=8;}
if(fx==1)
{
if(num==0)num=7;
else num--;
}
}
main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(keyup==0)
{
while(key1==0);
speed-=10;
}
if(keydn==0)
{
while(keydn==0);
speed+=10;
}
if(key3==0)
{
while(key3==0);
fx=~fx;
}
}
}
3. 51单片机步进电机加减速的c语言 。求答案
#include "reg52.h"
void delay(unsigned int t);
//Motor
sbit F1 = P1^0;
sbit F2 = P1^1;
sbit F3 = P1^2;
sbit F4 = P1^3;
unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反转
unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //正转
unsigned int K;
/**********************************************************************
* *
* 步进电机驱动 *
* *
***********************************************************************/
void motor_ffw()
{
unsigned char i;
unsigned int j;
for (j=0; j<12; j++) //转1*n圈
{
for (i=0; i<8; i++) //一个周期转30度
{
if(K==1) P1 = FFW[i]&0x1f; //取数据
if(K==2) P1 = FFZ[i]&0x1f;
delay(15); //调节转速
}
}
}
/******************************************************
*
* 延时程序
*
********************************************************/
void delay(unsigned int t)
{
unsigned int k;
while(t--)
{
for(k=0; k<100; k++)
{ }
}
}
main()
{
while(1)
{
K=1;
motor_ffw();
K=2;
motor_ffw();
}
}
给你个例子,这是正反转的可以用这个修改出加减速程序
求采纳为满意回答。
4. C语言 指针问题
使用的指针函数
考虑到题中说的是小朋友学习100以内正整数的简单运算
所以考虑到了被减数 大于 减速 ,除数不为0,整除的情况
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<conio.h>
charexpression[10];
char*p=expression;
intresult;
char*GetRandomExpression();
intmain()
{
char*p1;
inti,count=1;
charch;
printf("请输入下列算式的结果: ");
while(1)
{
p1=GetRandomExpression();
printf("第%d题:%s",count,p1);
scanf("%d",&i);
if(i==result)
printf("恭喜!您答对了 ");
else
printf("抱歉!您答错了 ");
printf("是否继续?(按Y继续,其他任意键结束):");
ch=getch();
if(ch=='Y'||ch=='y')
{
printf("您选择了继续 ");
count++;
}
else
{
printf("您选择了退出 ");
break;
}
}
}
char*GetRandomExpression()
{
intnum1,num2,index;
charop[]="-+*/";
srand(time(NULL));
num1=rand()%100+1;
num2=rand()%100+1;
if(num1<num2)
index=rand()%3+1;//保证被减数大于减速
else
index=rand()%4;
switch(index)
{
case0:
result=num1-num2;
break;
case1:
result=num1+num2;
break;
case2:
result=num1*num2;
break;
case3:
while(num2==0||num1>100||num1%num2!=0)//保证除数不为0,且可以整除
{
result=rand()%100+1;
num2=rand()%100+1;
num1=num2*result;
}
break;
}
sprintf(expression,"%d%c%d=",num1,op[index],num2);
returnp;
}
5. surf算法C语言编写,要做嵌入式开发,不要C++和基于OPENCV的
surf借鉴了sift中简化近似的思想,将DOH中的高斯二阶微分模板进行了近似简化,使得模板对图像的滤波只需要进行几个简单的加减法运算,并且,这种运算与滤波模板的尺寸有关。实验证明surf算法较sift算法在运算速度上要快3倍左右。
1积分图像
surf算法中要用到积分图像的概念。借助积分图像,图像与高斯二阶微分模板的滤波转化为对积分图像的加减运算。积分图像(IntegralImage)的概念是由viola和Jones提出来的,而将类似积分图像用于盒子滤波是由Simard等人提出。
积分图像中任意一点(i,j)的值为ii(i,j)为原图像左上角到任意点(i,j)相应的对角线区域灰度值的总和即:
公式中,I(x`,y`)表示原图像中点(i`,j`)的灰度值,ii(x,y)可以由下面两公式迭代计算得到:
公式中,S(x,y)表示一列的积分,且S(i,-1)=0,ii(-1,j)=0.求积分图像,只需对原图像的所有像素素进行一遍扫描。下面的代码为c++语言的实现
pOutImage[0][0]=pInImage[0][0];
for(intx=1,x<nWidth;i++)
{
pOutImage[x][0]=pInImage[x-1][0]+pInImage[x][0];
}
for(inty=1;y<nHeight;y++)
{
intnSum=0;
for(intx=0;x<nWidth;x++)
{
nSum=pInImage[x][y];
pOutImage[x][y]=pInImage[x][y-1]+nSum;
}
}
如图表示,在求取窗口w内的像元灰度和时,不管窗口W的大小如何,均可利用积分图像的4个对应点(i1,j1)(i2,j2)(i3,j3)(i4,j4)的值计算的到。也就是说,求取窗口W内的像元灰度和与窗口的尺寸是无关的。窗口W内的像元的灰度和为
Sum(W)=ii(i4,j4)-ii(i2,j2)-ii(i3,j3)+ii(i1,j1)
下面看以截图,相信都可以看懂
关于矩形区域内像素点的求和应该是一种简单重复性运算,采用这种思路总体上提高了效率。为什么这么说呢?假设一幅图片共有n个像素点,则计算n个位置的积分图总共的加法运算有n-1次(注意:可不是次哦,要充分利用递推思想),将这些结果保存在一个跟原图对应的矩阵M中。当需要计算图像中某个矩形区域内的所有像素之和是直接像查表一样,调出A,B,C,D四点的积分图值,简单的加减法(注意只需要三次哦)即可得到结果。反之,如果采用naive的方式直接在原图像中的某个矩形区域内求和,你想想,总共可能的矩形组合有多少?!!且对于一幅图像n那是相当大啊,所以2^n
那可是天文数字,而且这里面绝大部分的矩形有重叠,重叠意味着什么?在算求和的时候有重复性的工作,其实我们是可以有效的利用已经计算过的信息的。这就是积分图法的内在思想:它实际上是先计算n个互不重叠(专业点说是不相交)的矩形区域内的像素点求和,充分利用这些值(已有值)计算未知值,有点类似递推的味道...这就完全避免了重复求和运算。
这样就可以进行2种运算:
(1)任意矩形区域内像素积分。由图像的积分图可方便快速地计算图像中任意矩形内所有像素灰度积分。如下图2.3所示,点1的积分图像ii1的值为(其中Sum为求和):
ii1=Sum(A)
同理,点2、点3、点4的积分图像分别为:
ii2=Sum(A)+Sum(B);ii3=Sum(A)+Sum(C);ii4=Sum(A)+Sum(B)+Sum(C)+Sum(D);
矩形区域D内的所有像素灰度积分可由矩形端点的积分图像值得到:
Sum(D)=ii1+ii4-(ii2+ii3)(1)
(2)特征值计算
矩形特征的特征值是两个不同的矩形区域像素和之差,由(1)式可以计算任意矩形特征的特征值,下面以图2.1中特征原型A为例说明特征值的计算。
如图2.4所示,该特征原型的特征值定义为:
Sum(A)-Sum(B)
根据(1)式则有:Sum(A)=ii4+ii1-(ii2+ii3);Sum(B)=ii6+ii3-(ii4+ii5);
所以此类特征原型的特征值为:
(ii4-ii3)-(ii2-ii1)+(ii4-ii3)-(ii6-ii5)
另示:运用积分图可以快速计算给定的矩形之所有象素值之和Sum(r)。假设r=(x,y,w,h),那么此矩形内部所有元素之和等价于下面积分图中下面这个式子:
Sum(r)=ii(x+w,y+h)+ii(x-1,y-1)-ii(x+w,y-1)-ii(x-1,y+h)
由此可见,矩形特征特征值计算只与此特征端点的积分图有关,而与图像坐标值无关。对于同一类型的矩形特征,不管特征的尺度和位置如何,特征值的计算所耗费的时间都是常量,而且都只是简单的加减运算。其它类型的特征值计算方法类似。
6. 没有匀速怎么计算加减速时间
可以,不过要看你求什么平均速度。先以匀变速直线运动为例,加速度匀速改变a=k*t(k为常数),此时速度-时间曲线为二次曲线v=a*t=k*t^2,曲线和t轴所围的面积就是位移大小。此时有两个平均速度,一个为中间时刻的速度,叫做物体速度的算术平均数,另一个为中间位移速度,此时刻左右两个面积相等。称为该速度的几何平均数。第一种速度简单易求,不多说。
第二种用解微分方程:(高三掌握导数后可以对其验证)
s=f(v)dt;(注:f(v)dt表示速度v对时间t的积分)
可以得到s=k*t^3/3+C(C为任意常数,如果初始位移为0,C等于0)
比如时间是3秒,那么总位移为9k,一半位移为9/2(k),求得t=3/2^(1/3),此时速度为v=k*9/2^(2/3)。
注:上面这个方法为通解方法,对于其他更一般的运动也同样适用。
7. 一个关于单片机控制步进电机的C语言程序 想请高人帮我把每一步都注释出来
C语言程序源代码
#include <REGX51.H> // 51寄存器定义
#include "intrins.h"
#define control P1 //P1_0:A相,P1_1:B相,P1_2:C相,P1_3:D相
#define discode P0 //显示代码控制端口
#define uchar unsigned char //定义无符号型变量
#define uint unsigned int
sbit en_dm=P3^0; //显示代码锁存控制
sbit en_wk=P3^1; //位控锁存控制
uchar code corotation[4]= {0x03,0x06,0x0c,0x09};//电机正转
uchar code rollback[4]={0x0c,0x06,0x03,0x09}; //电机反转
uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示字段
uint code Levspeed[5]={500,400,300,200,100};//电机速度等级
uchar Hscan,speedcount;//Hscan行扫描,speedcount 速度等级计数
uint uu; //频率计数
uint step,setstep; //step:电机步伐计数,setstep:手动设置电机步伐
uint speed=500; //电机初始速度
uchar count;
uchar flag[5];
uchar butcount; //按键次数
//****************************************
//flag[0] 正转标志
//flag[1] 反转标志
//flag[2] 加速标志
//flag[3] 减速标志
//flag[4] 设置标志
//****************************************
Delay1mS(unsigned int tt) //延时1ms “Delay1mS”延时子程序,用循环语句延时。
{
unsigned char i;
while(tt--)
for(i=113;i>0;i--);
}
keyscan() //键盘扫描 “keyscan”键盘扫描子程序,用于寻找是否有按键按下。
{
P2=0xf0; //把oxfe赋值给P2口 //将按键控制口置于未按键的状态.单片机输出//口假设不是按键按下状态.
if(P2!=0xf0) //如果P2口的值不等于0xfe //检查是否有按键按下.如果有,处理{}内的事
{ //有按键按下.
Delay1mS(150);//调用延时函数//有按键按下,避开无效读码值的时间.,或者是脉冲长度
Hscan=0xfe; //将Hscan赋值,初始遥控值是要置高电平的.
P2=Hscan; //
while((Hscan&0x10)!=0) //检查X10口是否有键按下。未按下是1,
//在这显示出你的按键口是P2_4.即检查P2_4是高电平,无//键按下,低电平有键按下。
{
P2=Hscan;
if((P2&0xf0)!=0xf0) //检查按键脉冲是否是变化,
return P2;
else Hscan=(Hscan<<1)|0x01; //这里在存码值,应该是遥控输入。将码值存入Hscan
//这里是读取码值的关键,如果来的脉冲不管是高电平//还是低电平,靠左移一位保存脉冲的状态值.
}
}
else return 0;
}
key_val() //按键处理函数 //这里是读取将存好的码值进行处理.看是什么代码值
{
uchar key;
key= keyscan(); //这里是读取码值并存放在key里
switch(key) //这里是对比读取的码值
{
case 0xee: //按键‘7’ //读取的码值=0xEE,则是按键“7”的代码
//while(P2==0xee);
setstep=setstep*10+7; //步伐数 //这里是输入”setstep +7” 步伐数对比读取的码值, //setstep原来可能是有数字的。
step=setstep;
butcount++; //计数,看输入拉几个数字
if(butcount>=5) //输入的数字超过5个就置0,无效
{
butcount=0;
setstep=0;
}
break;
case 0xde: //按键‘8’ //读取的码值=0xdE,则是按键“8”的代码
//其他同”7”
//while(P2==0xde);
setstep=setstep*10+8;
butcount++;
step=setstep;
if(butcount>=5)
{
butcount=0;
setstep=0;
}
break;
case 0xbe: //按键‘9’ //同上”7”
//while(P2==0xbe);
setstep=setstep*10+9;
butcount++;
step=setstep;
if(butcount>=5)
{
butcount=0;
setstep=0;
}
break;
case 0x7e: //按键‘正转 //正转按键识别
while(P2==0x7e); //等待按键松开//一值按住电机是不转的,放开后才转.有检查//P2口的状态值
flag[0]=0xff; //开启正转标志,关闭反转//置正转标志.
flag[1]=0x00; //清除反转标志.
butcount=0;
speedcount=0;
speed=500; //置电机的转速.
if(!flag[4]) step=0;
TR0=1;
break;
case 0xed: //按键‘4’ //同上”7”
while(P2==0xed);
setstep=setstep*10+4;
butcount++;
step=setstep;
if(butcount>=5)
{
butcount=0;
setstep=0;
}
break;
case 0xdd: //按键‘5’ //同上”7”
//while(P2==0xdd);
setstep=setstep*10+5;
step=setstep;
butcount++;
if(butcount>=5)
{
butcount=0;
setstep=0;
}
break;
8. 求解释,一段c语言程序!出现死循环了!
只要指定条件为 true 都执行语句块。
for (initialization; test; increment)
statements 参数
initialization 必选项。一个表达式。该表达式只在执行循环前被执行一次。
test 必选项。一个 Boolean 表达式。如果 test 是 true,则 statement 被执行。如果 test 是 false,则循环结束。
increment 可选项。一个表达式。在每次经过循环的最后执行该递增表达式。 statements 可选项。test 是 true 时,要执行的一个或多个语句。可以是复合语句。
说明 循环要执行确定的次数,通常使用 for 循环。注意,for循环要求必须知道循环次数,楼主的程序中for(;;)并不知道循环次数,也没有给出循环结束的条件,所以,要作出相应的修改才可以哦。
9. plc能通过编程实现S型加减速曲线吗
可以,用伺服电机没问题,前提是成本高,而且伺服电机的功率可以满足要求。普通电机由于惯性太大,要做到完全曲线不太容易。