这三路超声波测距的源代码
单片机源程序如下:- #include<reg52.h>
- #include <intrins.h>
- #include "LCD1602.h"
- #include "STCEEPROM.h"
- sbit RX1 = P3^4;
- sbit RX2 = P3^5;
- sbit RX3 = P3^6;
- sbit TX = P3^7;
- sbit LED = P2^1;
- sbit SPEAK = P2^0;
- sbit KEY1 = P1^3;
- sbit KEY2 = P1^4;
- sbit KEY3 = P1^5;
- sbit RST=P2^5; /*1脚*/
- sbit CS=P2^7; /*11*/
- sbit SCL=P2^3; /*10*/
- sbit SDA=P2^6; /*12*/
- sbit VBUSY=P2^4; //忙等待
- void display(void);
- unsigned char en_flag=0;
- void delay100us(void) //100US延时子程序
- {
- unsigned char j;
- for(j=50;j>0;j--);
- }
- void delay1ms(unsigned char count) //1MS延时子程序
- {
- unsigned char i,j,k;
- for(k=count;k>0;k--)
- for(i=2;i>0;i--)
- for(j=248;j>0;j--);
- }
- void Send_threelines(unsigned char addr) //三线发码子程序
- {
- unsigned char i;
- RST=0;
- delay1ms(5);
- RST=1;
- delay1ms(17); /* 17ms*/
- CS=0;
- delay1ms(2);
- for(i=0;i<8;i++)
- {SCL=0;
- if(addr & 1)SDA=1;
- else SDA=0;
- addr>>=1;
- delay100us(); /* 100us */
- SCL=1;
- delay100us();
- }
- CS=1;
- delay1ms(30);
- while(VBUSY == 0); //忙等待
- }
- unsigned int time=0;
- unsigned int timer=0;
- unsigned int S=0,S1=0,S2=0,S3=0;
- unsigned int SET_H=100,SET_L=10;
- bit flag =0;
- unsigned char Table[3]={0};
- unsigned char KEY_flag=0;
- //延时函数
- void Delay_ms(int jj)
- {
- int ii;
- while(jj--)
- for(ii=0;ii<116;ii++);
- }
- void Conut(void)
- {
- time=TH0*256+TL0;
- TH0=0;
- TL0=0;
-
- S=(time*1.87)/100; //算出来是CM
- if((S>=700)||flag==1) //超出测量范围显示“-”
- {
- flag=0;
- }
- }
- void main(void)
- {
- LCD1602_init();//液晶初始化
- //////////////////////0123456789ABCDEF
- LCD1602_Disp_ZF(0x80," : : ",16);
- //0123456789ABCDEF
- LCD1602_Disp_ZF(0x80+0X40,"Set H: L: ",16);
- TMOD=0x11; //设T0为方式1,GATE=1;
- TH0=0;
- TL0=0;
- TH1=0xf8; //2MS定时
- TL1=0x30;
- ET0=1; //允许T0中断
- ET1=1; //允许T1中断
- TR1=1; //开启定时器
- EA=1; //开启总中断
- EA=0;
- SET_H = ISP_READ(0x2c00)*256+ISP_READ(0x2c01);
- SET_L = ISP_READ(0x2c02)*256+ISP_READ(0x2c03);
- EA=1;
- while(1)
- {
- while(!RX1); //当RX为零时等待
- TR0=1; //开启计数
- while(RX1); //当RX为1计数并等待
- TR0=0; //关闭计数
- Conut();
- S1=S;
- Delay_ms(10);
- /////////////////////////////
- while(!RX2); //当RX为零时等待
- TR0=1; //开启计数
- while(RX2); //当RX为1计数并等待
- TR0=0; //关闭计数
- Conut();
- S2=S;
- Delay_ms(10);
- /////////////////////////////
- while(!RX3); //当RX为零时等待
- TR0=1; //开启计数
- while(RX3); //当RX为1计数并等待
- TR0=0; //关闭计数
- Conut();
- S3=S;
- Delay_ms(10);
- /////////////////////////////////////
- Table[0]= S1/100+0X30;
- Table[1]= S1%100/10+0X30;
- Table[2]= S1%10+0X30;
- LCD1602_Disp_ZF(0x80,Table,3);
- Table[0]= S2/100+0X30;
- Table[1]= S2%100/10+0X30;
- Table[2]= S2%10+0X30;
- LCD1602_Disp_ZF(0x86,Table,3);
- Table[0]= S3/100+0X30;
- Table[1]= S3%100/10+0X30;
- Table[2]= S3%10+0X30;
- LCD1602_Disp_ZF(0x8C,Table,3);
- /////////////////////////////////
- if((S1>SET_H||S1<SET_L)||(S2>SET_H||S2<SET_L)||(S3>SET_H||S3<SET_L))
- {
- P2 = 0X00;
-
- }
- else
- P2 = 0XFF;
- if((S1<SET_L)||(S2<SET_L)||(S3<SET_L))
- {
- SPEAK=0;
- }
- else
-
- SPEAK=1;
- if((S1<SET_H&&S1>SET_L)||(S2<SET_H&&S2>SET_L)||(S3<SET_H&&S3>SET_L))
- {
- Send_threelines(0);
-
- }
-
- if(!KEY1)
- {
- Delay_ms(10);
- if(!KEY1)
- {
- KEY_flag++;
- ISP_ERASE(0x2c00); //注意:字节编程时必须要先要擦除整个扇区
- ISP_PROGRAM(0x2c00, SET_H/256);
- ISP_PROGRAM(0x2c01, SET_H);
- ISP_PROGRAM(0x2c02, SET_L/256);
- ISP_PROGRAM(0x2c03, SET_L);
- }
- while(!KEY1);
- }
- if(!KEY2)
- {
- Delay_ms(10);
- if(!KEY2)
- {
- if(KEY_flag%2==0)SET_H++;
- if(KEY_flag%2==1)SET_L++;
- }
- }
- if(!KEY3)
- {
- Delay_ms(10);
- if(!KEY3)
- {
- if(KEY_flag%2==0)SET_H--;
- if(KEY_flag%2==1)SET_L--;
- }
- }
- Table[0]= SET_H/100+0X30;
- Table[1]= SET_H%100/10+0X30;
- Table[2]= SET_H%10+0X30;
- LCD1602_Disp_ZF(0x86+0x40,Table,3);
- Table[0]= SET_L/100+0X30;
- Table[1]= SET_L%100/10+0X30;
- Table[2]= SET_L%10+0X30;
- LCD1602_Disp_ZF(0x8C+0x40,Table,3);
- }
- }
- /********************************************************/
- void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
- {
- flag=1; //中断溢出标志
- }
- /********************************************************/
- void zd3() interrupt 3
- {
- TH1=0xf8;
- TL1=0x30;
- timer++;
- if(timer>=100)
- {
- timer=0;
- TX=1; //200MS 启动一次模块
- _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_();
- _nop_(); _nop_();_nop_();
- _nop_(); _nop_(); _nop_();
- TX=0;
- }
- }
复制代码
Keil代码下载:
3路超声波 语音.rar
(65.59 KB, 下载次数: 22)
|