演示照片:
[演示程序(C51):]
?
/*****************************************************************/
/*????????????????????????????????????????????????????????????????*
/*?ME300B單片機開發系統演示程序-1602LCD顯示步進電機鍵控正反轉實驗?*
#include?
#include?
#define?uchar?unsigned?char
#define?uint??unsigned?int
#define?delayNOP();?{_nop_();_nop_();_nop_();_nop_();};
uchar?code?FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
uchar?code?REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
sbit??K1???=?P1^4;???????//運行與停止
sbit??K2???=?P1^5;???????//設定圈數
sbit??K3???=?P1^6;???????//方向轉換
sbit??K4???=?P1^7;???????//速率調整
sbit??BEEP?=?P3^7;???????//蜂鳴器
sbit??LCD_RS?=?P2^0;?????????????
sbit??LCD_RW?=?P2^1;
sbit??LCD_EN?=?P2^2;
bit??on_off=0;????????????//運行與停止標志
bit??direction=1;?????????//方向標志
bit??rate_dr=1;???????????//速率標志
bit??snum_dr=1;???????????//圈數標志
uchar?code??cdis1[?]?=?{"?STEPPING?MOTOR?"};
uchar?code??cdis2[?]?=?{"CONTROL??PROCESS"};
uchar?code??cdis3[?]?=?{"????STOP????????"};
uchar?code??cdis4[?]?=?{"NUM:????RATE:???"};
uchar?code??cdis5[?]?=?{"??RUNNING???????"};
uchar???m,v=0,q=0;
uchar???number=0,number1=0;?
uchar???snum=5,snum1=5;???????//預設定圈數
uchar???rate=8;???????????????//預設定速率
uchar???data_temp,data_temp1,data_temp2;???
/********************************************************/
/*??????????????????????????????????????????????????
/*?延時t毫秒?
/*?11.0592MHz時鐘,延時約1ms?????????????????????????????????????
/*??????????????????????????????????????????????????????
/********************************************************/
void?delay(uint?t)
{???????????????????????????
???uchar?k;
???while(t--)
???{
?????for(k=0;?k<125;?k++)
?????{?}
???}
}
/********************************************************/
void?delayB(uchar?x)????//x*0.14MS
?{
???uchar?i;
???while(x--)
???{
?????for?(i=0;?i<13;?i++)
?????{?}
???}
?}
/********************************************************/
void?beep()
?{
???uchar?j;
???for?(j=0;j<100;j++)
????{?
?????delayB(4);
?????BEEP=!BEEP;?????????????????//BEEP取反
????}?
?????BEEP=1;????????????????????//關閉蜂鳴器
??delay(170);
?}
/********************************************************/
/*????????????????????????????????????????????????????????????????
/*檢查LCD忙狀態???????????????????????????????????????????????????
/*lcd_busy為1時,忙,等待。為0時,閑,可寫指令與數據。?????
/*???????????????????????????????????????????????????????????????
/********************************************************/?
bit?lcd_busy()
?{??????????????????????????
????bit?result;
????LCD_RS?=?0;
????LCD_RW?=?1;
????LCD_EN?=?1;
????delayNOP();
????result?=?(bit)(P0&0x80);
????LCD_EN?=?0;
????return(result);?
?}
/********************************************************/
/*?????????????????????????????????????????????????????????????????
/*寫指令數據到LCD?????????????????????????????????????????????????
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。?????????????????????????????
/*???????????????????????????????????????????????????????????????
/********************************************************/
void?lcd_wcmd(uchar?cmd)
{??????????????????????????
???while(lcd_busy());
????LCD_RS?=?0;
????LCD_RW?=?0;
????LCD_EN?=?0;
????_nop_();
????_nop_();?
????P0?=?cmd;
????delayNOP();
????LCD_EN?=?1;
????delayNOP();
????LCD_EN?=?0;??
}
/********************************************************/
/*????????????????????????????????????????????????????????????????
/*寫顯示數據到LCD??????????????????????????????????????????????????
/*RS=H,RW=L,E=高脈沖,D0-D7=數據。??????????????????????????????
/*???????????????????????????????????????????????????????????????
/********************************************************/
void?lcd_wdat(uchar?dat)
{??????????????????????????
???while(lcd_busy());
????LCD_RS?=?1;
????LCD_RW?=?0;
????LCD_EN?=?0;
????P0?=?dat;
????delayNOP();
????LCD_EN?=?1;
????delayNOP();
????LCD_EN?=?0;?
}
/********************************************************/
/*????????????????????????????????????????????????????????????????
/*??LCD初始化設定????????????????????????????????????????????????
/*????????????????????????????????????????????????????????????????
/********************************************************/
void?lcd_init()
{?
????delay(30);???????????????????
????lcd_wcmd(0x38);??????//16*2顯示,5*7點陣,8位數據
????delay(5);
????lcd_wcmd(0x38);?????????
????delay(5);
????lcd_wcmd(0x38);?????????
????delay(5);
????lcd_wcmd(0x0c);??????//顯示開,關光標
????delay(5);
????lcd_wcmd(0x06);??????//移動光標
????delay(5);
????lcd_wcmd(0x01);??????//清除LCD的顯示內容
????delay(5);
}
/********************************************************/
/*?????????????????????????????????????????????????????????????????
/*??設定顯示位置??????????????????????????????????????????????????
/*????????????????????????????????????????????????????????????????
/********************************************************/
void?lcd_pos(uchar?pos)
{??????????????????????????
??lcd_wcmd(pos?|?0x80);??//數據指針=80+地址變量
}
/********************************************************/
/*???????????????????????????????????????????????????????
/*?LCD1602初始顯示子程序?????????????????????????????????????????????
/*??????????????????????????????????????????????????????
/********************************************************/
void??LCD_init_DIS()
{????????????
?????delay(10);?????????????????//延時
?????lcd_init();????????????????//初始化LCD?????????????
????????
?????lcd_pos(0);????????????????//設置顯示位置為第一行的第1個字符
?????m?=?0;
?????while(cdis1[m]?!=?'\0')
??????{?????????????????????????//顯示字符
????????lcd_wdat(cdis1[m]);
????????m++;
??????}
?????lcd_pos(0x40);?????????????//設置顯示位置為第二行第1個字符
?????m?=?0;
?????while(cdis2[m]?!=?'\0')
??????{
????????lcd_wdat(cdis2[m]);??????//顯示字符
????????m++;
??????}
??????delay(3000);???????????????//延時????????
????????
??????lcd_pos(0);????????????????//設置顯示位置為第一行的第1個字符
??????m?=?0;
??????while(cdis3[m]?!=?'\0')
????????{????????????????????????//顯示字符
??????????lcd_wdat(cdis3[m]);
??????????m++;
????????}
??????lcd_pos(0x40);?????????????//設置顯示位置為第二行第1個字符
??????m?=?0;
?????while(cdis4[m]?!=?'\0')
????????{
??????????lcd_wdat(cdis4[m]);????//顯示字符
??????????m++;
????????}??????
????????for(m=0;m<2;m++)
??????????{?
???????lcd_pos(0x0c+m);????//顯示方向符號
?????????????lcd_wdat(0x3e);
????}
}
/********************************************************/
/*
/*數據轉換子程序
/*
/********************************************************/
void??data_conv()?
?{
?????data_temp1=data_temp/10;???????//高位
??if(data_temp1==0)
??{data_temp1=0x20;}?????????????//高位為0不顯示
?????else?
??{data_temp1=data_temp1+0x30;}
???data_temp2=data_temp%10;???????//低位
?????data_temp2=data_temp2+0x30;
?}
/********************************************************/
/*
/*數據顯示子程序
/*
/********************************************************/
void??data_dis()
{
????data_temp?=?snum;????????//顯示圈數
????data_conv();
???????lcd_pos(0x44);?
???????lcd_wdat(data_temp1);
???????lcd_pos(0x45);?
???????lcd_wdat(data_temp2);
????
????data_temp?=?rate;?????????//顯示速率
????data_conv();
???????lcd_pos(0x4d);?
???????lcd_wdat(data_temp1);
???????lcd_pos(0x4e);?
???????lcd_wdat(data_temp2);
}
/********************************************************
/*
/*?顯示運行方向符號
/*
/********************************************************/
void??motor_DR()
??{
???????if(direction==1)???????????//正轉方向標志
????????{?for(m=0;m<2;m++)
??????????{?
??????lcd_pos(0x0c+m);??????//顯示方向符號
????????????lcd_wdat(0x3e);
?????}
???}
????????else
?????????{?for(m=0;m<2;m++)???????//反轉方向標志
???????????{?
??????????lcd_pos(0x0c+m);?????//顯示方向符號?
?????????????lcd_wdat(0x3c);
?????}
???}
??}
/********************************************************
/*
/*?顯示運行狀態
/*
/********************************************************/
void??motor_RUN()
?{
??????if(on_off==1)
????{?TR0=1;?
??????lcd_pos(0);?????//設置顯示位置為第一行的第1個字符
?????????m?=?0;
?????????while(cdis5[m]?!=?'\0')
??????????{?lcd_wdat(cdis5[m]);??????//RUNNING
????????????m++;???}
????????????motor_DR();??????????????//
????}??
??????else??
????{?TR0=0;?P1?=0xf0;?
???lcd_pos(0);?????//設置顯示位置為第一行的第1個字符
?????????m?=?0;
?????????while(cdis3[m]?!=?'\0')
??????????{?lcd_wdat(cdis3[m]);??????//STOP
????????????m++;???}
????????????motor_DR();??????????????//
???snum=snum1;?????????????//
???number1=0;??????????????//清圈數計數器
?????????}
??}
/********************************************************
*???????????????????????????????????????????????????????
*??主程序???????????????????????????????????????????????
*??????????????????????????????????????????????????????
*********************************************************/
main()
?{?
?????????LCD_init_DIS();
??
???TMOD?=?0x01;???????//T0定時方式1
???TL0??=?0x33;
?????????TH0??=?0xf5;
???EA???=?1;
???ET0??=?1;?
???P1???=?0xf0;?
??
???while(1)
????{??
???????if(K1==0)
????{
?????????beep();
??????while(K1==0);???????//等待鍵釋放
??????on_off=~on_off;???????
?????????motor_RUN();??
????????}???//K1?end
/********************************************************/
??????if(K2==0)????
???????{
??????beep();
???if(snum_dr==1)
????{?snum++;
????????snum1=snum;
??????if(snum==0x14)
????????????{?snum_dr=~snum_dr;}
????}
???else??
?????{snum--;
???snum1=snum;
??????if(snum==0x01)
???{?snum_dr=~snum_dr;?}
?????}
???
????}?//K2??end
/********************************************************/
????????if(K3==0)????
??????{
??????beep();
???direction=~direction;?
?????????motor_DR();
??????}//K3?end
/********************************************************/
????????if(K4==0)????
???????{
??????beep();
???if(rate_dr==1)
????{?rate++;
??????if(rate==0x10)
????????????{?rate_dr=~rate_dr;}
????}
????else??
?????{?
??????rate--;
??????if(rate==0x01)
???{?rate_dr=~rate_dr;?}
?????}
??}?//K4?end
????
/********************************************************/
??????if(number1==snum1)???//與設定圈數是否相等??
?????{?number1=0;?
?????????on_off=0;
?????????TR0=0;
????????snum=snum1;
???P1?=0xf0;
????motor_RUN();
????}?????????
?????????data_dis();
?}??//?while(1)?end
?}??//main?end
/********************************************************/
/*
/*??定時器?0?中斷?
/*
/********************************************************/
void??motor_onoff()??interrupt??1??
?{?????
???????TL0??=?0x33;
???????TH0??=?0xf5;?
???????q++;
????if(q?????????{?return;?}
????else?
???????{??q=0;????
???????number++;??????????????????//脈沖計數
????????
??????if(number==96)??????????????//96個脈沖電機轉一圈
???????{?snum--;
??????number=0;
????????????number1++;?}??????????//電機轉動圈數
????
?????????if(direction==1)????????????//方向標志
???????{?if(v<8)??
?????????{P1?=?FFW[v];v++;}???????//取數據,正轉
????????if(v==8)?
????????{?v=0;?}?
??????????}
???
??????else
???????{?if(v<8)??
?????????{P1?=?REV[v];v++;}???????//取數據,反轉
?????????if(v==8)?
?????????{?v=0;?}?
??????????}
????}
?}?
/********************************************************/
ME300實例-1602LCD顯示步進電機鍵控正反轉實驗-C
ME300實例-1602LCD顯示步進電機鍵控正反轉實驗-C語言源代碼
- 步進電機(145854)
相關推薦
51單片機實現步進電機的啟停,圈數設定,正反轉,速率調整,LCD1602顯示等調節
51單片機實現步進電機(39BYG316/28BYJ48)的啟停,圈數設定,正反轉,速率調整,LCD1602顯示等調節一、方案設計方案1:采用89C
2021-06-29 07:43:35
51單片機按鍵控制步進電機加減速及其正反轉
之前嘗試用單片機控制42步進電機正反轉,電機連接導軌實現滑臺前進后退,在這里分享一下測試程序及接線圖,程序部分參考網上找到的,已經實際測試過,可以實現控制功能。所用硬件:步進電機及驅動器
2021-06-28 07:31:42
1602LCD
小弟寫了一個1602LCD代碼,下到板子上發現液晶無顯示,先確定是代碼有問題,可用MODELSIM仿真發現功能實現正常,想搞時序仿真,但軟件運行起來實在太卡了。望各位走過路過的高手不吝賜教
2014-04-28 23:24:23
1602LCD光標顯示
我在做1602液晶顯示的時候,遇到些困難,我想設置光標在一個位置不動,通過按鍵左移或者右移,但是光標顯示開之后,光標就自動右移,不能控制,初始化如下:void lcd
2012-05-08 08:32:12
步進電機正反轉控制c語言程序
步進電機正反轉控制C語言程序,只為初學者只為初學者的步進電機正反控制程序#include#define uchar unsigned char#define uintunsigned
2021-07-05 06:41:16
步進電機控制系統設計一個開環步進電機控制系統
能夠正常運轉。②中斷方式的轉動。③啟停。按KK1+鍵控制步進電機的啟動。按KK2+鍵控制步進電機的停止。④正反轉。開關K7控制步進電機的正反轉。當K7向下撥時,電機正轉(順時針);向上撥時,電機反轉(逆時針)。⑤在LED數碼管上顯示速度編號。K0對應1擋、K1對應2擋,其余類推。⑥調速。開關K6~K0分
2021-06-29 06:48:40
步進電機的正反向旋轉c語言編程,實現步進電機自動正反轉程序怎么寫?
本文收集整理關于實現步進電機自動正反轉程序怎么寫的相關議題,使用內容導航快速到達。內容導航:Q1:用c語言程序實現步進電機的正反轉加減速的編程內容:1、本程序用于測試4相步進電機常規驅動2、需要用跳
2021-06-29 06:09:19
AT89C51控制三個步進電機控制的正反轉
能否幫我把12864的線接完,然后寫一個C語言程序,控制三個步進電機的正反轉,加減速。都要在液晶上面顯示出來的,麻煩有時間的各位幫幫忙了
2012-04-21 20:01:24
python-樹莓派通過按鍵控制步進電機正反轉相關資料分享
電機驅動板。步進電機驅動原理要想驅動步進電機進行正常的正反轉,就必須要先了解步進電機的驅動時序,此次選擇28BYJ-48-5V是四相的電機,按照通電順序不同可分為以下三種:單四拍,雙四拍,八拍三種工作方式。下面將列出三種工作方式下的正反轉時序:單四拍:正轉:A - B - C - D
2021-06-28 10:16:00
基于51單片機下通過藍牙串口控制LCD1602屏幕顯示步進電機正反轉以及轉速設計
通過藍牙串口控制LCD1602屏幕顯示正反轉以及轉速簡 述:通過藍牙串口發送指定數據到STC89C52RC單片機,控制28BYJ-48步進電機正轉或者反轉或者速度的快中慢,然后51單片機,做相應
2021-07-05 08:13:33
如何實現對步進電機的正反轉動控制?
前言 上一講我們已成功實現對步進電機的正反轉動控制,并簡單的通過調節節拍間的延時時間實現了簡單的轉速控制(開環),這一節將繼續給大學介紹在STM32中通過定時器方式來實現節拍間的精確延時操作,并
2021-07-08 08:30:20
怎樣用單片機控制步進電機正反轉以及加減速?
簡介:用單片機控制步進電機正轉 反轉 加速 減速;由LCD1602實時顯示步進電機的狀態;F-正轉,B-反轉;數字越大,轉速越大;仿真原理圖如下:MCU和LCD1602顯示模塊:ULN2803驅動
2021-07-07 06:20:46
急!!求基于單片機的步進電機的C51程序和仿真!
本帖最后由 超先生 于 2016-4-13 12:16 編輯
步進電機型號28BYJ-48,電源5V,ULN2003驅動,LCD1602液晶顯示,控制電機正反轉加減速!
2016-04-13 11:25:56
按鍵控制c51單片機驅動unl2003控制步進電機正反轉停止及程序調速
**按鍵控制c51單片機驅動unl2003控制步進電機正反轉停止及程序調速** 分享一個萌新入門小工程一、原件連接:第一種直接用51開發板第二種用最小單元加unl2003驅動二、開發板電路三
2021-06-28 09:28:10
請問怎么提取步進電機正反轉的信號?
論壇的各位大神們,步進電機輸入兩個信號然后正轉和反轉,怎樣才能將這兩個信號提取出來,我把四個黑、黃、棕、藍四根線分別接到三極管B極上,E極統一接地,C極接89C51上,結果沒什么作用。請問各位大神有沒有什么辦法把步進電機正反轉的兩組信號提取出來??
2020-07-21 08:10:35
控制步進電機正反轉的實際應用程序
控制步進電機正反轉的實際應用程序:/*這是一個控制步進電機正反轉的實際應用程序*/ /*選用的是三相步進電機驅動器,p14口線用做步進電機的脈沖控制*/ /*p13口線用做步進電機的方向
2010-01-09 15:13:25146
ME300/ME500單片機開發系統編程控制軟件
ME300/ME500開發系統編程控制軟件:本軟件可以同時支持偉納ME300系列和ME500系列單片機開發系統(板)。偉納ME系列單片機開發系統均具有實驗儀、編程器、仿真器、ISP下載線四種功能
2010-04-20 19:15:5390
單片機視頻教程15:1602LCD顯示
《手把手教你學單片機》單片機視頻教程15:1602LCD顯示 單片機視頻教程15:1602LCD顯示 1、熟悉1602總線操作 2、嘗試1602不同的操作,熟悉效果,比如流動顯示等等
2012-08-21 09:50:4412345
電機正反轉原理
電機正反轉,代表的是電機順時針轉動和逆時針轉動。電機順時針轉動是電機正轉,電機逆時針轉動是電機反轉。正反轉控制電路圖及其原理分析要實現電動機的正反轉只要將接至電動機三相電源進線中的任意兩相對調接線即可達到反轉的目的。電機的正反轉在廣泛使用,例如行車、木工用的電刨床、臺鉆、刻絲機、甩干機和車床等。
2019-01-07 15:12:40114880
使用LCD1602顯示超聲波控制電機正反轉的使用程序和工程文件免費下載
本文檔的主要內容詳細介紹的是使用LCD1602顯示超聲波控制電機正反轉的使用程序和工程文件免費下載。
2019-11-04 08:00:002
電機正反轉 如何確定電機正反轉
電機正反轉是指電機順時針轉動和逆時針轉動。電機順時針轉動是電機正轉,電機逆時針轉動是電機反轉,實現電機的正反轉,只需接至電機三相電源進線中的任意兩相對調接線,即可達到電機正反轉。
2021-07-15 15:34:0257929
單片機控制步進電機
簡介:用單片機控制步進電機正轉 反轉 加速 減速;由LCD1602實時顯示步進電機的狀態;F-正轉,B-反轉;數字越大,轉速越大;仿真原理圖如下:MCU和LCD1602顯示模塊:ULN2803驅動
2021-11-10 19:51:0111
基于51單片機下通過藍牙串口控制LCD1602屏幕顯示步進電機正反轉以及轉速
通過藍牙串口控制LCD1602屏幕顯示正反轉以及轉速簡 述:通過藍牙串口發送指定數據到STC89C52RC單片機,控制28BYJ-48步進電機正轉或者反轉或者速度的快中慢,然后51單片機,做相應
2021-11-13 19:51:0120
51單片機:proteus仿真1602LCD的顯示
基于keilC51和proteus實現1602LCD的顯示這是我自己用proteus仿真學習了1602的中英文顯示后自己的一些感悟和經驗總結,歡迎討論交流1602lcd的介紹1.引腳定義主要要注意
2021-11-23 17:51:3418
步進電機控制實驗
正轉;按下“Negitive(反轉)” 按鍵時,控制步進電機反
轉;按下“加速”按鍵時,控制步進電機加速;按下“減速” 按鍵時,控制步進電機減速。4位數碼管,左邊兩位顯示正反
轉,正轉顯示“11”,反轉顯示“00”,右邊兩位顯示轉速檔次,步進電機的轉速1~30檔在右邊兩位
2023-03-21 15:25:243
開環步進電機控制系統
。 ②中斷方式的轉動。 ③啟停。按KK1+鍵控制步進電機的啟動。按KK2+鍵控制步進電機的停止。 ④正反轉。開關K7控制步進電機的正反轉。當K7向下撥時,電機正轉(順時針);向上撥時,電機反轉(逆時針)。 ⑤在LED數碼管上顯示速度編號。K0對
2023-03-23 10:56:581
基于51單片機步進電機控速正反轉proteus仿真
作為電機
驅動;可通過按鍵控制正反轉及速度;四位數碼管第1位顯示電機的正反轉,第3位和第4位顯示電機運行速度的檔數;五個紅色LED,一個為電源指示,四個指示電機的轉速。
2023-03-24 11:39:014
ARM920T實驗箱s3c2410矩陣按鍵控制步進電機正反轉和停止
ARM920T實驗箱s3c2410 矩陣按鍵控制步進電機正反轉和停止 問題描述 矩陣按鍵控制 思路 配置輸入輸出 按鍵掃描步進電機控制 完整代碼 問題描述 按下第一個按鍵使步進電機可以正轉、第二個
2023-03-24 09:46:280
STM32F103RCT6利用ULN2003驅動步進電機正反轉
接通電源后,電機開始正轉,轉夠一圈后,電機開始反轉,同時在OLED上會顯示forward和reverse分別表示正反轉
器件 :STM32F103RCT6,OLED屏,十根杜邦線 ,ULN2003步進電機拓展版,28BYJ-48步進電機
2023-03-24 09:55:205
電機正反轉故障點有哪些
電機正反轉故障點有哪些 電機正反轉故障是在工業生產中常見的一種故障。電機正反轉是電機作業的基礎,如果出現故障,會導致產品不能正常進行加工,直接影響生產效率與質量。因此,本文將從以下幾點詳細闡述電機
2023-08-28 17:42:563194
步進電機正反轉的換線方法
步進電機正反轉的換線方法 步進電機是一種常見的電機類型,它具有正反轉的能力。換線是指改變步進電機的電源連接方式,以改變其運動方向。換線方法有很多種,下面將詳細介紹其中一種常見的換線方法。 步進電機
2024-01-23 14:45:51659
評論
查看更多