Potrebno je napisati program u C za 8051 koji omogucuje ispis na displej(memorijski mapiran na adresi 0x8001) SAMO brojeve u datom nizu od sedam proizvoljnih elemenata koji su deljivi sa tri.
Brojeve ispisivati svake sekunde.
Pokusao sam da resim ali mi nije ne registruje deljenje nego samo ispisuje SVE brojeve redom u nizu i znatno brze od jedne sekunde.
Ideja je napraviti 50ms (C350 HEX) u tajmeru i preko brojaca napraviti 20 prekida jer 50ms *20=1 s
Ako neko zna gde je greska u kodu, neka napise ..
Hvala !
Brojeve ispisivati svake sekunde.
Pokusao sam da resim ali mi nije ne registruje deljenje nego samo ispisuje SVE brojeve redom u nizu i znatno brze od jedne sekunde.
Ideja je napraviti 50ms (C350 HEX) u tajmeru i preko brojaca napraviti 20 prekida jer 50ms *20=1 s
Ako neko zna gde je greska u kodu, neka napise ..
Hvala !
Code:
#include <reg51.h>
#include <math.h>
typedef unsigned char byte;
byte a[7]= {7,5,16,1,4,11,9};
byte counter;
byte xdata display _at_ 0x8001;
byte started = 0;
int i=0;
sbit switcher=P0^0;
void Inic(void)
{
EA=1;
TMOD=1; // 16 bit timer
TH0=0xC3; // set timer0 0xC350
TL0=0x50; // 50,000 decimalno
TR0=1;
counter=1; // set brojac
}
void timer0(void) interrupt 1 using 2
{
TH0=0xC3; // set timer0 C350 = 50,000
TL0=0x50; // posle svakog prekida
counter--; // broj prekide
if(counter == 0) // broj 20 prekida za 1 sec kasnjenja
{
counter = 20;
if(started == 1)
{
if(i < 7) //ako je i<7 deli sa tri brojeve u nizu
if((a[i]/3) ) // deli brojeve u nizu sa 3
display=a[i]; // ako su deljivi, ispisi na displej
i++; // inkrementiranje za novu vrednost u nizu
if(i == 7) // kada se prodju svi elementi u nizu ,resetuj tajmer
{
ET0 = 0; // disable timer 0
TR0 = 0; // stop timer0 - svi u nizu su provereni
started = 0; // started = 0,zaustavi kada se prekidac opet stisne
}
}
}
}
void main(void)
{
Inic();
switcher = 1; // prekidac se startuje na 1
while(1)
{
if(switcher == 0)
if(started == 0)
{
started = 1; // started ide na 1 kada je prekidac pritisnut
i = 0; // postavi i na prvi broj u nizu
counter = 20; // ceka se 1 sekunda
//
TH0=0xC3; // set timer0 na 0xC350
TL0=0x50; // 50,000 decimalno
ET0=1; // enable timer0
TR0=1; // start timer0
}
}
}
#include <reg51.h>
#include <math.h>
typedef unsigned char byte;
byte a[7]= {7,5,16,1,4,11,9};
byte counter;
byte xdata display _at_ 0x8001;
byte started = 0;
int i=0;
sbit switcher=P0^0;
void Inic(void)
{
EA=1;
TMOD=1; // 16 bit timer
TH0=0xC3; // set timer0 0xC350
TL0=0x50; // 50,000 decimalno
TR0=1;
counter=1; // set brojac
}
void timer0(void) interrupt 1 using 2
{
TH0=0xC3; // set timer0 C350 = 50,000
TL0=0x50; // posle svakog prekida
counter--; // broj prekide
if(counter == 0) // broj 20 prekida za 1 sec kasnjenja
{
counter = 20;
if(started == 1)
{
if(i < 7) //ako je i<7 deli sa tri brojeve u nizu
if((a[i]/3) ) // deli brojeve u nizu sa 3
display=a[i]; // ako su deljivi, ispisi na displej
i++; // inkrementiranje za novu vrednost u nizu
if(i == 7) // kada se prodju svi elementi u nizu ,resetuj tajmer
{
ET0 = 0; // disable timer 0
TR0 = 0; // stop timer0 - svi u nizu su provereni
started = 0; // started = 0,zaustavi kada se prekidac opet stisne
}
}
}
}
void main(void)
{
Inic();
switcher = 1; // prekidac se startuje na 1
while(1)
{
if(switcher == 0)
if(started == 0)
{
started = 1; // started ide na 1 kada je prekidac pritisnut
i = 0; // postavi i na prvi broj u nizu
counter = 20; // ceka se 1 sekunda
//
TH0=0xC3; // set timer0 na 0xC350
TL0=0x50; // 50,000 decimalno
ET0=1; // enable timer0
TR0=1; // start timer0
}
}
}
