在 #include<reg52.h>头文件中,把单片机中的寄存器地址封装起来定义成宏供我们调用,寄存器这个概念我们初学先不用太深刻的去理解它,在《手把手教你学51单片机》文档中2.4.1节有讲解,大家熟读几遍,如果还是无法理解后面我们再用程序配合硬件来领悟它们的作用。
首先我们知道STC89C52RC这个芯片有4*8=32个IO端口是可以被我们用程序控制输出高电平或低电平的。拿P0表示它可以一次性控制8个引脚端口输出每个引脚想输出的电平状态,P0是一个寄存器,它的功能是控制所对应的8个单片机IO端口(P0.0~P0.7)输出我们想要输出的电平,比如我们控制P0.0单个IO端口输出低电平,P0.1~P0.7这7个IO端口输出高电平,程序中使用这条语句“P0=0xFE;”,其他P1,P2,P3也是一样的操作。
C语言中的十六进制0xFE用二进制表示 11111110,我们也就知道了单片机的P0.0排在了这八个位的最底端。我们控制P0.2单个IO端口输出低电平,其他IO端口输出高电平,则是“P0=0xFB; ”二进制表示 11111011。对这些知识没有过接触的读者用计算器可以快速查看,不过以后还是尽量口算比较好。
有时我们只关心单片机的一个引脚的电平控制,其他7个我们不用把人家强制输出成其他电平,而“P0=0xFE;”就是强制把其他7个IO端口都输出了固定高电平状态。要想实现单独控制一个IO端口,这时我们用这条语句来声明“sbit LED=P0^0;”也就是只控制一个位,此时想让单独的P0.0输出低电平只需“LED=0;”即可,LED不过是表示P0.0所用的名字而已,你可以根据喜好改写这个名字。
值得注意的是,程序书写中如果没有“sbit LED=P0^0;”这个提前定义,直接“P0.0=0;”这样书写是不符合语法的,必须先给IO端口一个命名,而且“sbit LED=P0.0;”这样的写法同样也不符合语法,规定是“P0^0”。
还有我们也不能命名已经在 #include<reg52.h>头文件中已有的名字,查看头文件内容可知,有些名字已经被使用,
像“sbit PSW=P0^0;”,“sbit CY=P0^0;”这样定义会编译报错的,因为命名冲突了。#include<reg52.h>头文件中已有的名字我们后期会使用到的。
假设开发板上的LED连接情况如下
那么我们用程序来点亮它就比较简单了,只需让P0.0输出低电平即可。
#include <reg52.h> sbit LED = P0^0; void main() { LED= 0; while (1);//程序执行到此处语句,则不再往下执行下面的语句,相当于程序运行停在了此处,其实是这条语句一直在死循环空作功,文档2.4.3节有参考 }
上述代码只是简单入门第一个程序,但是这段代码在本教程所使用的开发板中并不能点亮一盏灯,原因是开发板实际硬件连接并不是如上图所示。此讲的原理图只是作为第一个程序的入门讲解参考。
本文固定URL:https://www.dotcpp.com/course/177
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程