сам код:
Код: Выделить всё
#include <pic.h>
__CONFIG (LP & UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS);
unsigned long seconds;
unsigned long tmp;
unsigned long oboroti;
int tmr0_temp;
int num10000;
int num1000;
int num100;
int num10;
int num1;
void pauza (void){ // начало переменная
unsigned int x; // локальная
x = 100; // в tmp поместить некое максимальное число
while (x-->0);
}// конец функции
void podgot (void)
{
TRISA = 0b11110000; // направление работы ножек порта А.
TRISB = 0b00000000; // направление работы ножек порта В.
CMCON = 0x07; // отключение компараторов.
PORTA = 0; // очищаем порт А
PORTB = 0; // очищаем порт Б.
T0IE = 1; //разрешитьть прерывания от TMR0 .
GIE = 1; //разрешить глобальные прерывания .
PEIE = 1;
// OPTION BIT
RBPU = 1; // подтягивающие R (0-вкл, 1-выкл).
INTEDG = 1; //Прерывания INT по пер. фронту.
T0CS = 1; // внешний тактовый сигнал
T0SE = 0; // задний фронт преращения сигнала.
PSA = 1; // Предделитель перед wdt.
PS2 = 0;
PS1 = 0;
PS0 = 0; // предделитель 32.
//T1CON BIT
T1CKPS1 = 1;
T1CKPS0 = 0; //предделитель 1:4
T1OSCEN = 0; // внутренний тактовый генератор выкл.
T1SYNC = 1; // не синхронизировать внешний сигнал
TMR1CS = 0; // Внутреннй источник тактового сигнала.
TMR1ON = 1; // таймер включен.
/////////
TMR1IE = 1; // прерывание от 1 таймера разрешено.
}
void main (void)
{
podgot ();
TMR0=0;
TMR1H=0;
TMR1L=0;
TMR1H=0b01001011;
TMR1L=0b01000000;
while (1)
{
// === массив констант с описанием 7-сегментных символов
const int arr_seg[12]=
{ // начало массива
// 0bABCDEFGH <– расположение сегментов по битам
0b00111111, // 0й элемент, символ «0»
0b00000110, // 1й элемент, символ «1»
0b10011011, // 2й элемент, символ «2»
0b10001111, // 3й элемент, символ «3»
0b10100110, // 4й элемент, символ «4»
0b10101101, // 5й элемент, символ «5»
0b10111101, // 6й элемент, символ «6»
0b00000111, // 7й элемент, символ «7»
0b10111111, // 8й элемент, символ «8»
0b10101111, // 9й элемент, символ «9»
0b10100011, //10й элемент, символ градуса
0b00000000, //11й элемент, пробел
}; // конец массива
RB6 = 0;
PORTB = arr_seg[num10000];
pauza ();
RB6 = 1;
RA0 = 0;
PORTB = arr_seg[num1000];
pauza ();
RA0 = 1;
RA1 = 0;
PORTB = arr_seg[num100];
pauza ();
RA1 = 1;
RA2 = 0;
PORTB = arr_seg[num10];
pauza ();
RA2 = 1;
RA3 = 0;
PORTB = arr_seg[num1];
pauza ();
RA3 = 1;
}
}
void interrupt timer0_isr (void)
{
if (T0IF==1)
{
T0IF=0;
oboroti=oboroti+1;
}
if(TMR1IF==1)
{
TMR1IF=0;
seconds=seconds+1;
if (seconds==19)
{
tmr0_temp=TMR0;
seconds=0;
TMR1H=0b01001011;
TMR1L=0b01000000;
TMR0=0;
tmp=oboroti*256;
tmp=tmp+tmr0_temp;
tmp=tmp*60;
num10000=tmp/10000;
tmp %=10000;
num1000=tmp/1000; // количество тысяч
tmp %=1000; // остаток от деления на 1000
num100=tmp/100; // количество сотен
tmp %=100; // остаток от деления на 100
num10=tmp/10; // кол-во десятков
num1=tmp%10; // остаток - единицы
TMR1H=0;
TMR1L=0;
oboroti=0;
}
}
}Также в архиве проэкт протеуса и прошивка и всё остальное.
Суть: считает 0м таймером сколько было импульсов с датчика коленвала за секунду. Умнажаем на 60 и выводим.
За секунду ддо 300 импульсов не больше и то многго.