Mam do zrobienia mały projekcik. Bazując na 2 mikrokontrolerach 80C51 mam stworzyć tablice wyświetlające wyniki (taką jakiej np używają do wyświetlania wyników w koszykówce).
Jak widać na schemacie poniżej, mamy 4 przyciski:
1. Ustawia drużyne której punkty modyfikujemy
2. Dodaje 1 punkt
3. Odejmuje 1 punkt
4. Reset
Według wskazówek jakie otrzymałem, tak to powinno zostać zrobione. Pierwszy mikrokontroler powinien zapomocą printf wysłać 4 zmienne ( części dziesiętne i części jedności liczby punktów obu drużyn) do drugiego mikrokontrolera. Tam zostają wrzucone do tablicy. W momencie kiedy wszystkie 4 zmienne będą już w tej tablicy zapalamy sobie stworzoną przez nas flage. Na ten znak mikrokontroler drugi mam skopiować zmienne z tablicy do innej tablicy i z niej wrzucać na wyświetlacze, gasząc przy tam zapaloną wcześniej flagę. Wybrano takie rozwiązanie aby podczas przekazu danych między kontrolerami caly czas był wyświetlany jakiś wynik.
Schemat
Do stworzenia schematu został użyty Proteus ISIS Profesional 7.4 SP3. (Schemat w proteusie moge podesłać tylko trzeba mi dać znać na maila lub na gg)
Schemat mam już gotowy, ale oprogramowanie kontrolerów idzie mi dość opornie. Jak narazie mam zrobioną obsługe przerwania dla pierwszego kontrolera, ale dalej nie wiem już jak to ugryść. Mam czas do poniedziałku do północy aby to skończyć.
Tu zamieszczam fragment kodu, którym już dysponuję (fragment w komentarzu jest potencjalnie zły). Kodu dla drugiego kontrolera jeszcze nie zacząłęm.
Kod: Zaznacz cały
// Autor:
#include <REG51.H>
#include <math.h>
sbit Clear=P1^7;
unsigned int data licz1, licz2, dzies1, dzies2, jedno1, jedno2;
unsigned char bdata dru;
volatile unsigned char bdata Key;
sbit B1 = Key^0;
sbit B2 = Key^1;
sbit B3 = Key^2;
sbit B4 = Key^3;
/*
void Przyciski(void)
{
//ZMIANA DRUZYNY
if(B1 != 1)
{
if (dru ==1)
{
dru=2;
}
else
{
dru=1;
}
}
//ZMIANA DRUZYNY
//DODAWANIE
if(B2 !=1)
{
if (dru ==1)
{
licz1++;
if(licz1 == 100)
{
licz1=0;
}
dzies1=floor(licz1/10);
jedno1=licz1-(10*dzies1);
}
if (dru ==2)
{
licz2++;
if(licz2 == 100)
{
licz2=0;
}
dzies2=floor(licz2/10);
jedno2=licz2-(10*dzies2);
}
}
//DODAWANIE
//ODEJMOWANIE
if(B3 != 1)
{
if (dru ==1)
{
licz1--;
if(licz1 < 0)
{
licz1=99;
}
dzies1=floor(licz1/10);
jedno1=licz1-(10*dzies1);
}
if(dru ==2)
{
licz2--;
if(licz2 < 0)
{
licz2=99;
}
dzies2=floor(licz2/10);
jedno2=licz2-(10*dzies2);
}
}
//ODEJMOWANIE
//RESET
if(B4 != 1)
{
licz1 =0;
dzies1=floor(licz1/10);
jedno1=licz1-(10*dzies1);
licz2 =0;
dzies2=floor(licz2/10);
jedno2=licz2-(10*dzies2);
}
//RESET
}
*/
void Wait(int T)
{
int i;
for (i=0; i<T; i++) {;}
}
void przINT0(void) interrupt 0
{
Key = P1 & 0x0F;
Clear = 0;
Wait(100);
Clear = 1;
}
void SerialInit(void)
{
SCON = 0x50; // Ustaw rejestr kontroli portu szeregowego
// Tryb 1: 8-bit uart, zmienna predkosc transmisji
// REN = 0: odbiornik wylaczony
PCON &= 0x7F; // SMOD = 0: predkosc transmisji x 1
PCON |= 0x80; // SMOD = 1: predkosc transmisji x 2
TMOD &= 0xCF; // 8 bit Timer1 z automatycznym przeladowywaniem
// wyzeruj bity M1 i M0
TMOD |= 0x20; // ustaw bit M1
TH1 = 0xFF; // ustaw wartosc poczatkowa rejestru TH1
TL1 = 0xFF; // ustaw wartosc poczatkowa rejestru TL1
// predkosc 12800 dla czestotliwoasci 2.4576 MHz
TR1 = 1; // start timer 1
TI = 1; // ustaw flage TI gotowosci do nadawania
}
void Init (void)
{
dru =1;
IT0=1;
EX0=1;
EA=1;
}
void main (void)
{
Init();
SerialInit();
while(1)
{
Przyciski();
}
}Pozdrawiam.