51单片机

电平特性

image-20230910133058035

1高电平

0低电平

高电平 5V

低电平 0V

此外还有电平临界值


进制与逻辑运算

二进制

十六进制 0x

逻辑运算

  • 逻辑与
  • 逻辑或
  • 逻辑非

与C语言中一致

按位取反 符号 ~

运算

同或运算

  • 必须相同,否则没有

异或运算

  • 必须不同,否则没有

C简介

发展史–

很多硬件使用C语言进行开发

对平台依赖比较低

效率高 硬件开发友好

单片开发中 C语言还有汇编语言 C语言有很大的优点

C语言比较结构化

C数据类型

image-20230911133735042

数组和结构体使用还是蛮多的

可以让程序结构优化

C语言指针类型 是C的灵魂

image-20230911133916656

常量 变量等等

单片机也需要运算 ,为了合理运用内存空间 ,所以要使用好数据类型


C51基础知识

C51扩充数据类型

image-20230911193450357

所有声明 都在头文件中提供了 初学者可以先不了解

sfr寄存器声明

例如:sfr SCON = 0x98

例如: sbit TI = SCON^1

类型转换规律 大的转换到小的


C51运算量

  1. 常量

    常量是指在程序执行过程中其值不能改变的量。

  2. 变量
    变量是在程序运行过程中其值可以改变的量。
    [存储种类] 数据类型说明符 [存储器类型] 变量名 1[=初值],变量名 2 [初值]…
    typedef c51固有的数据类型说明符 别名;


暂时跳过C基础部分 回头复习 其中的C51特性 稍后研究

直接开始 江科大51单片机教程


江科大 C51单片机

手搓代码 让单片机烧起来

两款开发工具

开始肯定需要安装开发工具 51单片机需要两款:

  • keil 5 编译工具

  • stc-isp 烧录工具

注意安装目录 工具收费 学习过程中可以使用绿色学习版本

安装破解 正常流程 开始实操


介绍单片机

MCU 单片机

内部集成各种硬件功能等,可以简单理解为超微型电脑

单品阿吉的任务是信息采集(依靠传感器)处理和硬件设备的控制

袖珍版计算机,一个芯片就能构成完成的计算机系统。但在性能上,与计算机相差甚远,但是单片机成本低廉、体积小、结构简单,生活和工业控制领域大有所用

学习使用单片机是了解计算机原理与结构的最佳选择

单片机使用领域十分广泛,实施工控、通讯设备、导航、家用电器等。这种产品常常冠以“智能型”


单片机家族

STC89C52单片机

image-20230912153054171

老东西 上世纪80年代的产物 inter开发的 8051单片机

命名规则

image-20230912155151913

内部结构图

image-20230912155953577

flash闪存 rom io口都是引脚


单片机最小系统

image-20230912160259622

介绍了开发板


控制LED

image-20230912214940299

小的一端正极 大的负极 长脚正极 短脚负极

电阻 命名方式 101 = 10 0 类似科学计数法

如何控制引脚电压

mcu中包含cpu 还包含寄存器 寄存器通过驱动器来链接引脚 可以给寄存器写值来控制电流

程序中不支持直接输入二进制 一般转换为十六进制 或十进制

image-20230913125958045

控制p2寄存器 输出电流 控制一个LED灯

image-20230913131246177

可以使用stc-isp小工具生成延时代码 灰常好用

编写延时函数,调整为可定义延时参数的函数


独立按键

image-20230913190644554

数据运算

image-20230913191921078

一些结构

image-20230913192804412


按键取反操作

先了解按键的抖动 机械按键开闭的瞬间不会立即连接上电路会有一些干扰

image-20230913193106976

消除抖动 两种方法

  • 硬件防抖 加入一些电路消除
  • 软件防抖 代码中加入一些延时操作 把抖动跳过 20ms ok

按键控制状态

image-20230913194556127

按键控制LED如二进制

image-20230913214451530


独立按键控制LED移位

#include <REGX52.H>
//ÑÓʱº¯Êý
void Delay(unsigned int xms)
{
	unsigned char i,j;

	while(xms--)
	{
		 i = 2;
		 j = 239;
		 do{
			while(--j);
		 }while(--i);
	}
}
//

unsigned char LEDNum = 0;

void main()
{
	P2 = ~0x01;
	
	while(1)
	{
	
	if(P3_1 == 0)
	{
		Delay(20);
		while(P3_1 == 0)
		Delay(20);
		
		LEDNum ++;
		if(LEDNum >= 8)
		{
			LEDNum = 0;
		}
		
		P2 = ~(0x01<<LEDNum);
	}
	
	
	///
	
	if(P3_0 == 0)
	{
		Delay(20);
		while(P3_0 == 0)
		Delay(20);
		
		
		if(LEDNum == 0)
		{
			LEDNum = 7;
		}else
		{
			LEDNum --;
		}
		
		P2 = ~(0x01<<LEDNum);
	}
		
	}
}

LED数码管

image-20230914092545840


image-20230914092706346

上面单的 下面是四位一体 学习用的开发板即是四位一体数码管

image-20230914094440532


数组来控制LED数码管

先引入C51数组概念 即C数组 还有C子函数

image-20230914144054025

子函数

image-20230914144416003

子函数可以优化代码结构还有代码的复用


动态数码管显示问题

需要消影

因为运算速度太快了 所以造成数据的错乱 在后面加一个延时清零

数码管驱动方式

image-20230914154023381



模块化编程

image-20230914154325867

image-20230914154346062

image-20230914155247996


LCD调试 封装好的 导进去 直接调用封装好的函数 可以显示调试


矩阵键盘

读取矩阵键盘的键码值

image-20230914203652778

矩阵形式来减少IO口占用

扫描的概念

image-20230914204929819

扫描速度非常快 所以人眼无法看出闪烁

节省IO口

这里开发板按行扫描 蜂鸣器会响 所以这里采用按列扫描

手册与开发板原理图 非常重要 需要能看懂

双向口 开漏输出

在Keil 5 中 左边布局 有一个Templates 可以简化输入


定时器

image-20230915174654592

image-20230915175058905

image-20230916145647927

image-20230916150134499

  • SYSclk: 系统时钟,即晶振周期,本开发板上的晶振位12MHz

中断系统

image-20230916152747609

image-20230916152859456

image-20230916160240265

一堆电路电门需要区分


TMOD 工作模式寄存器

TCON 计数器控制寄存器

定时器可以使用stp-isp工具生成


串口通信

串口的介绍

image-20230919202035309

image-20230919202804443

image-20230919212509210

交叉连接 一端发送一端接收

串口电平和单片机并不相同 所以要定义一个电平标准

串口走的是RS232电平,也有可能走RS485电平也称为差分电平

usb也是差分电平 TTL电平和RS232电平就十多米长了传输错误

RS485传输可达上千米

image-20230919213407716

image-20230920114804797

image-20230920115205210

image-20230920194941733

image-20230920200636171


进入考核第二阶段 暂停