单片机原理及应用v第04章的c51语言_第1页
单片机原理及应用v第04章的c51语言_第2页
单片机原理及应用v第04章的c51语言_第3页
单片机原理及应用v第04章的c51语言_第4页
单片机原理及应用v第04章的c51语言_第5页
已阅读5页,还剩109页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章单片机的C51语言

4.1C51的程序结构

4.2C51的数据结构4.3C51与汇编语言的混合编程(了解)4.4C51仿真开发环境(自学)4.5C51初步应用编程(简单IO使用)第4章单片机的C51语言4.1C51的程序结构

4.2C51的数据结构4.3C51与汇编语言的混合编程4.4C51仿真开发环境4.5C51初步应用编程

第4章单片机的C51语言51汇编语言能直接操作单片机的系统硬件,指令执行速度快。但其程序可读性差,且编写、移植困难。

51单片机操作数的简记符实验2汇编源代码第4章单片机的C51语言C51是为51系列单片机设计的一种C语言,其特点:C51语言已成为51系列单片机程序开发的主流软件方法。结构化语言,代码紧凑——效率可与汇编语言媲美接近真实语言,程序可读性强——易于调试、维护库函数丰富,编程工作量小——产品开发周期短机器级控制能力,功能很强——适合于嵌入式系统开发与汇编指令无关,易于掌握——在单片机基础上上手快第4章单片机的C51语言C51与标准C语言对比相同之处:语法规则、程序结构、编程方法举例:LED闪烁控制功能;汇编程序LOOP:CLRP1.0ACALLDEL50SETBP1.0SJMPLOOPDEL50:MOVR7,#200DEL1:MOVR6,#125DJNZR6,$DJNZR7,DEL1RETEND第4章单片机的C51语言预处理命令---------函数说明------------全局变量定义------

主函数------------自定义函数---------局部变量定义---------

函数体

函数体------//C51程序第4章单片机的C51语言4.1C51的程序结构

4.2C51的数据结构

4.3C51与汇编语言的混合编程4.4C51仿真开发环境4.5C51初步应用编程

第4章单片机的C51语言1.C51的变量

在C语言编程中,数值可以发生改变的量称为变量。变量名与存储单元地址相对应,变量值与存储单元的内容相对应。例如在51单片机多存储空间中如何确定变量与地址的关系?第4章单片机的C51语言【存储种类】

数据类型

【存储类型】

变量名(标准C)(标准C)*括号项——可以缺省(但需有缺省值)C51变量定义的四要素:staticchardatai;(C51特有)(标准C+C51)第4章单片机的C51语言【存储种类】

数据类型

【存储类型】

变量名存储种类用于说明变量的作用范围:1、auto(自动型)——变量的作用范围在定义它的函数体或语句块内。执行结束后,变量所占内存即被释放。2、extern(外部型)——在一个源文件中被定义为外部型的变量,在其它源文件中需要通过extern说明方可使用。3、static(静态型)——利用static可使变量定义所在的函数或语句块执行结束后,其分配的内存单元继续保留。4、register(寄存器型)——目前已不推荐使用。缺省存储种类为auto(自动)型变量第4章单片机的C51语言数据类型用于表示数据存放格式*有符号数类型可以忽略signed标识符标准C语言的数据类型【存储种类】

数据类型

【存储类型】

变量名除上述常规格式外,51单片机还有三种新的存储格式:第4章单片机的C51语言bit型存储格式

sfr型存储格式

sfrbit型存储格式

bit、sfr或sfr16、sbit

C51扩充的3种数据类型:C51编译器在头文件“REG51.H”中定义了全部sfr/sfr16和sbit变量。用一条预处理命令#include<REG51.H>把这个头文件包含到C51程序中,无需重新定义即可直接使用它们的名称。第4章单片机的C51语言第4章单片机的C51语言编程举例:【存储种类】

数据类型

【存储类型】

变量名存储类型体现了变量的存放区域。51系列单片机共有6个存储类型(分布在3个逻辑存储空间中)。data区code区xdata区bdata区pdata区idata区第4章单片机的C51语言重点的存储类型:code,data,xdata不同存储类型的特点SMALL系统COMPACT系统LARGE系统编译模式第4章单片机的C51语言三种编译模式分别对应于三种缺省存储类型:约定:若无特殊声明,一般均为“SMALL编译模式”变量名可以由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,变量名长度随编译系统而定。变量名具有字母大小写的敏感性,如SUM和sum代表不同的变量。强调:头文件中定义的变量都是大写的,若程序采取小写变量则需要重新定义。【存储种类】

数据类型

【存储类型】

变量名第4章单片机的C51语言C51扩展的若干关键字一览表

变量名不得使用标准C语言和C51语言的关键字。第4章单片机的C51语言unsignedchardatasystem_status=0;

//定义system_status为无符号字符型自动变量,该变量位于data区中且初值为0。数据结构定义举例变量名为system_status位与片内RAM区无符号字符型自动型初值为零第4章单片机的C51语言unsignedcharbdatastatus_byte;

unsignedintcodeunit_id[2]={0x1234,0x89ab};

staticcharm,n;

//定义status_byte为无符号字符型自动变量,该变量位于bdata区//定义unit_id[2]为无符号整型自动变量,该变量位于code区中,是长度为2的数组,且初值为0x1234和0x89ab。//定义m和n为2个位于data区中的有符号字符型静态变量。第4章单片机的C51语言2.C51的指针

C语言指针的一般定义形式为:

数据类型*指针变量名[=&被指向变量名];其中,指针变量指向一个由“数据类型”说明的变量。被指向变量和指针变量都位于C编译器默认的内存区中。例如:inta=’A’;int*p1=&a;这表示p1是一个指向int型变量的指针变量,此时p1的值为int型变量a的地址,而a和p1两个变量都位于C编译器默认的内存区中。第4章单片机的C51语言以下内容自学!!!!对于C51,除了数据类型外,指针定义中还应能说明:1)指针变量自身位于哪个存储区中?

2)被指向变量位于哪个存储区中?C51指针的一般定义形式:数据类型[存储类型1]*[存储类型2]变量名[=&被指向变量名];数据类型——被指向变量的类型,如int型或char型存储类型1——被指向变量所在的存储区,缺省时由地址赋值关系决定存储类型2——指针变量所在的存储区,缺省时为编译器默认的存储区第4章单片机的C51语言例1若采用SMALL编译模式,试解释下述定义的含义。

charxdataa=‘A’;char*ptr=&a;解:ptr是一个指向char型变量的指针,它本身位于SMALL编译模式默认的data存储区里,此时它指向位于xdata存储区里的char型变量a的地址。数据类型[存储类型1]*[存储类型2]变量名[=&被指向变量名];第4章单片机的C51语言例2试解释下述定义的含义 charxdataa=‘A’; char*ptr=&a; charidatab=‘B’; ptr=&b;解:以char*ptr形式定义的指针变量,既可指向位于xdata存储区的char型变量a的地址,也可指向位于idata存储区的char型变量b的地址(由赋值操作关系决定)。前两句与例1相同charxdataa=‘A’;char*ptr=&a;第4章单片机的C51语言例3:试解释以下指针定义的含义 charxdataa=‘A’; charxdata*ptr=&a;【解】ptr是位于data存储区且固定指向xdata存储区的char型变量的指针变量,此时ptr的值为变量a的地址(不能像例2那样再将idata存储区的char型变量b的地址赋予ptr)。第4章单片机的C51语言例4:试解释以下指针定义的含义 charxdataa=‘A’; charxdata*idataptr=&a;【解】ptr是固定指向xdata存储区的char型变量的指针变量,它自身存放在idata存储区中,此时ptr指向位于xdata存储区中的char型变量a的地址。第4章单片机的C51语言第4章单片机的C51语言4.1C51的程序结构

4.2C51的数据结构4.3C51与汇编语言的混合编程

4.4C51仿真开发环境4.5C51初步应用编程

第4章单片机的C51语言C51语言编程可胜任单片机的基本测量与控制任务。对于某些特殊的I/O接口处理、中断处理、强调程序执行速度等场合,仍希望采用汇编程序。C51编译器提供了与汇编语言程序的接口规则,可方便地实现C51与汇0编语言程序的相互调用。本节仅讨论在C51中调用汇编函数和在C51中嵌入汇编代码两种方法。概要第4章单片机的C51语言1.在C51中调用汇编程序

1)程序的寻址,main.c中调用的max函数,如何与汇编文件中的相应代码对应起来;2)参数传递,main.c中传递给max()函数的参数a和b,存放在何处可使汇编程序能够获取到它们的值;3)返回值传递,汇编语言计算得到的结果,存放在何处可使C语言程序能够获取到。C51程序中调用汇编语言,需要解决三个问题:第4章单片机的C51语言举例:在两个数据中选出较大的数据,并赋值给变量c。其中,要求选数任务采用汇编子程序完成。1)程序的寻址问题第4章单片机的C51语言通过在汇编文件中定义同名的“函数”来实现。

第4章单片机的C51语言2)参数传递问题第4章单片机的C51语言3)返回值传递问题2.C51中嵌入汇编代码

程序中需要用到一些简短的汇编指令时,可以通过语句“#pragma”嵌入汇编代码的办法实现。第4章单片机的C51语言#include<reg51.h>voidmain(void){unsignedchari=0; //定义变量i#pragmaasm //嵌入汇编代码

MOVR0,#0AH LOOP:INCA //累加器循环加1 DJNZR0,LOOP#pragmaendasmi=++ACC; //输出累加结果}说明:汇编代码必须放在两条预处理命令#pragmaasm和#pragmaendasm之间,预处理命令必须用小写字母,汇编代码则大小写不限。本实例可实现用汇编语句进行累加器A循环加1和将累加结果传递给C51变量的功能。实例:第4章单片机的C51语言嵌入汇编代码时需要对编译器Keil进行一定设置,具体方法可结合教材P67和下图完成(说明略)。第4章单片机的C51语言4.1C51的程序结构

4.2C51的数据结构4.3C51与汇编语言的混合编程4.4C51仿真开发环境

4.5C51初步应用编程

第4章单片机的C51语言1.Keil的编译环境μVision3

Keil是德国KeilSoftware公司的51单片机开发软件包,包括C编译器、汇编编译器、连接器、库管理及仿真调试器,通过一个windows下的uVisoin3集成开发环境组合起来。第4章单片机的C51语言在uVisoin3可以通过建立工程文件,将多个不同源程序文件组合起来(包括.ASM和.C文件),而Proteus中只能有1个.ASM源程序。第4章单片机的C51语言μVision3的软件界面包括4大组成部分,即菜单工具栏,工程管理窗口,文件窗口和输出窗口。菜单工具栏工程管理窗口文件窗口输出窗口第4章单片机的C51语言μVision3中共有11个下拉菜单。工具栏的位置和数量可以通过设置选定和移动。第4章单片机的C51语言工程管理窗口用于管理工程文件目录,它由5个子窗口组成:文件窗口,寄存器窗口,帮助窗口,函数窗口,模版窗口。工程管理窗口:第4章单片机的C51语言输出窗口:输出窗口用于编译过程中的信息交互作用,由3个子窗口组成:编译窗口,命令窗口,搜寻窗口。第4章单片机的C51语言信息窗口:观察窗口(Watch&CallStackWindows)输出窗口(OutputWindows)存储器窗口(MemoryWindow)反汇编窗口(DissamblyWindow)串行窗口(SerialWindow)第4章单片机的C51语言建立工程→输入源程序→添加源程序→【工程设置】→编译源程序→【动态调试】→运行2、μVision3的基本使用方法举例:LED闪烁控制功能第4章单片机的C51语言(1)建立工程点击“Project->NewProject…”菜单,在编缉框中输入一个名字(设为exam1),无需扩展名。第4章单片机的C51语言选择目标CPU(Intel系列的80C51BH)第4章单片机的C51语言(2)输入源程序点击新建文件按钮打开一个新的文本编缉窗口第4章单片机的C51语言输入程序源代码,以*.c保存该文件。第4章单片机的C51语言(3)添加源程序(右击“SourceGroup1”→点击“AddfiletoGroup”SourceGroup1”→添加生成的.c文件)第4章单片机的C51语言(4)工程设置右击Project窗口的Target1→选择“Project->Optionfortarget‘target1’”→工程设置对话框第4章单片机的C51语言设置对话框中的OutPut页面(勾选“CreatHexfile”)第4章单片机的C51语言设置对话框中的Debug页面(选中Use和下拉框“PROTEUSVSMMONITOR…”)第4章单片机的C51语言(5)编译源程序(形成hex文件)点击F7或工具按钮启动编译、连接功能。完成后将在命令窗口中显示编译结果第4章单片机的C51语言若有语法错误,双击出错提示可指出错误所在行号第4章单片机的C51语言1、将Keil编译形成的*.hex文件加载到*.DSN文件中,通过proteus控制仿真运行(无法在运行过程中进行调试)程序运行的两种方法:第4章单片机的C51语言2、在Keil软件里控制Proteus仿真运行(可以在运行过程中进行调试)步骤:下载()→运行()→停止()第4章单片机的C51语言(6)一般调试过程①启动调试过程——Ctrl+F5、、

Debug->Start/StopDebugSession②开始调试——详见下页③结束调试——、Debug->StopRunning第4章单片机的C51语言调试工具栏复位运行到光标行执行完当前子程序过程单步单步停止运行调试菜单栏快捷键指向下条运行行第4章单片机的C51语言基本调试手段:1、运行到光标行——从当前行运行到光标所在行(Ctrl+F10)2、严格单步运行——遇到函数时亦单步进行(F11)3、跨函数单步运行——遇到函数时将其视作一行语句(F10)4、断点运行——全速运行到断点行停止(双击设置/解除断点)5、监视输出端口——打开I/O窗口(Peripherals->I/O-Ports)6、监视运行变量——打开Watch#1窗口(点击)

……第4章单片机的C51语言4.1C51的程序结构

4.2C51的数据结构4.3C51与汇编语言的混合编程4.4C51仿真开发环境4.5C51初步应用编程

4.5.1I/O端口的简单应用

4.5.2I/O端口的进阶实践第4章单片机的C51语言输出电路:

基本输出元件:发光二极管(LightEmittingDiode)低电平驱动高电平驱动灌电流拉电流4.5.1.1基本输入输出单元与编程灌入的最大电流为

10mA拉出的最大电流为

1mA

单片机输出低电平时驱动能力尚可,输出高电平时驱动能力很差。

输入电路:

基本输入元件:按钮(Button)或开关(Switch)第4章单片机的C51语言当按键未按下压时,Px.n端口为高电平;按压按键后为低电平。实例1独立按键识别【要求】采用独立按键方式实现下述功能:开机时LED全熄,然后根据按键动作使相应灯亮,并将亮灯状态保持到按压其它键时为止。第4章单片机的C51语言独立按键——每个按键都彼此独立地各占有一位I/O口线。特点是电路简单,但占用I/O口线较多。第4章单片机的C51语言为使按键抬起后LED能保持先前的点亮状态,需要在按键未压下期间禁止向P2输出P0状态值。【分析】参考程序如下:

第4章单片机的C51语言voidmain(){charkey=0; //定义按键变量while(1){key=P0&0x0f; //读取按键状态,高4位清零if(key!=0x0f)P2=key;//有按键动作时,P0状态值送P2}}第4章单片机的C51语言编程界面和运行界面分别如下图第4章单片机的C51语言实例1运行效果实例2键控流水灯

第4章单片机的C51语言【要求】K1为“启动键”,首次按压K1可产生“自下向上”的流水灯运动;K2为“停止键”,按压K2可终止流水灯的运动;

K3和K4为“方向键”,分别产生“自上向下”和“自下向上”运动。第4章单片机的C51语言思路分析:设立状态标志变量→根据键值修改标志值→根据标志值控制灯的亮灭总体关系流程图第4章单片机的C51语言按键状态值:无按键——xxxx1111B按压K1——xxxx1110B按压K2——xxxx1101B按压K3——xxxx1011B按压K4——xxxx0111B按键动作判断——(P0&0x0f)是否等于0x0f?若是,说明无按键动作,反之则有按键动作。→0x0f→0x0e→0x0d→0x0b→0x07获取按键状态第4章单片机的C51语言修改方向和启停标志值第4章单片机的C51语言P2口亮灯编码:xxxx1110xxxx1101xxxx1011xxxx0111D1~D4循环方向控制

charled[]={0xfe,0xfd,0xfb,0xf7};for(i=0;i<=3;i++){P2=led[i];}//↓移动for(i=3;i>=0;i--){P2=led[i];}//↑移动查表方法第4章单片机的C51语言else第4章单片机的C51语言实例2原理图与程序界面图实例2程序运行效果第4章单片机的C51语言实例3混合编程将实例2中C51的delay函数改用汇编语言实现,并完成系统的混合编程。程序说明分别编写汇编语言(delay.asm)与C51语言(实例3.c)两个程序文件,并将其添加到Keil的同一项目中。第4章单片机的C51语言C51部分与实例2基本相同#include"reg51.h"unsignedcharled[]={0xfe,0xfd,0xfb,0xf7};//LED灯的花样数据voiddelay(unsignedchartime);voidmain(){bitdir=0,run=0; //标志位定义及初始化

chari;while(1){switch(P0&0x0f){ //读取键值

case0x0e:run=1;break; //K1动作,设run=1 case0x0d:run=0,dir=0;break; //K2动作,设run=dir=0 case0x0b:dir=1;break; //K3动作,设dir=1 case0x07:dir=0;break; //K4动作,设dir=0}if(run) //若run=dir=1,自上而下流动

if(dir) for(i=0;i<=3;i++){ P2=led[i]; delay(255); } else //若run=1,dir=0,自下而上流动

for(i=3;i>=0;i--){ P2=led[i]; delay(255); } elseP2=0xff; //若run=0,灯全灭

}}第4章单片机的C51语言delay.asm与实例3.c文件中函数delay同名的子程序汇编子程序的头部格式;延时处理函数(汇编语言)PUBLIC_DELAYDE SEGMENTCODERSEG DE_DELAY:MOVR0,#225DEL2: DJNZR0,DEL2 DJNZR7,_DELAY RET END第4章单片机的C51语言实例3的全部程序及运行效果第4章单片机的C51语言4.5.1.2LED数码管原理与编程

LED显示元件——人机交互输出设备,其作用是指示中间运行结果与运行状态。点式字段式点阵式光柱式LED的类型第4章单片机的C51语言引脚配置七段式LED数码管(Proteus:7-SegmentDisplay)共阳极型共阴极型公共端接“0”公共端接“1”字符的显示码或字模与数码管的类型有关第4章单片机的C51语言共阴极型部分字符的显示码(字模)为:七段LED数码管的标准显示字符为0~9,A~F显示字符显示码(共阴)其它字符:——00111000B=0x38“L”字符的显示码“H”字符的显示码——01110110B=0x76第4章单片机的C51语言实例4LED数码管显示在P0口连接一个共阴极数码管,使之循环显示0~9数字,间隔为500循环步。分析:将显示码循环输出到P0口即可实现循环显示。但由于数字0~9的显示段码没有规律可循,需要采取查表方式进行操作:第4章单片机的C51语言i++=10?N

延时循环指针i=0P0←数组[i]Y①将显示码按序存放在一个数组中,顺序号与代表的显示字符相对应(如,charled_mod[]={x1,x2,….,xn);②通过查表语句(如,P0=led_mode[i])输出显示码。第4章单片机的C51语言参考程序第4章单片机的C51语言实例4仿真运行效果第4章单片机的C51语言实例5(实验1)根据如下共阴极型数码管电路,编程实现计数显示功能,即以十进制形式显示击键次数,次数大于99后重新由0开始。个位LED接P2口,十位LED接P0口按钮接P3.7,抬起时为1电平,按压时为0电平。第4章单片机的C51语言编程分析:两个新问题:问题1:如何将计数值拆解成个位和十位两个数?问题2:如何避免按键压下时被连续计数?第4章单片机的C51语言初始化:P2=P0=table[0];取模运算(%10)→个位整除10运算(/10)→十位P2=table[count%10];P0=table[count/10];拆解计数值方法第4章单片机的C51语言避免连续计数方案1:更新后处理连击方案2:更新前处理连击第4章单片机的C51语言参考程序程序运行效果

第4章单片机的C51语言第4章单片机的C51语言4.1C51的程序结构

4.2C51的数据结构4.3C51与汇编语言的混合编程4.4C51仿真开发环境4.5C51初步应用编程

4.5.1I/O端口的简单应用

4.5.2I/O端口的进阶实践第4章单片机的C51语言4.5.2.1数码管动态显示原理与编程

两种显示接口:静态显示接口和动态显示接口静态显示接口:一个数码管的引脚独立占据一根I/O口线。优点:被显示数据只要送入并行口后就不再需要CPU干预,因而显示效果稳定。缺点:占用资源较多第4章单片机的C51语言所有数码管的输入端(段码线)对应并联在一个IO口上,而每位数码管的公共端(位码线)分别由一位IO线控制;由IO口输出的显示码可被所有数码管收到,但只有满足位码线电平要求的数码管可被驱动。动态显示接口

第4章单片机的C51语言动态显示编程原理:快速(如10ms)切换段码值和位码值,使每一时刻只有一只数码管被驱动。利用视力暂留特性,可获得连续显示效果。优点:占用IO口资源较少(节省空间)缺点:需要CPU不断进行干预(占用机时)第4章单片机的C51语言实例6根据下图共阴极型数码管动态显示电路,编程实现显示字符“L2”的功能。第4章单片机的C51语言分析:Proteus中的双联LED数码管相当于两个并联的数码管。7SEG-MPX2-CC-BLUEBlue,2Digit,7-segmentCathodeDisplay第4章单片机的C51语言P2→“0x38”,P3.1→“1”,P3.0→“0”P2→“0x5b”,P3.1→“0”,P3.0→“1”P2←led_mode[0],P3←00000010B=2P2←led_mode[1],P3←00000001B=1led_mode[]={0x38,0x5b}led_point=0led_point=1-led_pointP2=led_mode[led_point]P3=2-led_point程序主要部分第4章单片机的C51语言#include<REG51.H>charled_mod[]={0x38,0x5B}; voiddelay(unsignedinttime);voidmain(){charled_point=0;while(1){ P3=2-led_point;

P2=led_mod[led_point];

led_point=1-led_point;

delay(30); }}led_point=0led_point=1-led_pointP2=led_mode[led_point]P3=2-led_point完整程序第4章单片机的C51语言第4章单片机的C51语言运行效果图第4章单片机的C51语言4.5.2.2行列式键盘原理与编程

独立式键盘的电路简单,易于编程,但占用的I/O口线较多,当需要较多按键时可能产生IO口资源紧张问题。独立式键盘电路第4章单片机的C51语言行列式键盘——将I/O口分为行线和列线,按键跨接在行线和列线上,列线通过上拉电阻接正电源。4×4行列式键盘行列式键盘的特点:占用I/O口线少,但软件过程复杂。第4章单片机的C51语言①键盘列扫描各行电平同时置1,各列电平轮流清0。扫描码:key_scan[]={0xef,0xdf,0xbf,0x7f};写P2: P2=key_scan[i];行列式键盘编程原理(以P2口接4×4键盘为例)第一次11101111B第二次11011111B第三次10111111B第四次01111111B=0xef=0xdf=0xbf=0x7f扫描输出码第4章单片机的C51语言

如果

(P2&0x0f)=0x0f

→无键压下

如果(P2&0x0f)≠0x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论