从点灯开始的51单片机生活

陵谷纷纭新事改,筑台土石未应迟。

目录


sfr与sbit?

这第一课咱们主要来先理解一下sfr与sbit,以下可能是咱们这些新手朋友常见的点灯代码:

c 复制代码
#include<regx52.h>//reg52.h只定义sfr而没定义sbit可寻址空间的位变量
int main()
{
	while(1)
	{
		P2_0 = 0;//P几取决于宁板子上led的对应的gpio
	}
}

或者是更底层更难理解一点的:

c 复制代码
sfr P2=0xA0;
sbit P2_0=P2^0;
int main()
{
	while(1)
	{
		P2_0=0;//赋值也有可能是1,这主要取决于led的二极管的连接电路
	}
}

可能有一些只有c语言基础的朋友就已经开始迷惑了,sfr和sbit是什么?

先来打个比方:想象单片机是一个储存有许多不同魔法的魔法书,每张书页都对应一个特殊功能:有的控制灯光(GPIO),有的管理时钟(Timer)。而sfr(特殊功能寄存器)​就是这些这本书的页码 。在单片机的sfr寄存器中有着许许多多的空间,空间里充斥着二进制数,这些二进制数控制着单片机接口输出高低电平,当然空间里的二进制数也会因为接口接收的高低电平改变;而sfr,一款由keil编译器开发的扩展关键字 ,它的作用类似于c语言中的取别名define,只不过它取别名的对象是储存八位二进制数的寄存器中的地址 ,比如咱们点灯用到的P2接口(GPIO,General Purpose Input Output ,通用功能输出输出 )所对应的sfr的地址就是0xA0,这个地址储存了一个八位二进制数,对应了八个led(对于一般的51单片机板子而言,咱手中这块是40脚的stc89c52rc);但是,目前咱们只想点一个led怎么办呢?所以咱们需要另一款keil扩展关键字sbit ,它的操作与^(规范的位寻址运算符)绑定,功能是也是取别名,但对象是sfr特殊寄存器地址中的某一位,这样咱们就可以直接操控确定的一位二进制数。

知道了sfr和sbit的作用与简单gpio的功能引脚定义,咱们现在就可以写出一些花活来:

c 复制代码
sfr LED_GPIO=0xA0;
sbit LED0=P2^0;
int main()
{
	while(1)
	{
		LED0=0;
	}
}

当然这是显然不规范的,蛤蛤蛤,如果是咱们自己兴趣的项目这样写写无伤大雅,但是在企业化的规范化开发中这显然是不能通过检查的。

但其实,像c中的头文件引用一样,单片机的开发也有自己的头文件,在51单片机系列中,通用的头文件<regx52.h>或者是<reg52.h>,前者既定义了sfr有定义了sbit;后者仅定义了sfr;这里藏着单片机开发的第一个隐藏关卡:

​reg52.h:标准AT89C52头文件 仅定义SFR基地址,如sfr P1 = 0x90; 需要手动位定义:sbit P1_0 =

P1^0;(很多新手漏掉这一步导致编译报错)

不靠定时器的delay_ms延时函数

在单片机编程中,延时是最基础的需求。比如让LED闪烁时,需要点亮后保持一段时间再熄灭。但单片机没有现成的delay_ms()函数,需要手动实现。咱们这里使用的方式是利用空循环消耗CPU时间

示例代码分析:

c 复制代码
void delay_ms(unsigned int ms) {
    unsigned int i, j;//unsigned关键字占用内存更少,符合单片机资源紧张需要空间高效利用性
    for(i = 0; i < ms; i++)
        for(j = 0; j < 680; j++); // 580次空操作循环约为1ms
}

所谓寄存器

举个不恰当的例子,寄存器就相当于一个api,咱们只需要知道参数(功能引脚初始化定义和sfr何如初始化设置)就可以玩转,在以后的学习中咱会以"api参数"为起始然后再阐述编程的框架!

相关推荐
天辛大师3 分钟前
天辛大师浅谈AI时代,“学会学习“本身的内涵也需要被重新定义?
人工智能·深度学习·学习·启发式算法·量子计算
三佛科技-1873661339713 分钟前
MT8F82XX系列MCU型号选型指南:兼容替代型号全梳理
单片机·嵌入式硬件
是隼人17 分钟前
buuctf-pwn PWN1题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
HugoStudio_SWAN20 分钟前
洛谷 P1321 单词覆盖还原——从蜡板上的密信到数字水印
c++·学习·程序人生·算法
春风解人意24 分钟前
从零开始学习嵌入式P33----网络基础之HTTP
网络·学习·http
励志不掉头发的内向程序员29 分钟前
【LibreCAD 2D架构】从鼠标点击到屏幕像素:LibreCAD绘图架构全链路解析之Action与命令系统
linux·开发语言·c++·qt·学习·系统架构
小道士写程序36 分钟前
自然语言处理NLP - 第8章 词向量与神经网络:从手工特征到学习表示
神经网络·学习·自然语言处理
Jaixln_HRF43 分钟前
芯维尔CN3921 2A/30V同步降压转换器芯片,集成120/80mΩ MOSFET与680kHz频率,用于汽车电子/IoT/便携仪器
嵌入式硬件·物联网·硬件工程
糖糖单片机设计44 分钟前
STM32智能行李箱控制系统
stm32·单片机·嵌入式硬件
Rocktech_ruixun1 小时前
机器人视觉SLAM对主控硬件有哪些要求?瑞迅科技RK3588/3576/3568分级方案解析
人工智能·嵌入式硬件·机器人