C51语言知识学习编程基本.ppt

上传人:小** 文档编号:3693033 上传时间:2020-10-16 格式:PPT 页数:77 大小:552.52KB
返回 下载 相关 举报
C51语言知识学习编程基本.ppt_第1页
第1页 / 共77页
C51语言知识学习编程基本.ppt_第2页
第2页 / 共77页
点击查看更多>>
资源描述

《C51语言知识学习编程基本.ppt》由会员分享,可在线阅读,更多相关《C51语言知识学习编程基本.ppt(77页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第3章 C51语言编程基础,1)机器语言 定义:处理器能直接执行的二进制代码 特点:效率高、但不易于使用,10110110 00000000 10110101 00000000,ADD A,#19,3.1 编程语言Keil C51简介,1、编程语言,2)汇编语言 定义:以助记符的形式表示机器语言 特点:速度快、体积小、但依赖于硬件体系,3)高级语言 独立于机器、面向过程的、接近于人的自然语言。 语言:FORTRAN、C语言 特点:与硬件无关、易于交流和使用、运行效率低,X = X + 1;,编译器 链接器,X = X + 1; ,程序员,10010010 10110010 ,高级语言程序,机器

2、码,单片机如何执行程序指令?,Keil C51语言是在标准C的基础上,针对51单片机的硬件特点进行扩展,并向51单片机上移植的高效、简洁的实用高级语言。,与汇编语言相比的特点: (1)可读性好。 (2)可模块化开发。 (3)可移植性好。 (4)生成的代码效率较低。,2、Keil C51语言简介,对于51单片机,目前广泛使用的是Keil C51语言,简称C51语言。,3、C51与标准C的区别,(1)库函数的不同。例如库函数printf和scanf,在标准C中,这两个函数通常用于屏幕打印和接收字符,而在Keil C51中,主要用于串行口数据的收发。,(3)C51的变量存储模式与标准C中的变量存储模

3、式不一样。 标准C是在通用计算机中只有一个程序和数据统一寻址的内存空间。 51单片机存储区可分为内部数据存储区、外部数据存储区以及程序 存储区。,(4)标准C语言没有处理单片机中断的方法。 C51中有专门处理中断的中断函数。,(2)数据类型有一定的区别。在标准C的基础上又扩展了4种类型。,(5)头文件的不同。 51头文件把单片机内部的硬件资源如定时器、中断、I/O等所相应的功能寄存器写入头文件内。 (6)程序结构的差异。 由于51单片机硬件资源有限,编译系统不允许太多的程序嵌套。其次,C51语言不支持标准C的递归特性。,4、Keil C51的开发工具Keil Vision3,Keil Visi

4、on3是德国Keil software公司开发的C51语言开发软件。 这个软件集成了文件编辑处理、编译链接等功能。,3.2 C51语言程序设计基础,1、数据类型与存储类型,1)数据类型,2)C51扩展的数据类型(4种扩展的数据类型),(1)位变量bit bit的值可以是1(true),或0(false)。,bit 变量名;,格式:,例如:,bit flag; flag = 0;,(2)特殊功能寄存器sfr 地址单元80HFFH之间的片内数据存储区; “sfr” 数据类型占用一个内存单元; 利用它可以访问51单片机内部的所有特殊功能寄存器。,sfr P1 = 0 x90; /定义了P1为片内的P

5、1口寄存器; P1 = 0 xff; /把P1口的所有输出引脚设置为高电平。,例如:,sfr 寄存器变量名 = 字节地址常数;,格式:,sfr SBUF = 0 x99;,习题: 往串行发送数据缓冲寄存器SBUF写入80,SBUF = 80;,习题: 从P0口寄存器读取数据,存放到任意一个变量X。,sfr P0 = 0 x80; int x;,x = P0;,例如:,(3)特殊功能寄存器sfr16 “sfr16”数据类型占两个内存单元; 用于操作占两个字节的特殊功能寄存器。,sfr16 DPTR = 0 x82;/定义了片内16位数据指针寄存器DPTR, /低8位字节地址为82H, /高8位字

6、节地址为83H。 DPTR=0 x1234;,sfr16 寄存器变量名 = 字节地址常数;,格式:,字节地址为82H、83H存放的数据分别是多少?,(4)特殊功能位 sbit 片内特殊功能寄存器的可寻址位。,“”前是特殊功能寄存器的名字; “”的后面数字是特殊功能寄存器可寻址位在寄存器中的位置,取值必须是0-7。, sbit 位变量名 = 特殊功能寄存器 位位置;,格式:,sfr PSW = 0 xd0; /定义PSW寄存器地址为0 xd0 sbit FO = PSW 5 ;/定义F0位为PSW.5 F0 = 0;,例如:,习题:片内I/O口P1口的P1.0寻址位置成高电平,sfr P1 =

7、0 x90; sbit P1_0 = P10; P1_0 = 1;,习题: 从P2口的P2.7读取数据,存放到任意一个位变量X。,sfr P2 = 0 xA0; sbit P2_7 = P27; bit x; x = P2_7;,sbit 位变量名 = 位地址常数;,sbit CY = 0 xD7; /* CY位地址为0 xD7*/ sbit OV = 0 xD2; /* OV位地址为0 xD2*/ if(CY = = 1) ,例如:,格式:,习题:片内I/O口P1口的P1.0寻址位置成低电平,sbit P1_0 = 0 x90; P1_0 = 0;,在头文件AT89X51.h中定义了常用的特

8、殊功能寄存器和可寻址位。 #include ,sfr P1 = 0 x90; sbit P1_0 = 0 x90; 两者区别?,6,3)数据存储类型,数据存储类型是指数据存放在51单片机的哪一个存储器空间。,bdata,data,idata,pdata,xdata,code,(1)DATA区。 DATA区指片内RAM的低128字节的空间,可直接寻址; 寻址是最快的,应该把经常使用的变量放在DATA区。,unsigned char data system_status=0; unsigned int data unit_id8;,例如:,格式: 数据类型【存储类型】变量名;,(2)BDATA区。

9、 BDATA区是内部RAM可位寻址的16字节存储区(字节地址为20H 2FH)中的128个位。 在这个区中声明变量就可进行位寻址。,例如:,unsigned char bdata status_byte; unsigned int bdata status_word; sbit stat_flag= status_byte4; if( status_word15 ) stat_flag=1; ,(3)IDATA区。 IDATA区是片内RAM的0-256字节的存储区,只能间接寻址, 速度比直接寻址慢。,unsigned char idata system_status=0; float idat

10、a value;,例如:,(4)PDATA区和XDATA区。 PDATA区和XDATA区位于片外存储区; PDATA区指的是外部数据存储区0256字节。 XDATA区指的是外部数据区64KB内的任何地址。,unsigned char xdata system_status=0; unsigned int pdata unit_id8;,例如:,(5)程序存储区CODE。 CODE区是程序存储区,储存的数据是不可改变的。,unsigned char code a9 =0 x00,0 x01,0 x02,0 x03,0 x04,0 x05,0 x06,0 x07,0 x08;,例如:,4)数据存储

11、器模式 C51编译器设定的存储器模式: SMALL、COMPACT和LARGE三种模式。,若声明 char var1; 在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 以字节形

12、式对code区寻址; CWORD 以字形式对code区寻址; DBYTE 以字节形式对data区寻址; DWORD 以字形式对data区寻址; XBYTE 以字节形式对xdata区寻址; XWORD 以字形式对xdata区寻址; PBYTE 以字节形式对pdata区寻址; PWORD 以字形式对pdata区寻址。,#define 变量名 绝对宏字节地址,格式,绝对宏,【例】片内RAM、片外RAM定义的程序如下: #include #define PORTE XBYTE0 xFFC0 /*将PORTE定义为外部I/O, 地址为0 xFFC0*/ #define NRAM DBYTE0 x40 /

13、*将NRAM定义为片内RAM, 地址为0 x40*/,main( ) PORTE=0 x3D; NRAM=0 x01; ,/*数据3DH写入地址0 xFFC0的外部I/O PORTE */,/*将数据01H写入片内RAM的40H单元*/,习题 使用绝对宏将片内RAM 20H的字节地址单元全部置1。,#include #define M DBYTE0 x0020 /*将M定义为外部RAM, 地址为0 x0020*/,main( ) M=0 xff; ,习题: 使用绝对宏读取片外RAM F000H字节地址单元的内容。,#include #define WRAM XBYTE0 xF000,main(

14、 ) char x; x = WRAM; ,7,2)_at_关键字 使用关键字_at_可对指定的存储器空间的绝对地址进行访问。 格式: 存储类型 数据类型 变量名 _at_ 地址常数;,地址常数:指定变量的绝对地址,位于存储器空间之内; 使用_at_定义的变量必须为全局变量。,【例】使用关键字_at_实现绝对地址的访问。 data unsigned char y1 _at_ 0 x50; /*在data 区定义字节变量 y1,地址为50H*/ xdata unsigned int y2 _at_ 0 x4000; /*在xdata区定义字变量 y2,地址为4000H*/ void main(v

15、oid) y1=0 xff; y2=0 x1234; while(1); ,习题:使用关键字_at_读取片内RAM 60H单元的内容。,data unsigned char M _at_ 0 x60; void main(void) unsigned char y ; y=M; ,【例】 使用关键字_at_将片外RAM 2000H开始的连续20个字节单元清0。,void main(void) unsigned char i; for(i=0; i20; i+) bufferi=0; ,xdata unsigned char buffer20 _at_ 0 x2000;,data unsigne

16、d char buffer8 _at_ 0 x40; void main(void) unsigned char j ; for(j=0; j8; j+) bufferj=0; ,习题:使用关键字_at_把片内RAM 40H单元开始的8个单元内容清0。,8,C51语言的基本运算与标准C类似,主要包括算术运算、关系运算、逻辑运算、位运算和赋值运算及其表达式等。 1)算术运算符,3、C51的基本运算,2)关系运算符,关系表达式,int x=3; int y=6; int R;,R = x y;,3)逻辑运算符,逻辑表达式,int x=0; int y=1; int R;,R = x ,4)位运算符

17、,01001000 ,习题:以字节操作方式,把P2口的P2.4位置成1,其它位保持不变。,sfr P0=0 x80; char flag; flag = P0 ,习题: 以字节操作方式,读取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(表达式

18、) 语句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; 否则把y置成0。,if((x10) ,9,void main( ) sfr P2=0 xA0; sfr P1=0 x90; sbit P24=P24; sbit P10=P10;,习题:如果读取P2口的P2.4位为1,则把P1口的P1.0置成0。,

19、if(P24=1) P10=0; ,if(表达式1) 语句1; else if (表达式2) 语句2; else if(表达式n) 语句n; else 语句n+1;,多分支if语句,当成绩90时, 输出verygood, 当80成绩90时, 输出good, 当60成绩80时, 输出pass, 当成绩60时, 输出fail。,int score; if (score=90) printf(“very good); else if (score=80) printf(“good); else if (score=60) printf(“pass); else printf(“fail);,多分支s

20、witch语句,switch (表达式1) case 常量表达式1:语句1; break; case 常量表达式2:语句2; break; case 常量表达式n:语句n; break; default: 语句n+1; ,格式:,switch,表达式1,语句1,语句2,语句n,语句n+1,式1,式2,式n,default,case,switch ( key ) case 1: y=1; break; case 2: y=2; break; case 3: y=4; break; default: ; ,在单片机程序设计中,常用switch语句作为键盘中按键的判别。 当按下键的键号变量key=1

21、,则变量y=1; 键号变量key=2,则变量y=2; 键号变量key=4,则变量y=3; 没有按下键, 则变量y不变。,key=2; switch ( key ) case 1: y=1; case 2: y=2; case 3: y=4; default: ; ,习题:读程序执行的结果 y =?,2)循环结构控制语句,while(表达式) 循环体; ,格式:,表达式,循环体,假(0),真(非0),先判断表达式,后执行循环体。,while语句,main() int i=0; int r; while(i3) i+ ; y=i; ,i+执行几次?,y =?,r = 3,习题:读程序执行的结果 y

22、 =?,main() int i=3; int r; while(i6) i+ ; y=i; ,y =?,习题:读程序执行的结果 y =?,do 循环体; while(表达式);,格式:,表达式,循环体,假(0),真(非0),;不可省略! 切记!,先执行循环体,后判断表达式。,do-while语句,main() int i=0; int y; do i+; while (i3); y=i; ,i+执行几次?,y =?,习题:读程序执行的结果 y =?,main() int i=0; int y=0; do i+; y= y + i; while (y20); ,习题:读程序执行的结果 y =?

23、,for(表达式1;表达式2;表达式3) 语句; ,格式:,for语句,main() int i, y; y=0; for(i=1;i4;i+) y = y + i; ,y = ?,习题:读程序执行的结果 y =?,main() int i, y; y=1; for( i=2; i6 ; i+ ) y = y + i; ,y = ?,习题:读程序执行的结果 y =?,3)break语句和continue语句,break功能: 跳出switch结构; 在循环语句中,终止并跳出本层循环。,continue功能: 结束本次循环,跳过本层循环体中尚未执行的语句, 执行循环体的判断。,#define P

24、I 3.1415 main( ) int r; float area; for(r=1;r100) break; printf(r=%d,area=%.2fn,r,area); ,计算r=1到r=10的圆面积,直到面积大于100时停止。,运行结果: r=1,area=3.14 r=2,area=12.57 r=3,area=28.27 r=4,area=50.26 r=5,area=78.54,结束整个for循环,把100200之间不能被3整除的数输出 。,main( ) int n; for(n=100;n=200;n+) if(n%3= =0) continue; printf(“%d ,

25、n); ,结束本次循环, 循环体的剩余语句被忽略, 执行表达式3,进入下一循环。,main( ) int n; for(n=100;n=200;n+) if(n%3=0) break; printf(“%d ,n); ,习题:读程序执行的结果?,习题:循环检测P1.0引脚,只有检测P1.0为低电平时,循环结束。,sfr P1=0 x90; sbit P10=P10; main( ) while(1) if(P10=0) break; ,5、数组,数组是用来存储一组相同数据类型的数据结构。,一维数组格式:,数据类型,变量名, N ;,int a 10;,int a5 = 1, 2, 3, 4,

26、5 ;,初始化:,char b 10;,求下列数组的和。,int a5 = 1, 2, 3, 4, 5 ;,main() int a5=1,2,3,4,5; int i,sum; sum=0; for(i=0;i5;i+) sum=sum+ai; ,习题:求数组a5中能被2整除的数的和。,int a5 = 10, 2, 33, 54, 15 ;,main() int a5=1,2,3,4,5; int i,sum; sum=0; for(i=0;i5;i+) if(sumi%2 = = 0) sum=sum+ai; ,二维数组格式:,数据类型,变量名, N M;,int a32;,int a3

27、2= 1, 2, 3, 4, 5, 6 ;,行数,列数,求下列数组的和。,main() int a32=1,2,3,4,5,6; int i,j,sum; sum=0; for(i=0;i3;i+) for(j=0;j2;j+) sum=sum+aij; ,int a32= 1, 2, 3, 4, 5, 6 ;,求下列数组的和。,6、C51语言的中断函数,函数是一个完成某个相关功能的代码段;,C51程序只有一个主函数main(),并且从主函数函数开始运行;,中断服务函数,格式:,函数类型 函数名() interrupt n using n,interrupt n:表示中断号,n的值为0 4;,using n:表示寄存器组号,n的值为0 3;,作业:,6、编程实现,P1口各引脚输出高电平。,7、用两种方法编程实现,P2口的P1.7位置成高电平。,P67 1, 2, 3, 4,8、编程实现,如果读取P0.0位为1,则P1.0输出高电平。,main() int i=0; int y; while(i6) i+ ; y=i; ,9、读程序执行的结果 y =?,main() int i, y; y=0; for(i=2;i5;i+) y = y + i; ,10、读程序执行的结果 y =?,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com