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

📄 main.c

📁 基于AVR mega16的电梯控制程序。现在几经能正常使用。
💻 C
字号:
#define _MAIN_
#include <iom16.h>
#include "main.h"
#include "key.h"
#include <string.h>
#include <stdio.h>

//call this routine to initialise all peripherals
void init_devices(void)
{
     PORTA = 0xfF;
     DDRA  = 0x80;    //the msb is out & other is input
     PORTB = 0xFF;
     DDRB  = 0x00;
     PORTC = 0xFD;
     DDRC  = 0x02;
     PORTD = 0xff;
     DDRD  = 0xFf;

     MCUCR = 0x00;
     GICR  = 0x00;
     TIMSK = 0x00; //timer interrupt sources
     MCUCR|=0x02;
     GIFR=0xff;
     GICR=0x40;
     SREG|=0x80;
}
//初始化定时器
void init_tc1_16(void)
{
  TCCR1A=0x00;
  TCCR1B=0x02;    // 8 devide 1.45us
  //TCNT1H=0xfd;      //1ms  foxs == 11.0529,系统时钟2分频
  //TCNT1L=0x4e;
    TCNT1H=0xfc;        //8MHz      //`1ms
    TCNT1L=0x18;        //
  //TIMSK|=0x80;        //TOIE1;
  TIMSK|=0x04;        //TOIE1;

}

#pragma vector=TIMER1_OVF_vect
__interrupt void Timer_1(void)
{

    TCNT1H=0xfc;        //8MHz      //`1ms
    TCNT1L=0x18;        //
    Free_Count ++;
    DispTime ++;
    if(DISP_TIME < DispTime)
    {
        //DispNmuber(Number);
        DispTime = 0;
        Number++;
        if(Number > 7)
            Number = 0;
        
    }
    ReadKeyTime++;
    if(READ_KEY_TIME <ReadKeyTime)
    {
        ReadKeyTime = 0;
        ReadKey();
        //if(key_status == )
    }
    FreeTimer++;
    if(Key.SOSBak == 0)
        AlarmTime++;
    if(Key.AlarmKeyCounts > 0)
        Key.AlarmKeyCounts--;
    if(Key.FloorKeySound > 0)
        Key.FloorKeySound --;
    else
        SPEAK_OFF;
}

void init_usart(void)
{
    UCSRB=0x00;
    UCSRA=0x00;

    UBRRH=0x00;
    UBRRL=95;       //9600
    UCSRB=0x0;

    UCSRB|=0x08;         //TXEN;
    UCSRA|=0x20;         //UDRE;
}

#pragma vector=USART_UDRE_vect
__interrupt void UART_TX (void)
{
   if(Tx_Ptr >= Tx_Len)
       Tx_status |= SEND_OK;           //发送完毕标志置位
   else
        UDR = Tx_Buff[Tx_Ptr++];

}

#pragma vector=USART_RXC_vect
__interrupt void UART_RX (void)
{
    unsigned char data;

    data=UDR;
    if(Rx_Count < 50)
        Rx_Buff[Rx_Count++] = data;
}
//显示楼层
void DispNmuber(unsigned char Number)
{
  switch(Number)
  {
      case 0:  //a
        if((Floor != 1) || (Floor != 4))
          A_SECT;
        break;
      case 1:  //b
        if((Floor != 5) || (Floor != 6))
          B_SECT;
        break;
      case 2:  //c
        if(Floor != 2)
          C_SECT;
        break;
      case 3:  //d
        if((Floor != 1) || (Floor != 4) || (Floor != 7))
          D_SECT;
        break;
      case 4:  //e
        if((Floor == 0) || (Floor == 2) || (Floor == 6) || (Floor == 8))
          E_SECT;
        break;
      case 5:  //f
        if((Floor != 1) || (Floor != 2) || (Floor != 3) || (Floor != 7))
          F_SECT;
        break;
      case 6:  //g
        if((Floor != 0) || (Floor != 1) || (Floor != 4) || (Floor != 7))
          G_SECT;
        break;
      case 7:  //dp
        if(Floor == 10) 
          DP_SECT;
        break;
      default:
        break;
  }    
}
void ElevatorAct(void)
{
    unsigned char UpSeek;
    unsigned char DownSeek;
    
    //在停止状态下,比较向上的需求和向下走的需求
    UpSeek = DownSeek = Floor;
    if(UpOrDown == STOP)
    {
        for(; DownSeek > 0; DownSeek --)
        {
            if((Key.FloorKey & (1 << (DownSeek - 1))) != 0)
                break;          
        }
    //如果没有查到最低层,找到与当前楼层最近的楼层
        if(DownSeek != 0)
        {
            DownSeek = Floor - DownSeek;
        }
        else
        {
    //如果已经找到最低层,则将他置为最大数
            DownSeek = TOPFLOOR;
        }
    //如果没有查到最高层,找到与当前楼层最近的楼层
        for(; UpSeek < TOPFLOOR; UpSeek ++)
        {
            if((Key.FloorKey & (1 << (UpSeek - 1))) != 0)
                break;          
        }
        if(UpSeek != TOPFLOOR)
        {
            UpSeek -= Floor; 
        }
        else
        {
          //如果已经找到最高层,则将他置为最大数
            UpSeek = TOPFLOOR;
        }
        //需求路程较短的一个方向位为电梯运动方向
        if((UpSeek != TOPFLOOR) || (DownSeek != TOPFLOOR))
        {
            if(UpSeek > DownSeek )
            {
                UpOrDown = DOWN;
                MOTOR_RIGHT_OFF;
                MOTOR_LEFT_ON;
            }
            else      
            {
                UpOrDown = UP;
                MOTOR_RIGHT_ON;
                MOTOR_LEFT_OFF;
            }
        }
    }
    else//上升
    if(UpOrDown == UP)
    {
        //判断是否在当前楼层之上还有需求
        for(; UpSeek < TOPFLOOR; UpSeek ++)
        {
            if((Key.FloorKey & (1 << (UpSeek - 1))) != 0)
                break;          
        }
        if(UpSeek != TOPFLOOR)
        {
            UpSeek -= Floor; 
        }
        else
        {
          //如果已经找到最高层,则将他置为最大数
            UpSeek = TOPFLOOR;
        }
        if(UpSeek == TOPFLOOR)
        {
            MOTOR_RIGHT_OFF;
            MOTOR_LEFT_OFF;
            UpOrDown = STOP;
        }
        else      
        {
            UpOrDown = UP;
            MOTOR_RIGHT_ON;
            MOTOR_LEFT_OFF;
        }
    }   
    else                //下降
    if(UpOrDown == DOWN)
    {
        for(; DownSeek > 0; DownSeek --)
        {
            if((Key.FloorKey & (1 << (DownSeek - 1))) != 0)
                break;          
        }
        //如果没有查到最低层,找到与当前楼层最近的楼层
        if(DownSeek != 0)
        {
            DownSeek = Floor - DownSeek;
        }
        else
        {
          //如果已经找到最低层,则将他置为最大数
            DownSeek = TOPFLOOR;
        }
        if(UpSeek ==  TOPFLOOR)
        {
            MOTOR_RIGHT_OFF;
            MOTOR_LEFT_OFF;
            UpOrDown = STOP;
        }
    }   
}
  
  
void main(void)
{
    
   init_devices();
   init_tc1_16();
   init_usart();
   Key_Init();
   
   FloorStore[MAX_FloorStore] = 0;
    Floor = 1;
    Key.FloorSwtich = 0xff;
    FloorSwtichAction();
    if((Floor == 1) && (SWITCH1 != 0))  //判断是否真正在一层
    {                                   //不在一层,也就是没有任何楼层接近开关输入
        for(FloorStore_Count = 0; FloorStore_Count < MAX_FloorStore; FloorStore_Count ++)
        {
            if((FloorStore[FloorStore_Count] < TOPFLOOR) && (FloorStore[FloorStore_Count] > 0) && (FloorStore[FloorStore_Count + 1] == 0))
            {
                Floor = FloorStore[FloorStore_Count];
                break;
            }
        }
    }
   FreeTimer = 0;
   Key.AlarmKeyStatus = KEY_NOTHING;
   Key.SOSStatus = KEY_NOTHING;
   Key.FloorSwtichStatus = KEY_NOTHING;
   Key.FloorKeyStatus = KEY_NOTHING;
   FloorToGo = 0;
   SPEAK_OFF;
   while(1)
   {
        if((Key.AlarmKeyStatus >= KEY_PRESS) && (FloorToGo == 0))
        {
            Key.AlarmKeyStatus = KEY_NOTHING;
            Key.AlarmKeyBak = 0;
            AlarmKeyAction();
	    }
        
        if(Key.SOSStatus >= KEY_PRESS)
        {
            Key.SOSStatus = KEY_NOTHING;
            //Key.SOSBak = 0;
            FloorToGo = 0;
            SOSAction();
            AlarmTime = 0;
	    }
        
        if(Key.FloorSwtichStatus >= KEY_PRESS)
        {
            Key.FloorSwtichStatus = KEY_NOTHING;
            FloorSwtichAction();
            Key.FloorSwtichBak = 0;
            AlarmTime = 0;
            ERR_OUT_HIGH;
	    }
        else
        if(Key.FloorSwtichStatus == KEY_NOTHING)
        {
            if(AlarmTime > FloorSwtichTime )  //报警 60S
            {   
                ERR_OUT_LOW;
                MOTOR_RIGHT_OFF;
                MOTOR_LEFT_OFF;
                AlarmTime = FloorSwtichTime + 1;
                //FloorStore[FloorStore_Count] = Floor;
                FloorToGo = 0;
            }
	    }
        /*
        if((Key.AlarmKeyCounts <= 1447) && (Key.FloorKeyStatus >= KEY_PRESS))
        {
            Key.FloorKeyStatus = KEY_NOTHING;
            FloorKeyAction();
            Key.FloorKeyBak = 0;
        }
        */
       //if((Key.AlarmKeyCounts <= 1447) && (FloorToGo != 0))     //>3s at 8MHz
       if((Key.AlarmKeyCounts <= 2000) && (Key.AlarmKeyCounts != 0))                           //>3s at 8MHz
       {
            
            if(Key.FloorKeyStatus >= KEY_PRESS)
            {
                Key.FloorKeyStatus = KEY_NOTHING;
                FloorKeyAction();
                Key.FloorKeyBak = 0;
            }
            if(FloorToGo != 0)
            {
                ALARM_OUT_HIGH;
                Key.AlarmKeyCounts = 0;
                if((FloorToGo & (1 << (Floor - 1))) != 0)
                {
                    FloorToGo &= ~(1 << (Floor -1));
                    UpOrDown = STOP;
                    MOTOR_RIGHT_OFF;
                    MOTOR_LEFT_OFF;
                }
                else
                {
                    ElevatorAct();
                    Key.SOSBak = 0;
                }
            }
            /*
            ALARM_OUT_HIGH;
            Key.AlarmKeyCounts = 0;
            if((FloorToGo & (1 << (Floor - 1))) != 0)
            {
                FloorToGo &= ~(1 << (Floor -1));
                UpOrDown = STOP;
                MOTOR_RIGHT_OFF;
                MOTOR_LEFT_OFF;
            }
            else
            {
                ElevatorAct();
            }
            */
       }
       else
       {
            if(Key.AlarmKeyCounts == 0)
            {
                Key.FloorKeyBak = 0;
                ALARM_OUT_HIGH;
                if(UpOrDown == STOP)
                    FloorToGo = 0;
            }
           Key.FloorKeyStatus =  KEY_NOTHING;
           Key.FloorKeyBak =  0;
       
       }
   }
}


void Print_Com(unsigned char *Buff)
{

}

⌨️ 快捷键说明

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