最近课程设计有限,只能玩超声播测距报警和舵机继电器。具体代码输入。 #include<reg51.h> #include<intrins.h> #include"lcd.h" sbit pwm = P0^7; sbit Trig = P0^1; sbit Echo = P0^0; sbit beep=P1^5; sbit dianji=P3^7; sbit IRIN=P3^2; typedef unsigned char u8; typedef unsigned int u16; unsigned char code ASCII[15] = {0、1、2、3、4、5、7、8、9.,,M’}; unsigned int PWM; //pwm占空比50%,可调占空比50% unsigned int t = 0; static unsigned char DisNum = 0; //显示指针 unsigned int time=0; unsigned long S=0; bit flag =0; unsigned char disbuff[4] ={ 0、0、0、0、0、0; u8 IrValue[6]; u8 T;
void delay(unsigned int v) { while(v–); }
//初始化红外接收 void IrInit() { IT0=1; EX0=1; EA=1; IRIN=1; }
void Conut(void) { while(!Echo); //当RX为零时等待 TR0=1; //打开计数 while(Echo); //当RX计数并等待1 TR0=0; //关闭计数 delay(100000); time=TH0*256 TL0; TH0=0; TL0=0;
S=(time*1.7)/100; //计算是的CM if((S>=700)||flag==1) 超出测量范围显示- { flag=0; DisplayOneChar(0, 1, ASCII[11]); DisplayOneChar(1, 1, ASCII[10]); //显示点 DisplayOneChar(2, 1, ASCII[11]); DisplayOneChar(3, 1, ASCII[11]); DisplayOneChar(4, 1, ASCII[12]); //显示M } else { disbuff[0]=S00/100; disbuff[1]=S000/10; disbuff[2]=S00 ; DisplayOneChar(0, 1, ASCII[disbuff[0]]); DisplayOneChar(1, 1, ASCII[10]); //显示点 DisplayOneChar(2, 1, ASCII[disbuff[1]]); DisplayOneChar(3, 1, ASCII[disbuff[2]]); DisplayOneChar(4, 1, ASCII[12]); //显示M } }
void zd0() interrupt 1 //T0中断用于计数器溢出,超过测距范围 { flag=1; //中断溢出标志 }
void StartModule() ///启动模块 { Trig=1; ///启动一次模块 nop(); //10微秒 nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); Trig=0; }
void delayms(unsigned int ms) { unsigned char i=100,j; for(;ms;ms–) { while(–i) { j=10; while(–j); } } } void Timer1Init() { TMOD|=0X10.//选择定时器1模式,只使用工作模式1TR1打开启动。
TH1=0XFC; ///给定时器赋初值,定时1ms TL1=0X18; ET1=1.//打开定时器1中断允许 EA=1;//打开总中断 TR1=1;///打开定时器
}
void main(void) { Timer1Init(); IrInit(); TMOD|=0x01; //设T0为方式1,GATE=1; TH0=0; TL0=0; ET0=1; //允许T0中断 EA=1; //打开总中断 LcdInit(); while(1) { StartModule() ; Conut(); //计算 } } void Timer1() interrupt 3 { TH1 = 0XFc; ///重新安装初始值 TL1 = 0X18; t ; if(t >= 20) //PWM周期为20ms t = 0; if(t < PWM) pwm = 1; else if(t >= PWM) pwm = 0; if(S>32) { beep=1;PWM=2;//dianji=1; } else { beep=0;PWM=1;//dianji=0; } if(IrValue[2]==0x40) { dianji=0; } if(IrValue[2]==0x43) { dianji=1; } }
void Readlr() interrupt 0 { u8 j,k; u16 err; T=0; delay(700); //7ms if(IRIN0) { err=1000; while((IRIN0)&&(err>0)) { delay(1); err–; }
if(IRIN==1) { err=500; while((IRIN==1)&&(err>0)) { delay(1); err--; } for(k=0;k<4;k ) { for(j=0;j<8;j ) { err=60; while((IRIN==0)&&(err>0)) { delay(1); err--; } err=500; while((IRIN==1)&&(err>0)) { delay(10); T ; err--; if(T>30) { return ; } } IrValue[k]>>=1; if(T>8) { IrValue[k]|=0x80; } T=0; } } if(IrValue[2]!=~IrValue[3]) { return ; } } }
}