|
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0659bb94c63230d695e81c7c07deed8.png (63.76 KB, 下載次數(shù): 54)
下載附件
2020-6-4 15:33 上傳
單片機(jī)源程序如下:
- /* 步進(jìn)電機(jī)程序 */
- /*P1^0 為四相單四拍, P1^1 為四相雙四拍, P1^2 為四相八拍 */
- /*P1^3 為啟動 / 停止控制、 P1^4 方向控制、 P1^5 加速、 P1^6 減速 */
- /* 用 4 位 LED 數(shù)碼管顯示工作步數(shù)。 */
- /* 用 3 個發(fā)光二極管顯示狀態(tài) */
- /* 正轉(zhuǎn)時紅燈亮,反轉(zhuǎn)時黃燈亮,不轉(zhuǎn)時綠燈亮 */
- /* 編寫人: */
- /* 時間: 2013-06-26 */
- /***********************************************************/
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define SegData P0 // 數(shù)碼管數(shù)據(jù)口
- #define KeyData P1 // 按鍵控制數(shù)據(jù)口
- #define MotorData P2 // 電機(jī)控制數(shù)據(jù)口
- #define dula P0 //段選
- sbit wela1=P3^0; // 數(shù)碼管位選 1
- sbit wela2=P3^1; // 數(shù)碼管位選 2
- sbit wela3=P3^3; // 數(shù)碼管位選 3
- sbit wela4=P3^7; // 數(shù)碼管位選 4
- sbit wela5=P2^4; // 數(shù)碼管位選 5
- sbit wela6=P2^5; // 數(shù)碼管位選 6
- sbit wela7=P2^6; // 數(shù)碼管位選 7
- sbit wela8=P2^7; // 數(shù)碼管位選 8
- sbit RS=P2^6;
- sbit RW=P2^5;
- sbit E=P2^7;
- #define LCD_data P0
- uchar code table2[13]={"RAOZU:Y90S-2"};
- uchar code table3[25]={"DZ:0X200 ZS:75"};
- sbit LedGreen=P3^4;// 控制綠燈-停止
- sbit LedRed=P3^5; // 控制紅燈-停止
- sbit LedYellow=P3^6;// 控制黃燈-停止
- uchar PositiveSingleFour[]={0xf1,0xf4,0xf2,0xf8}; // 步進(jìn)電機(jī)正相單四拍數(shù)表 ;
- uchar PositiveDoubleFour[]={0xf5,0xf6,0xfa,0xf9}; // 步進(jìn)電機(jī)正相雙四拍數(shù)表 ;
- uchar PositiveEight[]={0xf1,0xf5,0xf4,0xf6,0xf2,0xfa,0xf8,0xf9};// 步進(jìn)電機(jī)正相八拍數(shù)表 ;
- uchar NegitiveSingleFour[]={0xf1,0xf8,0xf2,0xf4}; // 步進(jìn)電機(jī)反相單四拍數(shù)表 ;
- uchar NegitiveDoubleFour[]={0xf9,0xfa,0xf6,0xf5}; // 步進(jìn)電機(jī)反相雙四拍數(shù)表 ;
- uchar NegitiveEight[]={0xf1,0xf9,0xf8,0xfa,0xf2,0xf6,0xf4,0xf5};// 步進(jìn)電機(jī)反相八拍數(shù)表 ;
- uchar table[]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
- 0x40,0x76,0x38};//數(shù)碼管顯示
- uchar Flag=0; // 用來控制拍數(shù)循環(huán);
- uchar Mode=0; // 用來標(biāo)志工作模式;
- uchar Way=0; // 用來標(biāo)志運(yùn)轉(zhuǎn)方向
- uchar Num=0; // 用來定時計數(shù)
- uchar Delay=0; // 用來標(biāo)志延時時間到
- uchar Move=0; // 用來標(biāo)志啟動或停止
- uint Step=0; // 用來計算步數(shù)的;
- char Speed=12; // 用來表示速度
- char SpeedMax=2; // 最大速度 - 參數(shù)為時間
- char SpeedMin=22; // 最小速度
- char SpeedChang=1; // 速度每次改變量
- uint Pulse=0; //計數(shù)
- uint Period=0 ; //周期計數(shù)
- uint real_speed=0; //實際轉(zhuǎn)速
- uint lilun_speed=0; //理論轉(zhuǎn)速
- /****************** 函數(shù)聲明部分 **********************/
- void Init();
- //void Display(uint);
- void DelayMs(uint);
- void KeyScan();
- void Motor();
- void display(uint first,uint second,uint third,uint forth);
- void display2(uint first,uint second,uint third,uint forth);
- /****************** 主函數(shù) **********************/
- /********************************/
- void delay_us(); //18us
- void delay_ms(uint);
- void lcd_init();
- void lcd_write_com(uchar com);
- void lcd_write_dat(uchar dat);
- void lcd_init();
- void lcd_display(uchar add,uchar dat);
- /***********************************/
- void delay_us()
- {
- uchar x;
- for(x=0;x<5;x++);
- }
- void delay_ms(uint z)
- {
- uint x,y;
- for(x=0;x<z;x++)
- for(y=0;y<123;y++);
- }
- void lcd_write_com(uchar com)
- {
- E=0;
- RS=0;
- RW=0;
- delay_us();
- LCD_data=com;
- E=1; //高脈沖寫入數(shù)據(jù)
- delay_us();
- E=0;
- }
- void lcd_write_dat(uchar dat)
- {
- E=0;
- RS=1;
- RW=0;
- delay_us();
- LCD_data=dat;
- E=1; //高脈沖寫入數(shù)據(jù)
- delay_us();
- E=0;
- }
- void lcd_init() //lcd初始化
- {
- delay_ms(15);
- lcd_write_com(0x38);
- delay_ms(10);
- lcd_write_com(0x0c);
- lcd_write_com(0x06);
- lcd_write_com(0x01);
- delay_ms(2);
-
-
- }
- void lcd_display(uchar add,uchar dat) //lcd顯示(地址,數(shù)據(jù))
- {
- lcd_write_com(add);
-
- lcd_write_dat(dat);
- delay_us();
- }
- void main()
- {
- char i;
- lcd_init();
- for(i=0;i<12;i++)
- {
- lcd_display(0x80+i,table2[i]);
- }
- for(i=0;i<14;i++)
- {
- lcd_display(0x80+0x40+i,table3[i]);
- }
- Init();
- while(1)
- {
- KeyScan();
- Motor();
- // display(real_speed/1000,real_speed%1000/100,real_speed%100/10,real_speed%10) ;
- display(lilun_speed/1000,lilun_speed%1000/100,lilun_speed%100/10,lilun_speed%10) ;
- }
- }
- //顯示函數(shù)
- void display(uint first,uint second,uint third,uint forth)
- {
- wela1 = 0;
- dula = table[first]; //顯示第一個
- DelayMs(1);
- wela1 = 1;
- dula = 0x00; //一定要加,否則不穩(wěn)定
- wela2 = 0;
- dula = table[second]; //顯示第二個
- DelayMs(1);
- wela2 = 1;
- dula = 0x00;
- wela3 = 0;
- dula = table[third]; //顯示第三個
- DelayMs(1);
- wela3 = 1;
- dula = 0x00;
- wela4 = 0;
- dula = table[forth]; //顯示第4個
- DelayMs(1);
- wela4 = 1;
- dula = 0x00;
- }
- //顯示函數(shù)
- void display2(uint first,uint second,uint third,uint forth)
- {
- wela5 = 0;
- dula = table[first]; //顯示第一個
- DelayMs(1);
- wela5 = 1;
- dula = 0x00; //一定要加,否則不穩(wěn)定
- wela6 = 0;
- dula = table[second]; //顯示第二個
- DelayMs(1);
- wela6 = 1;
- dula = 0x00;
- wela7 = 0;
- dula = table[third]; //顯示第三個
- DelayMs(1);
- wela7 = 1;
- dula = 0x00;
- wela8 = 0;
- dula = table[forth]; //顯示第4個
- DelayMs(1);
- wela8 = 1;
- dula = 0x00;
- }
- /****************** 電機(jī)運(yùn)轉(zhuǎn)函數(shù) **********************/
- void Motor()
- {
- if(Move==1)
- {
- LedGreen=0;
- if(Delay==1)
- {
- Delay=0;
- if(Way==0)
- {
- LedRed=0;
- LedYellow=1;
- switch(Mode)
- {
- /* 電機(jī)步進(jìn)拍數(shù)表數(shù)據(jù)送到電機(jī)控制口;判斷一周拍數(shù)是否完成;步數(shù)加 1*/
- case 1:MotorData=PositiveSingleFour[Flag++];if(Flag>=4) Flag=0;Step++;break;
- case 2:MotorData=PositiveDoubleFour[Flag++];if(Flag>=4) Flag=0;Step++;break;
- case 3:MotorData=PositiveEight[Flag++];if(Flag>=8) Flag=0;Step++;break;
- default: ;
- }
- }
- else
- {
- LedRed=1;
- LedYellow=0;
- switch(Mode)
- {
- case 1:MotorData=NegitiveSingleFour[Flag++];if(Flag>=4) Flag=0;Step++;break;
- case 2:MotorData=NegitiveDoubleFour[Flag++];if(Flag>=4) Flag=0;Step++;break;
- case 3:MotorData=NegitiveEight[Flag++];if(Flag>=8) Flag=0;Step++;break;
- default: ;
- }
- }
- }
- }
- else
- {
- MotorData=0xef;
- LedGreen=1;
- }
- }
- /****************** 初始化函數(shù) **********************/
- void Init()
- {
- Move=0;
- LedGreen=1;
- Step=0;
- MotorData=0xef;
- IT0=1;//跳變沿出發(fā)方式(下降沿)
- EX0=1;//打開INT0的中斷允許。
- EA=1;//打開總中斷
- TMOD=0x11; // 定時器 0 初始化
- TH0=(65536-2000)/256;
- TL0=(65536-2000)%256;
- EA=1; // 開總中斷
- ET0=1; // 開定時器 0 中斷
- TR0=1; // 開始計時
- }
- /****************** 按鍵檢測函數(shù) **********************/
- void KeyScan()
- {
- uchar Temp,Over=0;
- Temp=KeyData;
- Temp=Temp&0x08;
- if(Temp!=0x08) // 啟動鍵按下
- {
- Move=1;
- Temp=KeyData;
- Temp=Temp&0x60;
- if(Temp!=0x60)
- {
- DelayMs(2); // 按鍵軟件消抖
- Temp=KeyData;
- Temp=Temp&0x60;
- if(Temp!=0x60)
- {
- Over=1; // 有鍵按下則不掃描后續(xù)按鍵
- if(Temp==0x40) // 加速鍵按下
- {
- while(Temp!=0xe7) // 按鍵松開檢測
- {
- Temp=KeyData;
- Temp=Temp&0xe7;
- }
- Speed=Speed-SpeedChang;
- if(Speed<=SpeedMax)
- {
- Speed=SpeedMax; // 一直按加速鍵則保持到最大速度
- }
- }
- else if(Temp==0x20) // 減速鍵按下
- {
- while(Temp!=0xe7)
- {
- Temp=KeyData;
- Temp=Temp&0xe7;
- }
- Speed=Speed+SpeedChang;
- if(Speed>=SpeedMin)
- {
- Speed=SpeedMin;
- }
- }
- }
- }
- if(Over==0) // 判斷前是否有鍵按下
- {
- Temp=KeyData;
- Temp=Temp&0x10;
- if(Temp!=0x10)
- {
- DelayMs(2);
- Temp=KeyData;
- Temp=Temp&0x10;
- if(Temp!=0x10)
- {
- Way=0; // 方向按鍵按下,電機(jī)順時針轉(zhuǎn)動
- }
- }
- else
- {
- Way=1;
- }
- }
- if(Over==0)
- {
- Temp=KeyData;
- Temp=Temp&0x07;
- if(Temp!=0x07)
- {
- DelayMs(2);
- Temp=KeyData;
- Temp=Temp&0x07;
- if(Temp!=0x07)
- {
- switch(Temp)
- {
- case 0x06: Mode=1;break;// 電機(jī)四相單四拍運(yùn)行
- case 0x05: Mode=2;break;// 電機(jī)四相雙四拍運(yùn)行
- case 0x03: Mode=3;break;// 電機(jī)四相八拍運(yùn)行
- }
- }
- }
- }
- }
- else
- {
- Move=0; // 電機(jī)停止
- }
- }
- /**************** 毫秒延時 ***************/
- void DelayMs(uint z)
- {
- uint t1,y;
- for(t1=z;t1>0;t1--)
- for(y=110;y>0;y--);
- }
- /**************** 定時器 0 中斷函數(shù) ***************/
- void T0_time() interrupt 1
- {
- // TH0=(65536-45872)/256;
- // TL0=(65536-45872)%256;
- TH0=(65536-2000)/256;
- TL0=(65536-2000)%256;
- Num++;
- Period++;
- if(Num>=Speed)
- {
- Num=0;
- Delay=1; // 延時時間到
- }
- if(Period >= 500)
- {
- real_speed=Pulse*60; //實際轉(zhuǎn)速
- lilun_speed =Step*15; //理論轉(zhuǎn)速
- Step=0;
- Pulse=0;
- Period=0;
- }
- }
- /*外部中斷0的中斷函數(shù)*/
- void Int0() interrupt 0
- {
- Pulse++;//脈沖++
- }
復(fù)制代碼 全部資料51hei下載地址:
步進(jìn)電機(jī)1602 數(shù)碼管.rar
(155.69 KB, 下載次數(shù): 87)
2020-6-4 15:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|