#include <reg52.h> #include <stdio.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit Trig = P3^4; //控制端 sbit Echo = P3^5; //接收端 sbit led = P1^3; //指示燈 sbit servorControl =P1^3; //舵機的控制引腳 uchar flag = 0; uchar control = 5; uchar servorTime =0; unsigned char T0RH =0; unsigned char T0RL =0; void time_init() { EA = 1; TMOD= 0x11; TH0 = 0; TL0 = 0; } void delay ( uchar time ) //延遲函數 { uchar i; for(;time>0;time--) { for(i=0;i<255;i++); } } //初始化定時器 void Delay_us (unsigned char t) { while (--t); } //大約延時t*2+5us 超聲波模塊用 void timer0() interrupt 1 { TH0 = 0; TL0 = 0; } //中斷程序 初始化賦值 重新計數 超聲波模塊用 計算時間 void main () { unsigned int time,distance; EA = 1; ET0 = 1; ET1 = 1; TMOD = 0x11; TH1 = 0xff; TL1 = 0x9c; servorTime=0; Trig=0; Echo=0; time_init(); while(1) { Trig=1; Delay_us(5); Trig=0; while(Echo==0); TR0=1; while(Echo); TR0=0; time=TH0*256+TL0; distance=(int)(time*0.017); //計算路程 單位為cm TH0=0; TL0=0; if(distance<30) //如果距離小于30cm 蜂鳴器響 { control=5; //使舵機向正擺動 servorTime=0; TR1=1; delay(200); delay(200); TR1=0; } else { control=20; //使舵機向右擺動 servorTime=0; TR1=1; delay(200); delay(200); TR1=0; delay(200); delay(200); } } } void T1_int(void) interrupt 3 //產生舵機所需要的脈沖 { TH1 = 0xff; TL1 = 0x9c; servorTime++; if(servorTime<=control) servorControl=1; else servorControl=0; if(servorTime>=200) servorTime=0; } |