硬件(一)51单片机
一、核心概念
CPU(Central Processing Unit,中央处理单元)
计算机的核心部件,负责执行指令和处理数据,是运算和控制的核心。MCU(Microcontroller Unit,微控制单元)
将 CPU、内存、I/O 接口等集成在单一芯片上的微型计算机系统,侧重于对外设的控制而非高效数据处理。MPU(Microprocessor Unit,微处理器单元)
集成了 CPU、内存、外设控制器和总线接口的芯片,是构成计算机系统的核心器件。GPU(Graphics Processing Unit,图形处理单元)
专门设计用于快速处理图像和视频数据的处理器,擅长并行计算。SoC(System on Chip,系统级芯片)
将微处理器、模拟 IP 核、数字 IP 核、存储器及接口电路等集成在单一芯片上的先进系统,可视为功能高度集成的特殊 CPU。GPIO(General Purpose Input/Output,通用输入输出端口)
是MCU/MPU上的“通用引脚接口”,是一组可灵活配置的“多功能引脚”,能通过软件配置为输入、输出或复用功能,实现与外部设备的“简单交互”。
二、51 单片机
(一)8051 内核
基于 8051 内核的单片机是经典的 8 位微控制器,实际开发中需结合具体硬件手册和电路图(如 HC6800-MS 原理图)进行设计。
(二)LED 模块
原理图说明
- 硬件连接中,网络编号(如 P20/SDA)表示原理上相连的引脚。
- LED 模块通常通过 GPIO 端口(如 P2 口)控制,高低电平决定 LED 的亮灭状态。
控制代码
跑马灯代码:操作P2端口(注意是大写)
#include <reg52.h>void delay(unsigned int n) {while(n--); }void led_all_on(void) {P2 = 0; }void led_all_off(void) {P2 = 0xFF; }void led_on(unsigned char n) {P2 = n; }int main(void) {led_all_off();while(1){int i;for(i = 0;i < 8;++i){led_on(~(1 << i));delay(30000); }for(i = 6;i > 0;--i){led_on(~(1 << i));delay(30000);}} }
(三)位运算应用
位运算是单片机控制硬件的核心手段,通过操作寄存器的特定位实现精准控制:
指定位清零
reg &= ~(1 << n); // reg寄存器第n位清零
reg &= ~((1 << n) | (1 << m)); // reg寄存器第n、m位同时清零
reg &= ~(0x0F << 2); // reg寄存器从第2位开始,连续4位清零(0x0F为4位1)
2.指定位置 1
公式:
reg |= (1<<n) //reg寄存器第n位置1
reg |= (1<<n) | (1<<m) //reg寄存器第m位和n位置1
3. 指定位翻转
^:指定位翻转,其他位不变(相同为0不同为1)
reg ^= (1 << n); // 第n位翻转(0变1,1变0)
reg ^= (1 << n) | (1 << m); // 第n、m位同时翻转
位运算规则
&
(与):一假则假,用于清零。|
(或):一真则真,用于置 1。^
(异或):相同为 0,不同为 1,用于翻转。~
(取反):单目运算,0 变 1、1 变 0。<<
(左移):高位丢弃,低位补 0,等价于乘 2ⁿ。>>
(右移):无符号数补 0,有符号数补符号位,等价于除 2ⁿ。
(四)寄存器
- 定义:在数字电路中,用来存放二进制数据或代码的电路称为寄存器。
什么是外设寄存器?
是指能够操作硬件的,具有固定地址的内存空间
- 本质:
- 51 单片机中通过特殊功能寄存器(SFR)访问硬件,如:
#define P2 *((unsigned char *)(0xA0)) // 地址0xA0强转为指针
sfr P2 = 0xA0; // 直接定义SFR,0xA0为地址 - 可视为系统预定义的全局变量(如
unsigned char P2;
,占 1 字节 8 位)。
- 51 单片机中通过特殊功能寄存器(SFR)访问硬件,如:
(六)数码管控制
共阴极数码管 (共负极,负极是连接在一起的);
共阳极数码管 (共阳极,阳极是连接在一起的);
核心概念
- 段选:控制数码管各段(a~g、dp)的亮灭,通常由 P0 口控制。
- 位选:选择哪个数码管显示,由控制引脚(如 LEDS1~LEDS4)控制。
原理图说明
- 共阴极数码管:位选引脚为低电平时选中(如 P10 置 1 时,LEDS1即为0被选中)。
- 点亮4个数码管(eg:显示1234)
#include "delay.h"
#include <reg52.h>void delay(unsigned int n)
{while(n--);
}#include "digiter.h"
#include "delay.h"
#include <reg52.h>void bit_select(int n) //位选,即控制第几个数码管亮
{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(300); //保证二极管导通P0 = 0;delay(300); //消影
}void show_number(int n) //显示数码管的数字(eg: 1234)
{int t = 0;if(n > 9999){return ;}else if(0 == n) {bit_select(0);segment_select(0); }while(n){bit_select(t++);segment_select(n % 10);n /= 10; }
}#include <reg52.h>
#include "led.h"
#include "digiter.h"
#include "delay.h"int main(void)
{while(1){ show_number(1234);}}