51单片机学习笔记(更新中)

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口的四种模式:分别是准双向口模式(弱上拉)、开漏输出模式、推挽输出模式、高阻输入模式。

STC单片机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关键字:在此处声明某种变量或函数,在其他文件中已经定义,编译时要放行。

【014 关键字】一文彻底搞懂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)//进行位
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值