#include<reg52.h> //头文件
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit TX=P2^5; //超声波传感器的接口
sbit RX=P2^6;
sbit BUZZ= P2^7;
unsigned long int counter_time=0;
uint time=0; //声波时间
uint S=0; //距离
//LCD port
sbit LcdRs= P2^0;
sbit LcdRw= P2^1;
sbit LcdEn= P2^2;
sfr DBPort= 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
int FWD_num=0;
int REV_num=0;
//向LCD写入命令或数据************************************************************
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
//设置显示模式************************************************************
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关
#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动
#define LCD_NO_FLASH 0x00 //光标不闪动
//内部等待函数**************************************************************************
unsigned char LCD_Wait(void)
{
LcdRs=0;
LcdRw=1; _nop_();
LcdEn=1; _nop_();
//while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,
//可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80
//实际硬件时打开此语句
LcdEn=0;
return DBPort;
}
void LCD_Write(bit style, unsigned char input)
{
LcdEn=0;
LcdRs=style;
LcdRw=0; _nop_();
DBPort=input; _nop_();//注意顺序
LcdEn=1; _nop_();//注意顺序
LcdEn=0; _nop_();
LCD_Wait();
}
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
//设置输入模式************************************************************
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 画面可平移
#define LCD_NO_MOVE 0x00 //default
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
//初始化LCD************************************************************
void LCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
}
//************************************************************************
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
void Print(unsigned char *str) //在LCD上显示数据,内部调用
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
void LCD_Print(unsigned char x, unsigned char y, unsigned char *str) //指定的位置打印指定数据
{
GotoXY(x,y);
Print(str);
}
void LCD_Print_num(unsigned char x, unsigned char y,long int num) //指定的位置显示数值
{
uchar temp_tab[7]=0;
uchar i=0;
GotoXY(x,y);
if(num<0)
{
num=0-num;
LCD_Write(LCD_DATA,'-');
}
temp_tab[0]=num/1000000%10+0x30;
temp_tab[1]=num/100000%10+0x30;
temp_tab[2]=num/10000%10+0x30;
temp_tab[3]=num/1000%10+0x30;
temp_tab[4]=num/100%10+0x30;
temp_tab[5]=num/10%10+0x30;
temp_tab[6]=num%10+0x30;
for(i=0;i<7;i++)
{
if(temp_tab[i]!=0x30)break;
}
if(i==7)
{
LCD_Write(LCD_DATA,0x30);
}
else
{
while(i<7)
{
LCD_Write(LCD_DATA,temp_tab[i]);
i++;
}
}
}
void delayms(unsigned int ms) //延时函数
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
void Conut(void) //计算距离的函数
{
time=(TH0<<8)+TL0;
TH0=0;
TL0=0;
time=time+counter_time*65536;//us
S=time/58; //算出来是CM 340m/S声速
LCD_Print_num(0,1,S);
LCD_Print (0,14,"cm");
if (S>=16) {BUZZ=0; LCD_Print(10,1,"alert!");}
else if (S<16) {BUZZ=1; LCD_Print(10,1," ");}
}
//************************************
//定时器初始化
//初始化为10MS定时器
//************************************
void Time0_init()
{
TMOD |= 0x01; //使用模式1,16位定时器
TH0 = 0; //定时器装入初始值10ms
TL0 = 0;
EA = 1; //总中断
ET0 = 1;//定时器0初始化
TR0 = 0;
}
void StartModule() //T1中断用来扫描数码管和计800MS启动模块
{
TX=1; //800MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
unsigned long try=0;
uchar timeout_flag=0;
Time0_init(); //初始化定时器
LCD_Initial();
LCD_Print(0,0,"The Distance:");
while(1)
{
StartModule();
while(!RX) //当RX为零时等待
{
try++;
if(try>6000) //等待时间不能太长,防止程序死机
{
try=0;
timeout_flag=1;//置位超时标志
break;
}
}
counter_time=0;
TH0=0;
TL0=0;
TR0=1; //开启计数
if(timeout_flag==0)
{
while(RX) //当RX为1计数并等待
{
try++;
if(try>6000) //等待时间不能太长,防止程序死机
{
try=0;
timeout_flag=1; //置位超时标志
break;
}
}
}
TR0=0; //关闭计数
if(timeout_flag)//如果超时了
{
TH0=0;
TL0=0;
timeout_flag=0;
}
else//正常数据
{
Conut(); //计算
}
delayms(12); //延时一段时间
}
}
void timer0() interrupt 1 //10us定时器累加
{
TH0 = 0; //定时器装入初始值10ms
TL0 = 0;
counter_time++;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
超声波检测.zip (17个子文件)
超声波检测
程序
超声波_Opt.Bak 978B
超声波.lnp 42B
超声波.Uv2 2KB
main.OBJ 16KB
超声波 14KB
main.LST 12KB
超声波.build_log.htm 945B
超声波.plg 387B
main.c 6KB
超声波.hex 5KB
超声波_Uv2.Bak 2KB
超声波.M51 18KB
超声波.Opt 968B
仿真
Backup Of 超声波传感器.pdsbak 26KB
超声波传感器.pdsprj 26KB
Last Loaded 超声波传感器.fv8.14.pdsbak 25KB
超声波传感器.pdsprj.ADMIN.小明.workspace 2KB
共 17 条
- 1
superiortigre
- 粉丝: 11
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页