找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2711|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)程序改造,給辛苦費(fèi)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本帖最后由 sdwfmt 于 2018-4-26 13:29 編輯

目前已經(jīng)有了利用單片機(jī)控制步進(jìn)電機(jī)的延時(shí)(按秒)、轉(zhuǎn)動(dòng)角度、等,需要在這個(gè)基礎(chǔ)上加上 一天三次啟動(dòng)的定時(shí)系統(tǒng)。有沒(méi)有碼農(nóng)知道怎么搞定的?

源程序如下:
#include<reg52.h>
#include<stdio.h>
#include "lcd1602.h"
#include "eeprom.h"


#define   N_ADDRESS                 3
#define   DIR_ADDRESS               7
#define   SPEED_ADDRESS            12
#define   SET_ANGLE_ADDRESS         5
#define   SET_TIME_ADDRESS         12   

#define   MAX_PAGE                                    10   // 最大節(jié)點(diǎn)數(shù)
#define   T0_INIT_DATA_10          100
#define   T0_INIT_DATA_50ms        50000


#define   Two_XiFen_Clk              400



unsigned char T0_NUM;
unsigned char T0_NUM_2;
unsigned char END_FLAG = 0;
unsigned char END_FLAG_2 = 0;
unsigned char S_FLAG = 0;


sbit SW1=P3^0;                        //四個(gè)獨(dú)立按鍵定義
sbit SW2=P3^1;
sbit SW5=P3^2;
sbit SW4=P3^3;           // 暫調(diào)試
sbit SW3=P3^4;       


/*
sbit SW1=P1^3;                        //四個(gè)獨(dú)立按鍵定義
sbit SW2=P1^4;
sbit SW4=P1^2;
sbit SW5=P1^5;          
sbit SW3=P1^6;
*/       


sbit MotorEn = P2^1;     // 使能
sbit FX = P2^0;          // 方向
sbit CLK = P2^2;         // 脈沖


unsigned char g_MotorSt = 0;     // 啟停
unsigned char g_MotorDir = 0;    // 正反
unsigned int CLK_OUT_NUM = 0;         // 脈沖計(jì)數(shù)
signed int MotorSpedNum = 0;      // 速度檔
//float CUR_MotorAngle = 0.0;   // 當(dāng)前角度

unsigned int CUR_MotorSpedQuan = 0;   // 當(dāng)前圈數(shù)
//unsigned int SET_MotorQuan = 0;       //
//unsigned int SET_MotorPulse = 0;
unsigned int CUR_Miao = 0;

unsigned int T0_INIT_DATA = 10;


unsigned char cMode = 0;
unsigned char s1_num;
unsigned int iSetData;
//signed char RL = 0;         // 方向
//signed char iSet[3];
unsigned int SYS_NUM = 0;

unsigned char MotorTab[10] = {63, 42, 27, 18, 12, 8, 5, 3, 2};
//unsigned char MotorTab[10] = {25, 20, 16, 13, 9, 6, 4, 2, 1};

//unsigned int MotorSpedTab[6] = {400, 800, 1600, 3200, 6400, 12800};

//unsigned char MotorTab[10] = {63, 42, 27, 18, 12, 8, 5, 3, 2};

//unsigned int MotorSeparateTab[5] = {1, 2, 8, 16, 64};  // 細(xì)分

signed char EEPROM_Tab[8] = {0, 0, 0, 0, 0, 0, 0, 0};


unsigned char cur_page;            
signed char page_num;                   
signed char set_page_num[2];          

signed char set_jd_bai, set_jd_shi, set_jd_ge;
signed char set_sj_bai, set_sj_shi,        set_sj_ge;

/********數(shù)據(jù)定義***********************************************************/
struct DataNum       
{
        signed char        set_fx;             // 方向
        signed char        set_sd;             // 速度
        signed int        set_jd;             // 角度
        signed int set_time;     // 間隔
};

struct DataNum StepData[7];         // 注意: 因?yàn)镾TC89C52芯片容量有限,這里采用最大7組連貫動(dòng)作

//--------------
void delayms(xms);
void mDelay(unsigned int DelayTime);                //延時(shí)函數(shù)
void EEPROM_Init();
void SYS_Init();
void T0_Init();
void LCD_Init();

void PageProcess(unsigned char ac_page);
void EEPROM_DATA(unsigned char ac_page);
void EEPROM_READ(unsigned char ac_page);

void KeyScan(void);
void Stop_Key();
void KeyProcess();
void SecondPro();
void SecondPro_2();


// 主程序  main()
void main(void)
{
        SYS_Init();   // 參數(shù)初始化
        EEPROM_Init();    // 讀取數(shù)據(jù)
        T0_Init();             // 定時(shí)器0 初始化
        LCD_Init();      // 顯示初始化   
        while(1)
        {         

                if (!cMode)                // 空閑模式下                                                                                                                                                                                                                                                                                                                                                                       
                {
                        KeyScan();              // 按鍵
                }               

                KeyProcess();        // 處理進(jìn)程
        }

}


// 參數(shù)初始化
void SYS_Init()
{
        MotorEn = 0;     // 使能
        page_num = 0;         // 節(jié)點(diǎn)數(shù)
        cur_page = 0;   //當(dāng)前頁(yè)面數(shù)
        set_page_num[0] = set_page_num[1] = 0; // 節(jié)點(diǎn)2位小數(shù)
}

/********定時(shí)器初始化***********************************************************/
void T0_Init()
{
        TMOD = 0x01;
        TH0 = (65535-100)/256;  // 0.1ms
        TL0 = (65535-100)%256;
        EA = 1;
        ET0 = 1;
}

// 液晶顯示初始化
void LCD_Init()
{
        init_1602();                                           //lcd1602初始化
    write_string(1, 1, "Enter Step Num");
        write_string(2,3,"Step:");
        write_sf(2,9,page_num);
}

/************存儲(chǔ)初始化*****************/
void EEPROM_Init()
{
       
        EEPROM_READ(cur_page);

}

/********定時(shí)器中斷*****************/
void T0_time() interrupt 1
{
TR0 = 0;
       
//        TH0 = (65535-T0_INIT_DATA)/256;           // 0.1ms
//        TL0 = (65535-T0_INIT_DATA)%256;

/*        TH0 = (65535-100)/256;           // 0.1ms
        TL0 = (65535-100)%256;
        T0_NUM++;
        */          
//        SYS_NUM++;
       
        if (cMode == 6)           // 間隔模式
        {
                TH0 = (65535-50000)/256;           // 50ms
                TL0 = (65535-50000)%256;
                if (StepData[cur_page-1].set_time > 0)
                {
                        T0_NUM_2++;       
                        if (T0_NUM_2 >= 20)
                        {
                                T0_NUM_2 = 0;
                                CUR_Miao++;
                                if (CUR_Miao >= StepData[cur_page-1].set_time)         // 達(dá)到目標(biāo)
                                {
                                        CUR_Miao = 0;
                                        TR0 = 0;         // 關(guān)閉定時(shí)器
                                        END_FLAG_2 = 1;  // 時(shí)間目標(biāo)達(dá)到標(biāo)志
                                }       
                        }               
                }
                else
                {
                                        CUR_Miao = 0;
                                        TR0 = 0;         // 關(guān)閉定時(shí)器
                                        END_FLAG_2 = 1;  // 時(shí)間目標(biāo)達(dá)到標(biāo)志               
                }

        }
        else if (cMode == 4)  // 電機(jī)運(yùn)行模式
        {
                TH0 = (65535-100)/256;           // 0.1ms
                TL0 = (65535-100)%256;
                T0_NUM++;
                if (StepData[cur_page-1].set_jd > 0)
                {
                //        if(T0_NUM >= MotorTab[StepData[cur_page-1].set_sd])                   MotorSpedTab
                        if(T0_NUM >= MotorTab[StepData[cur_page-1].set_sd])               
                //        if(T0_NUM >= MotorTab[9])       
                        {
                                T0_NUM = 0;
                                CLK=CLK^0x01;               //   輸出脈沖
                                CLK_OUT_NUM++;         

                                if (S_FLAG)
                                {
                                        if(CLK_OUT_NUM > 30)          // 高速時(shí)給個(gè)加速過(guò)程
                                        {
                                                StepData[cur_page-1].set_sd = StepData[cur_page-1].set_sd + 1;
                                                S_FLAG = 0;
                                        }                       
                                }       
                               
                                if(CLK_OUT_NUM >= Two_XiFen_Clk)        // 一圈          2細(xì)分
                                {
                                         CLK_OUT_NUM = 0;
                                        CUR_MotorSpedQuan++;

                                        if(CUR_MotorSpedQuan >= StepData[cur_page-1].set_jd)   // 達(dá)到圈數(shù)
                                        {
                                                CLK_OUT_NUM = 0;       // 脈沖清空
                                                TR0 = 0;               // 關(guān)閉定時(shí)器
                                                END_FLAG = 1;          // 目標(biāo)達(dá)到標(biāo)志
                                                SYS_NUM = 0;               // 清空
                                        }
                                }
                                else
                                {
                                        ;
                                }
               
                        //        if(CLK_OUT_NUM >= SET_MotorPulse)        // 達(dá)到角度目標(biāo)
                        }               
                }
                else
                {
                                        CLK_OUT_NUM = 0;       // 脈沖清空
                                        TR0 = 0;               // 關(guān)閉定時(shí)器
                                        END_FLAG = 1;          // 目標(biāo)達(dá)到標(biāo)志
                                        SYS_NUM = 0;               // 清空               
                }
       
        }
        else
        {
                ;
        }

        TR0 = 1;

}

/********保持當(dāng)前頁(yè)數(shù)據(jù)*****************/
void EEPROM_DATA(unsigned char ac_page)
{
        if (ac_page == 0)
        {
                set_page_num[0] =  page_num / 10;
                set_page_num[1] =  page_num % 10;
                write_eeprom(SECTION_ADDRESS1,set_page_num,2);                // 保存總節(jié)點(diǎn)數(shù)
        }
        else if (ac_page > 0)
        {
                EEPROM_Tab[0] =  StepData[ac_page-1].set_fx;
                EEPROM_Tab[1] =  StepData[ac_page-1].set_sd;
                EEPROM_Tab[2] =  StepData[ac_page-1].set_jd / 100;
                EEPROM_Tab[3] =  StepData[ac_page-1].set_jd % 100 / 10;
                EEPROM_Tab[4] =  StepData[ac_page-1].set_jd % 10;
                EEPROM_Tab[5] =  StepData[ac_page-1].set_time / 100;
                EEPROM_Tab[6] =  StepData[ac_page-1].set_time % 100 / 10;       
                EEPROM_Tab[7] =  StepData[ac_page-1].set_time % 10;       

                switch (ac_page-1)
                {
                        case 0:
                                write_eeprom(SECTION_ADDRESS2,EEPROM_Tab,8);
                                break;
                        case 1:
                                write_eeprom(SECTION_ADDRESS3,EEPROM_Tab,8);
                                break;
                        case 2:
                                write_eeprom(SECTION_ADDRESS4,EEPROM_Tab,8);
                                break;
                        case 3:
                                write_eeprom(SECTION_ADDRESS5,EEPROM_Tab,8);
                                break;
                        case 4:
                                write_eeprom(SECTION_ADDRESS6,EEPROM_Tab,8);
                                break;
                        case 5:
                                write_eeprom(SECTION_ADDRESS7,EEPROM_Tab,8);
                                break;
                        case 6:
                                write_eeprom(SECTION_ADDRESS8,EEPROM_Tab,8);
                                break;
                        default:
                                break;
                }
        }
        else
        {
                ;
        }
}

/********讀取數(shù)據(jù)*****************/
void EEPROM_READ(unsigned char ac_page)
{
        if (ac_page == 0)
        {
                read_eeprom(SECTION_ADDRESS1,set_page_num,2);                // 保存總節(jié)點(diǎn)數(shù)
                if ((set_page_num[0] > 0) || (set_page_num[0] < 0))
                        set_page_num[0] = 0;
                if ((set_page_num[1] > 9) || (set_page_num[1] < 0))
                        set_page_num[1] = 0;
                page_num = set_page_num[0]*10 + set_page_num[1];
       
        //        read_eeprom(SECTION_ADDRESS1,page_num,2);                // 保存總節(jié)點(diǎn)數(shù)
        }
        else if (ac_page > 0)
        {
                switch (ac_page-1)
                {
                        case 0:
                                read_eeprom(SECTION_ADDRESS2,EEPROM_Tab,8);
                                break;
                        case 1:
                                read_eeprom(SECTION_ADDRESS3,EEPROM_Tab,8);
                                break;
                        case 2:
                                read_eeprom(SECTION_ADDRESS4,EEPROM_Tab,8);
                                break;
                        case 3:
                                read_eeprom(SECTION_ADDRESS5,EEPROM_Tab,8);
                                break;
                        case 4:
                                read_eeprom(SECTION_ADDRESS6,EEPROM_Tab,8);
                                break;
                        case 5:
                                read_eeprom(SECTION_ADDRESS7,EEPROM_Tab,8);
                                break;
                        case 6:
                                read_eeprom(SECTION_ADDRESS8,EEPROM_Tab,8);
                                break;
                        default:
                                break;
                }
                if ((EEPROM_Tab[0] > 1) || (EEPROM_Tab[0] < 0))
                        EEPROM_Tab[0] = 0;
                if ((EEPROM_Tab[1] > 9) || (EEPROM_Tab[1] < 0))
                        EEPROM_Tab[1] = 0;
                if ((EEPROM_Tab[2] > 9) || (EEPROM_Tab[2] < 0))
                        EEPROM_Tab[2] = 0;
                if ((EEPROM_Tab[3] > 9) || (EEPROM_Tab[3] < 0))
                        EEPROM_Tab[3] = 0;
                if ((EEPROM_Tab[4] > 9) || (EEPROM_Tab[4] < 0))
                        EEPROM_Tab[4] = 0;
                if ((EEPROM_Tab[5] > 9) || (EEPROM_Tab[5] < 0))
                        EEPROM_Tab[5] = 0;
                if ((EEPROM_Tab[6] > 9) || (EEPROM_Tab[6] < 0))
                        EEPROM_Tab[6] = 0;
                if ((EEPROM_Tab[7] > 9) || (EEPROM_Tab[7] < 0))
                        EEPROM_Tab[7] = 0;

                StepData[ac_page-1].set_fx = EEPROM_Tab[0];
                StepData[ac_page-1].set_sd = EEPROM_Tab[1];
                StepData[ac_page-1].set_jd =  EEPROM_Tab[2]*100 + EEPROM_Tab[3]*10 + EEPROM_Tab[4];
                StepData[ac_page-1].set_time =         EEPROM_Tab[5]*100 + EEPROM_Tab[6]*10 + EEPROM_Tab[7];
        }
        else
        {
                ;
        }
}





/********翻頁(yè)界面***********************************************************/
void PageProcess(unsigned char ac_page)
{
        write_string(1,0,"                ");
        write_string(2,0,"                ");
        write_string(1,1,"N:");                             // 顯示節(jié)點(diǎn)
        write_sf(1,3, (unsigned int)ac_page);       

        if(StepData[ac_page-1].set_fx == 0)            //顯示方向
                write_string(1,DIR_ADDRESS,"R");
        else
                write_string(1,DIR_ADDRESS,"L");

        write_string(1,10,"S:");                        // 顯示速度
        write_one_data(1,SPEED_ADDRESS, StepData[ac_page-1].set_sd);

        write_string(2,1,"set:");                       // 顯示圈數(shù)
        write_sfm(2, SET_ANGLE_ADDRESS, StepData[ac_page-1].set_jd);         

        write_string(2,10,"t:");                   // 顯示間隔
        write_sfm(2, SET_TIME_ADDRESS, StepData[ac_page-1].set_time);

}         


/********按鍵掃描函數(shù)***********************************************************/
void KeyScan()
{
        if(SW1 == 0)
        {
                delayms(10);
                if(SW1 == 0)   // 功能鍵
                {
                        while(!SW1);   // 等待松開(kāi)
                        cMode = 1;     // 功能模式       
               
                }
       
        }
        if(SW2 == 0)
        {
                delayms(10);
                if(SW2 == 0)   // 增加
                {
                        while(!SW2);   // 等待松開(kāi)
                    cMode = 2;
                }
       
        }
/*        if(SW3 == 0)
        {
                delayms(10);
                if(SW3 == 0)   // 減小
                {
                        while(!SW3);   // 等待松開(kāi)
                        cMode = 3;
                }
       
        } */
        if(SW4 == 0)               
        {
                delayms(10);
                if(SW4 == 0)   // 啟停
                {
                        while(!SW4);   // 等待松開(kāi)
                        cMode = 4;

                        if (StepData[cur_page-1].set_sd >= 9)
                        {
                                StepData[cur_page-1].set_sd = StepData[cur_page-1].set_sd - 1;
                                S_FLAG = 1;
                        }


                        g_MotorSt = 1;
                        MotorEn = 1;
                        cur_page = 1;  // 電機(jī)從第1個(gè)節(jié)點(diǎn)運(yùn)行
                       
                        EEPROM_READ(cur_page);        // 讀取數(shù)據(jù)  
                               
                        PageProcess(cur_page);        // 頁(yè)面更新
                //        CUR_MotorAngle = 0;
                        CUR_MotorSpedQuan = 0;
                        if(StepData[cur_page-1].set_fx == 0)
                        {
                                FX = 0;
                        }
                        else
                        {
                                FX = 1;
                        }

                        TR0 = 1;          // 定時(shí)器開(kāi)啟
                          
                }
       
        }
        if(SW5 == 0)
        {
                delayms(10);
                if(SW5 == 0)   // 翻頁(yè)
                {
                        while(!SW5);   // 等待松開(kāi)
                        cMode = 5;
                }
       
        }

}



void Stop_Key()
{
        if(SW4 == 0)
        {
                delayms(10);
                if(SW4 == 0)   // 啟停
                {
                        while(!SW4);   // 等待松開(kāi)
                        cMode = 0;
                       
                        g_MotorSt = 0;
                        MotorEn = 1;   // 繼續(xù)保持扭矩
                //        CUR_MotorAngle = 0;
                        CUR_MotorSpedQuan = 0;
                        TR0 = 0;
                          
                }
       
        }
}


/********按鍵處理函數(shù)***********************************************************/
void KeyProcess()
{
        switch(cMode)
        {
                case 0: // 空閑模式
                        break;
                case 1:         // 功能模式
                        {
                                s1_num++;       
                                cMode = 0;        // 功能模式
                                if(cur_page > 0)  // 各自界面中
                                {
                                        if(s1_num ==1)          // 第1次被按下
                                        {
                                                write_com(0x80+DIR_ADDRESS);                 // 方向
                                                write_com(0x0f);      // 光標(biāo)閃爍
                                        }
                                        if(s1_num ==2)
                                        {
                                                write_com(0x80+SPEED_ADDRESS);          
                                        }
                                        if(s1_num ==3)
                                        {
                                                write_com(0x80+0x40+SET_ANGLE_ADDRESS);          
                                        }
                                        if(s1_num ==4)
                                        {
                                                write_com(0x80+0x40+SET_ANGLE_ADDRESS+1);          
                                        }
                                        if(s1_num ==5)
                                        {
                                                write_com(0x80+0x40+SET_ANGLE_ADDRESS+2);          
                                        }
                                        if(s1_num ==6)         // 間隔
                                        {
                                                write_com(0x80+0x40+SET_TIME_ADDRESS);          
                                        }
                                        if(s1_num ==7)         
                                        {
                                                write_com(0x80+0x40+SET_TIME_ADDRESS+1);          
                                        }
                                        if(s1_num ==8)         
                                        {
                                                write_com(0x80+0x40+SET_TIME_ADDRESS+2);          
                                        }
                                        if(s1_num == 9)         //第9次退出
                                        {
                                                s1_num = 0;            // 記錄按鍵清零
                                                cMode = 0;             // 退出模式
                                                write_com(0x0c);           // 取消光標(biāo)閃爍

                                        //        SET_MotorPulse = (unsigned int)((StepData[cur_page-1].set_jd/0.9)*8.0);    // 脈沖
                                               
                                               
                                                EEPROM_DATA(cur_page);         //  保存數(shù)據(jù)
                                        }                               
                                }
                                else // 設(shè)定總節(jié)點(diǎn)界面
                                {
                                        if(s1_num ==1)          // 第1次被按下
                                        {
                                                write_com(0x80+0x40+9);          // 節(jié)點(diǎn)數(shù)目
                                                write_com(0x0f);      // 光標(biāo)閃爍
                                        }
                                        if(s1_num ==2)
                                        {
                                                write_com(0x80+0x40+10);          
                                        }
                                        if(s1_num == 3)         //第3次退出
                                        {
                                                s1_num = 0;            // 記錄按鍵清零
                                                cMode = 0;             // 退出模式
                                                write_com(0x0c);           // 取消光標(biāo)閃爍
                                                EEPROM_DATA(cur_page);         //  保存數(shù)據(jù)
                                        }                               
                                }

                       
                        }
                        break;
                case 2:         // 增加
                        {
                                cMode = 0;        // 功能模式
                                if(cur_page > 0)  // 各自界面中
                                {
                                        set_jd_bai = StepData[cur_page-1].set_jd / 100;       
                                        set_jd_shi = StepData[cur_page-1].set_jd % 100 / 10;       
                                        set_jd_ge = StepData[cur_page-1].set_jd % 10;
                                       
                                        set_sj_bai = StepData[cur_page-1].set_time / 100;       
                                        set_sj_shi = StepData[cur_page-1].set_time % 100 / 10;       
                                        set_sj_ge = StepData[cur_page-1].set_time % 10;       
                                        if(s1_num == 1)                 // 方向
                                        {
                                                StepData[cur_page-1].set_fx++;
                                                if(StepData[cur_page-1].set_fx > 1)
                                                        StepData[cur_page-1].set_fx = 0;
                                                if(StepData[cur_page-1].set_fx == 0)
                                                {
                                                //        FX = 0;
                                                        write_string(1, DIR_ADDRESS, "R");
                                                }
                                                else
                                                {
                                                //        FX = 1;
                                                        write_string(1, DIR_ADDRESS, "L");
                                                }
                                                write_com(0x80+DIR_ADDRESS);                                       
                                        }
                                        if(s1_num == 2)               // 速度
                                        {
                                                StepData[cur_page-1].set_sd++;
                                                if(StepData[cur_page-1].set_sd >= 10)
                                                {
                                                        StepData[cur_page-1].set_sd = 0;
                                                }
                                                write_one_data(1, SPEED_ADDRESS, StepData[cur_page-1].set_sd);
                                                write_com(0x80+SPEED_ADDRESS);                                       
                                        }
                                        if(s1_num == 3)                          // 角度   百
                                        {
                                                set_jd_bai++;
                                                if(set_jd_bai >= 10)
                                                        set_jd_bai = 0;
                                                StepData[cur_page-1].set_jd = set_jd_bai*100 + set_jd_shi*10 + set_jd_ge;
                                                write_sfm(2, SET_ANGLE_ADDRESS, StepData[cur_page-1].set_jd);
                                            write_com(0x80+0x40+SET_ANGLE_ADDRESS);
                                        }
                                        if(s1_num == 4)
                                        {
                                                set_jd_shi++;
                                                if(set_jd_shi >= 10)
                                                        set_jd_shi = 0;
                                                StepData[cur_page-1].set_jd = set_jd_bai*100 + set_jd_shi*10 + set_jd_ge;
                                                write_sfm(2, SET_ANGLE_ADDRESS, StepData[cur_page-1].set_jd);
                                            write_com(0x80+0x40+SET_ANGLE_ADDRESS+1);
                                        }
                                        if(s1_num == 5)
                                        {
                                                set_jd_ge++;
                                                if(set_jd_ge >= 10)
                                                        set_jd_ge = 0;
                                                StepData[cur_page-1].set_jd = set_jd_bai*100 + set_jd_shi*10 + set_jd_ge;
                                                write_sfm(2, SET_ANGLE_ADDRESS, StepData[cur_page-1].set_jd);
                                            write_com(0x80+0x40+SET_ANGLE_ADDRESS+2);
                                        }
                                        if(s1_num == 6)           // 時(shí)間間隔         百
                                        {
                                                set_sj_bai++;
                                                if(set_sj_bai >= 10)
                                                        set_sj_bai = 0;
                                                StepData[cur_page-1].set_time = set_sj_bai*100 + set_sj_shi*10 + set_sj_ge;
                                                write_sfm(2, SET_TIME_ADDRESS, StepData[cur_page-1].set_time);
                                            write_com(0x80+0x40+SET_TIME_ADDRESS);

                                        }
                                        if(s1_num == 7)
                                        {
                                                set_sj_shi++;
                                                if(set_sj_shi >= 10)
                                                        set_sj_shi = 0;
                                                StepData[cur_page-1].set_time = set_sj_bai*100 + set_sj_shi*10 + set_sj_ge;
                                                write_sfm(2, SET_TIME_ADDRESS, StepData[cur_page-1].set_time);
                                            write_com(0x80+0x40+SET_TIME_ADDRESS+1);                                       
                                        }
                                        if(s1_num == 8)
                                        {
                                                set_sj_ge++;
                                                if(set_sj_ge >= 10)
                                                        set_sj_ge = 0;
                                                StepData[cur_page-1].set_time = set_sj_bai*100 + set_sj_shi*10 + set_sj_ge;
                                                write_sfm(2, SET_TIME_ADDRESS, StepData[cur_page-1].set_time);
                                            write_com(0x80+0x40+SET_TIME_ADDRESS+2);                                       
                                        }                               
                               
                                }
                                else // 設(shè)定總節(jié)點(diǎn)界面
                                {
                                        if(s1_num == 1)                          // 十
                                        {
                                                set_page_num[0]++;
                                                if(set_page_num[0] >= 1)
                                                        set_page_num[0] = 0;
                                                page_num = set_page_num[0]*10 + set_page_num[1];
                                                write_sf(2, 9, page_num);
                                            write_com(0x80+0x40+9);
                                        }
                                        if(s1_num == 2)                 // 個(gè)
                                        {
                                                set_page_num[1]++;
                                                if(set_page_num[1] >= 6)
                                                        set_page_num[1] = 0;
                                                page_num = set_page_num[0]*10 + set_page_num[1];
                                                write_sf(2, 9, page_num);
                                            write_com(0x80+0x40+10);
                                        }                               
                                }

                        }
                        break;
                case 3:         // 減小
                        {
                                cMode = 0;        // 功能模式
                                if(cur_page > 0)
                                {
                                        set_jd_bai = StepData[cur_page-1].set_jd / 100;       
                                        set_jd_shi = StepData[cur_page-1].set_jd % 100 / 10;       
                                        set_jd_ge = StepData[cur_page-1].set_jd % 10;
                                       
                                        set_sj_bai = StepData[cur_page-1].set_time / 100;       
                                        set_sj_shi = StepData[cur_page-1].set_time % 100 / 10;       
                                        set_sj_ge = StepData[cur_page-1].set_time % 10;       

                                        if(s1_num == 1)                 // 方向
                                        {
                                                StepData[cur_page-1].set_fx--;
                                                if(StepData[cur_page-1].set_fx < 0)
                                                        StepData[cur_page-1].set_fx = 0;
                                                if(StepData[cur_page-1].set_fx == 0)
                                                {
                                                //        FX = 0;
                                                        write_string(1, DIR_ADDRESS, "R");
                                                }
                                                else
                                                {
                                                //        FX = 1;
                                                        write_string(1, DIR_ADDRESS, "L");
                                                }
                                                write_com(0x80+DIR_ADDRESS);                                       
                                        }
                                        if(s1_num == 2)               // 速度
                                        {
                                                StepData[cur_page-1].set_sd--;
                                                if(StepData[cur_page-1].set_sd < 0)
                                                {
                                                        StepData[cur_page-1].set_sd = 0;
                                                }
                                                write_one_data(1, SPEED_ADDRESS, StepData[cur_page-1].set_sd);
                                                write_com(0x80+SPEED_ADDRESS);                                       
                                        }
                                        if(s1_num == 3)                          // 百
                                        {
                                                set_jd_bai--;
                                                if(set_jd_bai < 0)
                                                        set_jd_bai = 9;
                                                StepData[cur_page-1].set_jd = set_jd_bai*100 + set_jd_shi*10 + set_jd_ge;
                                                write_sfm(2, SET_ANGLE_ADDRESS, StepData[cur_page-1].set_jd);
                                            write_com(0x80+0x40+SET_ANGLE_ADDRESS);
                                        }
                                        if(s1_num == 4)
                                        {
                                                set_jd_shi--;
                                                if(set_jd_shi < 0)
                                                        set_jd_shi = 9;
                                                StepData[cur_page-1].set_jd = set_jd_bai*100 + set_jd_shi*10 + set_jd_ge;
                                                write_sfm(2, SET_ANGLE_ADDRESS, StepData[cur_page-1].set_jd);
                                            write_com(0x80+0x40+SET_ANGLE_ADDRESS+1);
                                        }
                                        if(s1_num == 5)
                                        {
                                                set_jd_ge--;
                                                if(set_jd_ge < 0)
                                                        set_jd_ge = 9;
                                                StepData[cur_page-1].set_jd = set_jd_bai*100 + set_jd_shi*10 + set_jd_ge;
                                                write_sfm(2, SPEED_ADDRESS, StepData[cur_page-1].set_jd);
                                            write_com(0x80+0x40+SPEED_ADDRESS+2);
                                        }
                                        if(s1_num == 6)           // 時(shí)間間隔
                                        {
                                                set_sj_bai--;
                                                if(set_sj_bai < 0)
                                                        set_sj_bai = 9;
                                                StepData[cur_page-1].set_time = set_sj_bai*100 + set_sj_shi*10 + set_sj_ge;
                                                write_sfm(2, SET_TIME_ADDRESS, StepData[cur_page-1].set_time);
                                            write_com(0x80+0x40+SET_TIME_ADDRESS);

                                        }
                                        if(s1_num == 7)
                                        {
                                                set_sj_shi--;
                                                if(set_sj_shi < 0)
                                                        set_sj_shi = 9;
                                                StepData[cur_page-1].set_time = set_sj_bai*100 + set_sj_shi*10 + set_sj_ge;
                                                write_sfm(2, SET_TIME_ADDRESS, StepData[cur_page-1].set_time);
                                            write_com(0x80+0x40+SET_TIME_ADDRESS+1);                                       
                                        }
                                        if(s1_num == 8)
                                        {
                                                set_sj_ge--;
                                                if(set_sj_ge < 0)
                                                        set_sj_ge = 9;
                                                StepData[cur_page-1].set_time = set_sj_bai*100 + set_sj_shi*10 + set_sj_ge;
                                                write_sfm(2, SET_TIME_ADDRESS, StepData[cur_page-1].set_time);
                                            write_com(0x80+0x40+SET_TIME_ADDRESS+2);                                       
                                        }                       
                                }
                                else
                                {
                                        if(s1_num == 1)                          // -
                                        {
                                                set_page_num[0]--;
                                                if(set_page_num[0] < 0)
                                                        set_page_num[0] = 0;
                                                page_num = set_page_num[0]*10 + set_page_num[1];
                                                write_sf(2, 9, page_num);
                                            write_com(0x80+0x40+9);
                                        }
                                        if(s1_num == 2)                 // 個(gè)
                                        {
                                                set_page_num[1]--;
                                                if(set_page_num[1] < 0)
                                                        set_page_num[1] = 0;
                                                page_num = set_page_num[0]*10 + set_page_num[1];
                                                write_sf(2, 9, page_num);
                                            write_com(0x80+0x40+10);
                                        }       
                                }
                        }
                        break;

                        case 4:           // 運(yùn)行
                                {
                                       
                                        if (SYS_NUM >= 100)          // 10ms
                                        {
                                                SYS_NUM = 0;
                                        //        CUR_MotorAngle =  CLK_OUT_NUM *0.9/8.0;   // 計(jì)算當(dāng)前角度

                                        }
                                        SecondPro();        //  
                                //        Stop_Key();                               
                               
                                }
                                break;
                        case 5:           // 翻頁(yè)
                                {
                                        cMode = 0;        // 功能模式
                                        cur_page++; //翻頁(yè)增加
                                        if((cur_page > page_num) || (cur_page > MAX_PAGE))
                                                cur_page = 1;
                                        init_1602();
                                        EEPROM_READ(cur_page);        // 讀取數(shù)據(jù)  
                                        PageProcess(cur_page);        // 顯示節(jié)點(diǎn)數(shù)
                                }
                                break;
                        case 6:          //時(shí)間
                                {
                                //        cMode = 0;        // 功能模式
                                        SecondPro_2();
                                }
                                break;
                default:
                        break;
       
        }

}


void SecondPro()
{
        if (END_FLAG)          // 角度目標(biāo)達(dá)到
        {
                END_FLAG = 0;        // 清
                g_MotorSt = 0;        // 電機(jī)關(guān)閉關(guān)閉標(biāo)志
                MotorEn = 1;
        //        CUR_MotorAngle = 0;
                CUR_MotorSpedQuan = 0;

                cMode = 6;   // 進(jìn)入時(shí)間模式
        //        T0_INIT_DATA = 50000;  // 定時(shí)器初始值          
                T0_INIT_DATA = T0_INIT_DATA_50ms;  // 定時(shí)器初始值       
                TR0 = 1;        //啟動(dòng)定時(shí)器
                               
        }
        else
        {
                g_MotorSt = 1;
        }
}

void SecondPro_2()
{
        if (END_FLAG_2)          // 時(shí)間目標(biāo)達(dá)到
        {
                END_FLAG_2 = 0;         // 清
                if (cur_page >= page_num)  // 達(dá)到總節(jié)點(diǎn)數(shù)
                {
                        cur_page = 0;
                        TR0 = 0;     //關(guān)閉定時(shí)器          
                        write_string(1,0,"                ");
                        write_string(2,0,"                ");
                    LCD_Init();          // 頁(yè)面更新

                        cMode = 0;  // 待機(jī)模式
                       
       
                        g_MotorSt = 0;        // 電機(jī)
                        MotorEn = 1;
                //        CUR_MotorAngle = 0;
                        CUR_MotorSpedQuan = 0;
                //        T0_INIT_DATA = 10;  // 定時(shí)器賦值
                        T0_INIT_DATA = T0_INIT_DATA_10;  // 定時(shí)器賦值
                       
                }
                else
                {         
                        cur_page = cur_page + 1;  // 進(jìn)入下一個(gè)節(jié)點(diǎn)

                        EEPROM_READ(cur_page);        // 讀取數(shù)據(jù)

                        PageProcess(cur_page);          // 頁(yè)面更新
                        cMode = 4;  // 電機(jī)運(yùn)行模式

                        if(StepData[cur_page-1].set_fx == 0)
                        {
                                FX = 0;
                        }
                        else
                        {
                                FX = 1;
                        }
                               
                        g_MotorSt = 1;        // 電機(jī)
                        MotorEn = 1;
                //        CUR_MotorAngle = 0;
                        CUR_MotorSpedQuan = 0;

                        // 下一個(gè)動(dòng)作的角度冒充計(jì)算
                //        SET_MotorPulse = (unsigned int)((StepData[cur_page-1].set_jd/0.9)*8.0);    // 脈沖  

                //        T0_INIT_DATA = 10;  // 定時(shí)器賦值
                        T0_INIT_DATA = T0_INIT_DATA_10;  // 定時(shí)器賦值
                        TR0 = 1;     // 啟動(dòng)定時(shí)器                       
                }
               

        }
}

/********延時(shí)函數(shù)***********************************************************/
void delayms(xms)
{
         unsigned int x,y;
         for(x=xms;x>0;x--)
                 for(y=110;y>0;y--)
                        ;
}





原理圖1.pdf

42.37 KB, 下載次數(shù): 4

原理圖

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:303383 發(fā)表于 2018-4-20 09:52 | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
回復(fù)

使用道具 舉報(bào)

板凳
ID:123289 發(fā)表于 2018-4-20 12:14 | 只看該作者
這么一個(gè)簡(jiǎn)單的問(wèn)題提出來(lái),說(shuō)明現(xiàn)在的程序也不是你寫(xiě)的。還是先鞏固基礎(chǔ)知識(shí)吧。
回復(fù)

使用道具 舉報(bào)

地板
ID:312513 發(fā)表于 2018-4-20 16:36 | 只看該作者
這么一個(gè)簡(jiǎn)單的問(wèn)題提出來(lái),說(shuō)明現(xiàn)在的程序也不是你寫(xiě)的。還是先鞏固基礎(chǔ)知識(shí)吧。
回復(fù)

使用道具 舉報(bào)

5#
ID:312590 發(fā)表于 2018-4-20 18:33 | 只看該作者
一天三次,間隔均勻的嗎?
回復(fù)

使用道具 舉報(bào)

6#
ID:312279 發(fā)表于 2018-4-21 07:26 | 只看該作者
什么單片機(jī) 有鐘芯片么
回復(fù)

使用道具 舉報(bào)

7#
ID:303533 發(fā)表于 2018-4-26 13:11 | 只看該作者
Gavin.K 發(fā)表于 2018-4-21 07:26
什么單片機(jī) 有鐘芯片么

STC89C52
回復(fù)

使用道具 舉報(bào)

8#
ID:303533 發(fā)表于 2018-4-26 13:17 | 只看該作者
zhangzhanhu 發(fā)表于 2018-4-20 18:33
一天三次,間隔均勻的嗎?

間隔時(shí)間可以設(shè)定
回復(fù)

使用道具 舉報(bào)

9#
ID:303533 發(fā)表于 2018-4-26 13:18 | 只看該作者
qeqweqwewqwq 發(fā)表于 2018-4-20 16:36
這么一個(gè)簡(jiǎn)單的問(wèn)題提出來(lái),說(shuō)明現(xiàn)在的程序也不是你寫(xiě)的。還是先鞏固基礎(chǔ)知識(shí)吧。

。。。。。確實(shí)是不會(huì)啊,在自己學(xué)習(xí)中,但是畢竟是剛剛開(kāi)始學(xué) 所以確實(shí)搞不定
回復(fù)

使用道具 舉報(bào)

10#
ID:317277 發(fā)表于 2018-4-26 19:40 | 只看該作者
心好累 完全看不懂
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表