|
51hei.png (19.25 KB, 下載次數(shù): 24)
下載附件
2021-6-7 14:46 上傳
步進(jìn)電機(jī)控制LCD1602顯示電路.JPG (136.57 KB, 下載次數(shù): 40)
下載附件
2019-6-8 00:04 上傳
#include "AT89X51.h"
//#include <reg52.h>
#include <intrins.h>
//#define RIGHT_RUN 1 //正轉(zhuǎn)值
//#define LEFT_RUN 0 //反轉(zhuǎn)值
unsigned char i,j;
unsigned char date,da,m=1;
unsigned char SPEED[4];
unsigned int RunSpeed=50; //速度
//unsigned char RunState=RIGHT_RUN; //運(yùn)行狀態(tài)
/***********1602液晶顯示部分子程序****************/
//Port Definitions**********************************************************
sbit LcdRs = P2^0;
sbit LcdRw = P2^1;
sbit LcdEn = P2^2;
sfr DBPort = 0x90; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口
//內(nèi)部等待函數(shù)**************************************************************************
unsigned char LCD_Wait(void)
{
LcdRs=0;
LcdRw=1; _nop_();
LcdEn=1; _nop_();
LcdEn=0;
return DBPort;
}
//向LCD寫入命令或數(shù)據(jù)************************************************************
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光標(biāo)返回原點(diǎn)
void LCD_Write(bit style, unsigned char input)
{
LcdEn=0;
LcdRs=style;
LcdRw=0; _nop_();
DBPort=input; _nop_();//注意順序
LcdEn=1; _nop_();//注意順序
LcdEn=0; _nop_();
LCD_Wait();
}
//設(shè)置顯示模式************************************************************
#define LCD_SHOW 0x04 //顯示開(kāi)
#define LCD_HIDE 0x00 //顯示關(guān)
#define LCD_CURSOR 0x02 //顯示光標(biāo)
#define LCD_NO_CURSOR 0x00 //無(wú)光標(biāo)
#define LCD_FLASH 0x01 //光標(biāo)閃動(dòng)
#define LCD_NO_FLASH 0x00 //光標(biāo)不閃動(dòng)
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
//設(shè)置輸入模式************************************************************
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 畫(huà)面可平移
#define LCD_NO_MOVE 0x00 //default
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
//初始化LCD************************************************************
void LCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //開(kāi)啟顯示, 無(wú)光標(biāo)
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫(huà)面不動(dòng)
}
//液晶字符輸入的位置************************
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
//將字符輸出到液晶顯示
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
//******************串口初始化函數(shù)****************************//
Initial_com()
{
EA=1; //開(kāi)總中斷
ES=1; //允許串口中斷
ET1=1; //允許定時(shí)器T1的中斷
TMOD=0x20; //定時(shí)器T1,在方式3中斷產(chǎn)生波特率
PCON=0x00; //SMOD=0
SCON=0x50;
TH1=0xfd; //波特率設(shè)置為9600(晶振12M)
TL1=0xfd;
TR1=1; //開(kāi)定時(shí)器T1運(yùn)行控制位
}
/***************************************************/
//1ms延時(shí)程序
void clock(unsigned int Delay)
{ unsigned int i;
for(;Delay>0;Delay--)
for(i=0;i<124;i++);
}
//速度數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符********
void DoSpeed_to_str()
{
SPEED[0]=(1000*6/RunSpeed/100)+48;
SPEED[1]=1000*6/RunSpeed%100/10+48;
SPEED[2]=1000*6/RunSpeed%10+48;
SPEED[3]='\0';
}
//LCD顯示數(shù)據(jù)***********************
void LCD_show()
{
DoSpeed_to_str(); //轉(zhuǎn)換成液晶顯示字符
GotoXY(10,0); //液晶字符顯示位置
Print(SPEED); //顯示速度值
GotoXY(0,0); //液晶字符顯示位置
Print("RUN SPEED:"); //顯示"SPEED:"
GotoXY(0,1); //液晶字符顯示位置
Print("RUN STATE:"); //顯示"RUN STATE:"
}
/***************主程序**************/
main()
{
P0_2=1; //開(kāi)機(jī)默認(rèn)狀態(tài)為運(yùn)轉(zhuǎn)
LCD_Initial(); //液晶初始化
clock(100);
GotoXY(10,1); //液晶字符顯示位置
Print(" CW"); //顯示"CW"
Initial_com(); //串口初始化
while(1)
{
if(RI)
{
date=SBUF; //串口接收
if(date!=0x39)
SBUF=date;
da=date&0xb1; //串口控制加速
if(da==0x31)
{
if(RunSpeed>=12)
RunSpeed=RunSpeed-2;
// P1=0x01;
}
da=date&0xb2; //串口控制減速
if(da==0x32)
{
if(RunSpeed<=100)
RunSpeed=RunSpeed+2;
// P1=0x01;
}
da=date&0xb3; //串口控制正轉(zhuǎn)
if(da==0x33)
{
// RunState=RIGHT_RUN;
P0_0=1;
// P1=0x01;
GotoXY(10,1); //液晶字符顯示位置
Print(" CW"); //顯示"CW"
}
da=date&0xb4; //串口控制反轉(zhuǎn)
if(da==0x34)
{
// RunState=LEFT_RUN;
P0_0=0;
// P1=0x01;
GotoXY(10,1); //液晶字符顯示位置
Print("CCW"); //顯示"CCW"
}
da=date&0xb5; //串口控制停止
if(da==0x35)
{
P0_2=0;
}
da=date&0xb6; //串口控制運(yùn)轉(zhuǎn)
if(da==0x36)
{
P0_2=1;
}
RI=0; //清除接收中斷標(biāo)志
}
if(P3_4==0)//按鍵控制反轉(zhuǎn)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P3_4==0)
{
// RunState=LEFT_RUN;
P0_0=0;
// P1=0x01;
GotoXY(10,1); //液晶字符顯示位置
Print("CCW"); //顯示"CCW"
while(P3_4==0);
}
}
if(P3_5==0)//按鍵控制正轉(zhuǎn)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P3_5==0)
{
// RunState=RIGHT_RUN;
P0_0=1;
// P1=0x01;
GotoXY(10,1); //液晶字符顯示位置
Print(" CW"); //顯示"CW"
while(P3_5==0);
}
}
if(P3_2==0)//按鍵控制加速
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P3_2==0)
{
if(RunSpeed>=12)
RunSpeed=RunSpeed-2;
// P1=0x01;
while(P3_2==0);
}
}
if(P3_3==0)//按鍵控制減速
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P3_3==0)
{
if(RunSpeed<=100)
RunSpeed=RunSpeed+2;
// P1=0x01;
while(P3_3==0);
}
}
/*
if(P3_6==0)//停止控制(測(cè)試)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P3_6==0)
{
++m;
m=m%2;
if(m)
P0_2=0;
else
P0_2=1;
while(P3_6==0);
}
}
*/
if(P0_2)
{
clock(RunSpeed); //延時(shí)(控制脈沖寬度,從而調(diào)節(jié)步進(jìn)電機(jī)運(yùn)行速度)
P0_1=P0_1^0x01; //P0_1取反(產(chǎn)生控制脈沖)
LCD_show(); //LCD顯示
}
else
{
GotoXY(10,0); //液晶字符顯示位置
Print("000"); //顯示"000"
}
}
}
串口通信控制步進(jìn)電機(jī)(源程序).zip
(52.49 KB, 下載次數(shù): 80)
2019-6-8 00:10 上傳
點(diǎn)擊文件名下載附件
串口通信控制步進(jìn)電機(jī)源程序 下載積分: 黑幣 -5
Proteus7.5才能打開(kāi):
步進(jìn)電機(jī)控制仿真.zip
(24.14 KB, 下載次數(shù): 68)
2019-6-8 00:10 上傳
點(diǎn)擊文件名下載附件
串口通信控制步進(jìn)電機(jī)仿真 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|