基于51单片机的手机无线控制灯光系统仿真

仿真图:

在这里插入图片描述

芯片/模块的特点:

AT89C52简介:
AT89C52是一款经典的8位单片机,是意法半导体(STMicroelectronics)公司生产的一系列单片机之一。它基于8051内核,并具有许多与其兼容的特性。

AT89C52的主要特点如下:

内部存储器:AT89C52具有8KB的闪存(Flash)存储器,可用于存储用户程序和数据。这些存储器的内容可以通过编程器进行编程和擦除。

RAM存储器:AT89C52配备了256字节的随机存取存储器(RAM),用于暂存数据和程序的变量。

外部扩展性:AT89C52支持多种外部扩展设备的连接,包括外部存储器(如RAM、EEPROM)和外设(如ADC、LCD、UART等),通过外部硬件连接,可以扩展单片机的功能和应用。

通用I/O引脚:AT89C52拥有32个可编程的通用输入/输出引脚,可用于连接外部设备和与其他芯片进行通信。

定时器/计数器:AT89C52内置了3个16位定时器/计数器和一个可编程的串行定时器/计数器。这些计时器/计数器可用于实现定时功能、生成脉冲信号、测量时间间隔等。0

串行通信:AT89C52支持串行通信接口,包括UART(串行异步通信)和SPI(串行外设接口),便于与其他设备进行数据通信和交互。

低功耗模式:AT89C52具有多种低功耗模式,如空闲模式和电源下模式,在不需要执行任务的时候可以将CPU进入低功耗状态以节省能量。

宽电源电压范围:AT89C52的工作电压范围通常为4.0V至5.5V,可以满足大多数应用需求。

主程序:

#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <math.h> //Keil library
#include "delay.h"
//	操作方法
// 蓝牙发送字符 CX或cX 表示关闭x位灯, x取值1-8
// 蓝牙发送字符 OX或oX 表示关闭x位灯, x取值1-8
sbit LED1 = P2^0; // 初始化led灯对应引脚
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;
sbit LED6 = P2^5;
sbit LED7 = P2^6;
sbit LED8 = P2^7;

#define INIT 0xFF // 常量定义
#define OPEN 0x02
#define CLOSE 0x03
#define DAGN01 0x04
#define DAGN02 0x05
#define DAGN03 0x06

unsigned char Commd_Flag = INIT; // 命令接受标识

unsigned char pwmLed01 = 3; // pwm调整参数
unsigned char pwmLed02 = 3; // pwm调整参数
unsigned char pwmLed03 = 3; // pwm调整参数
unsigned char pwmLed04 = 3; // pwm调整参数
unsigned char pwmLed05 = 3; // pwm调整参数
unsigned char pwmLed06 = 3; // pwm调整参数
unsigned char pwmLed07 = 3; // pwm调整参数
unsigned char pwmLed08 = 3; // pwm调整参数

unsigned char countLed01 = 0; // pwm计数
unsigned char countLed02 = 0; // pwm计数
unsigned char countLed03 = 0; // pwm计数
unsigned char countLed04 = 0; // pwm计数
unsigned char countLed05 = 0; // pwm计数
unsigned char countLed06 = 0; // pwm计数
unsigned char countLed07 = 0; // pwm计数
unsigned char countLed08 = 0; // pwm计数

void UART_Init(void);
void SendByte(unsigned char dat);
void SendStr(unsigned char *s, unsigned char length);

void main(void)
{
	UART_Init();   // 蓝牙 串口 波特率9600

	LED1 = 0;
	LED2 = 0;
	LED3 = 0;
	LED4 = 0;
	LED5 = 0;
	LED6 = 0;
	LED7 = 0;
	LED8 = 0;

	DelayMs(200);
	LED1 = 1; // 关闭相应的灯 并恢复命令标志
	LED2 = 1;
	LED3 = 1;
	LED4 = 1;
	LED5 = 1;
	LED6 = 1;
	LED7 = 1;
	LED8 = 1;

	DelayMs(10); // 延时有助于稳定

	P2 = 0xFF;
	while (1) // 主循环
	{
		; // 蓝牙的接收处理 均在中断中处理 请查看串口中断

		countLed01++;
		if (countLed01 < pwmLed01) // 占空比调节
		{
			LED1 = 0;
		}						   // 打开
		else if (countLed01 <= 10) // 关闭时间段
		{
			LED1 = 1; // 关闭
			if (countLed01 == 10)
				countLed01 = 0; // 一个周期结束
		}

		countLed02++;
		if (countLed02 < pwmLed02) // 占空比调节
		{
			LED2 = 0;
		}						   // 打开
		else if (countLed02 <= 10) // 关闭时间段
		{
			LED2 = 2; // 关闭
			if (countLed02 == 10)
				countLed02 = 0; // 一个周期结束
		}

		countLed03++;
		if (countLed03 < pwmLed03) // 占空比调节
		{
			LED3 = 0;
		}						   // 打开
		else if (countLed03 <= 10) // 关闭时间段
		{
			LED3 = 1; // 关闭
			if (countLed03 == 10)
				countLed03 = 0; // 一个周期结束
		}

		countLed04++;
		if (countLed04 < pwmLed04) // 占空比调节
		{
			LED4 = 0;
		}						   // 打开
		else if (countLed04 <= 10) // 关闭时间段
		{
			LED4 = 1; // 关闭
			if (countLed04 == 10)
				countLed04 = 0; // 一个周期结束
		}

		countLed05++;
		if (countLed05 < pwmLed05) // 占空比调节
		{
			LED5 = 0;
		}						   // 打开
		else if (countLed05 <= 10) // 关闭时间段
		{
			LED5 = 1; // 关闭
			if (countLed05 == 10)
				countLed05 = 0; // 一个周期结束
		}

		countLed06++;
		if (countLed06 < pwmLed06) // 占空比调节
		{
			LED6 = 0;
		}						   // 打开
		else if (countLed06 <= 10) // 关闭时间段
		{
			LED6 = 1; // 关闭
			if (countLed06 == 10)
				countLed06 = 0; // 一个周期结束
		}

		countLed07++;
		if (countLed07 < pwmLed07) // 占空比调节
		{
			LED7 = 0;
		}						   // 打开
		else if (countLed07 <= 10) // 关闭时间段
		{
			LED7 = 1; // 关闭
			if (countLed07 == 10)
				countLed07 = 0; // 一个周期结束
		}

		countLed08++;
		if (countLed08 < pwmLed08) // 占空比调节
		{
			LED8 = 0;
		}						   // 打开
		else if (countLed08 <= 10) // 关闭时间段
		{
			LED8 = 1; // 关闭
			if (countLed08 == 10)
				countLed08 = 0; // 一个周期结束
		}
	}
}

void UART_Init(void)
{
	SCON = 0x50;  // SCON: 模式 1, 8-bit UART, 使能接收
	TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
	TH1 = 0xFD;	  // TH1:  重装值 9600 波特率 晶振 11.0592MHz
	TL1 = TH1;
	TR1 = 1; // TR1:  timer 1 打开
	EA = 1;	 // 打开总中断
	ES = 1;	 // 打开串口中断
}


void UART_SER(void) interrupt 4 // 串行中断服务程序
{
	unsigned char R_buf;
	if (RI) // 判断是接收中断产生
	{
		RI = 0; // 标志位清零
		R_buf = SBUF;
		if ((R_buf == 'O') || (R_buf == 'o'))
		{
			Commd_Flag = OPEN; // 接收到打开灯标志
		}
		else if ((R_buf == 'S') || (R_buf == 's'))
		{
			Commd_Flag = CLOSE; // 接收到 关闭灯标志
		}
		else if ((R_buf == 'A') || (R_buf == 'a'))
		{
			Commd_Flag = DAGN01; // 接收到 等级1标志
		}
		else if ((R_buf == 'B') || (R_buf == 'b'))
		{
			Commd_Flag = DAGN02; // 接收到 等级2标志
		}
		else if ((R_buf == 'C') || (R_buf == 'c'))
		{
			Commd_Flag = DAGN03; // 接收到 等级3标志
		}
		else if ((R_buf != '1') && (R_buf != '2') && (R_buf != '3') && (R_buf != '4') && (R_buf != '5') && (R_buf != '6') && (R_buf != '7') && (R_buf != '8') && (R_buf != 'T'))
		{
			Commd_Flag = INIT; // 否则 初始化接受标志
		}

		if ((Commd_Flag == OPEN) || (Commd_Flag == DAGN01)) // 根据命令值进行打开相应的灯
		{
			switch (R_buf)
			{
			case '1':
				pwmLed01 = 3;
				Commd_Flag = INIT;
				break; // 打开相应的灯 并恢复命令标志
			case '2':
				pwmLed02 = 3;
				Commd_Flag = INIT;
				break;
			case '3':
				pwmLed03 = 3;
				Commd_Flag = INIT;
				break;
			case '4':
				pwmLed04 = 3;
				Commd_Flag = INIT;
				break;
			case '5':
				pwmLed05 = 3;
				Commd_Flag = INIT;
				break;
			case '6':
				pwmLed06 = 3;
				Commd_Flag = INIT;
				break;
			case '7':
				pwmLed07 = 3;
				Commd_Flag = INIT;
				break;
			case '8':
				pwmLed08 = 3;
				Commd_Flag = INIT;
				break;
			case 'T':
				pwmLed01 = 3;
				pwmLed02 = 3;
				pwmLed03 = 3;
				pwmLed04 = 3;
				pwmLed05 = 3;
				pwmLed06 = 3;
				pwmLed07 = 3;
				pwmLed08 = 3;
				Commd_Flag = INIT;
				break;
			default:
				break; // 此处错误判断 不可恢复命令标准
			}
		}
		else if (Commd_Flag == CLOSE) // 根据命令值进行关闭相应的灯
		{
			switch (R_buf)
			{
			case '1':
				pwmLed01 = 1;
				Commd_Flag = INIT;
				break; // 打开相应的灯 并恢复命令标志
			case '2':
				pwmLed02 = 1;
				Commd_Flag = INIT;
				break;
			case '3':
				pwmLed03 = 1;
				Commd_Flag = INIT;
				break;
			case '4':
				pwmLed04 = 1;
				Commd_Flag = INIT;
				break;
			case '5':
				pwmLed05 = 1;
				Commd_Flag = INIT;
				break;
			case '6':
				pwmLed06 = 1;
				Commd_Flag = INIT;
				break;
			case '7':
				pwmLed07 = 1;
				Commd_Flag = INIT;
				break;
			case '8':
				pwmLed08 = 1;
				Commd_Flag = INIT;
				break;
			case 'T':
				pwmLed01 = 1;
				pwmLed02 = 1;
				pwmLed03 = 1;
				pwmLed04 = 1;
				pwmLed05 = 1;
				pwmLed06 = 1;
				pwmLed07 = 1;
				pwmLed08 = 1;
				Commd_Flag = INIT;
				break;
			default:
				break; // 此处错误判断 不可恢复命令标准
			}
		}
		else if (Commd_Flag == DAGN02) // 根据命令值进行关闭相应的灯
		{
			switch (R_buf)
			{
			case '1':
				pwmLed01 = 6;
				Commd_Flag = INIT;
				break; // 打开相应的灯 并恢复命令标志
			case '2':
				pwmLed02 = 6;
				Commd_Flag = INIT;
				break;
			case '3':
				pwmLed03 = 6;
				Commd_Flag = INIT;
				break;
			case '4':
				pwmLed04 = 6;
				Commd_Flag = INIT;
				break;
			case '5':
				pwmLed05 = 6;
				Commd_Flag = INIT;
				break;
			case '6':
				pwmLed06 = 6;
				Commd_Flag = INIT;
				break;
			case '7':
				pwmLed07 = 6;
				Commd_Flag = INIT;
				break;
			case '8':
				pwmLed08 = 6;
				Commd_Flag = INIT;
				break;
			case 'T':
				pwmLed01 = 6;
				pwmLed02 = 6;
				pwmLed03 = 6;
				pwmLed04 = 6;
				pwmLed05 = 6;
				pwmLed06 = 6;
				pwmLed07 = 6;
				pwmLed08 = 6;
				Commd_Flag = INIT;
				break;
			default:
				break; // 此处错误判断 不可恢复命令标准
			}
		}
		else if (Commd_Flag == DAGN03) // 根据命令值进行关闭相应的灯
		{
			switch (R_buf)
			{
			case '1':
				pwmLed01 = 9;
				Commd_Flag = INIT;
				break; // 打开相应的灯 并恢复命令标志
			case '2':
				pwmLed02 = 9;
				Commd_Flag = INIT;
				break;
			case '3':
				pwmLed03 = 9;
				Commd_Flag = INIT;
				break;
			case '4':
				pwmLed04 = 9;
				Commd_Flag = INIT;
				break;
			case '5':
				pwmLed05 = 9;
				Commd_Flag = INIT;
				break;
			case '6':
				pwmLed06 = 9;
				Commd_Flag = INIT;
				break;
			case '7':
				pwmLed07 = 9;
				Commd_Flag = INIT;
				break;
			case '8':
				pwmLed08 = 9;
				Commd_Flag = INIT;
				break;
			case 'T':
				pwmLed01 = 9;
				pwmLed02 = 9;
				pwmLed03 = 9;
				pwmLed04 = 9;
				pwmLed05 = 9;
				pwmLed06 = 9;
				pwmLed07 = 9;
				pwmLed08 = 9;
				Commd_Flag = INIT;
				break;
			default:
				break; // 此处错误判断 不可恢复命令标准
			}
		}

		SBUF = R_buf; // 返回接收到的数据
	}
	if (TI) // 如果是发送标志位,清零
		TI = 0;
}

设计文件:

链接:https://pan.baidu.com/s/1mnbz9AZAvfa8qOSCmZ2rDQ?pwd=tmd4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值