欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
Proteus仿真步進電機 數碼管+1602 有仿真圖和單片機源碼
[打印本頁]
作者:
lzh10620
時間:
2020-6-4 15:35
標題:
Proteus仿真步進電機 數碼管+1602 有仿真圖和單片機源碼
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0659bb94c63230d695e81c7c07deed8.png
(63.76 KB, 下載次數: 54)
下載附件
2020-6-4 15:33 上傳
單片機源程序如下:
/* 步進電機程序 */
/*P1^0 為四相單四拍, P1^1 為四相雙四拍, P1^2 為四相八拍 */
/*P1^3 為啟動 / 停止控制、 P1^4 方向控制、 P1^5 加速、 P1^6 減速 */
/* 用 4 位 LED 數碼管顯示工作步數。 */
/* 用 3 個發光二極管顯示狀態 */
/* 正轉時紅燈亮,反轉時黃燈亮,不轉時綠燈亮 */
/* 編寫人: */
/* 時間: 2013-06-26 */
/***********************************************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define SegData P0 // 數碼管數據口
#define KeyData P1 // 按鍵控制數據口
#define MotorData P2 // 電機控制數據口
#define dula P0 //段選
sbit wela1=P3^0; // 數碼管位選 1
sbit wela2=P3^1; // 數碼管位選 2
sbit wela3=P3^3; // 數碼管位選 3
sbit wela4=P3^7; // 數碼管位選 4
sbit wela5=P2^4; // 數碼管位選 5
sbit wela6=P2^5; // 數碼管位選 6
sbit wela7=P2^6; // 數碼管位選 7
sbit wela8=P2^7; // 數碼管位選 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}; // 步進電機正相單四拍數表 ;
uchar PositiveDoubleFour[]={0xf5,0xf6,0xfa,0xf9}; // 步進電機正相雙四拍數表 ;
uchar PositiveEight[]={0xf1,0xf5,0xf4,0xf6,0xf2,0xfa,0xf8,0xf9};// 步進電機正相八拍數表 ;
uchar NegitiveSingleFour[]={0xf1,0xf8,0xf2,0xf4}; // 步進電機反相單四拍數表 ;
uchar NegitiveDoubleFour[]={0xf9,0xfa,0xf6,0xf5}; // 步進電機反相雙四拍數表 ;
uchar NegitiveEight[]={0xf1,0xf9,0xf8,0xfa,0xf2,0xf6,0xf4,0xf5};// 步進電機反相八拍數表 ;
uchar table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
0x40,0x76,0x38};//數碼管顯示
uchar Flag=0; // 用來控制拍數循環;
uchar Mode=0; // 用來標志工作模式;
uchar Way=0; // 用來標志運轉方向
uchar Num=0; // 用來定時計數
uchar Delay=0; // 用來標志延時時間到
uchar Move=0; // 用來標志啟動或停止
uint Step=0; // 用來計算步數的;
char Speed=12; // 用來表示速度
char SpeedMax=2; // 最大速度 - 參數為時間
char SpeedMin=22; // 最小速度
char SpeedChang=1; // 速度每次改變量
uint Pulse=0; //計數
uint Period=0 ; //周期計數
uint real_speed=0; //實際轉速
uint lilun_speed=0; //理論轉速
/****************** 函數聲明部分 **********************/
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);
/****************** 主函數 **********************/
/********************************/
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; //高脈沖寫入數據
delay_us();
E=0;
}
void lcd_write_dat(uchar dat)
{
E=0;
RS=1;
RW=0;
delay_us();
LCD_data=dat;
E=1; //高脈沖寫入數據
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顯示(地址,數據)
{
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) ;
}
}
//顯示函數
void display(uint first,uint second,uint third,uint forth)
{
wela1 = 0;
dula = table[first]; //顯示第一個
DelayMs(1);
wela1 = 1;
dula = 0x00; //一定要加,否則不穩定
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;
}
//顯示函數
void display2(uint first,uint second,uint third,uint forth)
{
wela5 = 0;
dula = table[first]; //顯示第一個
DelayMs(1);
wela5 = 1;
dula = 0x00; //一定要加,否則不穩定
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;
}
/****************** 電機運轉函數 **********************/
void Motor()
{
if(Move==1)
{
LedGreen=0;
if(Delay==1)
{
Delay=0;
if(Way==0)
{
LedRed=0;
LedYellow=1;
switch(Mode)
{
/* 電機步進拍數表數據送到電機控制口;判斷一周拍數是否完成;步數加 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;
}
}
/****************** 初始化函數 **********************/
void Init()
{
Move=0;
LedGreen=1;
Step=0;
MotorData=0xef;
IT0=1;//跳變沿出發方式(下降沿)
EX0=1;//打開INT0的中斷允許。
EA=1;//打開總中斷
TMOD=0x11; // 定時器 0 初始化
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
EA=1; // 開總中斷
ET0=1; // 開定時器 0 中斷
TR0=1; // 開始計時
}
/****************** 按鍵檢測函數 **********************/
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; // 有鍵按下則不掃描后續按鍵
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; // 方向按鍵按下,電機順時針轉動
}
}
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;// 電機四相單四拍運行
case 0x05: Mode=2;break;// 電機四相雙四拍運行
case 0x03: Mode=3;break;// 電機四相八拍運行
}
}
}
}
}
else
{
Move=0; // 電機停止
}
}
/**************** 毫秒延時 ***************/
void DelayMs(uint z)
{
uint t1,y;
for(t1=z;t1>0;t1--)
for(y=110;y>0;y--);
}
/**************** 定時器 0 中斷函數 ***************/
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; //實際轉速
lilun_speed =Step*15; //理論轉速
Step=0;
Pulse=0;
Period=0;
}
}
/*外部中斷0的中斷函數*/
void Int0() interrupt 0
{
Pulse++;//脈沖++
}
復制代碼
全部資料51hei下載地址:
步進電機1602 數碼管.rar
(155.69 KB, 下載次數: 87)
2020-6-4 15:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
dj3365191
時間:
2020-10-23 19:40
仿真看了一下1602顯示的數據沒有任何變化,無論按哪個按鍵1602都無任何變化,不知為何?樓主能否告訴是什么原因,謝謝!
作者:
dj3365191
時間:
2020-10-30 16:26
帖子都沉了也沒人回答
作者:
RunRock
時間:
2020-11-9 10:04
仿真看了一下1602顯示的數據沒有任何變化,無論按哪個按鍵1602都無任何變化,不知為何?樓主能否告訴是什么原因,謝謝!
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1