Таймер на микроконтроллере MSP430F2013

Автор работы: Пользователь скрыл имя, 07 Мая 2014 в 12:07, научная работа

Краткое описание

Практически в любой современной электронной технике можно найти микроконтроллеры. Столь широкое применение этих микросхем обусловлено чрезвычайно удачным сочетанием низкой стоимости, миниатюрных габаритов, высокой надёжности и огромным набором выполняемых функций, что в сочетании с возможностью адаптации микроконтроллеров к работе в конкретном устройстве определило их повсеместное распространение в любой технике.

Вложенные файлы: 1 файл

НИР.doc

— 4.12 Мб (Скачать файл)

Приложение №1.

Листинг программы

//-------------------------------------------------------------------

/*

Файл:           

Автор:   Егорова Екатерина Геннадьевна

Группа:  РТЭ-11-08                           

Дата:  25.02.2012

Назначение: Таймер на микроконтроллере MSP430F2013

*/

//-------------------------------------------------------------------

//-------------------- Библиотечные файлы ---------------------------

#include  <msp430x20x3.h>

//------------------------- Сокращения ------------------------------

#define u_char unsigned char

#define u_int  unsigned int

//----------- Константы, используемые в  разных программах -----------

#define NOT_DEFINE    0x99  

#define KEY_MODE      0x01   

#define KEY_UP        0x02 

#define BOUNCE_TIME   20

#define TMR_2000MKS   1995

#define SW_Load       0x04

#define Power_On      0x10

#define fl_half_sec   0x01

#define blink_bit     0x02

#define REG_SHCP BIT5

#define REG_STCP BIT4

#define REG_DS BIT6

//begin ##############################################################

  u_char hour_H;         //десятки часов

  u_char hour_L;         //единицы часов

  u_char min_H;          //десятки минут

  u_char min_L;          //единицы минут

  u_char sec_H;          //десятки секунд

  u_char sec_L;          //единицы секунд

  u_char mode;           //режим работы

  u_char ct_2ms;         //счетчик интервала времени по 2 мс

  u_char ct_beep;        //счетчик  интервала в сек. звучания сигнала

  u_char key;            //исполнительный код кнопок

  u_char cur_num;        //номер текущей отображаемой цифры

  u_char cur_key;        //номер  текущего опроса кнопок

  u_char prev_key;       //результат  предыдущего опроса кнопок

  u_char bounce_tmr;     //счетчик  для программного исключения  дребезга

  u_char flags;

  int A; 

  u_char value;

  u_char c;

  char TBL_IMAGE[ ] = {

  0xC0,             //0  

  0xF9,             //1

  0xA4,             //2

  0xB0,             //3

  0x99,             //4

  0x92,             //5

  0x82,             //6

  0xF8,             //7

  0x80,             //8

  0x90,             //9

  };

// таблица сигналов управления  анодами 6 цифр светодиодного дисплея

  char TBL_COM[ ] = {

    0xFB, //А1 hour_H

    0xF7, //А2 hour_L

    0xEF, //А3 min_H

    0xDF, //А4 min_L

    0xBF, //А5 sec_H

    0x7F  //А6 sec_L

  };

  char TBL_LIGHT[ ] = {

    0x01, //загорается зеленый  светодиод

    0x10  //загорается красный  светодиод

  };

void Servis_Key()

{

   switch(key)

  {

  case KEY_MODE:

    {

    key=NOT_DEFINE;

    mode++;

    if(mode==7)

    {

      mode=0;

    }

    }

    break;

    case KEY_UP:

      {

         key=NOT_DEFINE;

         if(mode==0)

         {}

         else

         {

           ct_beep=0;

           P1DIR|=0x08;

           P1OUT|=0x08;

           switch(mode)

           {

           case 1:

             {

               hour_H++;

               if (hour_H>2)

               {

                 hour_H=0;

               }

           }

               break;

               case 2:

               {

               hour_L++;

               if ((hour_H>9)|((hour_H==2)&(hour_L>3)))

               {

                 hour_L=0;

               }

           }

                 break;

                   case 3:

               {

               min_H++;

               if (min_H>5)

               {

                 min_H=0;

               }

           }

                 break;

                    case 4:

               {

               min_L++;

               if (min_L>9)

               {

                 min_L=0;

               }

           }

                 break;    

                    case 5:

               {

               sec_H++;

               if (sec_H>5)

               {

                 sec_H=0;

               }

           }

                 break;

                      case 6:

               {             

                 sec_L=0;

           }

                 break;

           }

         }

      }

      break;

  }

 

void Keybscan()

{

    P1DIR &= ~0x07;

    key=P1IN;

   if (key&SW_Load==SW_Load)

   {

     value=TBL_LIGHT[0];

   }

   cur_key=NOT_DEFINE;           

      if (key&KEY_MODE==KEY_MODE)

   {

     cur_key=KEY_MODE;

   }

   else    //ST1

   {

      if (key&KEY_UP==KEY_UP)   

    {

     cur_key=KEY_UP;

    }

    else goto ST2;

   }

ST2:

     if (bounce_tmr==BOUNCE_TIME) //ST2

    {

      if (cur_key==NOT_DEFINE)

         {

            bounce_tmr=0;

            prev_key=NOT_DEFINE;

          }

       else goto exitKS;

    }

    else //ST3

      {

          if(cur_key==NOT_DEFINE)    //RESET_TMR

            {

               bounce_tmr=0;

               prev_key=NOT_DEFINE;

             }

          else    //ST4

            {

               if (cur_key!=prev_key) //OTHER_KEY

                    {

                      bounce_tmr=0;

                      prev_key=cur_key;

                    }

               else

                    {

                      bounce_tmr++;

                    }

               if (bounce_tmr==BOUNCE_TIME) //ST5

                    {

                     key=cur_key;

                    }

               else goto exitKS; 

            }    

       }

exitKS: {} 

}

void Timer()

{

   if (mode!=0)

   {goto ExitTmr;}

   else   //Tmr1

   {

     if (sec_L!=0) {sec_L--;goto ExitTmr;}              

     else    //Tmr2

     {

       if (sec_H!=0) {sec_H--;sec_L=9;goto ExitTmr;}   

       else   //Tmr3

       {

         if (min_L+min_H+hour_L+hour_H==0) {goto StopT;} 

        else    ///Tmr4

        {

          sec_L=9;

          if (min_L!=0) {min_L--;sec_H=5;goto ExitTmr;} 

          else

          {

            if (min_H+hour_L+hour_H==0) {goto StopT;}   //Tmr5

            else

            {

              sec_H=5;

              if(min_H!=0)

              {

                min_H--;

                min_L=9;

                goto ExitTmr;

              }

              else

              {

                if (hour_L+hour_H==0) {goto StopT;}      //Tmr6

                else

                {

                  min_L=9;

                  if(hour_L!=0)

                  {

                    hour_L--;

                    min_H=5;

                    goto ExitTmr;

                  }

                  else

                  {

                    if (hour_H==0) {goto StopT;}   //Tmr7

                    else

                    {

                      min_H=5;

                      hour_H--;

                      hour_L=9;

                      goto ExitTmr;

                    }

                   }

                }

              }

            }

          }

        }

       }

     }

   }

StopT: //время таймера истекло

   if (ct_beep==0)

   {

     ct_beep=6;

     P1DIR|=0x08;

     P1OUT|=0x00;

   }

   else {}

   if(SW_Load==0) //включение внешней нагрузки

   {

     P1DIR|=Power_On;

     P1OUT|=0x00;

   }

   else //отключение внешней  нагрузки

   {

     P1DIR|=Power_On;

     P1OUT|=Power_On;

   }

ExitTmr:{}

}

void Beep()

{

   switch (ct_beep)

   {

   case 0: break;

   case 0x0FF: break;  //Bp1

   case 1: {ct_beep=0x0FF; P1DIR|=0x08; P1OUT|=0x08;} break; //Bp2

   default: ct_beep--; //Bp3

   }

}

void init_spi(void){

    P1DIR |= 0x72;                            // P1 output

    USICTL0 |= USIPE6 + USIPE5 + USIMST + USIOE;   // Port, SPI Master

    USICTL0 &= ~USISWRST;                          // USI released for operation

    USICNT|=USI16B;

    USICKCTL |= USISSEL_2;  

    P1OUT |= (REG_SHCP)|(REG_STCP)|(REG_DS);

    return;

   

}

void send_data(char data1,char data2){

            P1OUT &= ~REG_STCP;

            USISRL =data1;

            USISRH =data2;

            USICNT = 16;

            while (USICNT !=0);

            P1OUT |= REG_STCP;

            return;

}

void Display()

{

  cur_num++;

  if(cur_num>5)

    {

      cur_num=0;

    }

  switch (cur_num) //Dis2

  {

  case 0: //Dig1

    {

      if ((mode!=1)|(flags&blink_bit==blink_bit))

      {A=hour_H; goto LoadDig;}

      else

      {goto ExitDspl;}

    }

    break;

    case 1: //Dig2

    {

      if ((mode!=2)|(flags&blink_bit==blink_bit))

      {A=hour_L; goto LoadDig;}

       else

      {goto ExitDspl;}

    }

    break;

    case 2: //Dig3

    {

       if ((mode!=3)|(flags&blink_bit==blink_bit))

       {A=min_H; goto LoadDig;}

       else

      {goto ExitDspl;}

    }

    break;

    case 3: //Dig4

    {

      if ((mode!=4)|(flags&blink_bit==blink_bit))

      {A=min_L;goto LoadDig;}

      else

      {goto ExitDspl;}

    }

    break;

    case 4: //Dig5

    {

      if ((mode!=5)|(flags&blink_bit==blink_bit))

      {A=sec_H;goto LoadDig;}

       else

      {goto ExitDspl;}

    }

    break;

    case 5: //Dig6

    {

      if ((mode!=6)|(flags&blink_bit==blink_bit))

      {A=sec_L;goto LoadDig;}

      else

      {goto ExitDspl;}

    }

    break;

  }

LoadDig:

  {

    send_data(TBL_IMAGE[A],TBL_COM[cur_num]&value);

  }

ExitDspl:{}

}

   void main(void)

{

  mode=0;

  hour_H=0;

  hour_L=0;

  min_H=0;

  min_L=0;

  sec_H=0;

  sec_L=0;

  ct_2ms=0;

  ct_beep=0;

  flags&=~fl_half_sec;

  P1DIR|=0x16;

  WDTCTL = WDTPW + WDTHOLD;

init_spi();

  key=NOT_DEFINE;

  CCTL0 = CCIE;                     // разрешение прерывания от CCR0

  TACTL = TASSEL_1 + MC_1 + TACLR;  // тактирование от ACLK, upmode, clear TAP

  CCR0 = TMR_2000MKS;                   // start timer

  _BIS_SR(LPM0_bits + GIE);         // разрешение глобальных прерываний и перевод в режим пониженного энергопотребления

 

}

// обслуживание прерывания по  таймеру Timer A0

#pragma vector=TIMERA0_VECTOR

__interrupt void Timer_A (void)

{

  Display();  //зажигаем очередную  цифру

  Keybscan(); //опрос клавиатуры

  Servis_Key();

  ct_2ms++;

  if ((ct_2ms!=250)|(ct_2ms!=125))

  {}

  else //ms250

  {

    flags^=blink_bit;

    if (ct_2ms==250) //ms500

    {

      ct_2ms=0;

      flags^=fl_half_sec;

      if (flags&fl_half_sec==fl_half_sec)

      {}

      else //

      {

        Timer();

      Beep();

      }

    }

  }

}

 

 


 



Информация о работе Таймер на микроконтроллере MSP430F2013