吴鉴鹰上的C语言编程C51的特色-

(1)学习过C语言的同学在对单片机有了基本了解之后,就可以开始试着写一两个基于单片机的C语言的程序了。一个最简单的单片机C语言程序就写完了。讲了这么多希望同学们了解,C51对C语言的扩展有所了解,知道可以通过C语言对硬件进行控制,学会常用的关键字。

店铺:【吴剑英店】

地址:【】

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语言控制硬件,可以学习常用的关键字。

喜欢这篇文章的朋友请点赞哦

吴鉴鹰上的C语言编程C51的特色-

吴鉴鹰上的C语言编程C51的特色-

技术源于积累,成功源于坚持

——单片机专家吴建英

单片机

微机原理与接口技术的学习方法是怎样的呢?

2024-1-31 16:03:43

单片机

嵌入式Linux倾向于高性能芯片的裸机操作意义不大感觉

2024-1-31 17:02:57

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索