版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2023/10/261第4章80C51单片机C语言程序设计C51对标准C的扩展4.1C51的指针4.2C51的函数4.3C51与汇编程序的接口4.4编译器能自动完成变量的存储单元的分配对常用功能模块和算法编制相应的函数,方便移植采用C51的优点C语言具有良好的可读性、可移植性和基本的硬件操作能力。
对单片机内部资源的操作直接简捷生成的代码紧凑汇编语言的特点2023/10/2634.1C51对标准C的扩展4.1.1C51的数据类型数据是计算机操作的对象,包含常量和变量。C51扩展了ANSIC,以适应单片机的结构和特点。
数据类型就是数据的格式,它决定数据的值域范围、占用存储单元的个数及能参与哪种运算。编写C51程序,先要确定数据类型、存储分区应尽可能采用无符号格式(unsigned)
C51中,多字节数据采用“大端对齐”格式数据起始字节置于高地址端2023/10/264数据类型长度(位)取值范围字符型signedchar8-128~127unsignedchar80~255整型signedint16-32768~32767unsignedint160~65535长整型signedlong32-21474883648~21474883647unsignedlong320~4294967295浮点型float32±1.75494E-38~±3.402823E+38位型bit10,1sbit10,1访问SFRsfr80~255sfr16160~65535C51数据类型表2023/10/265bit定义位变量名字,编译器在位寻址区自动分配该位变量;Sbit声明位变量的名字和地址,地址是确定的(SFR区确定位、位寻址区变量的某确定位)。几点说明:sbitCY=0xD7;bitflag1=0;含义:赋值含义:声明unsigned
charbdataibase;sbitmybitf=ibase^0;2023/10/2664.1.2C51数据的存储分区存储器类型长度(位)对应单片机存储器bdata1片内RAM位寻址区,共128位。(亦能字节访问)data8直接寻址,共128字节。idata8间接寻址,共256字节。pdata8片外
RAM分页间址,共256字节。(MOVX@Ri)xdata16间接寻址,共64k字节。(MOVX@DPTR)code16ROM间接寻址,共64k字节。(MOVCA,@A+DPTR)经常使用的变量应该置于片内RAM中,要用bdata、data、idata来定义不常使用的变量或规模较大的变量应该置于片外RAM中,要用pdata、xdata来定义bitbdataflags;
//位变量flags定位在片内位寻址区chardatavar;
//字符变量var定位在片内RAM区floatidatax,y;
//实型变量x,y定位在片内间址RAM区unsignedcharpdataz;
//无符号字符变量z定位在片外分页间址RAM区2023/10/268编译模式默认存储分区特点SMALLdata小模式。变量默认在片内RAM。空间小,速度块。COMPACTpdata紧凑模式。变量默认在片外RAM的页(256字节,页号由P2口决定)。LARGExdata大模式。变量默认在片外RAM的64KB范围。空间大,速度慢。编译模式默认的变量存储分区4.1.3C51的编译模式未对变量存储分区定义时,C51编译器采用默认存储分区。例如:charvar;
//SMALL模式时,var定位于data存储区
//COMPACT模式时,var定位于pdata存储区
//LARGE模式时,var定位于xdata存储区2023/10/26104.1.4用_at_定义变量绝对地址用关键字“_at_”定义变量存放的首地址idatainty_at_0x30;//idata区域整型变量y的首地址为0x30例如:又如:xdatacharstring[20]_at_0x3000;//xdata中字符型数组string的首地址为0x3000
注意,C51编程时不要轻易使用绝对地址定位变量。2023/10/2611补充1:80C51硬件结构的C51定义特殊功能寄存器的声明sfr
特殊功能寄存器名=地址常数;格式:例如:sfrSCON=0x90;/*串行口控制寄存器地址为90H*/sfrP0=0x80;/*P0口,地址为80H*/2023/10/2612特殊功能寄存器中特定位的声明sbit位变量名=特殊功能寄存器名^位的位置(0~7)例如:
sfrPSW=0xD0;sbitOV=PSW^2;
sbit位变量名=字节地址^位的位置(0~7)例如:
sbitOV=0xD0^2;sbitCY=0xD0^7;sbit位变量名=位地址
例如:
sbitOV=0xD2;sbitCY=0xD7;
注:字节地址做基地址,必须位于80H~FFH之间
,位地址也必须位于80H~FFH2023/10/2613内部RAM中可位寻址对象的定义先定义变量的数据类型和存储类型例如:
intbdataibase;charbdataarray[4];
再利用sbit进行声明
例如:
sbitmybit0=ibase^0;
sbitmybit15=ibase^15;
sbitary07=array[0]^7;注意:不能定义bit类型指针,也不能定义bit类型数组
访问示例:ibase=-1;array[2]=‘a’;ary07=0;
2023/10/2614算术运算符和算术表达式补充2:C51的运算符和表达式基本算术运算符例如:
+加法运算符;
-减法(取负)运算符;*乘法运算符;/除法运算符;%取余数运算符。
如:a+b*(10-a),(x+9)/(y-a)示例:25.0/20.0=1.2525/20=125%20=5
取负运算优先级最高。2023/10/2615自增、自减运算符(仅能用于变量)例如:
++自增运算符;
--自减运算符;++i和i++类型转换运算符自动转换,顺序:bit→char→int→long→float
强制类型转换,如:(double)a
2023/10/2616关系运算符和关系表达式关系运算符
<小于;<=小于等于;>大于;>=大于等于;==等于;!=不等于。关系表达式关系表达式的值为逻辑值:真(1)和假(0)2023/10/2617逻辑运算符和逻辑表达式逻辑运算符
||逻辑或;&&逻辑与;
!逻辑非。逻辑表达式逻辑表达式的值为逻辑值:真(1)和假(0)例:5||0结果为1,2&&0结果为02023/10/2618位运算符对硬件直接进行操作&按位与;|按位或;^按位异或;~按位取反;<<左移;>>右移。例:P1=P1<<1表示对P1口的所有位左移1位temp=P1|0xFF
如:sbitst=P1^0;sbitled=P2^0;if(st==0){led=~led;}2023/10/2619赋值和复合赋值运算符复合赋值运算符+=加法赋值;-=减法赋值;*=乘法赋值;/=除法赋值;%=取模赋值;符号“=”称为赋值运算符
<<=左移位赋值;>>=右移位赋值;&=逻辑与赋值;|=逻辑或赋值;^=逻辑异或赋值;~=逻辑非赋值
例:a*=5相当于a=a*5;b&=0x80相当于b=b&0x80。2023/10/2620补充3:C51流程控制语句3.1C51选择语句
条件语句if(条件表达式)语句
例如:if(p1!=0){c=20;}
if(条件表达式)语句1else语句2例如:if(p1!=0){c=20;}else{c=0;}
2023/10/2621if(条件表达式1)语句1elseif(条件表达式2)语句2elseif(条件表达式3)语句3
…
…elseif(条件表达式n)语句nelse语句n+1
例如:if(a<=1){c=10;}elseif(a<=2){c=20;}
elseif(a<=3){c=30;}elseif(a<=4){c=40;}elsec=0;
2023/10/2622开关语句switch(表达式){case常量表达式1:语句1;break;case常量表达式2:语句2;break;
…
…case常量表达式n:语句n;break;default:语句n+1;}2023/10/26233.2C51循环语句while语句一般形式为:
while(条件表达式)语句;如果条件表达式的结果一开始就为假,则后面的语句一次也不能执行。do-while语句一般形式为:
do语句
while(条件表达式);任何条件下,循环体语句至少会被执行一次。2023/10/2624for语句一般形式为:for([初值表达式];[条件表达式];[更新表达式])语句if语句与goto语句结合
当型循环
形式为:
loop:if(表达式)
{语句
gotoloop;
}2023/10/2625直到型循环
形式为:
loop:{语句
if(表达式)gotoloop;
}continue是一种循环中断语句,它并不跳出循环体;break语句只能跳出它所处的那一层循环;goto语句可以用于跳出多重循环(从内层到外层)。注意:示例:开关控制LED程序:开关控制LED#include<reg52.h>sbitS1=P1^0;sbitS2=P1^1;sbitLED1=P0^0;sbitLED2=P0^1;voidmain(){while(1) { LED1=S1; LED2=S2; }}示例:从左到右的流水灯程序:从左到右的流水灯#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintvoidDelayMS(uintx){uchari; while(x--) {for(i=120;i>0;i--);}}voidmain(){P0=0xFE;while(1) { P0=_crol_(P0,1); DelayMS(150); }}2023/10/26304.2
C51的指针对于一个变量a,利用&a表示变量a的地址。则语句
p=&a;表明把a的地址赋给了指针变量p,则“p指向了变量a”。
可以用*P表示变量a指针变量的定义
char*p;//定义指针变量P
p=30H;//指针变量赋值,30H为片内RAM地址x=*p;//30H单元的内容送给变量x*P指针变量数据变量4.2.1已定义数据存储分区的指针定义时就指定了所指向数据的存储分区。
该指针占1个字节(idata*,data*,pdata*)或2个字节(code*,xdata*)
示例:char
data*str;
//指针str指向的char型数据存于data空间int
xdata*num;
//指针num指向的int型数据存于xdata
空间
基于存储器的指针长度比通用指针短,可以节省存储器空间,运行速度快,但它所指对象具有确定的存储器空间,兼容性不好。数据数据存储分区2023/10/2632定义时未指定所指向的数据的存储分区。也称通用指针。4.2.2未定义数据存储分区的指针---通用指针通用指针占3个字节第一字节存放该指针的默认存储器类型编码(见表)第二字节存放该指针的高位地址偏移量第三字节存放该指针的低位地址偏移量
存储器类型编码存储器类型bdata/data/idataxdatapdatacode编码0x000x010xfe0xff2023/10/2633通用指针定义示例:char*xdatastrptr;
//指针本身存于xdata空间,它指向char型数据int*datanumber;
//指针本身存于data空间,它指向int型数据由于指向对象的存储空间在编译时无法确定(运行时确定),因此必须生成通用代码以保证对任意空间的对象进行存取。所以通用指针生成的代码速度较慢。指针char型数据指针分区2023/10/26344.2.3利用指针进行绝对地址访问unsignedchardata*p;p=0x40;*p=0x55;//数据0x55送入内部RAM的0x40单元
例如:
C51编译器提供了一组宏定义实现对80C51绝对地址的访问。这组宏定义原型放在absacc.h文件中,形如:
#defineDBYTE((unsignedcharvolatiledata*)0)从而使DBYTE用于以字节形式对data区访问,可以写成:*(DBYTE)=0x55H;或
DBYTE[0]=0x55H;
与此类似:CBYTE用于以字节形式对code区进行访问;PBYTE用于以字节形式对pdata区进行访问;XBYTE用于以字节形式对xdata区进行访问。CWORD、DWORD、PWORD和XWORD用于以字形式对code区、data区、pdata区和xdata区进行访问。4.2.4C51程序编写示例【例4-1】将30H至3FH共16个RAM单元初始化为“55H”。#include<reg52.h>#include<absacc.h>voidmain(void){ unsignedchari; for(i=0;i<=15;i++) { DBYTE[0x30+i]=0x55; } while(1);}C:0x0000020011LJMPC:0011C:0x0003E4CLRAC:0x0004FFMOVR7,AC:0x00057430MOVA,#0x30C:0x00072FADDA,R7C:0x0008F8MOVR0,AC:0x00097655MOV@R0,#0x55C:0x000B0FINCR7C:0x000CBF10F6CJNER7,#0x10,C:0005C:0x000F80FESJMPC:000FC:0x0011787FMOVR0,#0x7FC:0x0013E4CLRAC:0x0014F6MOV@R0,AC:0x0015D8FDDJNZR0,C:0014C:0x0017758107MOVSP,#0x07C:0x001A020003LJMPC:0003反汇编如下:编译系统自动连接了startup.a51生成代码一是将内部RAM的00H~7FH清0;二是设置堆栈指针SP。
2023/10/26394.3
C51的函数4.3.1C51函数的定义一般形式:返回值类型函数名(形式参数列表)[编译模式][reentrant][interruptn][usingn]{
函数体}编译模式为SMALL、COMPACT或LARGEreentrant用于定义可重入函数interruptn用于定义中断函数,n为中断号,可以为0~31usingn确定工作寄存器组,取值为0~3
【例4-2】延时nMs函数示例(晶振11.0592MHz)。voidDelayMs(unsignedintn)//延时函数{ unsignedcharj; while(n--) { for(j=0;j<113;j++); }}调试:Registers窗口中的sec值。
4.3.2C51函数定义的选项编译模式
SMALL模式:变量默认在片内RAM;COMPACT模式:变量默认在片外RAM的页内;LARGE模式:变量默认在片外RAM的64KB范围。reentrant定义为重入函数
ANSIC中,函数默认都是可重入的
C51函数默认是不可重入的,使用可重入函数会消耗较多的存储器资源,应该尽量少用。interruptn定义中断函数常用的中断源对应的中断号usingn确定中断服务函数所使用的工作寄存器组中断源外中断0定时器0外中断1定时器1串行口定时器2中断号012345【例4-3】中断函数定义示例#include<reg51.h>sbitP10=P1^0;voidIntSrv(void)interrupt0
{ if(INT0==0) //测开关状态
{ P10=!P10; while(INT0==0); }}示例:INT0中断控制LED程序:INT0中断控制LED#include<reg52.h>sbitLED=P0^0;voidmian(){ LED=1; EA=1; EX0=1; TCON=0x01; while(1);}voidExternal_Interrupt_0()interrupt0{ LED=~LED;}4.3.3C51的库函数常用的C51库函数参见附录B.2
【例4-4】C51库函数调用示例。#include“intrins.h”//在intrins.h中有对函数_nop_()的定义voidDelay(void){inti=5000;while(i--)_nop_();}【例4-5】C51标准输入输出函数调用示例。#include<reg51.h>#include<stdio.h>voidInitSPort(void){SCON=0x50;//串口方式1,允许接收TMOD=0x20;//T1方式2(自动重装)TH1=0xFD;//波特率9600 TR1=1;//启动T1TI=1;//发送中断置1}voidmain(void){InitSPort();
printf("HelloWorld\n");while(1);}标准I/O的重定向!
在调试状态:ViewSerialWindowsUART#14.4
C51与汇编程序的接口4.4.1在C51程序中嵌入汇编指令【例4-6】利用预编译指令。#include"reg51.h"voidInit(void);voidmain(){while(1){Init();}}voidInit(void){
#pragmaasm MOVR7,#16 MOVR1,#20H MOVA,#55HLP:MOV@R1,A INCR1 DJNZR7,LP
#pragmaendasm return;}要进行以下设置:2023/10/2649将嵌有汇编语句的源文件加入工程文件,将鼠标指向该文件,选择右键菜单“optionfor‘insertasm.c’”。将属性properties书签下的“GenerateAssemblerSRCFile”与“AssembleSRCFile”选项置成“√”。再加入库文件(如C51S.LIB),然后编译。
4.4.2在C51程序中调用汇编子
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 快递安检机操作安全规程
- 2026年农业种植技术员实操技能考核试卷及答案
- CRRT局部枸橼酸抗凝突发低钙急救共识
- 湿式除尘器安全操作规程
- PCB开料岗位技能考核试题(含详细答案)
- 职业性哮喘脱离接触后随访规范共识
- 2026年安全环保知识竞赛考试试题(附答案)
- 2026年广播电视播音员主持人资格(广播电视基础知识)自测试题及答案
- 全员安全生产责任清单落地方案
- NSATP网络安全从业人员能力测评模拟试题(含详细答案解析)
- 超星尔雅学习通《动手学AI:人工智能通识与实践(社科版)》2026章节测试及答案
- TCECS 1273-2023 冶炼渣骨料应用技术规程
- 二年级数学应用题题型及解答技巧
- 隧道开挖清包工合同协议
- 摩托三力测试试题及答案
- 第四十课-椭圆及其标准方程省公开课金奖全国赛课一等奖微课获奖课件
- 卡通小学生校园用电安全教育作品
- 中医中药辨识
- 我国牛病流行的现状及对策
- ifix培训教程课件
- 《新课程学习辅导》历史九下 统编版 答案
评论
0/150
提交评论