Kod: Zaznacz cały
#include <REG2051.H>
#include <stdio.h>
Config Timer0 = Timer, Gate = internal, Mode = 1
#define OSC_FREQ (12000000UL)
#pragma language=extended
void main (void)
{
T0_GATE_ = 1;
T1_GATE_ = 0 ;
sbit Buzer P^3.0;
sbit led_1 P^1.7;
sbit led_2 P^1.6;
sbit led_3 P^1.5;
sbit led_4 P^1.4;
sbit led_5 P^1.3;
sbit led_6 P^1.2;
sbit led_7 P^1.1;
sbit led_8 P^1.0;
sbit Gate_ P^3.7;
long int Temp;
unsigned char Error;
unsigned char B1;
unsigned char B2;
unsigned char Nled;
unsigned char Gd;
void Ledy ()
{
unsigned char nled;
unsigned char Gd;
}
void LEDS ()
{
led_1 = 1;
led_2 = 1;
led_3 = 1;
led_4 = 1;
led_5 = 1;
led_6 = 1;
led_7 = 1;
led_8 = 1;
}
void delay()
{
volatile int i;
for(i = 0 ; i < 500000 ; i++ );
}
int TIMER0 TIMER0_int;
INT0 = 1;
EX0 = 1;
IT0 = 0;
P3_0 = 0;
P3_7 = 1;
LEDS ();
do {
Error = 0;
TH0 = 0;
TL0 = 0;
Gate_ = 0;
delay();
Gate_ = 1;
TR0 = 1;
Waitms 1;
delay();
IE0 = 0;
INT0;
}
do
{
Error.1 = TFO;
Loop Until Error > 0;
if Error.0 = 1 then
LEDS = 0;
P3_0 = 0;
else Error.1 = 1 then
B1 = TL0;
B2 = TH0;
Temp = B2 * 256;
Temp = Temp + B1;
if Temp < 860 then
P1_0 = 1;
P1_1 = 1;
P1_2 = 1;
P1_3 = 1;
P1_4 = 1;
P1_5 = 1;
P1_6 = 1;
P1_7 = 1;
P3_0 = 1;
else Temp > 859 & Temp < 2109 then
P1_0 = 1;
P1_1 = 1;
P1_2 = 1;
P1_3 = 1;
P1_4 = 1;
P1_5 = 1;
P1_6 = 1;
P1_7 = 0;
P3_0 = 1;
else Temp > 2108 & Temp < 3359 then
P1_0 = 1;
P1_1 = 1;
P1_2 = 1;
P1_3 = 1;
P1_4 = 1;
P1_5 = 1;
P1_6 = 0;
P1_7 = 0;
P3_0 = 1;
else Temp > 3358 & Temp < 4609 then
P1_0 = 1;
P1_1 = 1;
P1_2 = 1;
P1_3 = 1;
P1_4 = 1;
P1_5 = 0;
P1_6 = 0;
P1_7 = 0;
P3_0 = 1;
else Temp > 4608 & Temp < 5859 then
P1_0 = 1;
P1_1 = 1;
P1_2 = 1;
P1_3 = 1;
P1_4 = 0;
P1_5 = 0;
P1_6 = 0;
P1_7 = 0;
P3_0 = 0;
else Temp > 5858 & Temp < 7109 then
P1_0 = 1;
P1_1 = 1;
P1_2 = 1;
P1_3 = 0;
P1_4 = 0;
P1_5 = 0;
P1_6 = 0;
P1_7 = 0;
P3_0 = 0;
else Temp > 7108 & Temp < 8359 then
P1_0 = 1;
P1_1 = 1;
P1_2 = 0;
P1_3 = 0;
P1_4 = 0;
P1_5 = 0;
P1_6 = 0;
P1_7 = 0;
P3_0 = 0;
else Temp 8358 & Temp 10000 then
P1_0 = 1;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;
P1_4 = 0;
P1_5 = 0;
P1_6 = 0;
P1_7 = 0;
P3_0 = 0;
else Temp > 9999 then
LEDS = 0;
P3_0 = 0;
}
switch (nled)
{
case 0 : Ledy = 255;
case 1 : Ledy = 254;
case 2 : Ledy = 252;
case 3 : Ledy = 248;
case 4 : ledy = 240;
case 5 : Ledy = 224;
case 6 : Ledy = 192;
case 7 : Ledy = 128;
case 8 : Ledy = 8;
}
switch (nled)
{
case 0 : Ledy = 255;
case 1 : Ledy = 127;
case 2 : Ledy = 63;
case 3 : Ledy = 31;
case 4 : ledy = 15;
case 5 : Ledy = 7;
case 6 : Ledy = 3;
case 7 : Ledy = 1;
case 8 : Ledy = 0;
}
B2 = Ledy;
void Timer0()
{
Over++;
if Over > 9 then
TR0 = 1;
INT0 = 0;
}
void Int0()
{
TR0 = 0;
INT0 = 0;
Error.1 = 1;
}
}
na początku powinna zostać ustawiona wartość kwarcu na 12 Mhz, następnie powinien zostać ustawiony Timer jako licznik 16 bitowy bez automatycznego ładowania, uaktywnienie bramkowania T0_Gate, bramka T0_Gate powinna mieć wartość 0, przypisanie Buzera do portu 3.0, przypisanie Gate_ do portu 3.7, diody znajdują sie w portach od 1.0 do 1.7, deklaracja Temp jako liczby 32 bitowej, deklaracja Error, B1, B2, Nled, Gd jako bajt przyjmujący wartości 0 - 255, następnie powinien zostać uruchomiony Timer0, przerwanie niskim poziomem sygnału przerywającego (IT0=0), włączenie systemu przerwań, włączenie przerwania przepełnienia licznika Timer0, wyłączenie przerwania INT0, buzer wartość 0, Gate wartość 1, chwilowe wywołanie diod, pętla "do", a w niej : wartości 0 na Gate, Error, TH0 oraz TL0, opóźnienie 500 ms, wartość Gate równa 1, przyłączenie (TR0=1) źródła zliczanych impulsów do wejścia licznika T0, wstrzymanie na 1 milisekundę, ponowne opóźnienie 500 ms, zgłoszenie przerwania na INT0, włączenie INT0, koniec pętli, następna pętla "do" : Error.1 jest równy przepełnieniu licznika T0, sprawdzenie przepełnienie licznika będzie wykonane przynajmniej raz i będzie powtarzane do momentu gdy przyjmie wartość inną niż 0. wywołanie diod, buzer wyłączony, jeżeli Error.1 będzie równy 1 wtedy, bit B2 jest równy bitowi TL0 a B2 jest równy TH0, Temp = B2*256, Temp = Temp + wartość B1, i teraz następuje pomiar odległości : jezeli wartość mniejsza niż X to nie włączają się diody, nie włącza się buzer, następnie jeżeli wartość Temp większa od x i mniejsza od Y to włącza sie 8 diod oraz buzer, przy kolejnej wartości włącza sie 7 diod i buzer itd aż wyjdzie poza zakres pomiaru. Później sprawdzane są przypadki w "Ledy" a na końcu zadeklarowany jest Timer0 oraz Int0.