独立按键中断方式c语言程序,独立按键控制步进电机运转C语言程序.doc

/*

* 名称:步进电机 *

* 晶振:12MHZ *

* 修改:无 *

* 内容:主程序中用 3个按键,加速、减速、启动和停止。定时器做数码*

* 管动态扫描和步进电机驱动。**

* 硬件事项:J19的7B,6B,5B,4B依次用杜邦线连接到P27,P26,P25,P24 *

* *

---------------------------------------------------------------*/

#include #define DataPort P1 //定义数据端口 程序中遇到DataPort 则用P1 替换

sbit LATCH1=P2^0;//定义锁存使能端口 段锁存

sbit LATCH2=P2^1;// 位锁存

sbit S17=P3^3;//独立按键

sbit S18=P3^2;

sbit S19=P3^1;

sbit S20=P3^0;

unsigned char code HEYAO_DuanMa[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

// 显示段码值0123456789

unsigned char code HEYAO_WeiMa[]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};

//分别对应相应的数码管点亮,即位码

unsigned char TempData[8]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF}; //存储显示值的全局变量

sbit A1=P2^7; //定义步进电机连接端口

sbit B1=P2^6;

sbit C1=P2^5;

sbit D1=P2^4;

#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电

#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电

#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电

#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电

#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电

#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电

#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电

#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电

#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电

unsigned char Speed;

bit StopFlag;

bit Flag,sb;

void Display(unsigned char FirstBit,unsigned char Num);

void Init_Timer0(void);

unsigned char KeyScan(void);//键盘扫描

/*------------------------------------------------

uS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,大致延时

长度如下 T=tx2+5 uS

------------------------------------------------*/

void DelayUs2x(unsigned char t)

{

while(--t);

}

void DelayMs(unsigned char t)

{

while(t--)

{

//大致延时1mS

DelayUs2x(245);

DelayUs2x(245);

}

}

/*------------------------------------------------

主函数

------------------------------------------------*/

main()

{

unsigned int j,i;//旋转一周时间

unsigned char num;

Init_Timer0();

while(1) //正向

{ Coil_OFF

num=KeyScan(); //循环调用按键扫描

if(num==1)//第一个按键,速度等级增加

{

if(Speed<18)

Speed++;

}

else if(num==2)//第二个按键,速度等级减小

{

if(Speed>1)

Speed--;

}

else if(num==3)//第三个按键,电机停止和启动

{

switch(j)

{case 0:

Coil_OFF

StopFlag=1;j++;break;

case 1: StopFlag=0;j--;break;

}

}

else if(num==4)

{ sb=1;

while((1)&&(sb))

{

Flag=1;

i=50;

while((i--)&&(Flag)) //正向

{

Coil_A1

DelayMs(Speed);

Coil_AB1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替

DelayMs(Speed); //改变这个参数可以调整电机转速 ,

//数字越小,转速越大,力矩越小

Coil_B1

DelayMs(Speed);

Coil_BC1

DelayMs(Speed);

Coil_C1

DelayMs(Speed);

Coil_CD1

DelayMs(Speed);

Coil_D1

DelayMs(Speed);

Coil_DA1

DelayMs(Speed);

num=KeyScan();

if(num==3)//第三个按键,电机停止和启动

{

Flag=0;sb=0;

}

}

Coil_OFF

i=50;

while((i--)&&(Flag))//反?

{ // num=KeyScan();

Coil_A1

DelayMs(Speed);

Coil_DA1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替

DelayMs(Speed); //改变这个参数可以调整电机转速 ,

//数字越小,转速越大,力矩越小

Coil_D1

DelayMs(Speed);

Coil_CD1

DelayMs(Speed);

Coil_C1

DelayMs(Speed);

Coil_BC1

DelayMs(Speed);

Coil_B1

DelayMs(Speed);

Coil_AB1

DelayMs(Speed);

num=KeyScan();

if(num==3)//第三个按键,电机停止和启动

{

Flag=0;sb=0;

}

}

TempData[0]=HEYAO_DuanMa[Speed/10];

TempData[1]=HEYAO_DuanMa[Speed%10];

}

}

//分解显示信息,如要显示68,则68/10=6 68%10=8

TempData[0]=HEYAO_DuanMa[Speed/10];

TempData[1]=HEYAO_DuanMa[Speed%10];

}

}

/*------------------------------------------------

显示函数,用于动态扫描数码管

输入参数 FirstBit 表示需要显示的第一位,如赋值2表示

从第三个数码管开始显示

如输入0表示从第一个显示。

Num表示需要显示的位数,如需要显示99两位数值则该值输入2

------------------------------------------------*/

void Display(unsigned char FirstBit,unsigned char Num)

{

static unsigned char i=0;

DataPort=0xff; //清空数据,防止有交替重影

LATCH1=1; //段锁存

LATCH1=0;

DataPort=HEYAO_WeiMa[i+FirstBit]; //取位码

LATCH2=1; //位锁存

LATCH2=0;

DataPort=TempData[i]; //取显示数据,段码

LATCH1=1; //段锁存

LATCH1=0;

i++;

if(i==Num)

i=0;

}

/*------------------------------------------------

定时器初始化子程序

------------------------------------------------*/

void Init_Timer0(void)

{

TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响

//TH0=0x00; //给定初值

//TL0=0x00;

EA=1; //总中断打开

ET0=1; //定时器中断打开

TR0=1; //定时器开关打开

PT0=1; //优先级打开

}

/*------------------------------------------------

定时器中断子程序

------------------------------------------------*/

void Timer0_isr(void) interrupt 1

{

static unsigned char times,i;

TH0=(65536-1000)/256; //重新赋值 1ms

TL0=(65536-1000)%256;

TR0=0;

TR0=1;

Display(0,8);

if(!StopFlag)

{

if(times==(20-Speed))//最大值18,所以最小间隔值20-18=2

{

times=0;

switch(i)

{

case 0:Coil_A1;i++;break;

case 1:Coil_B1;i++;break;

case 2:Coil_C1;i++;break;

case 3:Coil_D1;i++;break;

case 4:i=0;break;

default:break;

}

}

times++;

}

}

/*------------------------------------------------

按键扫描函数,返回扫描键值

------------------------------------------------*/

unsigned char KeyScan(void)

{

if(!S20) //如果检测到低电平,说明按键按下

{

DelayMs(10); //延时去抖,一般10-20ms

if(!S20) //再次确认按键是否按下,没有按下则退出

{

while(!S20);//如果确认按下按键等待按键释放,没有释放则一直等待

{

}

return 1;

}

}

if(!S19) //如果检测到低电平,说明按键按下

{

DelayMs(10); //延时去抖,一般10-20ms

if(!S19) //再次确认按键是否按下,没有按下则退出

{

while(!S19);//如果确认按下按键等待按键释放,没有释放则一直等待

{

}

return 2;

}

}

if(!S18) //如果检测到低电平,说明按键按下

{

DelayMs(10); //延时去抖,一般10-20ms

if(!S18) //再次确认按键是否按下,没有按下则退出

{

while(!S18);//如果确认按下按键等待按键释放,没有释放则一直等待

{

}

return 3;

}

}

if(!S17) //如果检测到低电平,说明按键按下

{

DelayMs(10); //延时去抖,一般10-20ms

if(!S17) //再次确认按键是否按下,没有按下则退出

{

while(!S17);//如果确认按下按键等待按键释放,没有释放则一直等待

{

}

return 4;

}

}

return 0;

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值