STC89C52单片机 点亮LED灯

点亮LED灯

一、什么是LED

LED全称为半导体发光二极管,采用半导体材料制成的,以直接将电能转化为光能,电号转换成光信号的发光器件;其特点是功耗低、高亮度、色彩艳丽、坑振动、寿命长(正常发光8-10万小时)、冷光源等优点,是真正的“绿色照明”。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3t4DG9VG-1604912650705)(img/LEDlight.png)]

二、LED工作参数

LED(发光二极管)在电路图中的符号为:
它具有二极管的基本特性正向导通,反向截止。要想点亮LED那么需要从正向流过工作电流。

  • 普通发光二极管工作压降为:1.6~2.1V。
  • 工作电流为:1~20mA。

有图中LED的通过电流我们可以根据欧姆定律I(电流) = U(电压) /R(电阻)
可以算出为3mA。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EFxHmT1r-1604912650709)(img/LEDWorkingParameter.png)]

三、原理图分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aFK0cizd-1604912650713)(img/LEDPrincipleAnalysis.png)]

四、C语言知识

关键字: sbit
功能:位定义
一般格式: sbit 标识符 = 地址值;

例如: sbit LED1 = P1^0;
注意:地址值中P1的“P” 必须为大写的P

五、编写代码

1.使 LED1 灯亮
#include <reg52.h>  // 引用51头文件

sbit LED1 = P1^0;  // P必须为大写			控制红色灯

void main(){   // 程序编译后main函数自身会循环
	LED1 = 0;  // 当设置为0时输入一个 低电平	单片机第一个灯会亮		    
	// LED1 = 1; // 当设置为1时输入一个高电平  单片机第一个灯会熄灭
}

效果图:
在这里插入图片描述

2.使 LED1、3、5、7 灯亮,使 LED2、4、6、8 灯灭;
#include <reg52.h>
void main(){ // main 函数自身会循环
	while(1){ // 一般在执行程序的时候需要 写出一个while的循环体来执行代码
		P1 = 0XAA; // 1010 1010	  // 使 LED1、3、5、7 灯亮
	}
} 

效果图:
在这里插入图片描述

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你设计一个基于 STC89C52 单片机的 UART 串口控制流水。 首先,你需要连接单片机的串口通信引脚 (TXD 和 RXD) 到一块串口转 USB 模块上,以便与电脑进行通信。 然后,你需要定义一个变量来存储串口接收到的数据。在主函数中,你可以使用以下代码来接收串口数据并将其存储到变量中: ```c unsigned char data; // 存储串口接收到的数据 void main() { // 初始化串口通信 UART_Init(); while (1) { // 检查是否接收到数据 if (RI) { data = SBUF; // 读取串口接收缓冲区中的数据 RI = 0; // 清除接收中断标志位 // 处理接收到的数据 if (data == '1') { // 开始流水效果 LED_Flow(); } } } } ``` 接下来,你需要编写一个函数来控制流水的效果。以下是一个简单的流水控制函数示例: ```c // 控制流水效果 void LED_Flow() { unsigned char i, j; while (1) { for (i = 0; i < 8; i++) { P1 = ~(1 << i); // 点亮当前 LED for (j = 0; j < 100; j++) { // 延时一段时间 Delay(); } } } } // 延时函数 void Delay() { unsigned int i, j; for (i = 0; i < 500; i++) { for (j = 0; j < 100; j++); } } ``` 这个函数会不断循环点亮 LED ,从第一个到第八个,然后从第八个回到第一个,形成流水的效果。当接收到电脑发送的字符 '1' 时,就会调用这个函数。 最后,你需要编写一个串口初始化函数来设置串口通信的参数,例如波特率、数据位、停止位和校验位等。以下是一个简单的串口初始化函数示例: ```c // 初始化串口通信 void UART_Init() { TMOD = 0x20; // 设置定时器 1 为模式 2 (自动重载) TH1 = 0xFD; // 波特率为 9600,TH1 = 256 - (1 / (32 * 9600)) = 253 TL1 = TH1; // 定时器 1 初值等于波特率设定值 TR1 = 1; // 启动定时器 1 SM0 = 0; // 设置串口为模式 1 (8 位数据位,无校验位,1 位停止位) SM1 = 1; REN = 1; // 允许串口接收 EA = 1; // 开启全局中断 ES = 1; // 开启串口中断 } ``` 这个函数会初始化定时器 1 和串口通信模式,以便进行数据的发送和接收。 希望这个设计能够帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值