超声波测距+12864显示

该程序详细说明了如何利用51系列单片机的TRIG模块配合LCD12864显示器进行超声波测距。通过设定晶振和特定的引脚连接,结合中断和计数器功能,实现了距离的测量和显示。在主循环中,启动测距模块并等待超声波回波,然后计算并更新显示距离。
摘要由CSDN通过智能技术生成

 本文内容是基于51系列单片机+TRIG模块,来实现超声波测距,程序中介绍了关于器件TRIG以及LCD12864的引脚连接方式。

/*  晶振11.0592M                        */
/*  接线:模块TRIG接P1.2				   */
/*  RS(CS)    接  P3.3;	 		      */
/*  RW(SID)   接  P3.4;			     */
/*  E(SCLK)   接  P3.5;			    */
/*  PSB       接  GND 		       */

#include   <AT89X51.H>
#include   <intrins.h>	
//器件引脚定义
    sbit     RX    =  P1 ^ 1;
    sbit     TX    =  P1 ^ 2;
    sbit     CS    =  P3 ^ 3;	
    sbit     SID   =  P3 ^ 4;	//数据
    sbit     SCLK  =  P3 ^ 5;	//时钟

//Function Definition  函数声明
void Delay(int num);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
unsigned int ReadTemperature(void);
void clock_out(unsigned char dd);
unsigned char clock_in(void);
unsigned char read_clock(unsigned char ord);
void write_clock(unsigned char ord, unsigned char dd);
void Disp(void);
void id_case1_key(void);
void id_case2_key(void);
void Set_time(unsigned char sel,bit sel_1);
void Timer0_Init(void);
void Init_1302(void);
void Set_Bell(unsigned char sel, bit sel_1);
void Bell(void);
//12864
void Write_char(bit start, unsigned char ddata);
void Send_byte(unsigned char bbyte);
void Delaynms(unsigned int di);
void Lcd_init(void);
void Disp_img(unsigned char *img);
void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s);
void LCD_set_xy( unsigned char x, unsigned char y );
unsigned char code num[]={"0123456789 :.-"};
unsigned char code waves[]={"超声波测距"};
unsigned char code CM[] =  {"M"};
unsigned int  time=0;
         long S=0;
         bit  flag =0;
unsigned char disbuff[4]	   ={ 0,0,0,0,};

void Lcd_init(void)	//初始化LCD 
{
	Delaynms(10); 
  	CS=1;
  	Write_char(0,0x30);  
  	Write_char(0,0x0c);  
  	Write_char(0,0x01);   
}


void Write_char(bit start, unsigned char ddata) //写指令或数据
{
	unsigned char start_data,Hdata,Ldata;
  	if(start==0) 
		start_data=0xf8;	 //写指令
    else    
    	start_data=0xfa;     //写数据
  
  	Hdata=ddata&0xf0;		  //提取高四位
  	Ldata=(ddata<<4)&0xf0;    //提取低四位
  	Send_byte(start_data);	  //发送起始信号
  	Delaynms(5);              //延时
  	Send_byte(Hdata);	      //发送高四位
  	Delaynms(1);              //延时
  	Send_byte(Ldata);		  //发送低四位
  	Delaynms(1);              //延时
}


void Send_byte(unsigned char bbyte) //发送一个字节
{
	unsigned char i;
 	for(i=0;i<8;i++)
   	{
   		SID=bbyte&0x80;      //取出最高位
 		SCLK=1;
   		SCLK=0;
   		bbyte<<=1;           //左移
   	}  
}


void Delaynms(unsigned int di) //延时
{
	unsigned int da,db;
 	for(da=0;da<di;da++)
   		for(db=0;db<10;db++);
}

void Clr_Scr(void)          //清屏指令
{
	Write_char(0,0x01);
}


void LCD_set_xy( unsigned char x, unsigned char y )  //设置LCD显示的起始位置,x为行,y为列
{	    
    unsigned char address;
	switch(x)
	{
		case 0: address = 0x80 + y; break;    
    	case 1: address = 0x80 + y; break; 
		case 2: address = 0x90 + y; break; 
   	 	case 3: address = 0x88 + y; break;
		case 4: address = 0x98 + y; break; 
		default:address = 0x80 + y; break;
	}
    Write_char(0, address);
}


void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s) //写字符指令
{	
	LCD_set_xy( X, Y );
    
    while (*s) 
    {
		Write_char( 1, *s );
	    s ++;
		Delaynms(1);
	}
}


void LCD_Write_number(unsigned char s)     //写数字指令
{	
	Write_char(1,num[s]);
	Delaynms(1);
}

void Lcd_Mark2(void)
{
	Clr_Scr();                      //清屏
	LCD_Write_string(1,0,znwk);
	LCD_Write_string(2,0,waves);
	LCD_Write_string(3,7,CM);
}


    void Conut(void)
	{
	   time=TH0*256+TL0;
	   TH0=0;
	   TL0=0;
	   S=time*1.87/100;       //得出的结果是cm
	   if(flag==1)		      //超出测量范围
	  {	 
	   flag=0;
	   LCD_set_xy( 3, 4 );
	   LCD_Write_number(13);
	   LCD_Write_number(12);
	   LCD_set_xy( 3, 5 );
	   LCD_Write_number(13);
	   LCD_Write_number(13);
	  
	   }
	 else
	  {
	   disbuff[1]=S%1000/100;
	   disbuff[2]=S%1000%100/10;
	   disbuff[3]=S%1000%10 %10;
	   LCD_set_xy( 3, 4 );
	   LCD_Write_number(disbuff[1]);
	   LCD_Write_number(12);
	   LCD_set_xy( 3, 5 );
	   LCD_Write_number(disbuff[2]);
	   LCD_Write_number(disbuff[3]);
	  }
	}

void delayms(unsigned int ms)
{
	unsigned char i=100,j;
	for(;ms;ms--)
	{
		while(--i)
		{
			j=10;
			while(--j);
		}
	}
}

     void zd0() interrupt 1 		 //T0中断用来计数器溢出,超过测量范围
  {
    flag=1;							 //中断溢出标志
  }

   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;
  }

void main(void)
{  
    TMOD=0x01;		  
	TH0=0;
	TL0=0; 
	TR0=1; 

	Lcd_init();       //初始化液晶显示屏
	Clr_Scr();        //清屏
  Lcd_Mark2();


	while(1)
	{
	 StartModule();	    //计算距离
	 while(!RX);		//当RX为0时等待
	 TR0=1;			    //开启计数
	 while(RX);			//当RX为1时计数
	 TR0=0;				//关闭计数
	 Conut();
	 delayms(80);		//80ms

	}

}              

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

臨城夏目

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值