1 | #include <t89c51ac2.h> // Header für Controller "AT89C51AC3"
|
2 | #include <stdio.h> // Standard-Eingabe-Ausgabe-Header
|
3 |
|
4 | // sfr P0 = 0x80; /* Port-0, address 80h */
|
5 | // sfr P1 = 0x90; /* Port-1, address 90h */
|
6 | // sfr P2 = 0xA0; /* Port-2, address 0A0h */
|
7 | // sfr P3 = 0xB0; /* Port-3, address 0B0h */
|
8 |
|
9 | /*---------------------------------------------------------------------------
|
10 | Dieses Programm liest die Entfernug aus dem Ultraschall Sensor SRF05 aus,
|
11 | und gibt die Entferung in cm auf Port 2 in Form von aufleuchtenden LEDs aus.
|
12 | -----------------------------------------------------------------------------*/
|
13 |
|
14 | /*--- Eingaenge und Ausgaenge deklarieren ---*/
|
15 |
|
16 | sfr srfPort = 0x90; // Die Ports MÜSSEN mit der Hex-Adress angegeben werden (0x90 = Port 1)
|
17 | sfr ausgabe = 0xA0; // Die Ports MÜSSEN mit der Hex-Adress angegeben werden (0xA0 = Port 2)
|
18 |
|
19 | sbit trigger_pin = P1^4; // SRF05 Auslösung Trigger
|
20 | sbit echo_pin = P1^3; // SRF04 Ergebnis einholen
|
21 |
|
22 | /*--- Variablen und Konstanten Deklarieren ---*/
|
23 |
|
24 | unsigned int distanz; // speichert die Distanz
|
25 |
|
26 | /*--- Methoden und Prototypen ---*/
|
27 |
|
28 | void main(void); // Hauptprogramm
|
29 | void srf_messung_ein(void); // Schaltet den Port 1 auf High
|
30 | void srf_messung_aus(void); // Schaltet den Port 1 auf Low und auf "einlesen"
|
31 | void timer_10ms(void); // Wartet bis ein Burst ausgesendet wurde
|
32 | void entfernung(); // errechnet die Entfernung zum Objekt
|
33 | int timer_echo(); // erfasst die Dauer vom reflektierten Echo
|
34 |
|
35 | /*--- Hauptprogramm ---*/
|
36 |
|
37 | void main(void){
|
38 |
|
39 | ausgabe=0x1; //Port 2.1 zeigt den Betrieb an
|
40 |
|
41 | while(1){
|
42 |
|
43 | srf_messung_ein();
|
44 | timer_10ms();
|
45 | srf_messung_aus();
|
46 | timer_echo();
|
47 | entfernung();
|
48 | }
|
49 | } // main
|
50 |
|
51 | /*--- Zusatzfunktionen ---*/
|
52 |
|
53 | void timer_10ms(void) {
|
54 | // Timer0 vorbereiten
|
55 | TMOD=0x02; // Timer 0 im 16 Bit-Betrieb (Mode1) Binär 000010000
|
56 | TH0=0xFFFF; // Reload Wert ist 0xFFFF = 65535
|
57 | TL0=0xD8EF; // Startwert = 55535 d.h. 10ms bis 65535 -> High-Bit des Zählers
|
58 | TF0=0; // Timer 0 Überlaufflag löschen
|
59 | TR0=1; // Timer 0 starten
|
60 | }
|
61 |
|
62 | void srf_messung_ein(void){
|
63 | trigger_pin = 0xFFFF; // trigger_pin Impuls auslösen (P1 auf high=1)
|
64 | }
|
65 |
|
66 | void srf_messung_aus(void){
|
67 | trigger_pin = 0x0000; // trigger_pin Impuls beenden (P1 auf low=0)
|
68 | srfPort = 0xFF; // srfPort auf einlesen geschaltet
|
69 | }
|
70 |
|
71 | /*--- Entfernung berechnen ---*/
|
72 |
|
73 | void entfernung(int z){
|
74 |
|
75 | distanz = z;
|
76 |
|
77 | if(distanz > 20 ){
|
78 | ausgabe=0x03; // Port 2.1 zeigt den Betrieb an u. Port 2.2 zeigt Distanz an
|
79 | }
|
80 | if(distanz > 40 ){
|
81 | ausgabe=0x07; // Port 2.1 zeigt den Betrieb an u. Port 2.3 zeigt Distanz an
|
82 | }
|
83 | if(distanz > 60 ){
|
84 | ausgabe=0x0F; // Port 2.1 zeigt den Betrieb an u. Port 2.4 zeigt Distanz an
|
85 | }
|
86 | if(distanz > 80 ){
|
87 | ausgabe=0x1F; // Port 2.1 zeigt den Betrieb an u. Port 2.5 zeigt Distanz an
|
88 | }
|
89 | if(distanz > 100 ){
|
90 | ausgabe=0x3F; // Port 2.1 zeigt den Betrieb an u. Port 2.6 zeigt Distanz an
|
91 | }
|
92 | }
|
93 |
|
94 | int timer_echo(){
|
95 | // Timer1 vorbereiten
|
96 | TMOD=0x20; // Timer 1 im Reload-Betrieb (Mode2)
|
97 | TH1=0x7530; // Reloadwert 30000, wenn bis Reloadwert gezählt wird ist kein Objekt in Reichweite
|
98 | TL1=0x0000; // Startwert 0
|
99 | TF1=0; // Timer 1 Überlaufflag löschen
|
100 | TR1=1; // Timer 1 starten
|
101 |
|
102 | if( echo_pin != 1 ){
|
103 |
|
104 | distanz = (TL1/59); // berechnet die Dauer des Echos in cm, speichert sie in der Variable "distanz"
|
105 | entfernung(distanz); // distanz wird der Methode entfernung übergeben
|
106 |
|
107 | if(TL1 == 0x7530){ // 30ms abgelaufen d.h. es ist kein Objekt in Reichweite
|
108 | TR1=0;
|
109 | return 0;
|
110 | }
|
111 | }
|
112 | }
|