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

上传人:b****7 文档编号:15443461 上传时间:2023-07-04 格式:DOCX 页数:9 大小:16.35KB
下载 相关 举报
独立按键控制步进电机运转C语言程序.docx_第1页
第1页 / 共9页
独立按键控制步进电机运转C语言程序.docx_第2页
第2页 / 共9页
独立按键控制步进电机运转C语言程序.docx_第3页
第3页 / 共9页
独立按键控制步进电机运转C语言程序.docx_第4页
第4页 / 共9页
独立按键控制步进电机运转C语言程序.docx_第5页
第5页 / 共9页
独立按键控制步进电机运转C语言程序.docx_第6页
第6页 / 共9页
独立按键控制步进电机运转C语言程序.docx_第7页
第7页 / 共9页
独立按键控制步进电机运转C语言程序.docx_第8页
第8页 / 共9页
独立按键控制步进电机运转C语言程序.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

《独立按键控制步进电机运转C语言程序.docx》由会员分享,可在线阅读,更多相关《独立按键控制步进电机运转C语言程序.docx(9页珍藏版)》请在冰点文库上搜索。

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

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

/*

*名称:

步进电机*

*晶振:

12MHZ*

*修改:

无*

*内容:

主程序中用3个按键,加速、减速、启动和停止。

定时器做数码*

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

**

*硬件事项:

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

**

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

#include

51.H>

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

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

sbitLATCH2=P2^1;//位锁存

sbitS17=P3^3;//独立按键

sbitS18=P3^2;

sbitS19=P3^1;

sbitS20=P3^0;

unsignedcharcodeHEYAO_DuanMa[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//显示段码值89

unsignedcharcodeHEYAO_WeiMa[]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};

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

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

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

sbitB1=P2^6;

sbitC1=P2^5;

sbitD1=P2^4;

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

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

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

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

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

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

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

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

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

unsignedcharSpeed;

bitStopFlag;

bitFlag,sb;

voidDisplay(unsignedcharFirstBit,unsignedcharNum);

voidInit_Timer0(void);

unsignedcharKeyScan(void);//键盘扫描

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

uS延时函数,含有输入参数unsignedchart,无返回值

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

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

xx如下T=tx2+5uS

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

voidDelayUs2x(unsignedchart){while(--t);}voidDelayMs(unsignedchart){while(t--){//大致延时1mS

DelayUs2x

(245);

DelayUs2x

(245);}}

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

主函数

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

main(){unsignedintj,i;//旋转一周时间

unsignedcharnum;

Init_Timer0();

while

(1)//正向

{Coil_OFF

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

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

Speed++;}elseif(num==2)//第二个按键,速度等级减小{if(Speed>1)

Speed--;}elseif(num==3)//第三个按键,电机停止和启动{switch(j)

{case0:

Coil_OFF

StopFlag=1;j++;break;

case1:

StopFlag=0;j--;break;}}

elseif(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,则=668%10=8

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

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

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

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

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

从第三个数码管开始显示

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

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

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

voidDisplay(unsignedcharFirstBit,unsignedcharNum){staticunsignedchari=0;

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

LATCH1=1;//xx

LATCH1=0;

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

LATCH2=1;//位锁存

LATCH2=0;

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

LATCH1=1;//xx

LATCH1=0;

i++;

if(i==Num)

i=0;}

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

定时器初始化子程序

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

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

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

//TL0=0x00;

EA=1;//总xx打开

ET0=1;//定时器xx打开

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

PT0=1;//优先级打开}/*------------------------------------------------

定时器xx子程序

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

voidTimer0_isr(void)interrupt1{staticunsignedchartimes,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){case0:

Coil_A1;i++;break;

case1:

Coil_B1;i++;break;

case2:

Coil_C1;i++;break;

case3:

Coil_D1;i++;break;

case4:

i=0;break;

default:

break;}}

times++;}}

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

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

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

unsignedcharKeyScan(void){if(!

S20)//如果检测到低电平,说明按键按下{DelayMs

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

if(!

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

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

return1;}}

if(!

S19)//如果检测到低电平,说明按键按下{DelayMs

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

if(!

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

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

return2;}}

if(!

S18)//如果检测到低电平,说明按键按下{DelayMs

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

if(!

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

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

return3;}}

if(!

S17)//如果检测到低电平,说明按键按下{DelayMs

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

if(!

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

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

return4;}}

return0;}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 畜牧兽医

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2