基于51單片機步進電機控制
(仿真+程序+設計報告)
功能介紹
具體功能:
1.使用L298驅動步進電機轉動,可分為9個速度等級(1級最快,9級最慢);
2.使用74HC595驅動數碼管顯示當前速度等級;
3.兩個按鍵可以控制轉速和正/方向;
?演示視頻:
基于51單片機步進電機控制—9個等級?
添加圖片注釋,不超過 140 字(可選)
程序
//*****************************************//
//**************名稱:步進電機*************//
//******** 木子單片機 *********//
//*****************************************//
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//74HC595引腳定義
sbit MOSIO=P2^1;
sbit R_CLKa=P2^2;
sbit S_CLKa=P2^0;
sbit LED = P0^0 ;
/
uchar vision_cnt = 0 ; //數碼管動態掃描計數變量
bit updat = 0 ; //動態刷新標志
uint cnt = 0 ;
uchar sec = 0 ;
uint key_cnt[4];
uchar key_tab = 0 ;
uint buf_cnt = 0 ;
bit cnv = 0 ;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x40
}; //共陰極數碼管顯示數組0-f
uchar code table1[4]={0x10,0x20,0x40,0x80}; //反轉表格,
//(P0.2-P0.5)各位分別取1,二進制碼即:00000100,00001000,0001000,0010000
uchar code table2[4]={0x80,0x40,0x20,0x10}; //正轉表格
/*
********************************************************************************
** 函數名稱 : send595(uchar dat)
** 函數功能 : 數據輸入
********************************************************************************
*/
void send595(uchar dat) //數據輸入
{ uchar i; for(i=0;i<8;i++) {if((dat<<i)&0x80) MOSIO = 1 ;else MOSIO = 0 ;S_CLKa=0;S_CLKa=1; }
}
/*
********************************************************************************
** 函數名稱 : out595(void)
** 函數功能 : 數據輸出
********************************************************************************
*/
void out595(void) // 數據輸出
{R_CLKa=0;R_CLKa=1; //上升沿
}
/*
********************************************************************************
** 函數名稱 : vision(uchar dat,uchar pos)
** 函數功能 : 顯示函數
********************************************************************************
*/ //在數碼管某個位置上顯示某個數字
void vision(uchar dat,uchar pos)
{send595(~pos);send595(table[dat]);out595();
}
//定時器初始化函數,
void timer_config(void)
{TMOD = 0x11 ; //設置定時器0和定時器1工作在方式1--16位計數模式TH0 = (65535-60000)/256 ; //設置定時器初值高位TL0 = (65535-60000)%256 ; //設置定時器初值低位TR0 = 1 ; //啟動定時器0ET0 = 1 ; //開啟定時器0中斷EA = 1 ; //開啟總中斷
}
//外部中斷配置函數
void ext_config(void)
{EX0 = 1; //開啟外部中斷0IT0 = 1; //外部中斷為邊沿觸發方式EX1 = 1; //開啟外部中斷1IT1 = 1; //外部中斷為邊沿觸發方式
}
//外部中斷0
void ext0_isr() interrupt 0
{if(sec<9)sec++;elsesec=1;
}
//外部中斷0
void ext1_isr() interrupt 2
{cnv = ~cnv ;
*****//完整資料
****//微信公眾號:木子單片機//
}
//定時器0中斷函數
void timer0_isr() interrupt 1
{TH0 = 0xfc ; //設置定時器初值高位 1ms定時TL0 = 0x17 ; //設置定時器初值低位updat = 1 ; //置位標志位if(buf_cnt<30*sec){buf_cnt++;}else{buf_cnt=0;if(cnt<3){cnt++;}else{cnt=0;}if(cnv)P1=table1[cnt];else P1=table2[cnt];}
}
硬件設計
使用元器件:
單片機:AT89C51;
(注意:單片機是通用的,無論51還是52、無論stc還是at都一樣,引腳功能都一樣。程序也是一樣的。)
設計資料
01仿真圖
本設計使用Proteus7.8和Proteus8.9兩個版本設計!具體如圖!
添加圖片注釋,不超過 140 字(可選)
02程序
本設計使用Keil5版本編程設計!具體如圖!
添加圖片注釋,不超過 140 字(可選)
03設計報告
一千字設計報告,具體如下!
添加圖片注釋,不超過 140 字(可選)
04設計資料
????????資料獲取請看前面演示視頻,全部資料包括仿真源文件 、程序(含注釋)、設計報告等。具體內容如下,全網最全! !
操作演示請觀看前面演示視頻!
點贊分享一起學習成長。