51单片机详细介绍

概述

51单片机是指Intel的MCS-51系列单片机,后来被众多厂商生产兼容产品,成为全球最流行的8位单片机系列之一。

51单片机泛指兼容英特尔8051指令系统的8位单片机统称,技术源自Intel 1980年代推出的8051内核,广泛应用于家电控制、汽车电子、工业测控及通信设备领域,也是国内高校单片机教学的主要硬件平台 [3]。典型型号包括ATMEL的89C5189S51及STC公司的增强型89C52等,主流厂商涵盖Atmel、STC、Philips等。

该系列采用哈佛架构,集成8位CPU、Flash程序存储器、RAM数据存储器及定时器/中断系统。新型号如89S51支持33MHz工作频率与ISP在线编程,内置双工UART、看门狗定时器及改进型加密算法,全系保持向下兼容特性 [1]。硬件层面配备40引脚PDIP封装,包含4组准双向I/O端口,支持宽电压供电(3.3V-5.5V)及外部晶振电路配置。开发工具链涵盖Keil集成环境与STC-ISP烧录软件。

核心架构

  • CPU:8位微处理器

  • ROM:4KB-64KB程序存储器

  • RAM:128B-1KB数据存储器

  • 工作频率:通常0-24MHz(经典为12MHz)

  • 指令周期:大多数指令为1-2个机器周期

51最小系统原理图

主要品牌及其产品

  • Intel(英特尔):80C31、80C51、87C51,80C32、80C52、87C52等;

  • Atmel(艾特梅尔):89C51、89C52、89C2051,89S51(RC),89S52(RC)等;

  • Philips(飞利浦)、华邦、Dallas(达拉斯)、Siemens(西门子)等公司的许多产品;

  • STC(宏晶):STC89C51、STC90C51、STC11系列、STC15系列、STC8系列等。

LCD1602的4位数据口基本原理

4位模式 vs 8位模式

  • 8位模式:使用8根数据线(D0-D7)一次性传输一个字节

  • 4位模式:使用4根数据线(D4-D7)分两次传输一个字节

    • 先传输高4位

    • 再传输低4位

4位模式的优势

  • 节省IO口:从8个数据引脚减少到4个

  • 硬件简化:连接更简单,布线更少

  • 功能完整:保持所有LCD功能

总结

4位数据口控制的核心原理是:

  1. 分时复用:用4根数据线分两次传输8位数据

  2. 高位优先:先传输高4位,再传输低4位

  3. 使能同步:每次4位数据传输都需要使能脉冲同步

  4. 初始化关键:必须按照特定序列切换到4位模式

这种方法在保证功能完整性的同时,大大节省了单片机的IO口资源。

LCD1602仿真图

代码实现

lcd1602.h代码实现:

#ifndef __LCD1602_H__
#define __LCD1602_H__

// LCD初始化
void lcd_init(void);

// 清屏
void lcd_clear(void);

// 显示字符串
void lcd_display_string(unsigned char x, unsigned char y, unsigned char *str);

// 显示字符
void lcd_display_char(unsigned char x, unsigned char y, unsigned char dat);
#endif

lcd1602.c代码实现:

#include <REGX52.H>


#include <intrins.h>

// 控制引脚定义
sbit RS = P2^0;  // 数据/命令选择
sbit RW = P2^1;  // 读/写选择  
sbit EN = P2^2;  // 使能信号

// 数据引脚定义 (4位模式,使用高4位)
sbit D4 = P2^3;
sbit D5 = P2^4;
sbit D6 = P2^5;
sbit D7 = P2^6;

// 延时函数
void delay_ms(unsigned int ms)
{
    unsigned int i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 120; j++);
}

void delay_us(unsigned int us)
{
    while(us--);
}

// 向LCD写入4位数据
void lcd_write_4bit(unsigned char Cdata)
{
    D4 = (Cdata & 0x01) ? 1 : 0;
    D5 = (Cdata & 0x02) ? 1 : 0;
    D6 = (Cdata & 0x04) ? 1 : 0;
    D7 = (Cdata & 0x08) ? 1 : 0;
    
    EN = 1;
    delay_us(5);
    EN = 0;
    delay_us(5);
}

// 向LCD写入命令
void lcd_write_cmd(unsigned char cmd)
{
    RS = 0;  // 命令模式
    RW = 0;  // 写模式
    
    // 先写高4位
    lcd_write_4bit(cmd >> 4);
    // 再写低4位
    lcd_write_4bit(cmd & 0x0F);
    
    delay_ms(2);  // 等待命令执行完成
}

// 向LCD写入数据
void lcd_write_data(unsigned char dat)
{
    RS = 1;  // 数据模式
    RW = 0;  // 写模式
    
    // 先写高4位
    lcd_write_4bit(dat >> 4);
    // 再写低4位
    lcd_write_4bit(dat & 0x0F);
    
    delay_us(100);
}

// LCD初始化
void lcd_init(void)
{
    delay_ms(15);  // 等待LCD上电稳定
    
    // 切换到4位模式
    RS = 0;
    RW = 0;
    lcd_write_4bit(0x03);
    delay_ms(5);
    
    lcd_write_4bit(0x03);
    delay_us(100);
    
    lcd_write_4bit(0x03);
    delay_us(100);
    
    // 进入4位模式
    lcd_write_4bit(0x02);
    delay_ms(1);
    
    // 设置显示模式:2行,5x8点阵
    lcd_write_cmd(0x28);
    // 显示开,光标关,闪烁关
    lcd_write_cmd(0x0C);
    // 清屏
    lcd_write_cmd(0x01);
    delay_ms(2);
    // 输入模式:地址递增,显示不移动
    lcd_write_cmd(0x06);
}


// 设置显示位置
void lcd_set_position(unsigned char x, unsigned char y)
{
    unsigned char address;
    
    if(x == 0)
        address = 0x80 + y;  // 第一行
    else
        address = 0xC0 + y;  // 第二行
        
    lcd_write_cmd(address);
}

// 清屏
void lcd_clear(void)
{
    lcd_write_cmd(0x01);
    delay_ms(2);
}

// 显示字符串
void lcd_display_string(unsigned char x, unsigned char y, unsigned char *str)
{
    lcd_set_position(x, y);
    while(*str != '\0')
    {
        lcd_write_data(*str);
        str++;
    }
}

// 显示字符
void lcd_display_char(unsigned char x, unsigned char y, unsigned char dat)
{
    lcd_set_position(x, y);
    lcd_write_data(dat);
}

主函数调用:

#include <REGX52.H>
#include "lcd1602.h"
void main()
{
	lcd_init();//初始化
	//显示字符串
	lcd_display_string(0,0,"MCU-Hello!!");
	lcd_display_string(1,0,"12345678910ABCDE");
	while(1)
	{
	
	}
}

仿真效果:

proteus8.17 仿真51单片机控制lcd1602显示:

显示mcu hello,12345678910ABCDE,效果图:

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐