演示照片:
[演示程序(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
評論