找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4557|回复: 4
打印 上一主题 下一主题
收起左侧

串口通信控制步进电机LCD1602显示程序及PROTEUS仿真

[复制链接]
跳转到指定楼层
楼主




#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, 下载次数: 79)
Proteus7.5才能打开:
步进电机控制仿真.zip (24.14 KB, 下载次数: 68)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:915366 发表于 2021-6-7 14:09 | 只看该作者
楼主 你的Proteus仿真程序怎么打开呀
回复

使用道具 举报

板凳
ID:915366 发表于 2021-6-7 14:11 | 只看该作者
没有工程文件
回复

使用道具 举报

地板
ID:328014 发表于 2021-6-7 14:45 | 只看该作者

步进电机仿真.DSN 这个是Proteus7.5版本的工程文件 需要安装Proteus7.5
回复

使用道具 举报

5#
ID:915366 发表于 2021-6-7 21:36 | 只看该作者
51hei团团 发表于 2021-6-7 14:45
步进电机仿真.DSN 这个是Proteus7.5版本的工程文件 需要安装Proteus7.5

已经解决了 我用的8.8 可以导入旧版本的原理图文件 很丝滑
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表