8051单片机C语言基础

发布者:科技律动最新更新时间:2016-10-24 来源: eefocus关键字:单片机  C语言基础 手机看文章 扫描二维码
随时随地手机看文章
单片机产生于19世纪70年代,80年代人们开始使用C语言作为单片机的开发语言,在1985年许多公司都推出51系列单片机的C语言编辑器,我们把面向51单片机的C语言简称为C51。目前C51软件中最为流行的就是Keil C。

一、C语言编程与汇编语言编程相比的优势

[1]编程调试灵活方便。因为它是一门高级语言,高级语言的特点就是编程方式灵活,同时,当前所有的单片机都有相应的C语言级别的仿真调试系统,使得它的调试十分方便。

[2]生成的代码编译效率高。尤其是用于较为复杂的单片机系统,用C语言开发更具明显优势,当前较好的C语言编辑系统的编译效率已经基本达到中高级程序人员的开发水平。

[3]完全模块化。C语言的基本构成单位是函数,其本身就是模块化的开发方式。程序的模块化可以最大程度地实现资源共享,十分有利于多人协作,进行大系统项目的开发。

[4]可移植性好。当对C语言程序进行移植时,只需将部分与硬件相关的地方进行适度修改,如:头文件。完全是算法类的程序无需修改就可以直接从一种单片机移植到另外一种单片机上。

[5]便于项目维护管理。用C语言开发的代码便于开发小组计划项目、灵活管理、分工合作以及后期维护,基本上可以杜绝因开发人员变化而给项目进度或后期维护或升级所带来的影响,从而保证了整个系统的高品质、高可靠性及可升级性。

二、与ANSI C的区别

[1]C51针对的是硬件系统,所以在程序的最开始应加载关于该系列芯片的头文件,如reg51.h或reg52.h,头文件中定义了各种SFR和SFR中可寻址位的信息。

[2]从数据类型上讲,C51多了一种位类型,可以使得单片机的位操作更加方便。

[3]从数据的存储类型上说,C51可分为data、code、bdata、idata、pdata、xdata等类型,不同的数据存储类型有着不同的执行效率。

[4]由于单片机系统资源有限,所以编译系统不允许有太多的程序嵌套。

[5]C51不支持扩展16位字符,同时不支持递归特性。

[6]printf和scanf函数在C51中不再是用于屏幕打印和接收字符,而是用于串行口通信时数据的收发。

三、C51的关键字

关键字是编程语言保留的特殊标识符,在程序中不允许另做他用。ANSI C中有32个关键字,C51在此基础上又扩展了20个,包括_at_, alien, bdata, bit, code, compact, data, idata, interrupt, large, pdata, _priority_, reentrant, sbit, sfr, sfr16, small, _task_, using,xdata。

四、C51的数据类型

ANSI C包括的数据类型有char、int、short、long、float、double、指针型,在C51中,short等同于int,double等同于float,除此之外,还增加了bit、sfr、sfr16、sbit这些特殊的数据类型。

char(1B)、int(2B)、long(4B)、float(4B)。

bit用于定义一个位标量,该位标量的值不是0就是1,类似某些高级语言中的Boolean类型数据。

sfr可以访问51单片机内所有的SFR,用于声明一个8位的SFR。如sfr P1=0x90;

sfr16用于定义存在于51单片机内部RAM的16位的特殊功能寄存器。如sfr16 T0=0x8c;

sbit用于访问位地址空间中的可寻址位或SFR中的可寻址位。

如:sbit OV=0xD2;

    sbit CY=0XD7;

*********************

    sfr SCON=0x98;

    sbit RI=SCON^0;

    sbit RB8=SCON^2;

************************

sbit OV=0xD0^2;

五、数据的存储器类型

data  存储在可直接寻址的片内低128B的RAM中,访问速度最快。

bdata 存储在可位寻址的内部RAM中(20H-2FH),允许位和字节混合访问。

idata  存储在可间接寻址的片内RAM的256B。允许访问全部片内地址。

pdata 存储在可分页寻址的外部RAM的256B空间内,相当于MOVX @Ri指令。

xdata 存储在可寻址的片外RAM的全部64KB空间,相当于MOVX @DPTR指令。

code 存储在全部64KB的程序存储区,相当于MOVC @A+DPTR指令。

六、绝对地址的访问方法

[1]使用指针。

char data *dp;

dp=0x61;

*dp=0x23;

[2]使用预定义宏(需包含absacc.h)

CBYTE   DBYTE   PBYTR   XBYTR

CWORD   DWORD   PWORD   XWORD

例如:  val2=XBYTE[0x7fdd];

[3]使用关键字_at_

unsigned char xdata com8255 _at_ 0xffef;

com8255=0x90;

七、中断服务程序

格式:  void 函数名() interrupt n [using  m]

n是中断号,取值为0~4,using m指明该中断服务程序对应的工作寄存器组,取值范围:0~3。使用C51编写中断服务程序,无需关心ACC、B、DPH、DPL、PSW等寄存器的保护,C51会自动增加入栈和出栈对这些寄存器进行保护。

八、C51的运算符和表达式

[1]赋值运算符:=

[2]算术运算符:+  -  *   /  %

[3]关系运算符:>   <   >=   <=  ==  !=

[4]逻辑运算符:&&  ||  !

[5]位运算符:&   |    ^   ~   <<   >>

[6]复合运算符:+=  >>=  %=  &=等

[7]指针和地址运算符:*   &

九、C51库函数:

[1]本征函数 

注意:调用这些函数时,需包含intrins.h

_crol_(x,n); _cror_(x,n);

_iror_(x,n); _irol_(x,n);

_lrol_(x,n); _lror_(x,n);

_nop_();

_testbit_(bitbar);

_chkfloat_(fltbar);

[2]非本征函数

reg51.h或reg52.h,其中包括了所有SFR的定义。

absacc.h 该文件中定义了几个宏,以确定各存储空间的绝对地址。

string.h 包括复制、比较、移动等函数如:memccpy, memchr, memcmp, memcpy, memmove, memset等。

stdio.h 通过51单片机的串口或用户定义的I/O口读写数据,默认为串口,如需修改,可以修改LIB目录中的getkey.c及putchar.c源文件。

maths.h 各种数学函数如:sqrt、exp等。

十、C51语法结构

[1]单分支结构:if(条件)……else……

[2]多分支结构:

switch(变量)

{

case 值1:……..;

case 值2:………..;

………….

case 值n:…………;

default:…………;

}

[3]for循环:for(起始条件;循环条件;变量递增){ ………}

[4]while循环:while(条件){……}

[5]do while循环:do{……}while(条件);

[6]goto 标号

[7]死循环:while(1);here:goto here;for(;;);

十一、C51应用技巧

[1]灵活选择变量的存储器类型。

由于单片机系统的存储器资源有限,为了提高执行效率,对存储器类型的设定应该根据以下原则:只要条件满足,尽量先使用内部直接寻址存储器(data),其次设定变量为间接寻址存储器(idata),在内部存储器数量不够的情况下,才使用外部存储器,而且在外部存储器,优先选择pdata,最后才是xdata,而且,在内部和外部存储器共同使用的情况下,要合理分配存储器,对经常使用和计算频繁的数据,应该使用内部存储器,其他的则使用外部存储器。

[2]另一个提高代码效率的方法就是减小变量的长度,51单片机是8位的,若使用int型的无疑是空间上的极大浪费。应尽可能选择的char、unsigned char、或bit,它们只占用1B或1位。

[3]再一个提高代码效率的方法是使用无符号类型,原因是51单片机指令不支持符号运算。若使用有符号类型的变量,C51编译器将要增加相应的库函数去处理符号运算。

[4]尽量避免使用浮点变量。浮点数占用4个字节,对单片机的存储器资源来说就是极大的浪费。浮点运算应尽量通过提高数值数量级或使用整型运算代替浮点运算。尽量减少乘除法运算,如*2或/2,可以使用移位操作代替,这样不仅可以减少代码量,同时还能大大提高程序执行效率。

[5]尽量使用库函数。C51的库函数提供的许多调令,尤其是本征函数,直接对应着汇编指令,编译效率较高。

[6]使用宏替换。宏替换可以使程序具有更好的可读性,且当需要修改宏时,只要修改宏定义处即可。

[7]灵活设置变量,高效利用存储器。

对于标志位要使用bit或sbit定义,而不要使用unsigned char。这样可以大量节省内存,编写C51程序时,不是特别必要的地方一般不要使用全局变量,尽量使用局部变量。

关键字:单片机  C语言基础 引用地址:8051单片机C语言基础

上一篇:基于SD2300的定时采集存储系统设计
下一篇:基于AT89S52的24C02使用

推荐阅读最新更新时间:2024-03-16 15:17

单片机并行I/O接口的扩展
在单片机系统中主要有两类数据传送操作,一类是单片机和存储器之间的数据读写操作;另一类则是单片机和其它设备之间的数据输入/输出(I/O)操作。单片机和存储器之间的连接十分简单,主要包括地址线、数据线、读写选通信号。 单片机与控制对象或外部设备之间的数据传送却十分复杂,存在速度不匹配,电平不一致,信号需要转换等问题。使用扩展的I/O接口电路可以较好实现速度协调、输出数据锁存、输入数据缓冲、数据转换等。 一、简单I/O口的扩展 由于单片机的P0口经常用作数据线或低8位地址线;P2口用作高8位地址线,P3口的第2功能更为重要,所以只有P1口能用作真正的数据I/O口来使用,但是,在很多场合,仅使用P1口来作为数据I/O口是不够的,这
[单片机]
<font color='red'>单片机</font>并行I/O接口的扩展
串行口通信 上位机发送字符x,单片机返回上位机"I get x"
一.程序功能 在上位机上用串口调试助手发送一个字符X, 单片机收到字符后返回给上位机 I get X ,串口波特率设为9600bps. 二.程序源码 1) 法1 (头文件法, 适用于老手) #include reg52.h #define uchar unsigned char #define uint unsigned int uchar flag, a, i; uchar code table = I get ; //定义一个字符类型编码数组 void init(); void main() { init(); //初始化 while (1) {
[单片机]
嵌入式单片机中设计硬件系统必须要遵守的基本性原则
  单片机应用系统的硬件电路设计包含两部分内容:一是系统扩展,即单片机内部的功能单元,如ROM、RAM、I/O、定时器/计数器、中断系统等不能满足应用系统的要求时,必须在片外进行扩展,选择适当的芯片,设计相应的电路。二是系统的配置,即按照系统功能要求配置外围设备,如键盘、显示器、打印机、A/D、D/A转换器等,要设计合适的接口电路。   系统的扩展和配置应遵循以下原则:   1、尽可能选择典型电路,并符合单片机常规用法。为硬件系统的标准化、模块化打下良好的基础。   2、系统扩展与外围设备的配置水平应充分满足应用系统的功能要求,并留有适当余地,以便进行二次开发。   3、硬件结构应结合应用软件方案一并考虑。硬件结构与软件方案会产生
[单片机]
基于单片机P0口的片外数据存储器扩展
  随着单片机运算速度和处理能力的不断提高,其在各个领域得到更广泛的应用。然而。随着其应用领域的不断扩大及集成化的不断提高,其内部资源已不能满足实际需求,往往需要对其内部资源进行扩展。经典的扩展方法主要是通过地址总线、数据总线即P0、P2口,以及控制线ALE、*****等来进行数据或程序存储器的扩展,最大寻址空间可达64KB,但这种方法占用端口较多,在有些情况下不能满足需求。这里以MCS-8051系列单片机为例,介绍一种新的片外数据存储器扩展方法,仅用单片机的P0口、P1.6及P1.7共10个端口便可实现256 KB数据存储器的扩展。   1 总体设计思路   MCS-8051单片机片内部存储空间为256 B,有P0、P1、P
[单片机]
51单片机控制的数字温度计
总览部分 MCU部分 显示部分 开仿真以后实时显示温度 因为这个程序比较简单,我就直接上代码了,有不明白的请看我以前的文章,谢谢哦! 参考代码如下: #include “reg51.h” char disp ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; char disp_dot ={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xc0}; sbit DQ = P1^3; //定义通信端口 //晶振12MHz void delay_18B20(unsigned int i) {
[单片机]
51<font color='red'>单片机</font>控制的数字温度计
32位MCU浪潮能否带动中国企业崛起?
  据IC Insights市场研究报告显示,2015年全球MCU市场规模达到168亿美元,较去年增长5.6%,出货量255亿颗比去年提升12.4%,预计2016年全球MCU市场出货量将突破300亿颗大关。对于32位MCU市场而言,2015年是具有重大标志性意义的一年,全球32位MCU出货量超过4/8位MCU与16位MCU出货量的总和,而且未来几年应该会保持30%左右的高速增长。   全球MCU市场规模和出货量   全球32位MCU市场占比情况   另一方面,物联网等新兴市场创造了庞大的MCU需求,例如:无人机、智能家电、穿戴式设备、高级电机驱动等硬件产品,都需要大量的MCU芯片来支撑。与此同时,随着
[单片机]
32位<font color='red'>MCU</font>浪潮能否带动中国企业崛起?
MCS-51系列单片机并行P1口的操作方法
  P1口的字节地址为90H,位地址为90H~97H。 对P1 口的操作,可以采用字节操作,也可以采用位操作。复位以后,口锁存器为1 。      例:在下图中,P1.0~P1.3作为输出线,接指示灯L0~L3。P1.4~P1.7作为输入线接四个开关K0~K3。       例1 的子程序采用字节操作指令将开关状态送指示灯显示,Ki闭合,Li亮。   例1KLA:MOVA,P1      SWAPA      ORLA,#0F0H ;保持P1.4~P1.7口锁存器为1      MOVP1,A      RET      例2用位操作指令实现同样的功能。      例2 KLB:MOVC,P1.4 ;位传送不影响P1.4~P1.
[单片机]
一种基于单片机和SG3525的程控开关电源设计与实现
引言 直流稳压电源是一种常见的电子仪器,其广泛应用于实验教学和科学研究等领域。目前使用的直流稳压电源大部分存在诸多缺点,如输出不可调、电压不稳定等等,因而导致实验结果不精确。以SG3525控制芯片和单片机为核心设计制造的智能稳压开关电源,电路简单,价格低廉,性能卓越。因其利用单片机设置周密的保护监测系统,确保了电源运行可靠,所以具有较高的使用价值。 1、调节原理及控制方案 图1 3525传统控制框图 采用SG3525控制的开关电源传统控制方案如图1所示。3525通过检测输出电压,与给定基准电压进行比较,从而自身调节输出的脉冲波形占空比,控制主电路开关管的关断以达到稳定输出的目的。3525传统的控制方式突出的缺点在于基准电压是恒
[单片机]
一种基于<font color='red'>单片机</font>和SG3525的程控开关电源设计与实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved