单片机C语言程序设计.ppt

上传人:sh****n 文档编号:12817187 上传时间:2020-05-26 格式:PPT 页数:82 大小:4.66MB
返回 下载 相关 举报
单片机C语言程序设计.ppt_第1页
第1页 / 共82页
单片机C语言程序设计.ppt_第2页
第2页 / 共82页
单片机C语言程序设计.ppt_第3页
第3页 / 共82页
点击查看更多>>
资源描述
第7章单片机C语言程序设计,教学目标7.1单片机C51语言概述7.2C51语言基本语法7.3C51语言程序设计本章小结思考题与习题,7.1单片机C51语言概述,7.1.1单片机支持的高级语言,7.1.2C51语言特点,7.1.1单片机支持的高级语言,程序设计高级语言,PL/MBASICC51,是能够利用单片机所有特性直接控制硬件的唯一语言,对于一些需要直接控制硬件的场合,汇编语言是必不可少的。但汇编语言不是一种结构化的程序设计语言,对于较复杂的单片机应用系统,它的编写效率很低。,语言适用于简单编程而对编程效率、运行速度要求不高的场合,8052单片机内固化有BASIC语言解释器。是一种结构化的语言,很象PASCAL,PL/M编译器好象汇编器一样产生紧凑的机器代码,可以说是高级汇编语言,但它不支持复杂的算术运算,无丰富库函数支持,学习PL/M无异于学习一种新的语言。是一种通用的程序设计语言,其代码率高,数据类型及运算符丰富,并具有良好的程序结构,适用于各种应用的程序设计,是目前使用最广的单片机编程语言。,汇编语言,BASIC,PL/M,C51语言,单片机的C语言编程称为C51编程,C51语言本身不依赖机器硬件,不要求编程者对硬件深入了解,应用C51编程具有以下优点:,1语言简洁、紧凑,使用方便、灵活。,2运算符、数据结构丰富。,3结构化程序设计。,4可以直接对计算机硬件进行操作。,5生成的目标代码质量高,程序执行效率高。,6可移植性好。,7.1.2C51语言特点,用C语言开发系统可以大大缩短开发周期,明显增强程序的可读性,便于改进和扩充。而针对8051的C51语言日趋成熟,成为了专业化的实用高级语言。,1.对单片机的指令系统不要求了解,仅要求对8051的存贮器结构有初步了解;2.寄存器分配、不同存贮器的寻址及数据类型等细节可由编译器管理;3.程序有规范的结构,可分成不同的函数,这种方式可使程序结构化;4.提供的库包含许多标准子程序,具有较强的数据处理能力;5.由于具有方便的模块化编程技术,使已编好程序可容易地移植;,C-51与ASM-51相比,有如下优点:,7.2C51语言基本语法,7.2.1C51语言的函数及程序结构,7.2.2C51语言的数据类型及存储类型,7.2.3C51语言的运算符,7.2.4C51语言的语句,7.2.6C51语言的指针,7.2.7中断函数、头文件及绝对地址访问,7.2.5C51语言的数组,实战1,实战2,实战3,实战4,实战5,实战6,实战7,C51函数的一般格式类型函数名(参数表)声明语句;执行语句;,同C语言程序一样,C51采用函数结构,每个C51语言程序由一个或多个函数组成。,7.2.1C51语言的函数及程序结构,其中,函数往往由“函数定义”和“函数体”两个部分组成。函数定义部分包括有函数类型、函数名、形式参数说明等,函数名后面必须跟一个圆括号(),形式参数在()内定义。函数体由一对花括号“”组成,在“”的内容就是函数体。如果一个函数内有多个花括号,则最外层的一对“”为函数体的内容。函数体内包含若干语句,一般由两部分组成:声明语句和执行语句。声明语句用于对函数中用到的变量进行定义。也可能对函数体中调用的函数进行声明。执行语句由若干语句组成,用来完成一定功能。当然也有的函数体仅有一对“”,其中内部既没有声明语句,也没有执行语句。这种函数称为空函数。,C语言的语句规则:1.每个变量必须先说明后引用。2.书写时格式十分自由,一行可以书写多条语句,一个语句也可以多行书写。但每个语句必须以“;”结尾。3.注释用/*/或者/表示。4.“”花括号必须成对,位置随意,多个花括号可同行书写,也可逐行书写。5.区分大小写字母。为层次分明,增加可读性,同一层的“”花括对齐,采用逐层缩进方式书写。,与一般C语言的结构相同:,1、C51语言的函数以“”开始,以“”结束,3、有且只有一个main()函数,以main()函数为程序入口,中间可以调用其他函数,最后在main()函数结束,2、程序体中包含若干语句还可以包含若干函数,均以;号结束。,4、函数放置顺序可随意,但是调用之后的函数需要先声明。,C语言程序的组成结构:全局变量说明/*可被各函数引用*/main()/*主函数*/局部变量说明/*只在本函数引用*/执行语句(包括函数调用语句);fun1(形式参数表)/*函数1*/形式参数说明局部变量说明执行语句(包括调用其他函数语句)funn(形式参数表)/*函数n*/形式参数说明局部变量说明执行语句,ucharkeyscan(void)/按键扫描函数,返回4个按键值XXXXXXX;returnkey;/返回按键值:key,voidmain(void)uchari;while(1)i=keyscan();/按键扫描函数,ucharkeyscan(void)/按键扫描函数,返回4个按键值XXXXXXX;returnkey;/返回按键值:key,ucharkeyscan(void);/声明函数,voidmain(void)uchari;while(1)i=keyscan();/按键扫描函数,7.2C51语言基本语法,7.2.1C51语言的函数及程序结构,7.2.2C51语言的数据类型及存储类型,7.2.3C51语言的运算符,7.2.4C51语言的语句,7.2.6C51语言的指针,7.2.7中断函数、头文件及绝对地址访问,7.2.5C51语言的数组,实战1,实战2,实战3,实战4,实战5,实战6,实战7,7.2.2C51语言的数据类型及存储类型,C51的数据有常量和变量之分。在程序运行中其值不变的量。可以为十进制数、十六进制数(用0 x表示,汇编后缀H)、字符(括起)和字符串型常量(“”括起)。用符号表示常量,符号常用大写表示,此符号需用宏定义指令(#define)对其进行定义(相当于汇编的“EQU”伪指令)。#defineAA100;相当于AAEQU100,常量,数值型常量:,符号型常量:,在程序运行中其值可以改变的量,常用小写字母表示。一个变量由两部分组成:变量名和变量值。定义一个变量,编译系统就会自动为它安排一个存贮区,具体的地址值,用户不必在意。,变量,在C51中,变量在使用前必须对变量进行定义,指出变量的数据类型和存储模式。以便编译系统为它分配相应的存储单元。定义的格式如下:,C51的变量声明的一般格式如下数据类型存储类型变量名=初值;,例如:unsignedcharcodeFlag=0 x0f;声明一个无符号的char型变量Flag,赋初值0 x0f;所在的存储空间在的ROM中。,C语言中的基本数据类型,类型,符号,关键字,数的表示范围,所占位数,整型,字符型,实型,有,无,(signed)int,16,-3276832767,(signed)short,16,-3276832767,(signed)long,32,-21474836482147483647,16,unsignedint,065535,32,04294967295,unsignedlongint,unsignedshortint,16,065535,有,float,32,有,char,8,-128127,无,unsignedchar,8,0255,1.176E383.40E+38,一、C51的数据类型:,表明该数据有无符号、位数多少位,整数还是小数等信息,(续)C51的数据类型扩充定义,sfr:特殊功能寄存器声明sfr16:sfr的16位数据声明sbit:特殊功能位声明bit:位变量声明,例:sfrSCON=0 x98;sfr16T2=0 xCC;sbitOV=PSW2;bitkeyscanflag=1;,二、C51数据的存储类型:,指明变量所处的单片机的存储器区域情况。,MCS-51存储器结构图(a)程序存储器地址分配;(b)数据存储器地址分配,FFH,1FH,00FFH,C51的变量声明的一般格式如下数据类型存储类型变量名=初值,;例如:unsignedcharcodeFlag=0 x0f;就是声明一个无符号的char型变量Flag,并给他赋初值为0 x0f;并且声明他所在的存储空间在片内统一编址的ROM中。声明中,如果没有存储类型,则数据默认的存储空间为data型,也就是在片内RAM中。,chardatavar;/*字符变量var定位在片内RAM区charcodeMSG=ENTERPARAMETER:/*字符数组定位在程序存贮区*/unsignedlongxdataarray100;/*无符号长型数组在片外RAM区,每元素占4bytes*/floatidatax,y,z;/*实型变量x,y,z,在片内用间址访问的内部RAM区*/bitlock;/*位变量lock定位在片内RAM可位寻址区*/unsignedintpdatadimension;/*无符号整型变量dimension定位在分页的外部RAM区*/unsignedcharxdatavector1044;/*无符号字符型三维数组,定位在片外RAM区*/,7.2C51语言基本语法,7.2.1C51语言的函数及程序结构,7.2.2C51语言的数据类型及存储类型,7.2.3C51语言的运算符,7.2.4C51语言的语句,7.2.6C51语言的指针,7.2.7中断函数、头文件及绝对地址访问,7.2.5C51语言的数组,实战1,实战2,实战3,实战4,实战5,实战6,实战7,与C语言基本相同:+-*/%(加减乘除取余)=)与汇编指令环移有什么区别?,C51语言的左右移位都是逻辑移位,也就是不循环,左移总是补0,但右移就不同了,如果被移位的变量是一个有符号变量,右移是补符号位,也就是最高位是1就补1,是0就补0,如果被移位的数是一个无符号变量,则右移补0。xy,表示将数据x左移y位,低位补0高位丢弃,汇编指令移位都是循环移位,数据不丢失。,A,1,0,1,1,1,1,0,1,RLA,i,1,0,1,1,1,1,0,1,i1,0,0,7.2C51语言基本语法,7.2.1C51语言的函数及程序结构,7.2.2C51语言的数据类型及存储类型,7.2.3C51语言的运算符,7.2.4C51语言的语句,7.2.6C51语言的指针,7.2.7中断函数、头文件及绝对地址访问,7.2.5C51语言的数组,实战1,实战2,实战3,实战4,实战5,实战6,实战7,1、控制语句if()else条件语句for()循环语句while()循环语句do-while()循环语句switch/case多分支选择句continue结束本次循环语句break终止执行循环语句goto跳转语句return从函数返回值语句,7.2.4C51语言的语句,2、空语句它仅是由一个分号“;”构成,什么也不做,用于消耗机器周期,类似NOP3、表达式语句一个表达式和一个分号构成,如sum=x+y;4、复合语句一些语句用括起来就构成复合语句5、函数调用语句调用已经定义过的函数,7.2C51语言基本语法,7.2.1C51语言的函数及程序结构,7.2.2C51语言的数据类型及存储类型,7.2.3C51语言的运算符,7.2.4C51语言的语句,7.2.6C51语言的指针,7.2.7中断函数、头文件及绝对地址访问,7.2.5C51语言的数组,实战1,实战2,实战3,实战4,实战5,实战6,实战7,7.2.5C51语言的数组,数组是同一类型的一组变量的有序集合,利用数组名加下标形式引用数组各个元素。,一维数据类型数组名常量表达式;,多维数据类型数组名常量表达式1.,常量表达式N;,定义一维或多维数组的方式:,unsignedintxcount10;/定义无符号整形数组,有10个数据单元floatoutnum10,10;/定义浮点型数组,有100个数据单元,7.2C51语言基本语法,7.2.1C51语言的函数及程序结构,7.2.2C51语言的数据类型及存储类型,7.2.3C51语言的运算符,7.2.4C51语言的语句,7.2.6C51语言的指针,7.2.7中断函数、头文件及绝对地址访问,7.2.5C51语言的数组,实战1,实战2,实战3,实战4,实战5,实战6,实战7,7.2.6C51语言的指针,一、指针与指针变量内存中每一个单元都有一个地址编号,指针就是存储单元地址,存储这个地址的变量称为指针变量。,指针的值:,指针的类型:,指针的定义:,指针存放的是某个变量在内存中的地址,指针的类型就是该指针所指向的变量的类型,被指数据类型被指存贮类型*指针变量名;,被指数据类型被指存贮类型*指针变量名;,C51中提供了两个专门的运算符:*指针运算符/指针就是变量的地址,前加*表示该地址的变量,将01H送给指针所指向的片外RAM8002H单元,ucharxdata*ziweima=0 x8002;/定义了一个指向片外RAM8002H单元的指针,uchar类型说明指针所指向的单元的内容是无符号八位的,2.通过库函数访问绝对地址利用绝对地址访问的头文件absacc.h可对不同的存贮区进行访问。该头文件的函数有:CBYTE(访问code区ROM字符型)DBYTE(访问data区字符型)PBYTE(访问pdata或外部I/O口)XBYTE(访问xdata或外部I/O口),例:#include#defineziweimaXBYTE0 x8002ziweima=0 x01;,7.3C51语言程序设计实战,实战1从点亮一个LED开始实战2闪烁一个LED实战3玩转流水灯实战4中断控制流水灯实战5定时器控制流水灯实战6计数器控制流水灯实战7片外RAM数据读取控制流水灯,实战1、P1.0发光二极管阴极,二极管阳极通过电阻接VCC,向引脚送0则该二极管发光。要求点亮P1.0上的发光二极管(0亮1灭)。,修改程序,P1.0输出方波,发光二极管闪烁,b、汇编语言实现,c、C51语言实现,a、Proteus仿真图,a、Proteus仿真图,c、C51语言实现,b、汇编语言实现,实战2、P1.0发光二极管阴极,二极管阳极通过电阻接VCC,向引脚送0则该二极管发光。要求P1.0输出方波,发光二极管L1闪烁。,修改程序,P1口八个发光二极管循环左右移,b、汇编语言实现,c、C51语言实现,a、Proteus仿真图,a、Proteus仿真图,b、汇编语言实现,c、C51语言实现方法一,c、C51语言实现方法二,实战3、P1.0P1.7接8个发光二极管阴极,二极管阳极通过电阻接VCC,向引脚送0则该二极管发光,要求P1口八个发光二极管循环左移点亮,再循环右移点亮。,修改程序,发光二极管循环左右移花样,b、汇编语言实现,c、C51语言实现,a、Proteus仿真图,a、Proteus仿真图,b、汇编语言实现,c、C51语言实现方法一:分别赋值,c、C51语言实现方法二:数组赋值,c、C51语言实现方法三:环移赋值,c、C51语言实现方法四:移位赋值,c、C51语言实现方法五:指针数组赋值,实战4、通过INT0向CPU申请中断,要求:初时最右边发光二极管点亮1个,每中断一次循环左移一位。,修改程序,利用INT1控制流水灯,修改程序,利用INT0、INT1分别控制流水灯左移和右移,b、汇编语言实现,c、C51语言实现,a、Proteus仿真图,a、Proteus仿真图,b、汇编语言实现,c、C51语言实现方法一,c、C51语言实现方法二,c、C51语言实现,实战5、初时最右边发光二极管点亮1个,定时器T0每定时1秒二极管循环左移一位。,b、汇编语言实现,c、C语言实现,a、Proteus仿真图,修改程序,利用T1每定时2秒控制流水灯,a、Proteus仿真图,b、汇编语言实现,c、C51语言实现,c、C51语言实现,实战6、初时最右边发光二极管点亮1个,用计数器T0每计3个数二极管循环左移一位。,b、汇编语言实现,c、C语言实现,a、Proteus仿真图,修改程序,利用T1计数5次控制流水灯,a、Proteus仿真图,b、汇编语言实现,c、C51语言实现,c、C51语言实现,实战7、通过INT0向CPU申请中断,每中断一次向片外RAM2000H开始的位置送1个流水灯控制数据,并将数据送P1口控制八个发光二极管。,b、汇编语言实现(略),c、C语言实现,a、Proteus仿真图,a、Proteus仿真图,c、C51语言实现,c、C51语言实现,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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