⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sysclock.c.bak

📁 摩托车的步进电机驱动。用的是LPC900系列单片机的RTC定时器
💻 BAK
字号:
/*
*********************************************************************************************************
*                                        Firmware of Fiscal Control ECR System
*                                 Complete and Ready-to-Use Modules in C
*
*                                          SysClock Routine Group
*
*                            (c) Copyright 2001-2002, EasyFlash, Sichuan Daoheng R&D Center
*                                           All Rights Reserved
*
* Filename   : SysClock.C
* Programmer : easyflash
*********************************************************************************************************
*/
#define SYSCLOCK_GLOBALS
/*
*********************************************************************************************************
*                                           include files
*********************************************************************************************************
*/
#include "includes.h"
/*
*********************************************************************************************************
*                                               CONSTANTS
*********************************************************************************************************
*/

#define RTCH_DATA 0x0
#define RTCL_DATA (0x39)    //1ms @7.373MHz

//#define RTCH_DATA 0x5b
//#define RTCL_DATA 0x8d    //50ms @7.373MHz

/*
*********************************************************************************************************
*                                               DATA TYPES
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                            GLOBAL VARIABLES
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                          FUNCTION PROTOTYPES
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                       LOCAL FUNCTION PROTOTYPES
*********************************************************************************************************
*/
/*
************************************************************************************************
* Name       : void RTC_ini(void)
* Describe   : 实时时钟RTC初始化,50ms@7.373MHz,允许中断
* Input      : 
* Output     : 
* Create by  : xuyong              Date:2005年01月29日 星期六  18:18:47
* Moid   by  :                     Date:
************************************************************************************************
*/
void RTC_ini(void)
{
    IEN0|=0xC0; //允许RTC中断
    WDCON= 0xe0;
    RTCH = RTCH_DATA;
    RTCL = RTCL_DATA;
    RTCCON = 0x63;  //RTC 时钟源为 CCLK,中断使能,启动RTC,
    //如果真的需要时钟一直运行,则一定需要用外部32.768KHz的低频晶振,这样功耗才能够降低。
    
    timeCnt =0;
    st = ST_MOTO_STOP;
    MotorDirct=MOTO_STOP;
    //ctime.sec = 0;
    //ctime.min = 30;
    //ctime.hour = 8;
}
void RTC_INT(void) interrupt 10 using 2
{
    char i;
    RTCCON=0x63;//清除RTC 中断标志,这句话,一定要放在中断服务程序的最开头。
    //RTC_INT_FLAG =1;
    kkCnt++;
    if(kkCnt==100)kkCnt=0; //100ms
    
    
    //if(UpDown>1)MotorTime = UpDown;
    //else if((0x100-UpDown)>1)MotorTime = 0x100-UpDown;
    //else MotorTime = 2;
    StSwitch();
    if(MotorDirct==MOTO_STOP)//
    {
        MotorTime =5;
    }
    else
    {
        i = UpDown;
        if(i<0)i+=5;//注意减速时,开始是高速,慢慢才低速,即开始时间短,后面时间长。
        
        if(i>1)MotorTime = i;
        else MotorTime = 2;
    }
    
    ++timeCnt;
    if(timeCnt==MotorTime)//MotorTime 是步进电机每步的间隔时间,单位1ms。至少2ms
    {
        timeCnt =0;
        if(MotorDirct!=0)
        {
            if(MotorDirct==MOTO_ZX)
            {
                MotorStep ++;
                MotorStepCnt++;
                if(MotorStep>6)MotorStep = 1;
            }
            else if(MotorDirct==MOTO_FX)
            {
                MotorStep --;
                MotorStepCnt--;
                if(MotorStep<1)MotorStep = 6;
            }
            
            switch(MotorStep)
            {
                case 1:
                    set1 = 0;
    		        set2 = 1;
    		        set3 = 1;
    		        set4 = 0;
    		        break;
                case 2:
    		        set1 = 0;
    		        set2 = 1;
    		        set3 = 0;
    		        set4 = 0;
    		        break;
                case 3:
    		        set1 = 0;
    		        set2 = 0;
    		        set3 = 0;
    		        set4 = 1;
    		        break;
                case 4:
    		        set1 = 1;
    		        set2 = 0;
    		        set3 = 0;
    		        set4 = 1;
    		        break;
                case 5:
    		        set1 = 1;
    		        set2 = 0;
    		        set3 = 0;
    		        set4 = 0;
    		        break;
                case 6:
    		        set1 = 0;
    		        set2 = 0;
    		        set3 = 1;
    		        set4 = 0;
    		        break;
    		    default:
    		        break;
            }
        }
    }
}

void StSwitch(void)
{
    if(MotorStepCnt==MotorStepDst)
    {
        MotorDirct=MOTO_STOP;
        st = ST_MOTO_STOP;
    }
    
    else
    {
        switch(st)
        {
            case ST_MOTO_OBV_UP://正向加速
                if(MotorStepCnt<MotorStepDst)
                {
                    if(timeCnt==0)
                    {
                        UpDown--;
                        if(UpDown ==0)
                        {
                           st =ST_MOTO_OBV;//正向常速
                        }
                    }
                }
                else
                {
                    //进入正向减速模式
                    //MotorDirct  不变;
                    UpDown=-5;//减速
                    st = ST_MOTO_OBV_DOWN;
                }
            break;
            
            case ST_MOTO_OBV_DOWN:
                if(MotorStepCnt<MotorStepDst)
                {
                    st =ST_MOTO_OBV_UP;//正向加速
                    UpDown = 5;
                }
                else
                {
                    if(timeCnt==0)
                    {
                        UpDown++;
                        if(UpDown ==0)
                        {
                            st =ST_MOTO_OBV;//正向常速
                        }
                    }
                }
            break;
            
            case ST_MOTO_OBV:
                if(MotorStepCnt<MotorStepDst)
                {
                    
                }
                else
                {
                    //进入正向减速模式
                    //MotorDirct  不变;
                    UpDown=-5;//减速
                    st = ST_MOTO_OBV_DOWN;
                }
            break;
            
            case ST_MOTO_STOP:
                if(MotorStepCnt<MotorStepDst)
                {
                    MotorDirct=MOTO_ZX;
                    UpDown=5;//加速
                    st =ST_MOTO_OBV_UP;//正向加速
                }
                else
                {
                    MotorDirct=MOTO_FX;
                    UpDown=5;//加速
                    st =ST_MOTO_REV_UP;//反向加速
                }
            break;
            
            case ST_MOTO_REV_UP:
                if(MotorStepCnt<MotorStepDst)
                {
                    MotorDirct=MOTO_FX;
                    UpDown=-5;//减速
                    st =ST_MOTO_REV_DOWN;//反向减速
                }
                else
                {
                    if(timeCnt==0)
                    {
                        UpDown--;
                        if(UpDown ==0)
                        {
                            st =ST_MOTO_REV;//反向常速
                        }
                    }
                }
            break;
            
            case ST_MOTO_REV_DOWN:
                if(MotorStepCnt<MotorStepDst)
                {
                    if(timeCnt==0)
                    {
                        UpDown++;
                        if(UpDown ==0)
                        {
                            st =ST_MOTO_STOP;//停止
                            MotorDirct=MOTO_STOP;
                        }
                    }
                }
                else
                {
                    MotorDirct=MOTO_FX;
                    UpDown=cabs(UpDown);//加速
                    st =ST_MOTO_REV_UP;//反向加速
                }
            break;
            
            case ST_MOTO_REV:
                if(MotorStepCnt<MotorStepDst)
                {
                    MotorDirct=MOTO_FX;
                    UpDown=-5;//减速
                    st =ST_MOTO_REV_DOWN;//反向减速
                }
                else
                {
                }
            break;
            
            default:
            break;
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -