51hei.png (19.25 KB, 下載次數: 24)
下載附件
2021-6-7 14:46 上傳
步進電機控制LCD1602顯示電路.JPG (136.57 KB, 下載次數: 40)
下載附件
2019-6-8 00:04 上傳
#include "AT89X51.h"
//#include <reg52.h>
#include <intrins.h>
//#define RIGHT_RUN 1 //正轉值
//#define LEFT_RUN 0 //反轉值
unsigned char i,j;
unsigned char date,da,m=1;
unsigned char SPEED[4];
unsigned int RunSpeed=50; //速度
//unsigned char RunState=RIGHT_RUN; //運行狀態
/***********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.數據端口
//內部等待函數**************************************************************************
unsigned char LCD_Wait(void)
{
LcdRs=0;
LcdRw=1; _nop_();
LcdEn=1; _nop_();
LcdEn=0;
return DBPort;
}
//向LCD寫入命令或數據************************************************************
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光標返回原點
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();
}
//設置顯示模式************************************************************
#define LCD_SHOW 0x04 //顯示開
#define LCD_HIDE 0x00 //顯示關
#define LCD_CURSOR 0x02 //顯示光標
#define LCD_NO_CURSOR 0x00 //無光標
#define LCD_FLASH 0x01 //光標閃動
#define LCD_NO_FLASH 0x00 //光標不閃動
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
//設置輸入模式************************************************************
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 畫面可平移
#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位數據端口,2行顯示,5*7點陣
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //開啟顯示, 無光標
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫面不動
}
//液晶字符輸入的位置************************
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++;
}
}
//******************串口初始化函數****************************//
Initial_com()
{
EA=1; //開總中斷
ES=1; //允許串口中斷
ET1=1; //允許定時器T1的中斷
TMOD=0x20; //定時器T1,在方式3中斷產生波特率
PCON=0x00; //SMOD=0
SCON=0x50;
TH1=0xfd; //波特率設置為9600(晶振12M)
TL1=0xfd;
TR1=1; //開定時器T1運行控制位
}
/***************************************************/
//1ms延時程序
void clock(unsigned int Delay)
{ unsigned int i;
for(;Delay>0;Delay--)
for(i=0;i<124;i++);
}
//速度數據轉換成液晶顯示字符********
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顯示數據***********************
void LCD_show()
{
DoSpeed_to_str(); //轉換成液晶顯示字符
GotoXY(10,0); //液晶字符顯示位置
Print(SPEED); //顯示速度值
GotoXY(0,0); //液晶字符顯示位置
Print("RUN SPEED:"); //顯示"SPEED:"
GotoXY(0,1); //液晶字符顯示位置
Print("RUN STATE:"); //顯示"RUN STATE:"
}
/***************主程序**************/
main()
{
P0_2=1; //開機默認狀態為運轉
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; //串口控制正轉
if(da==0x33)
{
// RunState=RIGHT_RUN;
P0_0=1;
// P1=0x01;
GotoXY(10,1); //液晶字符顯示位置
Print(" CW"); //顯示"CW"
}
da=date&0xb4; //串口控制反轉
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; //串口控制運轉
if(da==0x36)
{
P0_2=1;
}
RI=0; //清除接收中斷標志
}
if(P3_4==0)//按鍵控制反轉
{
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)//按鍵控制正轉
{
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)//停止控制(測試)
{
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); //延時(控制脈沖寬度,從而調節步進電機運行速度)
P0_1=P0_1^0x01; //P0_1取反(產生控制脈沖)
LCD_show(); //LCD顯示
}
else
{
GotoXY(10,0); //液晶字符顯示位置
Print("000"); //顯示"000"
}
}
}
串口通信控制步進電機(源程序).zip
(52.49 KB, 下載次數: 80)
2019-6-8 00:10 上傳
點擊文件名下載附件
串口通信控制步進電機源程序 下載積分: 黑幣 -5
Proteus7.5才能打開:
步進電機控制仿真.zip
(24.14 KB, 下載次數: 68)
2019-6-8 00:10 上傳
點擊文件名下載附件
串口通信控制步進電機仿真 下載積分: 黑幣 -5
|