標題: 【求助】跪求大神給修改現(xiàn)有程序 [打印本頁]

    作者: 412489601    時間: 2016-10-24 16:09
    標題: 【求助】跪求大神給修改現(xiàn)有程序
    本帖最后由 412489601 于 2016-10-24 16:45 編輯

    求助修改現(xiàn)有程序?qū)崿F(xiàn):【1】啟動仿真5S后,數(shù)碼管個位和十位顯示AT89C51接收到74LS165發(fā)來的數(shù)據(jù)中高電平數(shù)量;
    【2】當按鍵啟動鍵按下后,步進電機啟動(啟動后計時),直至某一時間手動改變74LS165接收端按鍵值,判斷之前的值和手動改變的值前后之間的運行時間,并且顯示在數(shù)碼管的百位和千位;
    【3】當按鍵反向鍵按下后,步進電機運行5S后程序初始化;
    【備注】:程序及仿真已上傳跪求大神多多指點
    基本程序已上傳
    #include<reg51.h>
    #include<intrins.h>
    /********************************************************************************************************
    **                         Marcos define
    *********************************************************************************************************/
    #define uint  unsigned int
    #define uchar unsigned char
    #define MotorTabNum 5

    //IO設(shè)置
    sbit QH    = P3^0;         //輸出端
    sbit CLK74 = P3^1;  //時鐘輸入端(上升沿有效)
    sbit SPL   = P3^2;  //移位控制/置入控制(低電平有效)
    //步進電機
    sbit K1 = P3^5;        // 啟動
    sbit K2 = P3^7;        // 反向
    //數(shù)碼管
    /*
    sbit SMG1 = P2^0;                                        //數(shù)碼管第一位定義
    sbit SMG2 = P2^1;                                        //數(shù)碼管第二位定義
    sbit SMG3 = P2^2;                                        //數(shù)碼管第三位定義
    sbit SMG4 = P2^3;                                        //數(shù)碼管第四位定義
    */
    //74LS165
    sbit FX      = P2^4;     // 方向
    sbit MotorEn = P2^5;     // 使能
    sbit CLK     = P2^6;     // 脈沖

    //電機狀態(tài)
    unsigned char T0_NUM;
    unsigned char g_MotorSt = 0;     // 啟停
    unsigned char g_MotorDir = 0;    // 正反
    //電機轉(zhuǎn)速
    unsigned char MotorTab[6] = {12, 10, 8, 6, 4, 2};
    //共陰極數(shù)碼管段值
    //int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};          

    signed char g_MotorNum = 0;

    void delayms(xms);
    void mDelay(unsigned int DelayTime);                //延時函數(shù)
    void T0_Init();

    void KeyScan(void);
    /********************************************************************************************************
    * Function Name  : read_int165
    * Description    : 接收數(shù)據(jù)
    * Input          : None
    * Output         : None
    * Return         : None
    ********************************************************************************************************/                     
    uint read_int165(void)
    {
      uchar i  = 0;
      uint read_data = 0;

      SPL           = 0;          //置數(shù),讀入并行輸入口數(shù)據(jù)        
      _nop_();
      SPL           = 1;                 //移位,并口輸入被封鎖,串行轉(zhuǎn)換開始
      _nop_();


      for(i=0;i<16;i++)        //16位數(shù)據(jù)
      {
         read_data <<= 1;
         if(QH)
             {
                     read_data|=QH;
             }
                 CLK74=0;           //下降沿      
                 _nop_();
                CLK74=1;           //上升沿      
                 _nop_();
      }
      return read_data;
    }
    /********************************************************************************************************
    * Function Name  : main
    * Description    : 主函數(shù)
    * Input          : None
    * Output         : None
    * Return         : None
    ********************************************************************************************************/
    void main()
    {
      //初始化值
      uint  temp  = 0;
      uchar tempH = 0;
      uchar tempL = 0;
      CLK74=0;

      T0_Init();  // 定時器0 初始化
      MotorEn = 0;// L297 使能(只有使能,才能正常工作,否則停止)
      FX = 1;          //正反轉(zhuǎn)
      while(1)
      {
        temp  = read_int165();
    //    tempH = (uchar) (temp>>8);//獲取高8位,存放置tempH        
    //    tempL = (uchar) temp;          //獲取低8位,存放置tempL         
    //    P0=tempH;  //接收到的字節(jié)顯示在P0 端口,顯示的值與撥碼開關(guān)對應(yīng)
    //    P1=tempL;  //接收到的字節(jié)顯示在P1 端口,顯示的值與撥碼開關(guān)對應(yīng)

            KeyScan();//掃描按鍵
      }
    }
    /********************************************************************************************************
    * Function Name  : T0_Init
    * Description    : 定時器初始化
    * Input          : None
    * Output         : None
    * Return         : None
    ********************************************************************************************************/
    void T0_Init()
    {
            TMOD = 0x01;
            TH0  = (65535-100)/256;  // 1ms
            TL0  = (65535-100)%256;
            EA   = 1;
            ET0  = 1;
            TR0  = 1;

    }
    /********************************************************************************************************
    * Function Name  : T0_time
    * Description    : 定時器中斷
    * Input          : None
    * Output         : None
    * Return         : None
    ********************************************************************************************************/
    void T0_time() interrupt 1
    {
            TR0 = 0;
            TH0 = (65535-100)/256;   
            TL0 = (65535-100)%256;
            T0_NUM++;
            if(T0_NUM >= MotorTab[g_MotorNum])        // 增加按鍵g_MotorNum++   減小按鍵g_MotorNum--
            {
                    T0_NUM = 0;
                    CLK=CLK^0x01;               // 輸出脈沖
            }
            TR0 = 1;
    }         
    /********************************************************************************************************
    * Function Name  : KeyScan
    * Description    : 按鍵控制
    * Input          : None
    * Output         : None
    * Return         : None
    ********************************************************************************************************/
    void KeyScan(void)
    {
            if(K1==0 && K2==1)                // 僅KEY1 按下
            {
                    delayms(10);                  // 軟件延時消抖
                    if(K1==0 && K2==1)  
                    {
                            MotorEn ^= 1;       
                            TR0 = 1;
                    }
            }
            if(K1==1 && K2==0)                // 僅KEY2 按下
            {
                    delayms(5);                   // 軟件延時消抖
                    if(K1==1 && K2 == 0)
                    {
                            FX ^= 1;                  //改變方向
                            while(!K2);       
                    }
            }
    }
    /********************************************************************************************************
    * Function Name  : Display
    * Description    : 數(shù)碼管顯示
    * Input          : None
    * Output         : None
    * Return         : None
    ********************************************************************************************************/
    /*void Display(void)
    {
            unsigned char B1,B2,B3,B4; //定義數(shù)碼管的每一位
            B1=g_MotorNum/1000;                   //取g_MotorNum的千位       
        B2=g_MotorNum%1000/1000;   //取g_MotorNum的百位       
            B3=g_MotorNum%100/10;           //取g_MotorNum的十位       
        B4=g_MotorNum%10;                   //取g_MotorNum的個位
            //顯示千位
            P0=table[B1];
            SMG1=0;                                                         
        delayms(3);
        SMG1=1;
            //顯示百位
            P0=table[B2];
            SMG2=0;                                                         
            delayms(3);
            SMG2=1;
            //顯示十位
            P0=table[B3];
            SMG3=0;                                                         
            delayms(3);
            SMG3=1;
            //顯示個位
            P0=table[B4];
        SMG4=0;
        delayms(3);                                                 
        SMG4=1;
    }*/       
    /********************************************************************************************************
    * Function Name  : delayms
    * Description    : 延時函數(shù)
    * Input          : None
    * Output         : None
    * Return         : None
    ********************************************************************************************************/
    void delayms(xms)
    {
             unsigned int x,y;
             for(x=xms;x>0;x--)
                     for(y=110;y>0;y--);
    }
    /*********************************************************************************************************
    **                            End Of File
    ********************************************************************************************************/

    QQ圖片20161024160856.png (59.86 KB, 下載次數(shù): 123)

    仿真圖紙

    仿真圖紙

    QQ圖片20161024162914.png (87.68 KB, 下載次數(shù): 108)

    程序截圖

    程序截圖

    74LS165測試版本B.zip

    82.2 KB, 下載次數(shù): 7


    作者: 412489601    時間: 2016-10-24 16:27
    基本程序已經(jīng)上傳,跪求大神幫忙....
    作者: zl2168    時間: 2016-10-25 20:02
    本帖最后由 zl2168 于 2016-10-25 20:07 編輯

    你上傳的帖子目標不明確、要求不明確,沒法幫忙。
    單片機雖然有點難,但是也有便利之處。反觀你的電路,主要有3部分組成:165串行輸入,步進電機驅(qū)動,4位數(shù)碼動態(tài)顯示。
    建議你將3部分電路分別調(diào)試(這是可行的),調(diào)通后再組合,不要胡子眉毛一把抓,搞不清。

    作者: 412489601    時間: 2024-4-28 20:31
    已經(jīng)解決




    歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1