当前位置: 首页 > web >正文

单片机点灯

MCU(微控制单元)如51单片机,集成CPU、RAM、ROM及外设,常用于简单控制场景。

gpio:通用输入输出

SoC(片上系统)是高性能芯片,集成了更多功能模块,广泛应用于手机等复杂设备。

MCU(微控制单元)、MPU(微处理单元)、GPU(图形处理单元)和CPU(中央处理器)的功能定位与应用场景

LED模块正极接VCC电源,负极通过限流电阻连接单片机P2端口引脚,低电平导通点亮。

单片机引脚电平由P2寄存器控制,写入0xFF使所有位为高电平灯灭,写入0x00使所有位为低电平灯亮。

使用按位与(&)配合按位取反(~)实现特定位清零,保持其他位不变,例如P2 &= ~(1<<4)关闭第4位对应的灯。

使用按位或(|)实现特定位置一,例如P2 |= (1<<3)开启第3位对应的灯。

多个位同时操作可通过组合左移和或运算构造掩码,如P2 &= ~((1<<2)|(1<<4)|(1<<6))同时关闭第2、4、6位。

位运算操作需结合赋值语句(如|=、&=)才能真正修改寄存器状态并影响硬件输出。

利用位运算的方法(异或),作用是将需要的位进行翻转操作,从而达到闪灯的操作。

以下例子是将前四位进行闪灯操作:

int main(void)
{int main(void)
{P2 |= (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7);P2 &= ~((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3));  	 while(1){P2 ^= 0x0F;delay(10000);	}while(1){} }

在裸机程序中无法使用标准库函数(如sleep),必须自行实现延时函数void delay(unsigned int n)//0-65535。

p2 = ~(1 << 0) 和p2 = &~(1 << 0) 一个是&=,一个是=,这两个的区别是,&=是其他位不变,指定为清零,而=是指定不考虑原来p2的值,直接赋值。

以下这段代码是流水灯,先让灯循环从0位跑到7位,再倒回来再次闪烁。

While(1)
{
for(i = 0; i < 8; ++i)
{
P2 =~(1 << i);delay(0x3000);
}
for(i = 6; i > 0; --i)
{
P2 =~(1<< i);delay(0x3000);
}
}

采用低电平点亮LED,是因单片机驱动能力有限,拉低电平比拉高更省力。限流电阻(1KΩ)的作用是防止电流过大烧毁电路,根据欧姆定律计算最大电流约为5mA。

SFR(特殊功能寄存器)是Keil C51的方言,用于定义具有固定地址的内存空间,可直接操作硬件。

也可以这样表示,首先找到0xA0的位置,然后把空间的数据当成一个基类型来看,最后将空间变为0xFF

寄存器的本质是具有固定地址的内存空间,通过向特定地址写入数据来控制硬件状态。

点灯是输出,按键算输入

kernl是内核,右边四个是外设,p1,p0这些属于gpio

动态数码管,由此可见,这八个发光二极管的负极都连在了LED1上,所以是共阴极数码管,所有发光二极管的阴极连接在一起形成公共阴极。然后abcdef接在阳极,例如要让a亮,就把p00制高位。LED1234再制高低电平时主要是由左边的,例如p10来控制LED1,将p10制位高电平,则LED1导通,接地,变为低电平

void bit_select(int n)//0-3
{
P1 &= ~(0x0F << 0);
P1 |= (1 << n);
}

unsigned char t[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};这是0-9的表示方法。

这段代码是将ledn制成低电平。

在上面显示一个数字

void bit_select(int n)//0-3
{
P1 &= ~(0x0F << 0);
P1 |= (1 << n);
}

void segment_select(int n) //0-9
{
unsigned char t[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
P0 = t[n];
delay(100);//保证二极管导通
P0 = 0;
delay(100);//消影

}

void show_number(int n)
{
int t = 0;
while(n)
{
bit_select(t++);
segment_select(n % 10);
n = n / 10;

    }
}

int main()

{

    while(1)
{
show_number(1234);
}

}

http://www.xdnf.cn/news/20012.html

相关文章:

  • 【C++上岸】C++常见面试题目--算法篇(第十八期)
  • 网络:tcp
  • 关于稳定币的一些问答
  • 封装一个redis获取并解析数据的工具类
  • FPGA学习笔记——SDR SDRAM简介
  • 【golang长途旅行第37站】Redis连接池
  • OCR 发票识别与验真接口:助力电子化发票新时代
  • 融云:当我们谈论 AI 重构业务时,我们到底在谈论什么
  • 【Android】SharedPreferences轻量级持久化存储
  • 【题解】洛谷P1776 宝物筛选 [单调队列优化多重背包]
  • C++----模板特化以及模板声明与定义分离问题
  • AT32网线拔插下,modbus tcp断线重连
  • Linux awk命令完全指南:从原理到实战,搞定文本处理难题
  • 【AI】人工智能 传统和现代 架构和算法的演变历史
  • windows安装谷歌浏览器地址
  • TypeScript `infer` 关键字详解(从概念到实战)
  • AGV 搬运小车路径规划:从地图构建到路径决策的技术全解析
  • 打通 Flutter 与原生状态管理:Android ViewModel 的运用
  • SpringBoot+PDF.js实现按需分片加载(包含可运行样例源码)
  • C++小游戏
  • 腾讯开源HunyuanWorld-Voyager突破性原生3D重建与视频扩散框架
  • 计算机大数据毕业设计选题:基于Spark+hadoop的全球香水市场趋势分析系统
  • 优思学院|5个为什么(5 Whys)分析法一文讲清楚
  • AI编写自动点击器 - 毫秒级精准鼠标连点器
  • kafka:【1】概念关系梳理
  • kvm 虚拟机如何安装 qemu-guest-agent
  • kali_linux
  • 【Linux】线程封装
  • 【FastDDS】Layer DDS之Domain ( 04-DomainParticipantFactory)
  • 采用基于模型的方法实现车辆SOA威胁分析自动化