找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1015|回复: 0
收起左侧

源程序代码

[复制链接]
ID:938324 发表于 2021-6-15 23:06 | 显示全部楼层 |阅读模式
  • #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;
  • }


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表