智能垃圾桶+蓝牙功能(定时器2)

智能垃圾桶+蓝牙功能(定时器2)

主控:

STC89C52RC单片机

所需模块及材料:

蓝牙模块、超声波模块、舵机、桌面垃圾桶、杜邦线若干、手机(连蓝牙用)

接线:

智能垃圾桶+蓝牙功能(定时器2)_第1张图片

程序:

跟之前的垃圾桶代码差不多,但之前的超声波使用了定时器1,舵机使用定时器0,因为这次多了蓝牙模块,而蓝牙是通过串口与单片机通信的,要用到定时器1作波特率发生器,所以这次超声波使用了平时少用的定时器2,定时器1留给蓝牙

蓝牙——定时器1,产生波特率

超声波——定时器2,计算时间

舵机——定时器0,PWM控制

程序文件

1.main.c:主函数中调用定时器0、定时器2和串口的初始化函数,循环内判断距离从而开盖关盖

2.Timer0.c:定时器0初始化函数,中断处理中PWM控制舵机旋转

3.Delay.c:延时函数

4.key.c:按键检测函数,也可用按键开盖

5.Timer2.c:定时器2初始化函数,不开启中断,用于超声波测距定时

6.Usart.c:串口初始化函数,发送一个字符、发送一个字符串函数,串口中断中判断指令“ope”、“clo”从而开盖或关盖

7.HC-SR04.c:超声波起始信号,测距函数,开盖或关盖的函数

智能垃圾桶+蓝牙功能(定时器2)_第2张图片

下面是对于上次垃圾桶进行修改的代码,其他部分不变

Timer2.c:增加定时器2,可通过STC-ISP工具生成配置函数,省去看手册的时间,将设置定时初值和定时重载值置0,同时关闭计时,到超声波发波时才开始计时

#include 

void Timer2Init(void)		//1毫秒@11.0592MHz
{
	T2MOD = 0;		//初始化模式寄存器
	T2CON = 0;		//初始化控制寄存器
	TL2 = 0;		//设置定时初值
	TH2 = 0;		//设置定时初值
	RCAP2L = 0;		//设置定时重载值
	RCAP2H = 0;		//设置定时重载值
	TR2 = 0;		//定时器2开始计时
}

HC-SR04.c:超声波模块,主要是测距函数中开启定时器改为TR2 = 1,计数器位也要改为TH2和TL2

/**
  * @brief超声波测距
  * @param无
  * @retval返回测到的距离,单位cm
  */
double ultrasonic()
{
	double time;
	double distance;
	Trig_Start();
	while(Echo == 0);
	TR2 = 1;
	while(Echo == 1);
	TR2 = 0;
	time = (TH2*256+TL2)*1.085;
	distance = time*0.017;
	TH2 = 0;
	TL2 = 0;
	return distance;
}

Usart.c:串口中断处理,根据串口接收到的字符串修改compare的值,从而开盖和关盖

/**
  * @brief串口中断处理函数,用于蓝牙
  * @param无
  * @retval无
  */
void Uart_Rountine() interrupt 4
{
	static unsigned int p = 0;
	if(RI)
	{
		RI = 0;
		rec[p] = SBUF;
		Usart_SendChar(rec[p]);
		p++;
		if(p >= SIZE)
		{
			p = 0;
		}
		if(strstr(rec,"ope"))
		{
			compare = 3;		//舵机旋转90度,开盖
			p = 0;
			memset(rec,'\0',SIZE);
		}
		if(strstr(rec,"clo"))
		{
			compare = 1;		//舵机旋转0度,关盖
			p = 0;
			memset(rec,'\0',SIZE);
		}
	}
}

main.c:

主函数中记得要将所有定时器和串口的初始化函数调用进来

开盖条件跟之前不太一样,之前距离小于20cm则开盖,大于20cm都关盖,在超声波没检测到障碍物靠近时,距离大于20cm,是会一直执行CloseDusbin()关盖函数的,compare 一直等于1,因为这次加入了蓝牙功能,如果还是按上次的判断条件,串口收到“open”开盖指令后,CPU去执行中断处理函数,compare会等于3,但又会马上回来执行CloseDusbin()关盖函数,compare又会被置1,导致蓝牙无法开盖,或者开盖一瞬间又关盖了

按下面修改判断条件后,只有检测到小于20cm的距离垃圾桶开盖,因为开盖函数OpenDusbin()里有2秒的延时,所以2秒后就会关盖,此时用蓝牙也能通过“open”和“close”指令控制开关盖,超声波和蓝牙互不影响

void main()
{
	double dis;
	Timer0Init();
	Timer2Init();
	Uart_Init();
	while(1)
	{
		dis = ultrasonic();
		if(dis < 20)
		{
			OpenDusbin();	//开盖
			
			CloseDusbin();	//2秒后关盖
		}
		KeyNumber();		//按键检测开盖
	}
}

你可能感兴趣的:(#,蓝牙模块,单片机,嵌入式硬件,c语言,学习,51单片机)