STC12C5A60S2单片机驱动深圳电应普DYP-A01A超声波受控串口输出,结果显示在LCD1602

在某宝购买了一款超声波,问客服没有工程Demo,所有只好自己个Demo测试。
请添加图片描述

我购买的是A01A系列UART受控输出,通信波特率9600。

#include <STC12C5A60S2.h>
#include <stdio.h>

//数据类型宏定义
#define uchar unsigned char
#define uint unsigned int

//常用变量宏定义
#define MAIN_Fosc		11059200L	//宏定义主时钟HZ
//#define MAIN_Fosc		12000000L

//硬件接口宏定义
#define LCD1602_DB P0	//LCD1602数据总线

/*硬件接口定义*/
sbit LCD1602_RS = P3^5;	 //RS端
sbit LCD1602_RW = P3^6;	 //RW端
sbit LCD1602_EN = P3^4;	 //EN端


/*全局变量定义*/
uint timer_count = 0;		//定时计数变量
uint uart_count = 0;		//串口获取数据计数变量
uchar uart_data[4];			//串口获取数据存储数组
uint ultrasound_distance;	//超声波获取距离信息
uint ultrasound_SUM;		//超声波校验值
uchar str[10];

	
//串口初始化,晶振11.0592,波特率9600
void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x04;		//独立波特率发生器时钟为Fosc,即1T
	BRT = 0xDC;			//设定独立波特率发生器重装值
	AUXR |= 0x01;		//串口1选择独立波特率发生器为波特率发生器
	AUXR |= 0x10;		//启动独立波特率发生器
	
	RI = 0;				//串口接收标志位置0
	
//	EA = 1;//开总中断
//	ES = 1;//开串口中断
}

//定时器0初始化,16位定时器自动重载,1T模式
void Timer0Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xCD;		//设置定时初始值
	TH0 = 0xD4;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	
	EA = 1;			//开总中断标志位清零
	ET0 = 1;		//开定时器0中断
}


//向串口发送一个字符
void _putchar(char ch)
{
	SBUF = ch;
	while(!TI);TI = 0;
}

/*=================================================
*函数名称:Read_Busy
*函数功能:判断1602液晶忙,并等待
=================================================*/
void Read_Busy()
{
	uchar busy;
	LCD1602_DB = 0xff;//复位数据总线
	LCD1602_RS = 0;	  //拉低RS
	LCD1602_RW = 1;	  //拉高RW读
	do
	{
		LCD1602_EN = 1;//使能EN
		busy = LCD1602_DB;//读回数据
		LCD1602_EN = 0;	 //拉低使能以便于下一次产生上升沿
	}while(busy & 0x80); //判断状态字BIT7位是否为1,为1则表示忙,程序等待
}
/*=================================================
*函数名称:LCD1602_Write_Cmd
*函数功能:写LCD1602命令
*调用:Read_Busy();
*输入:cmd:要写的命令
=================================================*/
void LCD1602_Write_Cmd(uchar cmd)
{
	Read_Busy();	 //判断忙,忙则等待
	LCD1602_RS = 0;
	LCD1602_RW = 0;	//拉低RS、RW操作时序情况1602课件下中文使用说明基本操作时序章节
	LCD1602_DB = cmd;//写入命令
	LCD1602_EN = 1;	 //拉高使能端 数据被传输到LCD1602内
	LCD1602_EN = 0;	 //拉低使能以便于下一次产生上升沿
}
/*=================================================
*函数名称:LCD1602_Write_Dat
*函数功能:写LCD1602数据
*调用:Read_Busy();
*输入:dat:需要写入的数据
=================================================*/
void LCD1602_Write_Dat(uchar dat)
{
	Read_Busy();
	LCD1602_RS = 1;
	LCD1602_RW = 0;
	LCD1602_DB = dat;
	LCD1602_EN = 1;
	LCD1602_EN = 0;
}

/*=================================================
*函数名称:LCD1602_Dis_Str
*函数功能:在指定位置显示字符串
*调用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
*输入:x:要显示的横坐标取值0-40,y:要显示的行坐标取值0-1(0为第一行,1为第二行)
		*str:需要显示的字符串
=================================================*/
void LCD1602_Dis_Str(uchar x, uchar y, uchar *str) reentrant
{
	if(y) x |= 0x40;
	x |= 0x80;
	LCD1602_Write_Cmd(x);
	while(*str != '\0')
	{
		LCD1602_Write_Dat(*str++);
	}
}
/*=================================================
*函数名称:Init_LCD1602
*函数功能:1602初始化
*调用:	LCD1602_Write_Cmd();
=================================================*/
void Init_LCD1602()
{
	LCD1602_Write_Cmd(0x38); //	设置16*2显示,5*7点阵,8位数据接口
	LCD1602_Write_Cmd(0x0c); //开显示
	LCD1602_Write_Cmd(0x06); //读写一字节后地址指针加1
	LCD1602_Write_Cmd(0x01); //清除显示
}


void main(void)
{
	uchar TestStr[] = {"data:"};		//定义一个字符串数组
	Init_LCD1602();							//1602初始化
	UartInit();								//串口初始化
	Timer0Init();							//定时器0初始化
	LCD1602_Dis_Str(0, 0, &TestStr[0]);		//显示字符串
	while(1);
}

//定时器0中断
void Timer0_Routine(void) interrupt 1
{
	timer_count++;	//定时器计数+1
	
	// 每个500ms发送一次超声波获取距离请求
	if(timer_count == 500)	//判断当到达500ms时
	{
		timer_count = 0;	//计数归零
		_putchar('1');		//向串口发送一个字符
	}
	
	//使用查询方式接收串口数据
	if(RI == 1)
	{
		RI = 0;
		uart_data[uart_count] = SBUF;
		uart_count++;//串口接收计数+1
		
		if(uart_count == 4)//当接收数据到达4位
		{
			uart_count = 0;
			ultrasound_SUM = (uart_data[0] + uart_data[1] + uart_data[2]) & 0xff;
			if(ultrasound_SUM != uart_data[3])
				LCD1602_Dis_Str(10, 0, "error");		//显示错误字符串
			else
			{
				ultrasound_distance = uart_data[1] * 256 + uart_data[2];
				sprintf(str, "%dmm", ultrasound_distance);
				LCD1602_Dis_Str(6, 0, &str[0]);		//显示超声波距离值字符串
			}
		}		
	}
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小明n.n

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

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

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

打赏作者

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

抵扣说明:

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

余额充值