《嵌入式硬件(一):裸机概念与80c51单片机基础》
系统与操作特性
裸机系统通常不包含操作系统,依赖直接硬件操作。RAM(随机存取存储器)用于临时数据存储,读写速度快但断电后数据丢失。
处理单元分类表
缩写 | 全称 | 功能描述 |
---|---|---|
SoC | System on Chip | 高性能处理单元(集成CPU/GPU/内存的高性能芯片) |
MCU | Microcontroller Unit | 微小控制单元->单片机(集成存储与外设的单片机) |
MPU | Microprocessor Unit | 微处理单元(需外接存储的处理核心) |
GPU | Graphics Processing Unit | 图像处理单元(专用于图形计算) |
CPU | Central Processing Unit | 中央处理单元(通用计算核心) |
数据类型规范
int
类型占用2字节存储空间(16位系统)unsigned int
取值范围为0到65535(2^16-1)- 十六进制常量表示如
0xFFFF
对应十进制65535
寄存器操作原理
寄存器(外设):是指能够操作硬件的,具有固定地址的内存空间
通用寄存器(如P0-P3)可通过数据类型直接映射:
unsigned char P0 = 0x00; // 8位寄存器声明
特殊功能寄存器(SFR)具有固定物理地址,51架构中通过sfr关键字定义:
str P0 = 0x80; // 地址0x80的端口寄存器
硬件接口标准
- 原理图网络编号规则:红色标识相同电气节点
- 电源符号标准:Vcc表示正电源,GND为地线
- 外设接口类型:
- GPIO:可编程输入/输出引脚
- UART:异步串行通信接口
- TIMER:硬件定时器模块
电平逻辑规范
共阴极LED晶体管:高电平时整个晶体亮
代码
1.
main.c
#include <reg52.h>
#include "led.h"
#include "digiter.h"
#include "delay.h"int main(void)
{int i;//必须定义在前面//led_on_all();//打开所有灯//led_off_on();//关闭所有灯//P2 &= ~((1 << 4)| (1 << 6) | (1 << 2) | (1 << 0));//开灯//P2 |= ((1 << 4)| (1 << 6) | (1 << 2) | (1 << 0));//关灯(需要先关灯)//P0 = t[9];//bit_select(1);//位选while(1){//P2 ^= 0x0F;//delay(60000);//延时/*for(i = 0;i < 8;++i){led_on(~(1 << i));//开某个灯delay(3000);} for(i = 6;i >0; --i){led_on(~(1 << i));delay(3000);} *//*for(i = 0;i < 10;++i){seqment_select(i);//段选delay(50000);} */ //show_number(1234);输出1234show_number(i++);计时器0~9999}
}
led.h
#ifndef _LED_H_
#define _LED_H_extern void led_on_all(void);
extern void led_off_on(void);
extern void led_on(unsigned int n);
#endif
led.c
#include <reg52.h>void led_on_all(void)
{P2 = 0;
}void led_off_on(void)
{P2 = 0xFF;
}void led_on(unsigned int n)
{P2 = n;
}
digiter.h
#ifndef _DIGITER_H_
#define _DIGITER_H_extern void bit_select(int n);
extern void seqment_select(int n);
extern void show_number(int n);#endif
digiter.c
#include <reg52.h>
#include "delay.h"
#include "digiter"void bit_select(int n)
{P1 &= ~(0x0F << 0);P1 |= (1 << n);
}void seqment_select(int n)
{unsigned char t[10] = {0X3F, 0X06, 0X5B, 0X4F, 0x66, 0X6D, 0X7D, 0X07, 0X7F, 0X6F};P0 = t[n];delay(100);P0 = 0;delay(100);
}void show_number(int n)
{ if(n > 9999){return;}else if(n == 0){bit_select(0);seqment_select(0);}else{int t = 0;while(n){bit_select(t++);seqment_select(n % 10);n /= 10;}}
}
delay.h
#ifndef _DELAY_H_
#define _DELAY_H_extern void delay(unsigned int n);#endif
delay.c
#include <reg52.h>
#include "delay.h"void delay(unsigned int n)
{while(n--);
}