51单片机c语言定义寄存器r,c51特殊功能寄存器定义及作用

发布者:幸福梦想最新更新时间:2022-05-19 来源: eefocus关键字:51单片机  c语言  寄存器  特殊功能寄存器 手机看文章 扫描二维码
随时随地手机看文章

单片机C51语言是由C语言继承而来的。和C语言不同的是,C51语言运行于单片机平台,而C语言则运行于普通的桌面平台。C51语言具有C语言结构清晰的优点,便于学习,同时具有汇编语言的硬件操作能力。对于具有C语言编程基础的读者,能够轻松地掌握单片机C51语言的程序设计。


c51主要特点

单片机C51语言兼备高级语言与低级语言的优点。

语法结构和标准C语言基本一致,语言简洁,便于学习。

2f348e6006a5252c14385db3f8568ee3.png

单片机C51实验板

运行于单片机平台,支持的微处理器种类繁多,可移植性好。对于兼容的8051系列单片机,只要将一个硬件型号下的程序稍加修改,甚至不加改变,就可移植到另一个不同型号的单片机中运行。


具有高级语言的特点,尽量减少底层硬件寄存器的操作。

单片机C51语言提供了完备的数据类型、运算符及函数供使用。

C51语言是一种结构化程序设计语言,可以使用一对花括号“{}”将一系列语句组合成一个复合语句,程序结构清晰明了。

C51语言代码执行的效率方面十分接近汇编语言,且比汇编语言的程序易于理解,便于代码共享。


“Hello world”程序

c51特殊功能寄存器定义与作用

在开始讲对C51单片机中特殊寄存器(SPR)的定义前,先简单介绍下我们在进行51单片机开发时经常看到的两个关键字“sbit”和”sfr“:

sfr用于将一个单片机的特殊功能寄存器(specialfuncTIonregister)赋值给一个变量,这样在后面的程序中就可以中这个变量指引(referto)该寄存器

sbit与sfr用法类似,只是sbit是位操作,用于将某个sfr中具体位赋值给一个变量,这样后面程序就可用通过该变量为该位清0或置1。

接着我们以STC系列的51单片机为例简单的了解下单片机的特殊功能寄存器布局,如下:

b8d5f190cf22447bef686f068bc71350.png

MCS-51单片机中,除了程序计数器PC和4组工作寄存器组外,其它所有的寄存器均为特殊功能寄存器(SPR),分散在片内RAM区的高128字节中,地址范围为80H~0FFH。SFR中有11个寄存器具有位寻址能力,它们的字节地址都能被8整除,即字节地址是以8或0为尾数的。

为了能直接访问这些SPR,FranklinC51提供了一种自主形式的定义方法,这种定义方法与标准C语言不兼容,只适合与对MCS-51系列单片机进行C语言编程,特殊的能寄存器C51定义的一般语法格式如下:

sfrsfr-name=intconstant;

“sfr”是定义语句的关键字,其后必须跟一个MSC-51单片机真实存在的特殊功能寄存器名,“=”后面必须是一个整型常数,不允许带有运算符的表达式,是特殊功能寄存器“sfr-name”的字节地址,这个常数值的范围必须在SFR地址范围内,位于0x80~0xFF。

例如:

sfrSCON=0x98;    /* 串口控制寄存在器地址98H*/

sfrTMOD=0x89;   /*定时器/计数器方式控制寄存器地址89H*/

MCS-51系列单片机的特殊功能寄存器的数量与类型不尽相同,因此建议将所有特殊的“sfr”定义放入一个头文件中,该文件应包括MCS-51单片机系列机型中的SFR定义。C51编译器的“reg51.h”头文件是这样一个文件。

在新的MCS-51系列产品中,SFR在功能上经常组合为16位值,当SFR的高字节地址直接位于低字节之后时,对16位SFR的值可以直接进行访问。例如52子系列的定时器/计数器2就是这种情况。为了有效地访问这类SFR,可使用关键字“sfr16”来定义,其定义语句的语法格式与8位SFR相同,只是“=”后面的地址必须用16位于的SFR的低字节地址,即低字节地址作为“sfr16”的定义地址。例如:

sfr16T2=0xCC/*定时器/计数器2;T2低8位地址为0CCH,T2高8位地址为0CDH*/

这种定义适用于所有的新的16位SFR,但不能用于定时器/计数器0和1。

对于位寻址的SFR中的位,C51的扩充功能支持特殊位的定义,像SFR一样不与标准C兼容,使用“sbit” 来定义位寻址单元。

定义语句的一般语法格式有如下三种:

第一种格式:sbitbit-name=sfr-name^intconstant ;

“sbit”是定义语句的关键字,后跟一个寻址位符号名(该位符号名必须是MCS-51单片机中规定的位名称),“=”后的“sfr=name”中的位号,必须是0~7范围中的数。例如:

sfrPSW=0Xd0;   /*定义PSW予寄存器地址为D0H*/

sfrOV=PSW^2;   /*定义OV位为PSW.2,地址为D2H/*

sfrCY=PSW^7;   /*定义CY位为PSW.7 地址为D7H^*/

第二种格式:sbitbit-name=intconstant^intconstant;

“=”后的intconstant为寻址地址们所在的特殊功能寄存器的字节地址,“^” 符号后的intconstant为寻址位在特殊功能寄存器中的位号。例如:

sbitOV=0Xd0^2; /*定义OV位地址是D0H字节中的第2位*/

sbitCY=0XD0^7; /*定义CY位地址是D0H字节中的第7位*/

第三种格式:sbitbit-name=intconstant;

“=”后的intconstant为寻址位的绝对地址。例如:

sbitOV=0XD2;    /*定义OV位地址为D2H*/

sbitOY=0XD7;    /*定义CY位地址为D7H*/

特殊功能位代表了一个独立的定义类,不能与其它位定义和位域互换。

了解完了关于特殊功能寄存器的定义,有人又会产生疑问:

我们用sfrP0=0&TImes;80表示P0,用sfrSP=0&TImes;81表示SP,这个没有歧义。但有疑问的是:假如用sbitP0_1=0&TImes;81表示P0口的第一位,那么我想表示SP寄存器的第0位怎么办呢?如果也是定义成sbitSP_0=0×81那么明显会有二义性,编译器理解不了。其实这个问题是不存在的,从图1中可以看出,SPR又可以分为两个区域:可位寻址区和不可位寻址区。可位寻址区的寄存器地址能够被8整除,而不可位寻址区的寄存器地址不满足这一要求。因此例子中的sbitSP_0=0×81对于SP寄存器这是无效的应该写成sfrSP=0x81。

例如:sbitP1^1=0x81;sfrSP=0x81;

它们虽然都引用了同一个地址0×81,但是对于编译器来说,这两者的含义完全不同,前者因为有sfr关键字,所以是字节地址。后者因为是sbit关键字,所以是位寻址,表示的是一个bit。

关键字:51单片机  c语言  寄存器  特殊功能寄存器 引用地址:51单片机c语言定义寄存器r,c51特殊功能寄存器定义及作用

上一篇:8051 的串口通讯及应用
下一篇:8051/2单片机常用的本地通讯方式 UART,RS485,I2C,SPI 之 UART串口通讯 1

推荐阅读最新更新时间:2024-11-16 23:11

51单片机快速入门指南】2.5:并行I/O扩展与8255A
Windows 10 20H2 Proteus 8 Frofessional v8.9 SP2 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 摘自《单片机基础》(第3版) —— 李广弟 朱月秀 冷祖祁编著 单片机I/O扩展基础知识 使用单片机本身的I/O (Input/Output)口,可以实现一些简单的数据输入/输出传送,例如,开关状态的输入,发光二极管的驱动输出等。但是对于复杂的I/O操作,必须有接口电路的协调与控制才能进行。所以I/O扩展的主要内容是接口问题。 I/O接口电路的功能 在单片机系统中,
[单片机]
【<font color='red'>51单片机</font>快速入门指南】2.5:并行I/O扩展与8255A
51单片机控制步进电机运动详解
本来接触单片机挺久了的,但是一直只是停留在非常初级的认识阶段,本科的时候上过几门课,但是从来没有自己捣鼓过单片机,这次突然来了兴趣,感觉一下子学到了好多东西,在这里好好整理一下。这篇文章只适合于入门阶段的小白阅读,高手请绕道。 12年年初的时候购买了一套普中科技的“单片机开发试验仪”,好多次想好好学学,结果每一次都半途而废,主要原因还是周围的人都不会用,有问题都不知道找谁问,结果锁到箱子里一直到现在。因为最近需要用到一个步进电机,而这个步进电机需要用PWM波控制。以前也用过电机,直流无刷的、交流伺服等等,但是都是RS232、RS485或者Can总线协议,从来没有用PWM波控制过。废话不多说,直接入正题。 硬件 单片
[单片机]
用<font color='red'>51单片机</font>控制步进电机运动详解
数码显示管显示按键序号 89c51单片机编程实例
题目:AT89C51单片机P1口接8个按键(button),P2口接1个共阴极数码显示管,当有键按下时,数码显示管显示按键的序号 电路图: 源码如下: org 00h sjmp start org 30h start: mov P2,#00h start1: mov r1,#00h mov dptr,#table next: mov a,p1 cpl a jz next mov r5,#1 acall delay mov a,p1 cpl a jz next clr c shift: rrc a jc d
[单片机]
基于51单片机的酒精浓度监测仪
一.系统概述 系统使用的模块有AT89C51单片机+LCD1602显示屏+MQ-3酒精检测模块+小灯+ADC0832。 本设计采用51单片机为核心控制,通过调节电位器可以模拟MQ-3酒精浓度的变化,MQ-3采集到的模拟电压信号会通过ADC0832转换为数字电压信号,单片机会将电压信号进行处理和分析并得到我们想要的酒精浓度信号,通过LCD1602显示屏显示酒精浓度,当检测到的酒精浓度高于设置的阈值,小灯就会直接进行报警。 二.仿真概述 1.通过LCD1602显示实时检测到的酒精浓度和设置的酒精浓度阈值。 2.通过MQ-3乙醇模块进行酒精浓度的检测。 3.当检测到的酒精浓度值超过设定阈值后就会通过小灯进行报警。 三
[单片机]
基于<font color='red'>51单片机</font>的酒精浓度监测仪
PIC单片机C语言精确控制时间
很多朋友说C不能精确控制延时时间,不能像汇编那样直观。其实不然,对延时函数深入了解一下就能设计出一个理想的筐架出来。一般我们都用for(VX=100;--X){;}此句等同于X=100;while(--X){;};或Vfor(x=0;x 100;x++){;}. 来写一个延时函数。 在这里要注意:X=100,并不是表示只运行100个指令就跳出循环。 可以看看编译后的汇编: X=100;while(--x){;} 汇编后: movlw 100 bcf 3,5 bcf 3,6 movwf _delay l2 decfsz _delay goto 12 return 从代码中可以看出总的指令是303个,其公式是8+3*(x-1).注
[单片机]
基于C语言的闪烁灯
#include reg52.h #define uint unsigned int sbit LED = P1^0; void delay(uint a) //延时函数,毫秒级别 { uint i; while(--a!=0) //执行空操作循环,其中a为形参,由调用该函数的函数语句提供值 { for(i=0;i 125;i++);//执行当0加到125时,大约会用掉1ms的时间 } } void main() //主函数 { while(1) //循环执行这个程序 { LED=0; //点亮发光二极管 delay(1000); //延时一段时间 LED=
[单片机]
开发51单片机操作系统注意事项
51系列单片机是美国Intel公司在1980年推出的高性能8位单片机,在我国的应用非常广泛。目前,在软件设计中需要软件工程师从底层做起,在系统软件设计方面需要做大量的重复性劳动。如果开发一套基于51系列单片机的操作系统,那么用户只需要编写各个任务的程序,不必同时将所有任务运行的各种情况记在心中,不但大大减少了程序编写的工作量,而且减少了出错的可能性。 1 开发平台的选择和论证 开发平台的选择至关重要,因为有时它不光影响进度、产品质量、可维护性等一般问题,还涉及到方案的可实现性。 在本系统中,选择51系列单片机作为操作系统的运行平台有以下原因。 首先,51系列单片机应用非常广泛,一大批性能优越的51兼容单片机相继推出。这
[单片机]
开发<font color='red'>51单片机</font>操作系统注意事项
基于51单片机秒表设计,独立按键实现启动、复位、暂停功能
功能说明: #include reg52.h //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; sbit K1=P3^1; //开始 sbit K2=P3^0; //停止 sbit K3=P3^2; //使用中断 清零 //数码表 u8 code smgduan ={0x3f,0x06,0x5b, 0x4f,0x66,0x6d, 0x7d,
[单片机]
基于<font color='red'>51单片机</font>秒表设计,独立按键实现启动、复位、暂停<font color='red'>功能</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved