糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > 按键控制步进电机转速(led闪烁)学习心得

按键控制步进电机转速(led闪烁)学习心得

时间:2022-07-05 23:47:41

相关推荐

按键控制步进电机转速(led闪烁)学习心得

面对一个任务时的分工能力

比如这个任务,由三块组成,步进电机,按键,led,根据难易程度或复杂程度,我的首要任务是先把步进电机搞懂,包括他的原理,工作方式,输入/输出逻辑表,在心中大体确定使用什么方法编程;接着就把按键也加入其中,要考虑两者之间的控制、联动等等;最后把led加入其中,将三者整合在一起。

处理问题的能力

前两步一直都挺顺利的,但是加入led闪烁这个条件时,就遇到了一些困难,比方说,必须要使用定时器中断了,因为电机转速控制和led闪烁控制都使用延迟函数的话,会导致一些问题(因为延迟函数本质上,是执行到这一步时,整个系统都处在待命状态,这样会导致此时电机与led灯都停止工作,就会造成两者同步运行的现象);再比如,在使用定时器中断时,由于电机转速和闪烁频率是变量,这就需要进行一些处理TH0=ledfrequency/256; TL0=ledfrequency%256;在按键编程时,忽略了按完之后要讲两个键都复位,导致出现一些意外的混乱

程序

一直以来我都对编程都心存恐惧,学习的时候都只是处在看懂的阶段,从来没有真正使用过,正好借这次机会,战胜我心里的恐惧

还有就是感觉,将知识融入到真正的项目中,也就是实践,真的能学到很多很多东西,光看是学不到真正的知识的。

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16; //对数据类型进行声明定义typedef unsigned char u8;sbit MOTOA = P1^0;sbit MOTOB = P1^1;sbit MOTOC = P1^2;sbit MOTOD = P1^3; sbit K1=P3^0; //高速sbit K2=P3^1; //低速sbit led=P0^0;int motorspeed=400;int ledfrequency=60535; //10ms#define GPIO_MOTOR P1void delay(u16 i){while(i--);}void Timer0InitLED(){TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。TH0=ledfrequency/256;TL0=ledfrequency%256;ET0=1;//打开定时器0中断允许EA=1;//打开总中断TR0=1;//打开定时器 }void Timer0() interrupt 1{static u16 i=0;TH0=ledfrequency/256;TL0=ledfrequency%256;i++;if(i==100){i=0;led=~led;}}void keypros(){if(K1==0) //检测按键K1是否按下{delay(1000); while(!K1); //检测按键是否松开}if(K2==0) //检测按键K2是否按下{delay(1000); while(!K2); //检测按键是否松开}}void main(){P1=0X00; //因为P1^0有上拉电阻所以需要先调低while(1){keypros();Timer0InitLED();MOTOA = 1; MOTOB = 0;MOTOC = 1;MOTOD = 1;delay(motorspeed);MOTOA = 1;MOTOB = 1; MOTOC = 1;MOTOD = 0;delay(motorspeed);MOTOA = 0;MOTOB = 1;MOTOC = 1;MOTOD = 1;delay(motorspeed);MOTOA = 1;MOTOB = 1;MOTOC = 0;MOTOD = 1;delay(motorspeed); if(K1==0){K2=1;K1=1;ledfrequency-=63535; motorspeed-=100; }if(K2==0){K1=1;K2=1;ledfrequency+=63535;motorspeed+=100;}}}

如果觉得《按键控制步进电机转速(led闪烁)学习心得》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。