這里給大家分享一下常用的4線5相步進電機的單片機源程序和仿真,希望能對大家有所幫助
帶6個按鈕 加速 減速 順時針 逆時針 暫停 運行功能
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)lcd12864液晶顯示:
單片機源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit CS1=P1^6; /*片選1*/
- sbit CS2=P1^7; /*片選2*/
- sbit SEG_LE=P1^0;
- sbit LCD_LE=P1^1;
- sbit SEG_OE=P1^2;
- sbit LCD_OE=P1^3;
- uchar code seg[]=//數碼管:正向位置;共陽極;正向連接
- {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0-9
- uchar code table_speed_num1[]=
- {
- 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*1*/
- 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*5*/
- 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*0*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,/*.*/
- 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00/*0*/
- }; //150.0
- uchar code table_speed_num2[]={
- 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*7*/
- 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*5*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,/*.*/
- 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*0*/
- 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00/*0*/
- }; //75.00
- uchar code table_speed_num3[]={
- 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*3*/
- 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*7*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,/*.*/
- 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*5*/
- 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00/*0*/
- }; //37.50
- uchar code table_speed_num4[]={
- 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*1*/
- 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*8*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,/*.*/
- 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*7*/
- 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00/*5*/
- }; //18.75
- uchar code table_speed_num5[]={
- 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*9*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,/*.*/
- 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*3*/
- 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*7*/
- 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00/*5*/
- }; //9.375
- uchar code table_direct_state_Y[]=
- {
- 0x00,0xFE,0x00,0xFC,0x00,0xFE,0x00,0xF2,0x12,0x1A,0x96,0x12,0x12,0xF2,0x02,0x00,0x20,0x1F,0x00,0x0F,0x00,0x7F,0x00,0x47,
- 0x20,0x10,0x0F,0x10,0x20,0x67,0x00,0x00,
- 0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,
- 0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,
- 0x40,0x30,0x2C,0xEB,0x28,0x28,0x08,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x00,0x01,0x01,0x01,0x7F,0x21,0x11,0x09,0x00,
- 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00
- }; //順時針
- uchar code table_direct_state_N[]=
- {
- 0x40,0x42,0xCC,0x00,0x00,0x08,0xC9,0x0E,0x08,0xF8,0x0C,0x0B,0xC8,0x08,0x00,0x00,0x40,0x20,0x1F,0x20,0x40,0x40,0x51,0x49,
- 0x47,0x41,0x41,0x41,0x41,0x40,0x40,0x00,
- 0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,
- 0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,
- 0x40,0x30,0x2C,0xEB,0x28,0x28,0x08,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x00,0x01,0x01,0x01,0x7F,0x21,0x11,0x09,0x00,
- 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00
- }; //逆時針
- uchar code table_state_roll[]=
- {
- 0x40,0x41,0xCE,0x04,0x00,0x20,0x22,0xA2,0x62,0x22,0xA2,0x22,0x22,0x22,0x20,0x00,0x40,0x20,0x1F,0x20,0x28,0x4C,0x4A,0x49,
- 0x48,0x4C,0x44,0x45,0x5E,0x4C,0x40,0x00,
- 0x10,0x08,0x84,0xC6,0x73,0x22,0x40,0x44,0x44,0x44,0xC4,0x44,0x44,0x44,0x40,0x00,0x02,0x01,0x00,0xFF,0x00,0x00,0x00,0x00,
- 0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,
- 0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00,
- 0x00,0xC0,0xC0,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- }; //運行中...
- uchar code table_state_pause[]=
- {
- 0x80,0x92,0x9A,0x96,0xFB,0x52,0x52,0x80,0x7E,0x12,0x12,0x12,0xF2,0x12,0x10,0x00,0x00,0x00,0x00,0x7E,0x4B,0x4A,0x4B,0x4A,
- 0x4A,0x4A,0x4A,0x7E,0x01,0x00,0x00,0x00,
- 0x80,0x40,0x20,0xF8,0x07,0x02,0x04,0x74,0x54,0x55,0x56,0x54,0x74,0x04,0x04,0x00,0x00,0x00,0x00,0xFF,0x00,0x03,0x01,0x05,
- 0x45,0x85,0x7D,0x05,0x05,0x05,0x03,0x00,
- 0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,
- 0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00,
- 0x00,0xC0,0xC0,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- }; //暫停中...
- uchar code stepmotor_Y_table[]={0x02,0x06,0x04,0x0C,0x08,0x09,0x01,0x03};//B-BC-C-CD-D-DA-A-AB-B 順時針 八拍
- uchar code stepmotor_N_table[]={0x01,0x09,0x08,0x0C,0x04,0x06,0x02,0x03};//A-AD-D-DC-C-CB-B-BA-A 逆時針 八拍
- uchar p; //控制轉一圈的八次轉動
- uchar direct; //轉動方向標志
- uchar speed=3,delay=0; //轉動速度標志
- extern display(uchar page,uchar column,uchar code *hzk,uchar num); //顯示漢字函數
- extern display_char(uchar page,uchar column,uchar code *hzk,uchar num); //顯示字符函數
- extern Keys_Scan(); //按鍵檢測函數
- extern LCD_DIS(); //LCD初始化函數
- //x=1時延時2ms
- void DelayMS(unsigned int x)
- {
- unsigned int i,j;
- for(i=x;i>0;i--)
- {
- for(j=0;j<247;j++)
- ;
- }
- }
- /*********顯示速度數值函數****************/
- void dis_speed_num(uchar *v)
- {
- CS1=0;
- CS2=1;
- display_char(2,48,v,2);
- CS1=1;
- CS2=0;
- display_char(2,0,&v[32],3);
- }
- /*********顯示方向函數****************/
- void dis_direct_Y_N(uchar dir)
- {
- CS1=1;
- CS2=0;
- if(dir==1)
- display(4,0,table_direct_state_Y,3);
- if(dir==2)
- display(4,0,table_direct_state_N,3);
- }
- /*********顯示電機狀態函數****************/
- void dis_state_P_R(uchar *buffer)
- {
- CS1=1;
- CS2=0;
- display(6,0,buffer,4);
- }
- void main()
- {
- uchar k=0,i=0,j=0,key=0;
- TMOD=0x11;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- SEG_OE=1; //關數碼管輸出使能
- LCD_OE=0; //開LCD輸出使能
- LCD_LE=1; //關LCD鎖存輸出
- LCD_DIS();
- // TR0=1;
- while(1)
- {
- while(key==0)
- key=Keys_Scan(); //檢測按鍵鍵值
- if(key==3)
- {
- direct=1; //轉動方向標志為1,順時針轉動
- dis_direct_Y_N(direct);
- key=0;
- }
- if(key==4)
- {
- direct=2; //轉動方向標志為2,逆時針轉動
- dis_direct_Y_N(direct);
- key=0;
- }
- if(key==5)
- {
- TR0=0; //關T0中斷,電機暫停轉動
- dis_state_P_R(table_state_pause);
- key=0;
- }
- if(key==6)
- {
- TR0=1; //開T0中斷,電機開始轉動
- dis_state_P_R(table_state_roll);
- key=0;
- }
- if(key==1)
- {
- speed=speed-1;; //轉動一次所需延時時間減少,轉動加速
- if(speed<=1)
- speed=1; //最少延時一次
- key=0;
- }
- if(key==2)
- {
- speed=speed+1; //轉動一次所需延時時間增加,轉動減速
- if(speed>=5)
- speed=5; //最多延時五次
- key=0;
- }
- if(speed==1) //顯示相應延時時間的速度數值
- dis_speed_num(table_speed_num1);
- if(speed==2)
- dis_speed_num(table_speed_num2);
- if(speed==3)
- dis_speed_num(table_speed_num3);
- if(speed==4)
- dis_speed_num(table_speed_num4);
- if(speed==5)
- dis_speed_num(table_speed_num5);
- LCD_LE=0; //關LCD輸出使能
- SEG_OE=0; //開數碼管輸出使能
- SEG_LE=1; //關數碼管鎖存輸出
- P0=seg[speed]; //輸出當前速度檔位1-5,也就是延時時間
- SEG_LE=0; //開數碼管鎖存輸出,鎖存輸出值
- LCD_LE=1; //關LCD鎖存輸出
- DelayMS(100); //延時一會,等待外圍器件工作,
- //沒有延時,在加速加速時可能會產生多加速或多減速
- }
- }
- /**********電機轉動函數************/
- void roll()
- {
- if(direct==1) //檢測方向標志,使電機順時針轉動
- P3=stepmotor_Y_table[p++];
- if(direct==2) //檢測方向標志,使電機逆時針轉動
- P3=stepmotor_N_table[p++];
- if(p==8) //轉動8次正好一圈
- p=0;
- }
- void delayspeed()
- {
- delay=delay+1;
- if(delay>=speed) //當延時時間delay大于速度時間speed就會使電機轉動
- { //特別是當加速時,delay可能是大于speed,這樣會在加速時產生等待時間
- roll();
- delay=0;
- }
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
步進電機.zip
(136.81 KB, 下載次數: 58)
2018-4-15 11:10 上傳
點擊文件名下載附件
|