《单片机原理与应用》-胡辉-电子教案 第11章

上传人:E**** 文档编号:89409399 上传时间:2019-05-24 格式:PPT 页数:65 大小:227KB
返回 下载 相关 举报
《单片机原理与应用》-胡辉-电子教案 第11章_第1页
第1页 / 共65页
《单片机原理与应用》-胡辉-电子教案 第11章_第2页
第2页 / 共65页
《单片机原理与应用》-胡辉-电子教案 第11章_第3页
第3页 / 共65页
《单片机原理与应用》-胡辉-电子教案 第11章_第4页
第4页 / 共65页
《单片机原理与应用》-胡辉-电子教案 第11章_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《《单片机原理与应用》-胡辉-电子教案 第11章》由会员分享,可在线阅读,更多相关《《单片机原理与应用》-胡辉-电子教案 第11章(65页珍藏版)》请在金锄头文库上搜索。

1、第11章 单片机 C51程序设计,C51语言概述,在学会使用汇编语言后,学习C语言编程是一件比较容易的事。下面是一个简单的例子: 89S52的P1引脚上接8个发光二极管,我们的任务是让接在P1引脚上的发光二极管按要求发光。,111 简单的C程序介绍,例1-1: 让接在P1.0引脚上的LED发光。 /*/ 单灯闪烁程序 /*/ #include “reg51.h” sbit P1_0=P10; void main( ) P1_1=0; ,这个C语言程序包含了哪些信息,1.“文件包含”处理 所谓“文件包含”是指一个文件将另外一个文件的内容全部包含进来,所以这里的程序虽然只有4行,但C编译器在处理的

2、时候却要处理几十或几百行。这里程序中包含REG51.h文件的目的是为了要使用P1这个符号,即通知C编译器,程序中所写的P1是指80C51单片机的P1端口而不是其它变量。,reg51.h 文件包含以下内容:,/*-REG51.H Header file for generic 80C51 and 80C31 microcontroller. Copyright (c) 1988-2001 Keil Elektronik GmbH and Keil Software, Inc. All rights reserved. - - -*/ /* BYTE Register */ sfr P0 = 0x

3、80; sfr P1 = 0x90; sfr P2 = 0xA0; sfr P3 = 0xB0; sfr PSW = 0xD0; sfr ACC = 0xE0;,sfr B = 0xF0; sfr SP = 0x81; sfr DPL = 0x82; sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B; sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8; sfr IP = 0xB8;,sfr SCON = 0x

4、98; sfr SBUF = 0x99; /* BIT Register */ /* PSW */ sbit CY = 0xD7; sbit AC = 0xD6; sbit F0 = 0xD5; sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0;,/* TCON */ sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT

5、0 = 0x88;,/* IE */ sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8;,/* IP */ sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8;,/* P3 */ sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5; sbit T0 = 0xB4; sbit INT1 = 0xB

6、3; sbit INT0 = 0xB2; sbit TXD = 0xB1; sbit RXD = 0xB0;,/* SCON */ sbit SM0 = 0x9F; sbit SM1 = 0x9E; sbit SM2 = 0x9D; sbit REN = 0x9C; sbit TB8 = 0x9B; sbit RB8 = 0x9A; sbit TI = 0x99; sbit RI = 0x98;,注意:,sfr P1 = 0x90; 这样的一行(上文中用黑体表示),即定义P1与地址0x90对应,P1口的地址就是0x90(0x90是C语言中十六进制数的写法,相当于汇编语言中写90H)。 sfr是

7、标准C语言的关键字,而是Keil为能直接访问80C51中的SFR而提供了一个新的关键词,其用法是: sfrt 变量名=地址值。,2.符号P1_0来表示P1.0引脚,在C语言里,如果直接写P1.0,C编译器并不能识别,而且P1.0也不是一个合法的C语言变量名,所以得给它另起一个名字,这里起的名为P1_0,可是P1_0是不是就是P1.0呢?你这么认为,C编译器可不这么认为,所以必须给它们建立联系,,这里使用了Keil C的关键字sbit来定义,sbit的用法有三种: 第一种方法:sbit 位变量名地址值 第二种方法:sbit 位变量名SFR名称变量位地址值 第三种方法:sbit 位变量名SFR地址

8、值变量位地址值,如定义PSW中的OV可以用以下三种方法:,sbit OV=0xd2 (1)说明:0xd2是OV的位地址值 sbit OV=PSW2 (2)说明:其中PSW必须先用sfr定义好 sbit OV=0xD02 (3)说明:0xD0就是PSW的地址值 因此这里用sfr P1_0=P10;就是定义用符号P1_0来表示P1.0引脚,如果你愿意也可以起P10一类的名字,只要下面程序中也随之更改就行了。,3.main称为“主函数”。,每一个C语言程序有且只有一个主函数,函数后面一定有一对大括号“ ”,在大括号里面书写其它程序。 从上面的分析我们了解了部分C语言的特性,下面再看一个稍复杂一点的例

9、子。 例1-2 让接在P1.0引脚上的LED闪烁发光,/* 单灯闪烁程序 */ #include “reg51.h“ #define uchar unsigned char #define uint unsigned int sbit P10=P10; /*延时程序由Delay参数确定延迟时间*/ void mDelay(unsigned int Delay) unsigned int i; for(;Delay0;Delay-) for(i=0;i124;i+) ; ,void main() for(;) P10=!P10; /取反P1.0引脚 mDelay(1000); 程序分析:程序第二

10、行是“P1_0=!P1_0;”,在P1_0前有一个符号“!”,符号“!”是C语言的一个运算符,就像数学中的“+”、“-”一样,是一种运算任号,意义是“取反”,即将该符号后面的那个变量的值取反。,注意:,取反运算只是对变量的值而言的,并不会自动改变变量本身。可以认为C编译器在处理“!P1_0”时,将P1_0的值给了一个临时变量,然后对这个临时变量取反,而不是直接对P1_0取反,団此取反完毕后还要使用赋值符号(“”)将取反后的值再赋给P1_0,这样,如果原来P1.0是低电平(LED亮),那么取反后,P1.0就是高电平(LED灭),反之,如果P1.0是高电平,取反后,P1.0就是低电平,这条指令被反

11、复地执行,接在P1.0上灯就会不断“亮”、“灭”。,for(;),这行程序连同其后的一对大括号“”构成了一个无限循环语句,该大括号内的语句会被反复执行。 第三行程序是:“mDelay(1000);”,这行程序的用途是延时1s时间。 这里mDelay(1000)并不是由Keil C提供的库函数。在下面的程序中有void mDelay() 一段,如果你的程序中没有这么一段程序行,那就不能使用mDelay(1000)了。 mDelay后面有一个小括号,小括号里有数据(1000),这个1000被称之“参数”,用它可以在一定范围内调整延时时间的长短,这里用1000来要求延时时间为1000毫秒。,C语言的

12、一些特点,1、C程序是由函数构成的,一个C源程序至少包括一个函数,一个C源程序有且只有一个名为main()的函数,也可能包含其它函数,因此,函数是C程序的基本单位。主程序通过直接书写语句和调用其它函数来实现有关功能,这些其它函数可以是由C语言本身提供给我们的,这样的函数称之为库函数,也可以是用户自己编写的,这样的函数称之为用户自定义函数。那么库函数和用户自定义函数有什么区别呢?简单地说,任何使用Keil C语言的人,都可以直接调用C的库函数而不需要为这个函数写任何代码,只需要包含具有该函数说明的相应的头文件即可;而自定义函数则是完全个性化的,是用户根据自己需要而编写的。Keil C提供了100

13、多个库函数供我们直接使用。,2、一个函数由两部份组成:,(1)函数的首部、即函数的第一行。包括函数名、函数类型、函数属性、函数参数(形参)名、参数类型。 例如:void mDelay (unsigned int DelayTime) 一个函数名后面必须跟一对圆括号,即便没有任何参数也是如此。 (2)函数体,即函数首部下面的大括号“”内的部份。如果一个函数内有多个大括号,则最外层的一对“”为函数体的范围。 函数体一般包括: 声明部份:在这部份中定义所用到的变量, 执行部份:由若干个语句组成。,C51的一般格式如下: 类型 函数名(参数表) 参数说明; 数据说明部分; 执行语句部分; ,在某此情况

14、下也可以没有声明部份,甚至即没有声明部份,也没有执行部份,如: void mDelay() 这是一个空函数,什么也不干,但它是合法的。 通过上述的几个例子,可以得出一些结论: 在编写程序时,可以利用空函数,比如主程序需要调用一个延时函数,可具体延时多少,怎么个延时法,暂时还不清楚,我们可以主程序的框架结构弄清,先编译通过,把架子搭起来再说,至于里面的细节,可以在以后慢慢地填,这时利用空函数,先写这么一个函数,这样在主程序中就可以调用它了。,3、一个C语言程序,总是从main函数开始执行的,而不管物理位置上这个main( )放在什么地方。 4、主程序中的mDelay如果写成mdelay就会编译出

15、错,即C语言区分大小写,这一点往往让初学者非常困惑,尤其是学过一门其它语言的人,有人喜欢,有人不喜欢,但不管怎样,你得遵守这一规定。 5、C语言书写的格式自由,可以在一行写多个语句,也可以把一个语句写在多行。没有行号(但可以有标号),书写的缩进没有要求。但是建议读者自己按一定的规范来写,可以给自己带来方便。,6、每个语句和资料定义的最后必须有一个分号,分号是C语句的必要组成部份。 7、可以用/*/的形式为C程序的任何一部份作注释。 Keil C也支持C+风格的注释,就是用“/”引导的后面的语句是注释, 例:P1_0=!P1_0; /取反P1.0 这种风格的注释,只对本行有效,所以不会出现上面的问题,而且书写比较方便,所以在只需要一行注释的时候,我们往往采用这种格式。但要注意,只有Keil C支持这种格式,早期的Franklin C以及PC机上用的TC都不支持这种格式的注释,用上这种注释,编译时通不过,会报告编译错误。,11.2 C51的数据结构,C51的常量与变量,其值不能改变的量称为常量。常量可以有不同的数据类型。如0,1,2,-3为整型常量;4.6,-1.

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

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号