標(biāo)題:
Proteus仿真步進(jìn)電機(jī) 數(shù)碼管+1602 有仿真圖和單片機(jī)源碼
[打印本頁(yè)]
作者:
lzh10620
時(shí)間:
2020-6-4 15:35
標(biāo)題:
Proteus仿真步進(jìn)電機(jī) 數(shù)碼管+1602 有仿真圖和單片機(jī)源碼
仿真原理圖如下(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 為啟動(dòng) / 停止控制、 P1^4 方向控制、 P1^5 加速、 P1^6 減速 */
/* 用 4 位 LED 數(shù)碼管顯示工作步數(shù)。 */
/* 用 3 個(gè)發(fā)光二極管顯示狀態(tài) */
/* 正轉(zhuǎn)時(shí)紅燈亮,反轉(zhuǎn)時(shí)黃燈亮,不轉(zhuǎn)時(shí)綠燈亮 */
/* 編寫人: */
/* 時(shí)間: 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; // 用來(lái)控制拍數(shù)循環(huán);
uchar Mode=0; // 用來(lái)標(biāo)志工作模式;
uchar Way=0; // 用來(lái)標(biāo)志運(yùn)轉(zhuǎn)方向
uchar Num=0; // 用來(lái)定時(shí)計(jì)數(shù)
uchar Delay=0; // 用來(lái)標(biāo)志延時(shí)時(shí)間到
uchar Move=0; // 用來(lái)標(biāo)志啟動(dòng)或停止
uint Step=0; // 用來(lái)計(jì)算步數(shù)的;
char Speed=12; // 用來(lái)表示速度
char SpeedMax=2; // 最大速度 - 參數(shù)為時(shí)間
char SpeedMin=22; // 最小速度
char SpeedChang=1; // 速度每次改變量
uint Pulse=0; //計(jì)數(shù)
uint Period=0 ; //周期計(jì)數(shù)
uint real_speed=0; //實(shí)際轉(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]; //顯示第一個(gè)
DelayMs(1);
wela1 = 1;
dula = 0x00; //一定要加,否則不穩(wěn)定
wela2 = 0;
dula = table[second]; //顯示第二個(gè)
DelayMs(1);
wela2 = 1;
dula = 0x00;
wela3 = 0;
dula = table[third]; //顯示第三個(gè)
DelayMs(1);
wela3 = 1;
dula = 0x00;
wela4 = 0;
dula = table[forth]; //顯示第4個(gè)
DelayMs(1);
wela4 = 1;
dula = 0x00;
}
//顯示函數(shù)
void display2(uint first,uint second,uint third,uint forth)
{
wela5 = 0;
dula = table[first]; //顯示第一個(gè)
DelayMs(1);
wela5 = 1;
dula = 0x00; //一定要加,否則不穩(wěn)定
wela6 = 0;
dula = table[second]; //顯示第二個(gè)
DelayMs(1);
wela6 = 1;
dula = 0x00;
wela7 = 0;
dula = table[third]; //顯示第三個(gè)
DelayMs(1);
wela7 = 1;
dula = 0x00;
wela8 = 0;
dula = table[forth]; //顯示第4個(gè)
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; // 定時(shí)器 0 初始化
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
EA=1; // 開總中斷
ET0=1; // 開定時(shí)器 0 中斷
TR0=1; // 開始計(jì)時(shí)
}
/****************** 按鍵檢測(cè)函數(shù) **********************/
void KeyScan()
{
uchar Temp,Over=0;
Temp=KeyData;
Temp=Temp&0x08;
if(Temp!=0x08) // 啟動(dòng)鍵按下
{
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) // 按鍵松開檢測(cè)
{
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ī)順時(shí)針轉(zhuǎn)動(dòng)
}
}
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ī)停止
}
}
/**************** 毫秒延時(shí) ***************/
void DelayMs(uint z)
{
uint t1,y;
for(t1=z;t1>0;t1--)
for(y=110;y>0;y--);
}
/**************** 定時(shí)器 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; // 延時(shí)時(shí)間到
}
if(Period >= 500)
{
real_speed=Pulse*60; //實(shí)際轉(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 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
dj3365191
時(shí)間:
2020-10-23 19:40
仿真看了一下1602顯示的數(shù)據(jù)沒有任何變化,無(wú)論按哪個(gè)按鍵1602都無(wú)任何變化,不知為何?樓主能否告訴是什么原因,謝謝!
作者:
dj3365191
時(shí)間:
2020-10-30 16:26
帖子都沉了也沒人回答
作者:
RunRock
時(shí)間:
2020-11-9 10:04
仿真看了一下1602顯示的數(shù)據(jù)沒有任何變化,無(wú)論按哪個(gè)按鍵1602都無(wú)任何變化,不知為何?樓主能否告訴是什么原因,謝謝!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1