Автор работы: Пользователь скрыл имя, 07 Мая 2014 в 12:07, научная работа
Практически в любой современной электронной технике можно найти микроконтроллеры. Столь широкое применение этих микросхем обусловлено чрезвычайно удачным сочетанием низкой стоимости, миниатюрных габаритов, высокой надёжности и огромным набором выполняемых функций, что в сочетании с возможностью адаптации микроконтроллеров к работе в конкретном устройстве определило их повсеместное распространение в любой технике.
Приложение №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=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;
USICTL0 |= USIPE6 + USIPE5 + USIMST + USIOE; // Port, SPI Master
USICTL0 &= ~USISWRST;
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==
{A=hour_H; goto LoadDig;}
else
{goto ExitDspl;}
}
break;
case 1: //Dig2
{
if ((mode!=2)|(flags&blink_bit==
{A=hour_L; goto LoadDig;}
else
{goto ExitDspl;}
}
break;
case 2: //Dig3
{
if ((mode!=3)|(flags&blink_bit==
{A=min_H; goto LoadDig;}
else
{goto ExitDspl;}
}
break;
case 3: //Dig4
{
if ((mode!=4)|(flags&blink_bit==
{A=min_L;goto LoadDig;}
else
{goto ExitDspl;}
}
break;
case 4: //Dig5
{
if ((mode!=5)|(flags&blink_bit==
{A=sec_H;goto LoadDig;}
else
{goto ExitDspl;}
}
break;
case 5: //Dig6
{
if ((mode!=6)|(flags&blink_bit==
{A=sec_L;goto LoadDig;}
else
{goto ExitDspl;}
}
break;
}
LoadDig:
{
send_data(TBL_IMAGE[A],TBL_
}
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_
{}
else //
{
Timer();
Beep();
}
}
}
}