正反转加减速步进电机(调好)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*晶振:12M T1计时250微秒溢出中断一次;P1.01.1为增加,减少键,P3.0输出方波hz_shu 设定的频率数

T1_over_num: 根据设定频率计算后,定时器溢出的出次数值

T1_cnt; 定时器计数溢出数

sec_over_num; 一秒内的计数

second :连续按键的计时

state_val 连续按下的标志0=按键已经弹起;1=按键一直按下

led_seg_code 数码管7段码

**************************************************************/

#include "reg51.h"

#include"math.h"

sbit pulse_out=P2^0; //方波输出口

sbit zf=P2^1; //方向输出

sbit jiasu=P2^2; //按下加速

sbit jiansu=P2^3; //按下减速

sbit fangxiang=P2^4; //改变方向键

//--------------------

unsigned char data hz_shu,second,key_val,key_val_old;

unsigned int data sec_over_num;

unsigned int data T1_cnt,T1_over_num;

unsigned char data state_val;

#define uchar unsigned char

#define uint unsigned int

//char code led_seg_code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//------------------------

void delay(unsigned int i)

{

while(--i);}

unsigned char scan_key()

{

unsigned char i,k;

if(jiansu&&jiasu==1)

{ // i=P1;

k=255; // if(i==0xff) 没有按下时i=P1=1

} // {

else // k=255; //无键按下

{ // } delay(10); // else //有键按下

if(jiansu&&jiasu==1) // {

{k=255;} // delay(10);

else if(jiansu==0) // if(i!=P1) //i不等于P1=0xff

{k=1;} //

{k=255;}

else if(jiasu==0) // else

{k=0;} // {switch(i)

// {

//

case 0xfe: k=0; break;

} //

case 0xfd: k=1; break;

// }

// }

// } return k;

}

/* void led_show()

{

unsigned char i;

i=hz_shu%10; //显示个位

P0=led_seg_code[i];

P2=0xfe;

delay(10);

i=hz_shu%100/10; //显示十位

P0=led_seg_code[i];

P2=0xfd;

delay(10);

i=hz_shu%1000/100; //显示百位

P0=led_seg_code[i];

P2=0xfb;

delay(10);

} */

//-------------------------------

unsigned int get_T1_over_num(unsigned char P) //P为频率数

{

unsigned int *k,h;

double f;

f=(double)P; //转化为浮点数

f=0.5/f; //半个周期的时间

f=f/0.00025; //中断溢出数=f/0.00025;

h=f; //取整

//四舍去五入

if(modf(f,k)>=0.5)

{ h=h+1;

}

return h;

}

/*c51库文件main.h,里面有个函数

如下定义:extern float modf(float x,float *ip);

调用它以后,整数部分被放入*ip,小数部分作为返回值

**************************************************/

void timer1() interrupt 3 //T1中断

{ T1_cnt++;

if(T1_cnt>T1_over_num) //半周期的计数到达

{

T1_cnt=0;

pulse_out=!pulse_out; //反复取反,产生方波

}

if(state_val==1) //连续按键

{ if(sec_over_num<4000) //计时未到1S

{sec_over_num++;}

else //计时到1s,执行else的代码

{ sec_over_num=0 ;

if(second<2) //当超过2秒,second一直为2,直到松开按键

{second++;} //连续按下键少于2秒时,second继续增1.

else //连续按下键2秒,以10次/秒的速度连续增加

{TR1=0;

switch(key_val)

{

case 0: if(hz_shu<190)

{ hz_shu=hz_shu+10;} //增10HZ/秒

else

{ hz_shu=200;}

T1_over_num=get_T1_over_num(hz_shu);

break;

case 1: if(hz_shu>10)

相关文档
最新文档