Вы находитесь на странице: 1из 3

D:\Books\PS\main.

c
1 #include <reg52.h>
2 #include <math.h>
3 #define PWM_Freq_Num 1
4
5 sbit rs=P1^3;
6 sbit rw=P1^4; //variables to control the LCD screen
7 sbit e= P1^5; //enable of LCD screen
8 sbit trig=P1^0;
9 sbit PWM_pin1 = P0^0;
10
11 unsigned char PWM = 0;
12 unsigned char hi=0;
13 unsigned char lo=0;
14 int dist=0;
15 int repeat=1; //will be reset in ISR
16 unsigned char ch[]="DISTANCE"; //string to print on LCD screen
17 unsigned char ch1; //character to print the distance
18 unsigned int i,j,k; //loop control
19 int timer=0;
20 int conv1;
21 int conv2;
22 unsigned int temp = 0;
23
24 void delay(unsigned int); //delay used for giving the edge for enable on LCD
25 void cmd(unsigned char); //function used to pass command to LCD screen
26 void dat(unsigned char); //to send dat to print on LCD
27 void printmeasure(); //function for printing the diastance
28 void portinitialize(void);
29 void measure();
30 void InitTimer0(void); //TIMER0 used for measuring distance
31 void InitTimer1(void); //TIMER1 used for trigering the HC-SR04
32 void Delay_us(); //delay for ultrasonic sensor triger
33 void write_PWM(int);
34 void InitPWM();
35
36 void main(){
37 portinitialize();
38 //enable external int 0
39 IT0 = 1; // Configure interrupt 0 for falling edge on /INT0 (P3.2)
40 EX0 = 1; // Enable EX0 Interrupt
41 EA = 1; // Enable Global Interrupt Flag
42
43 while(1){
44 InitPWM();
45 write_PWM(127);
46 }
47 }
48
49 void InitPWM(void)
50 {
51
52 InitTimer1(); // Initialize timer0 to start generating interrupts
53 // PWM generation code is written inside the Timer0 ISR
54 }
55
56 void write_PWM(int a){
57
58 PWM = a; // Make 50% duty cycle of PWM
59 while(1) // Rest is done in Timer0 interrupt
60 {
61 measure();
62 printmeasure();
63 }
64
65 }
66
67 void InitTimer1(void)
68 {
69 TMOD &= 0x0F; // Clear 4bit field for timer0
70 TMOD |= 0x10; // Set timer0 in mode 1 = 16bit mode
71
72 TH1 = 0x00; // First time value

Page 1
D:\Books\PS\main.c
73 TL1 = 0x00; // Set arbitrarily zero TIMER 1 PWM creation
74
75 ET1 = 1; // Enable Timer0 interrupts
76 EA = 1; // Global interrupt enable
77
78 TR1 = 1; // Start Timer 0
79 }
80
81 void portinitialize(){
82 P3=0xFF; //P3:input P1:output P2:output
83 P1=0x00;
84 P2=0x00;
85 P0=0x00;
86 }
87
88
89
90 void measure(){
91 repeat=1;
92 InitTimer0();
93 InitTimer1();
94 trig=1;
95 for(i=0;i<100;i++);
96 trig=0;
97 TR0=1;
98 IT0 = 1; // Configure interrupt 0 for falling edge on /INT0 (P3.2)
99 EX0 = 1; // Enable EX0 Interrupt
100 EA = 1;
101 while(repeat){
102 }
103
104 }
105
106
107
108 void InitTimer0(void)
109 {
110 TMOD &= 0xF0; // Clear 4bit field for timer0
111 TMOD |= 0x01; // Set timer0 in mode 1 = 16bit mode
112
113 TH0 = 0x00; // First time value
114 TL0 = 0x00; // Set arbitrarily zero
115
116 //ET0 = 1; // Enable Timer0 interrupts
117 //EA = 1; // Global Interrupt enable
118 }
119
120
121 void dist_timer(void) interrupt 0
122 {
123 TR0=0;
124 TF0=0;
125 timer&=0x00;
126 hi=TH0;
127 lo=TL0;
128 timer=hi ;
129 repeat=0;
130 dist=timer;//dist=(int)(((timer/1000)*342)/2);
131 }
132
133 void Timer1_ISR (void) interrupt 1
134 {
135 TR1 = 0; // Stop Timer 0
136
137 if(PWM_pin1) // if PWM_pin1 is high
138 {
139 PWM_pin1 = 0;
140 temp = (255-PWM)*PWM_Freq_Num;
141 TH1 = 0xFF - (temp>>8)&0xFF;
142 TL1 = 0xFF - temp&0xFF;
143 }
144 else // if PWM_pin1 is low

Page 2
D:\Books\PS\main.c
145 {
146 PWM_pin1 = 1;
147 temp = PWM*PWM_Freq_Num;
148 TH1 = 0xFF - (temp>>8)&0xFF;
149 TL1 = 0xFF - temp&0xFF;
150 }
151
152 TF1 = 0; // Clear the interrupt flag
153 TR1 = 1; // Start Timer 0
154 }
155
156
157 void printmeasure()
158 {
159 cmd(0x38);
160 cmd(0x01);
161 cmd(0x0c);
162 cmd(0x83);
163 cmd(0x06);
164
165
166 for(i=0;ch[i]!='\0';i++)
167 dat(ch[i]);
168
169 cmd(0xc3);
170 ch1=((dist/10)+48);
171 hi=hi+48;
172 dat(hi);//dat(ch1);
173 ch1=(dist%10)+48;
174 lo=lo+48;
175 dat(lo);//dat(ch1);
176 /*
177 while(1){
178 for(k=0;k<16;k++)
179 {
180 cmd(0x1c);
181 }
182 }
183 */
184 }
185 void delay(unsigned int t)
186 {
187 unsigned int i,j;
188 e=1;
189 for(i=0;i<t;i++)
190 for(j=0;j<1275;j++);
191 e=0;
192 }
193
194 void cmd(unsigned char ch)
195 {
196
197 rs=0;
198 rw=0;
199 P2=ch;
200 delay(20);
201 }
202 void dat(unsigned char ch)
203 {
204 rs=1;
205 rw=0;
206 P2=ch;
207 delay(20);
208 }
209

Page 3

Вам также может понравиться