#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)
|