仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- #include<intrins.h> //声明void _nop_(void);
- #defineuint unsigned int
- #defineuchar unsigned char
- #defineNOP() {_nop_();_nop_();_nop_();_nop_();}
- sbit PL=P1^0;
- //------LCD引脚-----
- sbit LCD_RS=P2^6; //将P2.6引脚定义为LCD寄存器选择
- sbitLCD_RW=P2^5; //将P2.5引脚定义为LCD读写信号线
- sbitLCD_EN=P2^7; //将P2.7引脚定义为LCD使能端
- //------超声波引脚-------
- sbitTx=P3^3; //触发控制信号输入
- sbit Rx=P3^2; //回响信号输出
- ucharcode table[]={"Distance Test:"}; //LCD第一行显示
- uchartemp_dis[]= {"000.0 cm"}; //LCD第二行
- longint t,distance;
- ucharcache[4]={0,0,0,0};
- //--------延时-------
- voiddelay(uint ms)
- {
- uint t;
- while(ms--)
- for(t=0;t<120;t++);
- }
- //-------读LCD状态-------
- ucharread_lcd_state()
- {
- uchar state;
- LCD_RS=0; //LCD选择指令寄存器
- LCD_RW=1; //LCD进行读操作
- LCD_EN=1; //LCD使能端为高电平
- _nop_(); // 产生一条NOP指令
- state=P0;
- LCD_EN=0; //LCD使能端为低电平
- _nop_();
- returnstate; //返回函数
- }
- //-------忙等待------
- voidlcd_busy_wait()
- {
- while((read_lcd_state() &0x80)==0x80);
- NOP();
- }
- //----------LCD写指令----------
- voidlcd_write_com(uchar com)
- {
- lcd_busy_wait();
- LCD_RS=0; //RS为0时,写指令,RS为1时,写数据
- LCD_RW=0; //LCD进行写操作
- P0=com; //把命令字送入P0
- NOP(); //延时一个机器周期1us
- LCD_EN=1;
- NOP();
- LCD_EN=0;
- }
- //----------LCD写数据----------
- voidlcd_write_data(uchar dat)
- {
- lcd_busy_wait();
- LCD_RS=1;
- LCD_RW=0;
- P0=dat; //把要显示的数据送入P0
- NOP();
- LCD_EN=1;
- NOP();
- LCD_EN=0;
- }
- //-------LCD初始化-------
- voidlcd_init()
- {
- LCD_EN=0;
- lcd_write_com(0x38); //LCD显示模式设置
- lcd_write_com(0x0c); //LCD显示开/关及光标设置
- lcd_write_com(0x06); //当写一个字符后地址指针加1,且光标加1
- lcd_write_com(0x01); //显示清屏
- }
- //---------设置液晶显示位置-----------
- voidset_lcd_pos(uchar p)
- {
- lcd_write_com(p|0x80);
- }
- //---------液晶显示程序----------
- voidlcd_print(uchar p,uchar *s,uint low)
- {
- uint num;
- set_lcd_pos(p);
- for(num=0;num<low;num++)
- {
- lcd_write_data(s[num]);
- delay(1);
- }
- }
- voidHC05_Init()
- {
- Tx=1; //触发脉冲
- NOP();NOP();NOP();NOP();
- Tx=0;
- distance=0.1725*t; //距离计算
- }
- voiddistance_convert(long int dat)
- {
- cache[0]=dat/1000;
- cache[1]=dat/100%10;
- cache[2]=dat/10%10;
- cache[3]=dat%10;
- temp_dis[0]=cache[0]+'0';
- temp_dis[1]=cache[1]+'0';
- temp_dis[2]=cache[2]+'0';
- temp_dis[4]=cache[3]+'0';
- }
- //------------主程序-----------
- voidmain()
- {
- PL=1;
- delay(20);
- PL=1;
- delay(1000);
- PL=0;
-
- lcd_init();
- delay(5);
- TMOD=0x19;
- EA=1; //开总中断
- TR0=1; //启动定时器
- EX0=1; //开外部中断
- IT0=1; //设置为下降沿中断方式
- while(1)
- {
- HC05_Init();
- distance_convert(distance);
- lcd_print(0x01,table,14);
- lcd_print(0x44,temp_dis,8);
- }
- }
- //外部中断0
- voidint0() interrupt 0
- {
- t=(TH0*256+TL0); //计算高电平持续的时间,上升沿到来时候开始计时,下降沿到来进入外部中断,关闭计时器,停止计时
- TH0=0;
- TL0=0;
- }
复制代码
Keil代码与Proteus仿真下载:
基于单片机超声波测距系统 语音提示 程序hex 原理图.zip
(60.45 KB, 下载次数: 162)
|