51单片机学习过程有一些心得和收获,在此略作梳理
本人开发板:普中A2开发板(包括核心STC89C52单片机和其他各种外设)
前置知识
1.C语言(必学)
2.数字电路(必学)
3.电路基础,模拟电路
4.单片机原理/微机原理
5.汇编原理
我学习了C语言,数电,电路基础,微机原理和模电零零散散学了点,个人感觉数字电路和C语言是必学的,其他的有基础最好,没有学问题不大
51单片机学习核心点
个人的学习中的一些理解
1.要明确自己的需求是什么,然后考虑用什么硬件?怎么实现?
2.要学会看懂单片机和其他芯片的手册和芯片硬件原理图,开发过程中这些是核心内容
3.对51单片机来讲,配置寄存器是控制单片机的有效手段(基于寄存器开发),51单片机中寄存器基本都是8位宽,本文阅读过程对寄存器配置有困惑请翻阅相关手册或硬件原理图
单片机杂乱知识
单片机的执行逻辑
正常计算机程序中C语言是从main函数开始执行,执行到最后结尾处结束(只执行一次),但单片机自身工作方式就是循环扫描,所以会反复循环执行main函数。
例:这是一个循环流水灯代码(D1→D8方向),while(1)语句中的内容会循环执行,可以实现循环流水灯。
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2=0xFE;
Delay500ms();
P2=0xFD;
Delay500ms();
P2=0xFB;
Delay500ms();
P2=0xF7;
Delay500ms();
P2=0xEF;
Delay500ms();
P2=0xDF;
Delay500ms();
P2=0xBF;
Delay500ms();
P2=0x7F;
Delay500ms();
}
}
如果把while循环去掉(代码如下),循环流水灯的功能还是会正常实现,因为main函数执行完会从头再反复循环执行。
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
P2=0xFE;
Delay500ms();
P2=0xFD;
Delay500ms();
P2=0xFB;
Delay500ms();
P2=0xF7;
Delay500ms();
P2=0xEF;
Delay500ms();
P2=0xDF;
Delay500ms();
P2=0xBF;
Delay500ms();
P2=0x7F;
Delay500ms();
}
单片机的上电逻辑
单片机默认给IO口上电为1,要记得根据设计需要将目标的IO口初始化为0
例:
void 74HC595_Init()//单片机默认给IO口上电为1,这里根据需要将SCK和RCK初始化为0
{
SCK=0;
RCK=0;
}
这里是74HC595芯片的初始化,通过查阅原理图应该将SCK和RCK初始化为0(不将数据移位不将数据输出)再工作。
单片机IO口工作状态
51单片机IO口的四种模式:分别是准双向口模式(弱上拉)、开漏输出模式、推挽输出模式、高阻输入模式。
C51数据类型
51单片机比较古老,C51中char位宽是1个字节,但int位宽是2个字节(16位)不是4个字节
unsigned char表示范围0-255;unsigned int表示范围0-65535
C51关键字
static关键字:static关键字修饰的变量具有全局生存周期,存放位置同全局变量,即未初始化的变量存放在BSS段(被初始化为0),已经初始化的变量存放在data段
extern关键字:在此处声明某种变量或函数,在其他文件中已经定义,编译时要放行。
code关键字:code关键字修饰的变量存放在code(text)段,一般存在ROM或者flash中,所以只能读出不可更改,对他写入是违法操作。
单片机C语言code关键字_单片机code的用法-优快云博客
机械按键消抖
对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,开关闭合及断开的瞬间会伴随一连串的抖动,所以需要进行消抖
例:每按一次机械开关,LED1灯切换状态(开→关/关→开),下面代码在开关断开、闭合时分别延时20ms进行消抖
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
if(P3_1==0) //如果K1按键按下
{
Delay(20); //延时消抖
while(P3_1==0); //不松手时卡在这个while循环
Delay(20); //延时消抖
P2_0=~P2_0; //LED1取反
}
}
}
移位的用法
消影
数码管消影
例:8位数码管前三位显示“123”
开发板原理图
显示“123”是利用人眼视觉暂留效应
根据原理图:LED1~LED8接口实现数码管位选,LED1~LED8接口接3-8译码器,所以通过配置P22、P23、P24信号实现数码管位选。P00~P07实现数码管段选。
代码:
#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
// NixieTable[]数组包装 0~9和A~F的段码表
void Nixie(unsigned char Location,Number)//进行位