📄 sensor.c
字号:
#include <reg52.h>
unsigned int count=0; //保留定时器值
unsigned int count1=0; //1号传感器
unsigned int count2=0; //2号传感器
unsigned int count3=0; //3号传感器
unsigned int count4=0; //4号传感器
unsigned int count5=0; //5号传感器
unsigned int count6=0; //6号传感器
unsigned int count7=0; //7号传感器
unsigned int count8=0; //8号传感器
unsigned char flag=0; //定时中断溢出标志
unsigned char group=0; //启动第几组传感器的标志位,0表示第一组
unsigned char sendchar; //保留串口发送的字符串
unsigned char i;
unsigned int temp;
/***************************************************************************/
//传感器使用管脚定义
sbit P1_0=P1^0; //1号驱动管脚
sbit P1_1=P1^1; //2号驱动管脚
sbit P1_2=P1^2; //3号驱动管脚
sbit P1_3=P1^3; //4号驱动管脚
sbit P1_4=P1^4; //5号驱动管脚
sbit P1_5=P1^5; //6号驱动管脚
sbit P1_6=P1^6; //7号驱动管脚
sbit P1_7=P1^7; //8号驱动管脚
sbit P0_0=P0^0; //1号传感器或门
sbit P0_1=P0^1; //2号传感器或门
sbit P0_2=P0^2; //3号传感器或门
sbit P0_3=P0^3; //4号传感器或门
sbit P0_4=P0^4; //5号传感器或门
sbit P0_5=P0^5; //6号传感器或门
sbit P0_6=P0^6; //7号传感器或门
sbit P0_7=P0^7; //8号传感器或门
sbit P2_0=P2^0; //1号传感器判断脚
sbit P2_1=P2^1; //2号传感器判断脚
sbit P2_2=P2^2; //3号传感器判断脚
sbit P2_3=P2^3; //4号传感器判断脚
sbit P2_4=P2^4; //5号传感器判断脚
sbit P2_5=P2^5; //6号传感器判断脚
sbit P2_6=P2^6; //7号传感器判断脚
sbit P2_7=P2^7; //8号传感器判断脚
void sensor();
void pin_init();
void interrupt_init();
void sensor_display();
void value_init();
void main(void)
{
pin_init();
interrupt_init();
while(1)
{
sensor();
sensor_display();
value_init();
}
}
void value_init()
{
count1=0; //1号传感器
count2=0; //2号传感器
count3=0; //3号传感器
count4=0; //4号传感器
count5=0; //5号传感器
count6=0; //6号传感器
count7=0; //7号传感器
count8=0; //8号传感器
}
void pin_init()
{
P0=0xff; //锁死8个或门
P1=0x00; //8驱动脚置低
P2=0xff; //为读引脚作准备
}
void interrupt_init()
{
TCON=0x00; //外部中断低电平触发
TMOD=0x21; //定时器1工作于16位模式
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 启动定时器1
IE=0x83; //允许定时器0,外部中断,开总中断,禁止定时器1中断
}
void sensor()
{
double dis=0; //传感器距离值
unsigned char i;
TH0=0xb9;
TL0=0xd7; //定时19.5毫秒
TR0=1;
P1=0x0f;
P1=0x0f;
P1=0x00;
//经示波器测量,P1.0输出4.4微秒脉冲,激活第一组(a,b,c,d)超声波传感器
for(i=0;i<234;i++); //延时766微秒
P0&=0xf0; //(a,b,c,d)或门打开
while(1) //第一组传感器(a,b,c,d)工作
{
if(flag)
{
flag=0;
group=1;
P0|=0x0f;
break;
}
}
TH0=0xb9;
TL0=0xd7; //定时19.5毫秒
P1=0xf0;
P1=0xf0;
P1=0x00;
//经示波器测量,P1.0输出4.4微秒脉冲,激活第二组(e,f,g,h)超声波传感器
for(i=0;i<234;i++); //延时766微秒
P0&=0x0f; //(e,f,g,h)或门打开
while(1) //第二组传感器(e,f,g,h)工作
{
if(flag)
{
flag=0;
group=0;
P0|=0xf0;
break;
}
}
TR0=0;
//a sensor **************************************************
count1=count1-0xB9D7-0x02B6; //减去755微秒所用时间
dis=count1*0.1866319;
count1=(unsigned int)dis; //计算距离 单位:mm
//b sensor **************************************************
count2=count2-0xB9D7-0x2B6; //减去755微秒所用时间
dis=count2*0.1866319;
count2=(unsigned int)dis; //计算距离 单位:mm
//c sensor **************************************************
count3=count3-0xB9D7-0x2B6; //减去755微秒所用时间
dis=count3*0.1866319;
count3=(unsigned int)dis; //计算距离 单位:mm
// d sensor *************************************************
count4=count4-0xB9D7-0x2B6; //减去755微秒所用时间
dis=count4*0.1866319;
count4=(unsigned int)dis; //计算距离 单位:mm
// e sensor *************************************************
count5=count5-0xB9D7-0x2B6; //减去755微秒所用时间
dis=count5*0.1866319;
count5=(unsigned int)dis; //计算距离 单位:mm
// f sensor *************************************************
count6=count6-0xB9D7-0x2B6; //减去755微秒所用时间
dis=count6*0.1866319;
count6=(unsigned int)dis; //计算距离 单位:mm
// g sensor *************************************************
count7=count7-0xB9D7-0x2B6; //减去755微秒所用时间
dis=count7*0.1866319;
count7=(unsigned int)dis; //计算距离 单位:mm
// h sensor *************************************************
count8=count8-0xB9D7-0x2B6; //减去755微秒所用时间
dis=count8*0.1866319;
count8=(unsigned int)dis; //计算距离 单位:mm
}
void int0() interrupt 0
{
count=TH0*256+TL0;
if(!group)
{
if(!P2_0)
{
P0_0=1;
count1=count;
return;
}
if(!P2_1)
{
P0_1=1;
count2=count;
return;
}
if(!P2_2)
{
P0_2=1;
count3=count;
return;
}
if(!P2_3)
{
P0_3=1;
count4=count;
}
}
else
{
if(!P2_4)
{
P0_4=1;
count5=count;
return;
}
if(!P2_5)
{
P0_5=1;
count6=count;
return;
}
if(!P2_6)
{
P0_6=1;
count7=count;
return;
}
if(!P2_7)
{
P0_7=1;
count8=count;
}
}
}
void timer0() interrupt 1
{
flag=1;
}
void uart_sendchar(unsigned char c)
{
SBUF=c;
while(TI==0);
TI=0;
}
void sensor_display()
{
uart_sendchar(65);//发送桢的起始字符
sendchar=(unsigned char)(unsigned char)(count1/10000);
uart_sendchar(sendchar|0x30);
sendchar=((unsigned char)((count1%10000)/1000));
uart_sendchar(sendchar|0x30);
sendchar=((unsigned char)((count1%1000)/100));
uart_sendchar(sendchar|0x30);
sendchar=((unsigned char)((count1%100)/10));
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)(count1%10);
uart_sendchar(sendchar|0x30);
uart_sendchar(44);
sendchar=(unsigned char)(unsigned char)(count2/10000);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count2%10000)/1000);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count2%1000)/100);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count2%100)/10);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)(count2%10);
uart_sendchar(sendchar|0x30);
uart_sendchar(44);
sendchar=(unsigned char)(unsigned char)(count3/10000);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count3%10000)/1000);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count3%1000)/100);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count3%100)/10);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)(count3%10);
uart_sendchar(sendchar|0x30);
uart_sendchar(44);
sendchar=(unsigned char)(unsigned char)(count4/10000);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count4%10000)/1000);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count4%1000)/100);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count4%100)/10);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)(count4%10);
uart_sendchar(sendchar|0x30);
uart_sendchar(44);
sendchar=(unsigned char)(unsigned char)(count5/10000);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count5%10000)/1000);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count5%1000)/100);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count5%100)/10);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)(count5%10);
uart_sendchar(sendchar|0x30);
uart_sendchar(44);
sendchar=(unsigned char)(unsigned char)(count6/10000);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count6%10000)/1000);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count6%1000)/100);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count6%100)/10);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)(count6%10);
uart_sendchar(sendchar|0x30);
uart_sendchar(44);
sendchar=(unsigned char)(unsigned char)(count7/10000);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count7%10000)/1000);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count7%1000)/100);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count7%100)/10);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)(count7%10);
uart_sendchar(sendchar|0x30);
uart_sendchar(44);
sendchar=(unsigned char)(unsigned char)(count8/10000);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count8%10000)/1000);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count8%1000)/100);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)((count8%100)/10);
uart_sendchar(sendchar|0x30);
sendchar=(unsigned char)(count8%10);
uart_sendchar(sendchar|0x30);
uart_sendchar(66); //字符桢的结束
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -