|
51單片機使用ULN2003A芯片驅(qū)動步進電機程序加Proteus仿真。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
TIM截圖20180707150244.png (25.84 KB, 下載次數(shù): 64)
下載附件
2018-7-7 15:02 上傳
0.png (46.5 KB, 下載次數(shù): 55)
下載附件
2018-7-8 01:58 上傳
單片機源程序如下:
- #include<reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit KEY1=P1^0;
- sbit KEY2=P1^1;
- sbit KEY3=P1^2;
- sbit KEY4=P1^3;
- sbit KEY5=P1^4;
- sbit KEY6=P1^5;
- sbit KEY7=P1^6;
- uchar code motor_1[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09,
- 0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; //第一象限
- uchar code motor_2[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09,
- 0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; //第二象限
- uchar code motor_3[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09,
- 0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90}; //第三象限
- uchar code motor_4[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09,
- 0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90};
- uchar code shuma[]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //第四象限
- uchar bushu[50]; //路徑存儲
- int F,Xe=0,Ye=0,J,Xm=0,Ym=0,dat=0,xiangxian=0;
- uint key_flag=0,key_change=0,chabu_flag=0,motor_flag=1,start_flag=0;
- void keyscan(void); //獲取按鍵
- void chabu(void); //插補計算
- void start(void); //步進電機執(zhí)行與數(shù)碼管顯示
- void main(void)
- {
- EA = 1; /*************************************/
- ET0 = 1;
- TMOD = 0x01; //定時器初始化//
- TH0= (65536-1000) / 256;
- TL0= (65536-1000)%256; /*************************************/
- TR0 = 1;
- while(1)
- {
- keyscan(); //按鍵計數(shù)獲取
- chabu(); //插補計算,生成步數(shù)軌跡
- start(); //電機按照軌跡運行
- }
- }
- void keyscan(void)
- {
- static uint key_up=1;
- if(key_up&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0||KEY5==0||KEY6==0||KEY7==0))
- {
- key_up=0; // 不支持連按。
- if(key_change==1) //消抖,等待10ms
- {
- if(KEY1==0) Xe++;
- if(KEY2==0) Ye++;
- if(KEY3==0) {key_flag=1;xiangxian=1;}
- if(KEY4==0) {key_flag=1;xiangxian=2;}
- if(KEY5==0) {key_flag=1;xiangxian=3;}
- if(KEY6==0) {key_flag=1;xiangxian=4;}
- if(KEY7==0) {P0=0X99;}
- }
- }
- else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1&&KEY5==1&&KEY6==1)key_up=1;//按鍵松開
- }
- void chabu(void)
- {
- int i,a=0,b=0;
-
- if(key_flag==1)
- {
- J=Xe+Ye;
- for(i=0;i<J;i++)
- {
- F=((Ym*Xe)-(Xm*Ye)); //插補計算公式
- if(F==0||F>0) //如果F大于等于零往X方向走
- {
- a++;
- if(a==8)a=0;
- bushu[i]=(a-1);
- Xm++;
- }
- else //否則往Y方向走
- {
- b++;
- if(b==8)b=0;
- bushu[i]=(b+7);
- Ym++;
- }
- if(i==(J-1)) //判斷是否到達終點
- {
- chabu_flag=1;
- key_flag=0;
- start_flag=1;
- }
- }
-
- }
- }
- void start(void)
- {
-
- if(chabu_flag==1&&motor_flag==1&&start_flag==1&&xiangxian==1)//判斷是否為第一象限
- {
- motor_flag=0;
- P0=motor_1[bushu[dat]];
- if(bushu[dat]<8)
- {
- P2=shuma[bushu[dat]];
- }
- else
- {
- P3=shuma[(bushu[dat]-8)];
- }
- if(dat==(J-1))
- {
- Xe=0;Ye=0;Xm=0;Ym=0;dat=0; //初始化變量
- key_flag=0;key_change=0;chabu_flag=0;
- motor_flag=1;start_flag=0; //初始化標(biāo)志量
- }
- }
- if(chabu_flag==1&&motor_flag==1&&start_flag==1&&xiangxian==2)//判斷是否為第二象限
- {
- motor_flag=0;
- P0=motor_2[bushu[dat]];
- if(bushu[dat]<8)
- {
- P2=shuma[bushu[dat]];
- }
- else
- {
- P3=shuma[(bushu[dat]-8)];
- }
- if(dat==(J-1))
- {
- Xe=0;Ye=0;Xm=0;Ym=0;dat=0; //初始化變量
- key_flag=0;key_change=0;chabu_flag=0;
- motor_flag=1;start_flag=0; //初始化標(biāo)志量
- }
- }
- if(chabu_flag==1&&motor_flag==1&&start_flag==1&&xiangxian==3)//判斷是否為第三象限
- {
- motor_flag=0;
- P0=motor_3[bushu[dat]];
- if(bushu[dat]<8)
- {
- P2=shuma[bushu[dat]];
- }
- else
- {
- P3=shuma[(bushu[dat]-8)];
- }
- if(dat==(J-1))
- {
- Xe=0;Ye=0;Xm=0;Ym=0;dat=0; //初始化變量
- key_flag=0;key_change=0;chabu_flag=0;
- motor_flag=1;start_flag=0; //初始化標(biāo)志量
- }
- }
- if(chabu_flag==1&&motor_flag==1&&start_flag==1&&xiangxian==4) //判斷是否為第四象限
- {
- motor_flag=0;
- P0=motor_4[bushu[dat]];
- if(bushu[dat]<8)
- {
- P2=shuma[bushu[dat]];
- }
- else
- {
- P3=shuma[(bushu[dat]-8)];
- }
- if(dat==(J-1))
- {
- Xe=0;Ye=0;Xm=0;Ym=0;dat=0; //初始化變量
- key_flag=0;key_change=0;chabu_flag=0;
- motor_flag=1;start_flag=0; //初始化標(biāo)志量
- }
- }
- }
- void Timer0( ) interrupt 1
- {
- static uchar key_jishu=0,motor_jishu=0,motor_jishu_a=0;
- TR0 = 0;
- TH0= (65536-1000) / 256; //定時1ms
- TL0= (65536-1000)%256;
- key_jishu++;
- if(key_jishu==10&&key_change==0) //按鍵延時
- {
- key_change=1; //按鍵標(biāo)志量置1
- key_jishu=0; //計數(shù)清零
- }
- if(chabu_flag==1) //計數(shù)10ms的次數(shù),因為500太大
- {
- motor_jishu++;
- if(motor_jishu==10)
- {
- motor_jishu_a++;
- motor_jishu=0;
- }
- }
- if(motor_flag==0&&motor_jishu_a==50) //50ms計時
- {
- motor_flag=1; //電機標(biāo)志量置1
- dat++; //數(shù)組位置,電機步數(shù)
- motor_jishu_a=0; //計數(shù)值清零
- }
- TR0 = 1;
- }
復(fù)制代碼
所有資料51hei提供下載:
步進電機控制.rar
(63.11 KB, 下載次數(shù): 71)
2018-7-7 15:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|