c语言按键控制的步进电机程序,独立按键控制步进电机运转c语言程序

独立按键控制步进电机运转c语言程序

/* * 名称:步进电机 * * 晶振:12MHZ * * 修改:无 * * 内容: 主程序中用 3 个按键,加速、减速、启动和停止。定时器做数码* * 管动态扫描和步进电机驱动。* * * 硬件事项:J19 的 7B,6B,5B,4B 依次用杜邦线连接到 P27,P26,P25,P24 * * * -*/ #include #define DataPort P1 / 定义数据端口 程序中遇到 DataPort 则用 P1 替换 sbit LATCH1=P20;/ 定义锁存使能端口 段锁存 sbit LATCH2=P21;/ 位锁存 sbit S17=P33; /独立按键 sbit S18=P32; sbit S19=P31; sbit S20=P30; unsigned char code HEYAO_DuanMa10=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 TempData8=0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF; / 存储显示值 的全局变量 sbit A1=P27; /定义步进电机连接端口 sbit B1=P26; sbit C1=P25; sbit D1=P24; #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 是定义无符号字符变量,其值的范围是0255 这里使用晶振 12M,大致延时长度如下 T=tx2+5 uS -*/ void DelayUs2x(unsigned char t) while(-t); void DelayMs(unsigned char t) while(t-)/大致延时 1mSDelayUs2x(245);DelayUs2x(245); /*-主函数 -*/ main() unsigned int j,i;/旋转一周时间unsigned char num;Init_Timer0();while(1) /正向 Coil_OFF num=KeyScan(); /循环调用按键扫描if(num=1)/第一个按键,速度等级增加if(Speed1)Speed-;else if(num=3)/第三个按键,电机停止和启动 switch(j)case 0:Coil_OFFStopFlag=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_BC1DelayMs(Speed);Coil_C1 DelayMs(Speed);Coil_CD1 DelayMs(Speed);Coil_D1 DelayMs(Speed);Coil_DA1DelayMs(Speed);num=KeyScan();if(num=3)/第三个按键,电机停止和启动 Flag=0; sb=0; Coil_OFFi=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_CD1DelayMs(Speed);Coil_C1 DelayMs(Speed);Coil_BC1DelayMs(Speed);Coil_B1 DelayMs(Speed);Coil_AB1DelayMs(Speed); num=KeyScan();if(num=3)/第三个按键,电机停止和启动 Flag=0; sb=0; TempData0=HEYAO_DuanMaSpeed/10;TempData1=HEYAO_DuanMaSpeed%10;/分解显示信息,如要显示 68,则 68/10=6 68%10=8 TempData0=HEYAO_DuanMaSpeed/10;TempData1=HEYAO_DuanMaSpeed%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_WeiMai+FirstBit; /取位码 LATCH2=1; / 位锁存LATCH2=0;DataPort=TempDatai; /取显示数据,段码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; /重新赋值 1msTL0=(65536-1000)%256;TR0=0; TR0=1;Display(0,8);if(!StopFlag)if(times=(20-Speed)/最大值 18,所以最小间隔值 20-18=2times=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-20msif(!S20) / 再次确认按键是否按下,没有按下则退出while(!S20);/如果确认按下按键等待按键释放,没有释放则一直等待return 1; if(!S19) /如果检测到低电平,说明按键按下DelayMs(10); /延时去抖,一般 10-20msif(!S19) / 再次确认按键是否按下,没有按下则退出while(!S19);/如果确认按下按键等待按键释放,没有释放则一直等待return 2; if(!S18) /如果检测到低电平,说明按键按下DelayMs(10); /延时去抖,一般 10-20msif(!S18) / 再次确认按键是否按下,没有按下则退出while(!S18);/如果确认按下按键等待按键释放,没有释放则一直等待return 3; if(!S17) / 如果检测到低电平,说明按键按下DelayMs(10); /延时去抖,一般 10-20msif(!S17) / 再次确认按键是否按下,没有按下则退出 while(!S17);/如果确认按下按键等待按键释放,没有释放则一直等待return 4; return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值