📄 caoshengpo.c
字号:
#include<reg51.h>
#define uchar unsigned char
#define data_out P1
unsigned char code Seg7Code[17]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,0x3f}; /*用十六进数作为数组下标,可直接取得对应的七段编码字节*/
//0 1 2 3 4 5 6 7 8 9 A b C d E F -
sbit collective_plus0=P3^0;
sbit collective_plus1=P3^1;
sbit collective_plus2=P3^2;
sbit collective_plus3=P3^3;
sbit key_begin=P3^3 ; /*测距启动键*/
sbit start=P1^0 ; /*超声波电路启动口*/
sbit back=P1^1 ; /*回波检测口*/
uchar survey_time; /*每次测量检测次数*/
uchar count1=0; /*这两个都是存时间用的*/
uchar count2=0;
float count_all=0; //T0定时器中断总次数
float distance; /*实际距离*/
uchar jumpout=0;
//=============================================================
// 函数名称: time_count() (T0中断服务子程序)
// 功能描述: 记录回波时间
// 语法格式: void time_count(void)
// 入口参数: 无
// 出口参数: 无
// 注意事项: 用到count1、count2两个全局变量,这样不利于模块化,有待改进
//=============================================================
time_count() interrupt 1
{
TR0=0;
TMOD=0x11;
TH0=0xff;
TL0=0xf6;
if(count1<255)
count1++;
else {
count1=0;
count2++;
}
TR0=1;
}
//=============================================================
// 函数名称: survey_nothing() (T1中断服务子程序)
// 功能描述: 处理无回波的情况
// 语法格式: void survey_nothing(void)
// 入口参数: 无
// 出口参数: 无
// 注意事项: 用到定时器T1
//=============================================================
survey_nothing() interrupt 2
{
TR1=0;
data_out=Seg7Code[17];
collective_plus0=0;
collective_plus1=0;
collective_plus2=0;
collective_plus3=0;
jumpout=1;
}
//=============================================================
// 函数名称: survey_manage()
// 功能描述: 回波检测及预处理
// 语法格式: void survey_manage(void)
// 入口参数: 无
// 出口参数: 无
// 注意事项: 由于用外部中断在检测时主程序较难处理,所以用了查询方式
//=============================================================
survey_manage()
{
while(1)
{
if(back==0)
{
TR0=0;
count_all=count_all+count1+count2*255;
break;
}
if(jumpout==1)
break;
}
}
//=============================================================
// 函数名称: data_manage()
// 功能描述: 用于将时间转换为距离
// 语法格式: void data_manage(void)
// 入口参数: 无
// 出口参数: 无
// 注意事项: 声速取335.55m/s
//=============================================================
data_manage()
{
float time;
time=0.01*count_all; //回波时间计算
distance=33.55*time/8; //距离计算
}
//=============================================================
// 函数名称: static_display()
// 功能描述: 静态显示4位数据(LED)
// 语法格式: void static_display(void)
// 入口参数: 无
// 出口参数: 无
// 注意事项:
//=============================================================
void static_display() //先放着
{
}
//=============================================================
// 函数名称: display(uchar tmpx)
// 功能描述: 显示1位数据(LED)
// 语法格式: void display(uchar tmpx)
// 入口参数: 无
// 出口参数: 无
// 注意事项:
//=============================================================
display(uchar tmpx)/*本函数用于输出各位的数据*/
{
uchar i;
if(tmpx==0)
i=0;
if(tmpx==1)
i=1;
if(tmpx==2)
i=2;
if(tmpx==3)
i=3;
if(tmpx==4)
i=4;
if(tmpx==5)
i=5;
if(tmpx==6)
i=6;
if(tmpx==7)
i=7;
if(tmpx==8)
i=8;
if(tmpx==9)
i=9;
data_out=Seg7Code[i];/*输出数据*/
}
//=============================================================
// 函数名称: dynamic_display(float tmpy)
// 功能描述: 显示1位数据(LED)
// 语法格式: void dynamic_display(float tmpy)
// 入口参数: 无
// 出口参数: 无
// 注意事项:
//=============================================================
dynamic_display(float tmpy) /*这部分是整个函数的主体,即用于动态显示各位数据*/
{
uchar seg3;
uchar seg2;
uchar seg1;
int a;
a=tmpy;
seg3=a/100; /*求出百位的数据*/
a=a-seg3*100;
seg2=a/10; /*求出十位的数据*/
a=a-seg2*10;
seg1=a/1; /*个位*/
collective_plus3=0;
display(seg3);
collective_plus3=1;
collective_plus2=0;
display(seg2);
collective_plus2=1;
collective_plus1=0;
display(seg1);
collective_plus1=1;
collective_plus0=0;
data_out=Seg7Code[13];
collective_plus0=1;
}
//=============================================================
// 函数名称: delay()
// 功能描述: 检测前延时
// 语法格式: void delay(uchar i)
// 入口参数: 无
// 出口参数: 无
// 注意事项: 时间要具体计算
//=============================================================
void delay(uchar i) //用软件延时
{
}
//=============================================================
// 函数名称:
// 功能描述: 测距控制及显示
// 语法格式: void (void)
// 入口参数: 无
// 出口参数: 无
// 注意事项: 用户可参考设置进行必要修改,以适应不同情况
//=============================================================
main()
{
while(1)
{
jumpout=0;
count1=0;
count2=0;
count_all=0;
while(1) /*判断测量启动键是否按下*/
{
if(key_begin==0)
break;
}
for(survey_time=4;survey_time>0;survey_time--) /*测4次数据*/
{
EA=1;
ET1=1;
TR1=0;
TMOD=0x11;
TH1=0x2e; /*定时时间要大于最大测量距离时回波所需的时间(这里大概54ms)*/
TL1=0x6d;
TR1=1; /*启动定时器T1,作用:针对探测时前面无障碍物而无返回的情况*/
start=1; /*启动发射电路*/
TH0=0xff; /*定时0.01ms*/
TL0=0xf6;
ET0=1;
TR0=1; /*开定时器T0,开始对回波计时*/
delay(100); /*检测前延时*/
start=0; /*关闭发射电路*/
survey_manage(); /*查询回波信号并预处理*/
}
data_manage(); /*数据处理*/
static_display(count_all); /*静态显示*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -