正反转加减速步进电机(调好)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)