久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5160|回復: 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, 下載次數: 80)
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 少妇av片 | av国产精品 | 亚洲精品18| 超碰人人在线 | 久久久区 | 手机看黄av免费网址 | 午夜成人在线视频 | 久久国产一区 | 国产精品欧美一区二区三区不卡 | 粉嫩一区二区三区国产精品 | 日韩精品一区在线观看 | 欧美在线看片 | 一区二区三区视频在线观看 | 九九九久久国产免费 | 天堂一区二区三区四区 | 国产乱码精品一品二品 | 日韩精品极品视频在线观看免费 | 精品日韩一区二区 | 欧美成人一区二区 | www免费视频 | 久久久久久亚洲精品 | 在线91| 亚洲91精品 | aaa大片免费观看 | 91国产精品在线 | 99re在线视频 | 黄网站免费在线看 | 日韩不卡在线 | 欧美日韩一区二区三区四区 | 91视频在线网站 | 色婷婷激情 | 久久99视频免费观看 | 精品乱人伦一区二区三区 | 视频精品一区 | 国产高清久久 | 中文字幕视频在线观看 | 亚洲高清免费观看 | 国产在线一区观看 | 日韩a在线 | 激情婷婷 | 日屁网站 |