- #include<reg52.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define NOP() {_nop_();_nop_();_nop_();_nop_();}
- //------LCD引脚-----
- sbit lcd_rs=P0^6;
- sbit lcd_en=P0^7;
- //------超声波引脚-------
- sbit Tx=P3^3; //触发控制信号输入
- sbit Rx=P3^2; //回响信号输出
- uchar xuehao[]={" 17110201138 "};
- uchar xingming[]={"NAME:zhaolongda"};
- uchar code table[]={" Distance Test:"}; //LCD第一行显示
- uchar temp_dis[]= {" 000.0 cm"}; //LCD第二行
- long int t,distance;
- uchar cache[4]={0,0,0,0};
- //--------延时-------
- void delay(uint ms)
- {
- uint t;
- while(ms--)
- for(t=0;t<30;t++);
- }
- void write_com(uchar com);//init_lcd()函数需要用到,所以先提前声明
- //************LCD1602初始化函数************************
- void init_lcd()
- {
- write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
- write_com(0x08); //写一个字符后地址指针加1
- write_com(0x01); //显示清零,数据指针清零
- write_com(0x06); //写一个字符后地址指针加1
- write_com(0x0c); //关显示,光标不显示不闪烁
- }
- //************LCD1602写指令函数************************
- void write_com(uchar com) //lcd1602写指令:rs低电平,rw低电平,en从高电平变为低电平
- {
- delay(5);
- lcd_rs = 0; // 选择写指令
- lcd_en = 0; // 将使能端置0
- P2 = com; // 将要写的命令送到数据总线上
- delay(5); // 延时5ms,待数据稳定
- lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,
- delay(5); // 延时5ms,待数据稳定
- lcd_en = 0; // 将使能端置0以完成脉冲
- }
- //************LCD1602写数据函数************************
- void write_data(uchar date)//lcd1602写数据:rs高电平,rw低电平,en从高电平变低电平
- {
- delay(5);
- lcd_rs = 1; // 选择写数据
- lcd_en = 0; // 将使能端置0
- P2 = date; // 将要写的数据送到数据总线上
- delay(5); // 延时5ms,待数据稳定
- lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,
- delay(5); // 延时5ms,待数据稳定
- lcd_en = 0; // 将使能端置0以完成脉冲
- }
- //************LCD1602显示函数******************
- void lcd1602_display(uchar *q,uchar *p)//*通过指针p和q分别指向两个数组的第一个数,然后进行数组扫描显示,一次性显示两行字符
- {
- write_com(0x80); // 现将数据指针定位到第一行第一个字处
- while(*q!='\0')
- {
- write_data(*q);
- q++;
- delay(1);
- }
- write_com(0xc0); // 现将数据指针定位到第二行第一个字处
- while(*p!='\0')
- {
- write_data(*p);
- p++;
- delay(1);
- }
- }
- //************LCD1602显示欢迎函数******************
- void welcome() //扫描显示学号加姓名,几秒延时后结束
- {
- init_lcd();
- lcd1602_display(xuehao,xingming);
- delay(200);
- }
- void HC05_Init() //超声波模块初始化函数
- {
- Tx=1; //触发脉冲
- NOP();NOP();NOP();NOP();
- Tx=0;
- distance=0.1725*t; //距离计算
- }
- void distance_convert(long int dat) //距离计算函数
- {
- cache[0]=dat/1000;
- cache[1]=dat/100%10;
- cache[2]=dat/10%10;
- cache[3]=dat%10;
- temp_dis[4]=cache[0]+'0';
- temp_dis[5]=cache[1]+'0';
- temp_dis[6]=cache[2]+'0';
- temp_dis[8]=cache[3]+'0';
- }
- //------------主程序-----------
- void main()
- {
- welcome();
- init_lcd();
- delay(5);
- TMOD=0x09; //定时器T0工作方式1 GATE0=1
- EA=1; //开总中断
- TR0=1; //启动定时器
- EX0=1; //开外部中断
- IT0=1; //设置为下降沿中断方式
- while(1)
- {
- HC05_Init();
- distance_convert(distance);
- lcd1602_display(table,temp_dis);
- }
- }
- //外部中断0
- void int0() interrupt 0
- {
- t=(TH0*256+TL0); //计算高电平持续的时间,上升沿到来时候开始计时,下降沿到来进入外部中断,关闭计时器,停止计时
- TH0=0;
- TL0=0;
- }
|