- UID
- 293721
- 阅读权限
- 1
- 推广
-
- 幽默
-
- 注册时间
- 2012-5-12
- 最后登录
- 1970-1-1
|
注册家电维修技术论坛,与同行畅聊维修技术,享更多技术论坛功能。
您需要 登录 才可以下载或查看,没有帐号?快速注册
x
我做了模拟部分的超声波发射和接收电路~~现在通过点按发射机的按钮开关,给单片机一个引脚提供低电平,让其开始定时,然后查询单片机另一个引脚的状态,当查询到低时,终止定时~程序如下~~跪求高人指点~~
#include<reg52.h>
#include<stdio.h>
#include<string.h>
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uchar unsigned char //宏定义
#define ulong unsigned long
#define uint unsigned int
/**********************************************
端口定义
液晶屏端口:rs=P3^5; lcden=P3^4;输出端口接P2
定时器启动和关闭引脚:定时开始P1.3,定时结束P1.4
**********************************************/
sbit rs=P3^6;
sbit lcden=P3^7;
sbit TimeSt=P1^3;
sbit TimeEd =P1^4;
uchar code table1[]="ULTRASOUND"; //code的内容只能读,不能改.
uchar code table2[]="DISTANCE:";
uchar table3[4]; //定义一个空数组,存放测算的距离
uchar code table4[]="m" ;
uchar code table5[]="safe " ;
ulong c=340; //超声波传播速度
bit succeed_flag;
/**********************************************
延时函数
短延时:delay(unit x)
长延时:delay1(uint x)
函数返回值为空
延时1Ms函数 void delay1ms(void)
**********************************************/
void delay(uint x) //短延时子函数 100us延时函数
{
uint a,b;
for(a=x;a>0;a--)
for(b=11;b>0;b--);
}
void delay1(uint x) //长延时子函数
{
uint a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void delay1ms(void) //1ms延时函数
{
uchar i,j;
for(i=0;i<2;i++)
for(j=0;j<255;j++);
}
/**********************************************
LCD1602子函数部分
write_com(unchar com):写指令函数
write_data(uchar date:写数据函数
LCD_Display(uchar *str):字符串显示函数
void init()CD初始化函数
************************************************/
void write_com(uchar com)
{
P2=com;
rs=0; //RS=0,输入指令
lcden=0;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
void write_data(uchar date)
{
P2=date;
rs=1; //RS=1,输入数据
lcden=0;
delay(10);
lcden=1; //使能信号LCDEN,在时钟下降沿时执行指令
delay(10);
lcden=0;
}
void LCD_Display(uchar *str)
{
uchar i;
for(i=0;i<strlen(str);i++)
{
write_data(str[i]);
delay(40);
}
}
void init()
{
write_com(0x38); //显示模式设置,设置16 *2显示,5*7点阵,8位数据接口
delay(20);
write_com(0x0d); //设置开显示,显示光标,光标闪烁
delay(20);
write_com(0x06); //写一个字符后,地址指针加1,且光标加1,写一个字符时,整屏显示不移动
delay(20);
write_com(0x01); // 显示清零,数据指针清零
delay(20);
}
/*********************************************
unit Time()
获取时间
发射超声波时开始计时,收到回波后定时结束
*********************************************/
ulong Time()
{
ulong time1,Th,Tl;
uint i;
time1=0;
Th=0;
Tl=0;
TimeSt=1;
TimeEd=1;
TMOD=0x01; //定时器0,工作方式1
TH0=0; //从0开始定时,最多可计65536个数
TL0=0;
EA=1;
ET0=1;
TR0=0;
waitforstarting: //检测按键
while(TimeSt); //延迟20MS,去除按键抖动
for(i=0;i<20;i++)
delay1ms();
if(TimeSt)
goto waitforstarting;
TR0=1;
succeed_flag=1;
delay(3); //除直接接收的超声波信号的干扰
while(TimeEd); //等待接收到回波信号,终止定时
if(succeed_flag==1)
{
TR0=0;
Th=TH0;
Tl=TL0;
time1=Th*256+Tl-300; //读取定时器的数值,计算时间
}
else
{
time1=0;
}
return (time1);
}
void T0_time() interrupt 1 //产生中断,超出测距范围,提示安全
{
TR0=0;
succeed_flag=0;
TimeEd=0;
}
/*********************************************
ulong Distance(ulong t)
距离的计算
**********************************************/
ulong Distance(ulong t)
{
ulong time2;
ulong distance1;
time2=t;
distance1=(time2*c)/2;
return (distance1);
}
/*********************************************
主函数MAIN
void main()
实现距离的测算和CD1602液晶显示功能
**********************************************/
void main()
{
ulong time;
ulong distance,i;
time=0;
distance=0;
/*******LCD1602静态显示部分*******************/
init(); //LCD1602初始化
write_com(0x80+0x03); //设置数据地址指针
delay(20);
LCD_Display(table1);
delay(20);
write_com(0xc0); //从第二行首地址显示数据
delay(20);
LCD_Display(table2);
delay(20);
while(1)
{
/*******超声波测量距离**************/
time=Time(); //获取时间
if(time==0)
{
write_com(0xc0+0x0a); //从第二行第10个地址显示转换结果
delay(20);
LCD_Display(table5);
}
else
{
distance=Distance(time); //获取距离
/**更新table3的内容,实时显示距离***/
table3[0]=distance/1000000+'0';//取个位
distance=distance%1000000;
table3[1]='.';
table3[2]=distance/100000+'0'; //取小数点后一位
distance=distance%100000;
table3[3]=distance/10000+'0'; //取小数点后两位
/*******LCD1602动态显示部分**********/
write_com(0xc0+0x0a); //从第二行第10地址显示转换结果
delay(20);
LCD_Display(table3);
delay(20);
write_com(0xc0+0x0e);
delay(20);
LCD_Display(table4);
delay(20);
}
/*************使测试结果显示0.5秒*****/
for(i=0;i<500;i++)
delay1ms();
}
}
|
|