店铺:【吴剑英店】
地址:【】
80C51上的C语言编程 C51的特点
(1)学过C语言的学生对单片机有了基本的了解后,就可以开始尝试编写一两个基于单片机的C语言程序。 C51语言继承了ANSI C的大部分功能,基本语法相同,因此学生上手很快。 不过,由于C51语言是控制硬件的编程语言,所以它本身在硬件结构上进行了扩展,以增强C语言对硬件的控制,比如关键字sbit、data、code等(我会讲一下它们分别是什么)稍后再做)。
(2)因为单片机并不是我们平时使用的计算机,所以它的英文名称是MCU(microcontroller),它的特点就体现在“微”字上。 因此里面的硬件资源很少,所以在写程序的时候一定要注意RAM(存储数据)和ROM(存储程序)的使用。 说白了,我们在编程的时候,应该尽量精简,比如各种算法,不要给系统带来太大的负担。 使用更少的浮点运算。 如果可以使用未签名的未签名数据,请不要使用签名数据。 (当你写程序时,你会发现很多地方都使用了unsigned,它不像我们在ANSI C中使用的那样,我们不太关注它,C51非常注重资源控制)。 避免乘法和除法,多使用移位运算(这个是写走马灯程序时用的,很有趣,不是我们想象的循环控制)。
了解了基本特征之后,我们来说说具体的事情:
首先,C51为硬件控制添加了一些关键字和数据类型。
(1)bit:与我们平时使用的int、char相同,只不过int是两个字节(16位、16bit),char是单字节(8位、8bit),而bit是一位,其值range 是0和1,类似于windows编程中的BOOL。
(2)sbit:sbit是对应位寻址空间的位,位寻址区域:20H~2FH。 一旦使用sbit xxx = REGE^6这样的定义(例如sibt a = P0^0,则将P0端口的第0位定义为变量a。此时,当a被赋值为0或1,是P0口的第一位。0位用于控制,分配低电平或高电平),这个sbit的数量决定了地址。 (Sbits多用于特殊功能寄存器,方便对寄存器的某些位进行操作。)
(3)sfr:用于定义特殊功能寄存器(8位)(程序中会写入头文件#include,在Keil中右键打开reg51.h,可以看到很多sfr定义),比如当 sfr P0 = 0x80 时,端口 P0 被定义。
(4)sfr16:与上面16位相同
其次,C51还提供对8051所有存储区域的访问。
8051芯片的存储区域在逻辑上分为内部数据存储区、外部数据存储区和程序存储区(内部和外部统一寻址)。
80C51 有 4KB 的内部程序存储区(片内 ROM)(0000H~0FFFH),其中前 43 个单元有特殊用途,0000H~0002H 无条件跳转,0003H~002AH 用于存储中断程序(中断程序为这里不解释)
256B内部数据存储区域(片内RAM)分为低128B和高128B,功能不同(可见硬件资源是多么的小,所以我们要节约使用)。 低128B划分为工作寄存器区域。 又称通用寄存器(00H~1FH)、位寻址区(20H~2FH,前一个sbit为对应位寻址空间中的一位)、数据缓冲区(30H~7FH,该区域供用户使用,无限制,80总计单位)
高128B是特殊功能寄存器(上面提到的sfr)。 具体内容可以在很多书籍上找到。
%20特殊%20函数%20Register.htm
有一个英文网站解释SFR,不过没必要看,看书就可以了。
这里之所以讲这么多,是因为在C51中,声明变量时也可以显式指定存储空间。 关键字包括:DATA、IDATA、BDATA(RAM中高128B)、CODE等。
(1) DATA指定RAM的低128B,可在一个机器周期内直接寻址。 寻址速度最快,所以经常使用的变量应放在DATA区。
例如:unsigned char 数据 system_status = 0;
(2) BDATA 指定RAM 中的位寻址区域。 该区域中定义的变量可以执行位操作。 这是什么意思? 举个例子。
unsigned char bdata status_byte,这里定义了变量status_byte,它是一个单字节(8位)数据变量。 我们可以将这个变量中的某个位设置为0或1。我们设置status_byte=0x00,即变量中的8个位全部设置为0。之前我们讲过一个sbit,它用于位寻址中的一位区域。 sbit a = status_byte^2; a = 1,表示设置变量status_byte的第二位为1(八位数字0,1,2,3,4,5,6,7),所以变量status_byte等于0x02;
(3) CODE 程序存储区,其中内容不变。 我们想要使用的一些固定数据都存储在这个区域中,而不占用RAM空间。 例如,当我们学习数码管显示程序时,上面的每个数码管每个数字都对应一个十六进制数,我们可以将其存储在程序存储区中,例如:
无符号字符代码表[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
关于特殊功能寄存器sfr的使用,我们以一个简单的程序为例。 将发光二极管LED、电阻RES和电源VCC连接到80C51芯片的P0^0。 三者串联。 电流方向是从电源到P0^0端口。 将电源、地、晶体振荡器和复位电路连接到80C51。 如果使用proteus仿真,这些电路就不需要连接。
用Keil软件编写程序
#包括
sbit a = P0^0;
无效主(){
a = 0;
同时(1);
由于芯片刚刚上电,P0控制处于高电位,我们在程序中将其设置为0; 电流可以流过LED,LED灯就会发光。 并使用 while(1) 来停止程序。
一个最简单的单片机C语言程序已经编写完成。 说了这么多,希望同学们明白C51对C语言扩展有一定的了解,知道可以通过C语言控制硬件,可以学习常用的关键字。
喜欢这篇文章的朋友请点赞哦
技术源于积累,成功源于坚持
——单片机专家吴建英