超声波1602
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<pic.h> //为超生波测距发送和用液晶显示距离
#include <delay_ms.h>
__CONFIG(HS&PROTECT&PWRTEN&BOREN&WDTDIS&LVPDIS); #define uchar unsigned char
#define uint unsigned int
//********************液晶功能控制引脚配置*************//
#define LCD PORTD //LCD的数据口
#define RS RA2 //LCD数据/命令选择端(H/L)
#define RW RA3 //LCD 读/写选择端(H/L)
#define EN RA5 //LCD使能控制端
//-----------------------------------------------------//
//*************超声波功能控制参数********************//
#define ECHO RC6
#define TRIG RC7
volatile uchar k1=0,k2=0,k3=0;
long int a=0;
//-----------------------------------------------------//
void init_sys(void){
ADCON1=0X07;
INTCON=0X00;
TRISD=0X00;
PORTD=0X0FF;
TRISA=0X00;
TRISC=0X40;//0100 0000
}
void check_BF(void) //检查LCD状态函数
{
unsigned char i;
for(i=0;i<15;i++); //proteus中只能用延时了,检测BF位进行不了
}
void write_inst(char inst) //写入指令函数
{
RS=0;
delay_ms(1);
RW=0;
delay_ms(1);
EN=1;
delay_ms(1);
LCD=inst;
delay_ms(1);
EN=0;
check_BF();
}
void write_char(char character) //写入数据函数
{
RS=1;
delay_ms(1);
RW=0;
delay_ms(1);
EN=1;
delay_ms(1);
delay_ms(1);
LCD=character;
delay_ms(1);
EN=0;
check_BF();
}
//=====写入指定位置函数======
void display_str(unsigned char line,unsigned char location,unsigned char str)//line行,location列,str字符
{
RS=0;
delay_ms(1);
RW=0;
delay_ms(1);
EN=1;
delay_ms(1);
if (line==0) //line=0,第一行
LCD=0x80+location;
if (line==1) //line=1,第二行
LCD=0xC0+location; //1602-LCD的第二行首地址为:0xA8
EN=0;
check_BF();
write_char(str);
}
void init_lcd(void) //液晶初始化函数
{
write_inst(0x30); //设定功能
delay_ms(5);
write_inst(0x30); //设定功能
delay_ms(5);
write_inst(0x30); //设定功能
delay_ms(5);
write_inst(0x38); //设定俩列
delay_ms(5);
write_inst(0x08); //关闭显示功能
delay_ms(5);
write_inst(0x01); //清除显示屏
delay_ms(5);
write_inst(0x0c); //开启显示功能
delay_ms(5);
}
//输出一串数字到LCD
void LCD_prints(unsigned char line,unsigned char location,unsigned int uiNumber)//line行,location列,uiNumber数字
{
unsigned char ucaNumber[5],ucCount;
ucaNumber[0]=(uiNumber/10000);
ucaNumber[1]=(uiNumber/1000)%10;
ucaNumber[2]=(uiNumber/100)%10;
ucaNumber[3]=(uiNumber/10)%10;
ucaNumber[4]=uiNumber%10;
RS=0;
delay_ms(1);
RW=0;
delay_ms(1);
EN=1;
delay_ms(1);
if (line==0) //line=0,第一行
LCD=0x80+location;
if (line==1) //line=1,第二行
LCD=0xC0+location; //1602-LCD的第二行首地址为:0xA8
EN=0;
check_BF();
for(ucCount=0;ucCount<5;ucCount++)
{
write_char(ucaNumber[ucCount]+48); //从首位到末位逐一输出。
}
}
void main(void){
init_sys();
init_lcd();
display_str(0,0,'D');
display_str(0,1,'i');
display_str(0,2,'s');
display_str(0,3,'t');
display_str(0,4,'a');
display_str(0,5,'n');
display_str(0,6,'c');
display_str(0,7,'e');
display_str(1,0,'V');
display_str(1,1,'a');
display_str(1,2,'l');
display_str(1,3,'u');
display_str(1,4,'e');
display_str(1,5,'=');
display_str(1,11,'(');
display_str(1,12,'C');
display_str(1,13,'M');
display_str(1,14,')'); while(1)
{
uchar i;
k1=0;k2=0;k3=0;
/* TRIG=1;
delay_ms(1);
TRIG=0;
while(ECHO==0);
while(ECHO==1) ++a;
delay_ms(30);
a=(108*a*17)/30000; //20 */
for(i=10;i>0;i--){
a=0;
TRIG=1;
delay_ms(1);
TRIG=0;
while(ECHO==0);
while(ECHO==1) ++a;
delay_ms(3);
a=(108*a*17)/30000;
if(a>50&&a<130) k1++;
else if(a<=50) k2++;
else k3++;
delay_ms(10);
}
for(i=1;i<25;i++)
display();
LCD_prints(1,6,a);
a=0;
delay_ms(200);
}
}。