第3章_C51语言编程基础

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第3章C51语言编程基础1)机器语言定义:处理器能直接执行的二进制代码特点:效率高、但不易于使用10110110000000001011010100000000ADDA,#193.1编程语言KeilC51简介1、编程语言2)汇编语言定义:以助记符的形式表示机器语言特点:速度快、体积小、但依赖于硬件体系3)高级语言独立于机器、面向过程的、接近于人的自然语言。语言:FORTRAN、C语言特点:与硬件无关、易于交流和使用、运行效率低X=X+1;编译器链接器X=X+1;…………程序员1001001010110010……高级语言程序机器码单片机如何执行程序指令?KeilC51语言是在标准C的基础上,针对51单片机的硬件特点进行扩展,并向51单片机上移植的高效、简洁的实用高级语言。与汇编语言相比的特点:(1)可读性好。(2)可模块化开发。(3)可移植性好。(4)生成的代码效率较低。2、KeilC51语言简介对于51单片机,目前广泛使用的是KeilC51语言,简称C51语言。3、C51与标准C的区别(1)库函数的不同。例如库函数printf和scanf,在标准C中,这两个函数通常用于屏幕打印和接收字符,而在KeilC51中,主要用于串行口数据的收发。(3)C51的变量存储模式与标准C中的变量存储模式不一样。标准C是在通用计算机中只有一个程序和数据统一寻址的内存空间。51单片机存储区可分为内部数据存储区、外部数据存储区以及程序存储区。(4)标准C语言没有处理单片机中断的方法。C51中有专门处理中断的中断函数。(2)数据类型有一定的区别。在标准C的基础上又扩展了4种类型。(5)头文件的不同。51头文件把单片机内部的硬件资源如定时器、中断、I/O等所相应的功能寄存器写入头文件内。(6)程序结构的差异。由于51单片机硬件资源有限,编译系统不允许太多的程序嵌套。其次,C51语言不支持标准C的递归特性。4、KeilC51的开发工具———KeilμVision3KeilμVision3是德国Keilsoftware公司开发的C51语言开发软件。这个软件集成了文件编辑处理、编译链接等功能。3.2C51语言程序设计基础1、数据类型与存储类型1)数据类型2)C51扩展的数据类型(4种扩展的数据类型)(1)位变量bitbit的值可以是1(true),或0(false)。bit变量名;格式:例如:bitflag;flag=0;(2)特殊功能寄存器sfr地址单元80H——FFH之间的片内数据存储区;“sfr”数据类型占用一个内存单元;利用它可以访问51单片机内部的所有特殊功能寄存器。sfrP1=0x90;//定义了P1为片内的P1口寄存器;P1=0xff;//把P1口的所有输出引脚设置为高电平。例如:sfr寄存器变量名=字节地址常数;格式:sfrSBUF=0x99;习题:往串行发送数据缓冲寄存器SBUF写入80SBUF=80;习题:从P0口寄存器读取数据,存放到任意一个变量X。sfrP0=0x80;intx;x=P0;例如:(3)特殊功能寄存器sfr16“sfr16”数据类型占两个内存单元;用于操作占两个字节的特殊功能寄存器。sfr16DPTR=0x82;//定义了片内16位数据指针寄存器DPTR,//低8位字节地址为82H,//高8位字节地址为83H。DPTR=0x1234;sfr16寄存器变量名=字节地址常数;格式:字节地址为82H、83H存放的数据分别是多少?(4)特殊功能位sbit片内特殊功能寄存器的可寻址位。“^”前是特殊功能寄存器的名字;“^”的后面数字是特殊功能寄存器可寻址位在寄存器中的位置,取值必须是0-7。①sbit位变量名=特殊功能寄存器^位位置;格式:sfrPSW=0xd0;//定义PSW寄存器地址为0xd0sbitFO=PSW^5;//定义F0位为PSW.5F0=0;例如:习题:片内I/O口P1口的P1.0寻址位置成高电平sfrP1=0x90;sbitP1_0=P1^0;P1_0=1;习题:从P2口的P2.7读取数据,存放到任意一个位变量X。sfrP2=0xA0;sbitP2_7=P2^7;bitx;x=P2_7;②sbit位变量名=位地址常数;sbitCY=0xD7;/*CY位地址为0xD7*/sbitOV=0xD2;/*OV位地址为0xD2*/if(CY==1){…}例如:格式:习题:片内I/O口P1口的P1.0寻址位置成低电平sbitP1_0=0x90;P1_0=0;在头文件AT89X51.h中定义了常用的特殊功能寄存器和可寻址位。#includeAT89X51.hsfrP1=0x90;sbitP1_0=0x90;两者区别?63)数据存储类型数据存储类型是指数据存放在51单片机的哪一个存储器空间。bdatadataidatapdataxdatacode(1)DATA区。DATA区指片内RAM的低128字节的空间,可直接寻址;寻址是最快的,应该把经常使用的变量放在DATA区。unsignedchardatasystem_status=0;unsignedintdataunit_id[8];例如:格式:数据类型【存储类型】变量名;(2)BDATA区。BDATA区是内部RAM可位寻址的16字节存储区(字节地址为20H~2FH)中的128个位。在这个区中声明变量就可进行位寻址。例如:unsignedcharbdatastatus_byte;unsignedintbdatastatus_word;sbitstat_flag=status_byte^4;if(status_word^15){stat_flag=1;}(3)IDATA区。IDATA区是片内RAM的0-256字节的存储区,只能间接寻址,速度比直接寻址慢。unsignedcharidatasystem_status=0;floatidatavalue;例如:(4)PDATA区和XDATA区。PDATA区和XDATA区位于片外存储区;PDATA区指的是外部数据存储区0—256字节。XDATA区指的是外部数据区64KB内的任何地址。unsignedcharxdatasystem_status=0;unsignedintpdataunit_id[8];例如:(5)程序存储区CODE。CODE区是程序存储区,储存的数据是不可改变的。unsignedcharcodea[9]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};例如:4)数据存储器模式C51编译器设定的存储器模式:SMALL、COMPACT和LARGE三种模式。若声明charvar1;在SMALL模式下,var1被定位在data存储区;在COMPACT模式下,var1被定位在idata存储区;在LARGE模式下,var1被定位在xdata存储区中。2、C51语言的绝对地址访问C51语言提供了两种比较常用的访问绝对地址的方法,对片内RAM、片外RAM及I/O进行访问。绝对地址1)绝对宏C51编译器提供了一组宏定义对code、data、pdata和xdata空间进行绝对寻址。这组宏定义放在absacc.h头文件中:CBYTE以字节形式对code区寻址;CWORD以字形式对code区寻址;DBYTE以字节形式对data区寻址;DWORD以字形式对data区寻址;XBYTE以字节形式对xdata区寻址;XWORD以字形式对xdata区寻址;PBYTE以字节形式对pdata区寻址;PWORD以字形式对pdata区寻址。#define变量名绝对宏[字节地址]格式绝对宏【例】片内RAM、片外RAM定义的程序如下:#includeabsacc.h#definePORTEXBYTE[0xFFC0]/*将PORTE定义为外部I/O,地址为0xFFC0*/#defineNRAMDBYTE[0x40]/*将NRAM定义为片内RAM,地址为0x40*/main(){PORTE=0x3D;NRAM=0x01;}/*数据3DH写入地址0xFFC0的外部I/OPORTE*//*将数据01H写入片内RAM的40H单元*/习题使用绝对宏将片内RAM20H的字节地址单元全部置1。#includeabsacc.h#defineMDBYTE[0x0020]/*将M定义为外部RAM,地址为0x0020*/main(){M=0xff;}习题:使用绝对宏读取片外RAMF000H字节地址单元的内容。#includeabsacc.h#defineWRAMXBYTE[0xF000]main(){charx;x=WRAM;}72)_at_关键字使用关键字_at_可对指定的存储器空间的绝对地址进行访问。格式:[存储类型]数据类型变量名_at_地址常数;地址常数:指定变量的绝对地址,位于存储器空间之内;使用_at_定义的变量必须为全局变量。【例】使用关键字_at_实现绝对地址的访问。dataunsignedchary1_at_0x50;/*在data区定义字节变量y1,地址为50H*/xdataunsignedinty2_at_0x4000;/*在xdata区定义字变量y2,地址为4000H*/voidmain(void){y1=0xff;y2=0x1234;……while(1);}习题:使用关键字_at_读取片内RAM60H单元的内容。dataunsignedcharM_at_0x60;voidmain(void){unsignedchary;y=M;}【例】使用关键字_at_将片外RAM2000H开始的连续20个字节单元清0。voidmain(void){unsignedchari;for(i=0;i20;i++){buffer[i]=0;}}xdataunsignedcharbuffer[20]_at_0x2000;dataunsignedcharbuffer[8]_at_0x40;voidmain(void){unsignedcharj;for(j=0;j8;j++){buffer[j]=0;}}习题:使用关键字_at_把片内RAM40H单元开始的8个单元内容清0。8C51语言的基本运算与标准C类似,主要包括算术运算、关系运算、逻辑运算、位运算和赋值运算及其表达式等。1)算术运算符3、C51的基本运算2)关系运算符关系表达式intx=3;inty=6;intR;R=xy;3)逻辑运算符逻辑表达式intx=0;inty=1;intR;R=x&&y;4)位运算符01001000&1111111100001000201001001|1111111101001000&0011011101000000|11111111000010003习题:【例】以字节操作方式对I/O口P1的P1.5清0,P1.1置为1,其他位保持不变。XX0XXX1XP1.5P1.1sfrP1=0x90;P1=(P1&0xDF)│0x02;P1.0sfrP2=0xA0;P2=P2|0x10;习题:以字节操作方式,把P2口的P2.4位置成1,其它位保持不变。sfrP0=0x80;charflag;flag=P0&0x40;习题:以字节操作方式,读取P0口的P0.6位是否为1?4、C51的分支与循环程序结构程序结构分为三类:顺序结构、分支结构、循环结构。1)分支结构控制语句格式二分支if语句if(表达式){语句;}if(xy){max=x;}比较变量x和变量y,如果xy,则把x赋给变量max。习题:比较变量x和变量y,如果x和y相等,则把0赋给变量max。if(x==y){max=0;}格式:if(表达式){语句1;}else{语句2;}if(xy){max=x;}else{max=y;}比较变量x和变量y,如果xy,则把x赋给变量max;否则把y赋给变量max。习题:比较变量x和变量y,把二者最小值赋给变量min;if(xy){min=y;}else{min=x;}习题:如果变量x满足关系10x20,则把变量y置成1;否则

1 / 77
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功