Сторінка 5 із 20
Таймер обратного отсчёта , интервал времени в диапазоне от 1 секунды до 24 часов.

Простая схема, источник http://cxema.at.ua Author : Katran
Code
Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 4,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega8.h> #asm .equ __lcd_port=0x12 ;PORTD #endasm #include <lcd.h> #include <delay.h> unsigned char a=0, b=0, c=0, d=0, e=0, f=0, help=0; // ab : cd : ef char hours, minuts, seconds; #define SIGNAL PORTD.3 #define ON 1 #define OFF 0 #define MPLUS PINB.2 #define MMINUS PINB.3 #define SPLUS PINB.4 #define SMINUS PINB.5 #define PUSK PINC.0 #define STOP PINC.2 // ФУНКЦИЯ ОТОБРАЖЕНИЯ ВРЕМЕНИ void time(void) // Подготовка регистров для заполнения данными { a = 0; b = 0; c = 0; d = 0; e = 0; f = 0; //============================================================================= help = hours; // Разложение значения ЧАСов по разрядам ab : __ : __ while (help > 9) { help -= 10; a++; }; b = help; //============================================================================= help = minuts; // Разложение значения МИНут по разрядам __ : cd : __ while (help > 9) { help -= 10; c++; }; d = help; //============================================================================= help = seconds; // Разложение значения СЕКунд по разрядам __ : __ : ef while (help > 9) { help -= 10; e++; }; f = help; //============================================================================= // ОТОБРАЖЕНИЕ НА ДИСПЛЕЕ ВРЕМЕНИ В СООТВЕТСТВИИ с местрположением // ab : cd : ef // Alrm gh : ij lcd_gotoxy(0,0); lcd_putchar(a+0x30); lcd_putchar(b+0x30); lcd_putsf(":"); lcd_putchar(c+0x30); lcd_putchar(d+0x30); lcd_putsf(":"); lcd_putchar(e+0x30); lcd_putchar(f+0x30); lcd_gotoxy(0,1); lcd_putsf("<<<<>>>>"); }; // Timer 1 overflow interrupt service routine interrupt [TIM1_OVF] void timer1_ovf_isr(void) { // Reinitialize Timer 1 value TCNT1H=0xBDC >> 8; TCNT1L=0xBDC & 0xff; // Place your code here seconds--; // Инкремент таймера +1СЕК if (seconds > 59) // условия при которых таймер ведет себя как часы { seconds = 59; minuts--; if (minuts > 59) { minuts = 59; hours--; if (hours > 23) { hours = 23; }; }; }; // В данные часы включена функция включения нагрузки с 8 до 23,
//поэтому проверяем условие и делаем вывод time(); // обновление дисплея } // Declare your global variables here void main(void) { // Declare your local variables here
PORTB=0b00111111; DDRB=0b00000000; // PORTC=0b11111111; // «WzAVR «Port C initialization DDRC=0b00000000; // PORTD=0b00000000; // «WzAVR «Port D initialization DDRD=0b00001000; TCCR0=0x00; TCNT0=0x00; TCCR1A=0x00; TCCR1B=0x03; TCNT1H=0x0B; TCNT1L=0xDC; ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; MCUCR=0x00; TIMSK=0x04; ACSR=0x80; SFIOR=0x00; // LCD module initialization lcd_init(16); // НАЧАЛЬНАЯ ИНИЦИАЛИЗАЦИЯ timing: while (PUSK == 1) { if (MPLUS == 0) { minuts++; if (minuts > 59) { minuts = 0; hours++; if (hours > 23) { hours = 0; }; }; } if (MMINUS == 0) { minuts--; if (minuts > 59) { minuts = 59; hours--; if (hours > 23) { hours = 23; }; }; }; if (SPLUS == 0) { seconds++; if (seconds > 59) seconds = 0; }; if (SMINUS == 0) { seconds--; if (seconds > 59) seconds = 59; }; delay_ms(100); time(); }; // Global enable interrupts #asm("sei") while (1) { // проводим сравнение для включения нагрузки if (STOP == 0) { #asm("cli") SIGNAL = OFF; goto timing; }; if (hours == 0) { if (minuts == 0) { if (seconds == 0) { #asm("cli") SIGNAL = ON; } } }
}; }
|
|
Скачать архив проекта; исходный код, прошивка, proteus.
Секундомер на МК ATtiny2313 6 знаков.
Code
/***************************************************** This program was produced by the CodeWizardAVR V2.04.4a Advanced Automatic Program Generator © Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l. c2.at.ua Chip type : ATtiny2313 AVR Core Clock frequency: 8,000000 MHz Memory model : Tiny External RAM size : 0 Data Stack size : 32 *****************************************************/ #include <tiny2313.h> #include <delay.h> unsigned char razrad=0b00100000; bit start=0; unsigned char cloc[6]={0,0,0,0,0,0}; unsigned char tik=0; unsigned char des_tik=0; unsigned char sec=0; unsigned char des_sec=0; unsigned char min=0; unsigned char des_min=0; unsigned char x=0; unsigned char znak [10] = {0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111};//знакогенератор OA. //unsigned char znak [10] = {0b11000000, 0b11111001, 0b10100100, 0b10110000, 0b10011001, 0b10010010, 0b10000010, 0b11111000, 0b10000000, 0b10010000};//знакогенератор OK. //****************************** динамическая индикация ************************************ interrupt [TIM0_OVF] void timer0_ovf_isr(void) { PORTD = razrad^0xFF ; // PORTD = razrad; PORTB = znak [cloc[x]]; if ((x==2) | | (x==4)) {PORTB.7 =1;} else PORTB.7 =0; razrad>>= 1; x++; if (x==6) {x=0; razrad=0b00100000;} // if (x==4) {x=0; razrad=0b0001000;} } //******************************** отсчет времени ************************************ interrupt [TIM1_COMPA] void timer1_compa_isr(void) { if (start==0) goto m1; tik++; if (tik==10) {tik=0; des_tik++;} if (des_tik==10) {des_tik=0; sec++;} if (sec==10) {sec=0; des_sec++;} if (des_sec==6) {des_sec=0; min++;} if (min==10) {min=0; des_min++;} if (des_min==10) {des_min=0;} cloc[0] = tik; cloc[1] = des_tik; cloc[2] = sec; cloc[3] = des_sec; cloc[4] = min; cloc[5] = des_min;
m1: } void main(void) { #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif PORTA=0x00;DDRA=0x00; PORTB=0x00;DDRB=0xFF; PORTD=0x40;DDRD=0x3F; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 125,000 kHz // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0x00; TCCR0B=0x03; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 125,000 kHz // Mode: CTC top=OCR1A // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: On // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x0B; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x04; OCR1AL=0xE2; OCR1BH=0x00; OCR1BL=0x00; TIMSK=0x42; ACSR=0x80; #asm("sei") while (1) { while (PIND.6!=0) {}; start++; delay_ms(200); while (PIND.6!=1) {}; }; }
|
|

Скачать архив проекта секудомера; исходный код , прошивка, proteus.