第4章80C51单片机的C语言程序设计课件

PPT
  • 阅读 60 次
  • 下载 0 次
  • 页数 53 页
  • 大小 270.905 KB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
第4章80C51单片机的C语言程序设计课件
可在后台配置第一页与第二页中间广告代码
第4章80C51单片机的C语言程序设计课件
可在后台配置第二页与第三页中间广告代码
第4章80C51单片机的C语言程序设计课件
可在后台配置第三页与第四页中间广告代码
第4章80C51单片机的C语言程序设计课件
第4章80C51单片机的C语言程序设计课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 53
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
文本内容

【文档说明】第4章80C51单片机的C语言程序设计课件.ppt,共(53)页,270.905 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-44645.html

以下为本文档部分文字说明:

第4章80C51单片机的C语言程序设计2024/12/4210.1单片机C语言概述10.1.1C51程序开发过程编译器能自动完成变量的存储单元的分配对常用功能模块和算法编制相应的函数,方便移植采用C51的优点C语言具有良好的可读性、可移植性和基本的硬件操作能力。C51程序开发过程编写源程序建立

工程,加入源程序编译生产目标程序仿真调试、写存储器2024/12/43C51源程序C51编译器列表文件浮动目标码模块连接器用户库系统库映像文件绝对定位目标码文件硬件仿真器编程器2024/12/4410.2.1C51的数据类型10.2C51的数据类

型与运算数据类型决定其取值范围、占用存储器的大小及可参与哪种运算。数据类型长度(位)取值范围字符型signedchar8-128~127unsignedchar80~255整型signedint16-32768~32767unsignedint160~65535长整型sig

nedlong32-21474883648~21474883647unsignedlong320~4294967295浮点型float32±1.75494E-38~±3.402823E+38位型bit10,1sbit10,1访问SFRsfr80~255sfr16160

~655352024/12/45尽可能采用无符号格式bit用于定义位变量的名字,编译器会对其分配地址(RAM的20H~2FH区域)sbit用于定义位变量的名字和地址,地址是确定的且不用编译器分配(SFR及RAM的20H~2FH区域)C51

编译器在编译时会自动进行类型转换几点说明:2024/12/4610.2.2C51数据的存储类型C51的存储器类型存储器类型长度(位)对应单片机存储器bdata1片内RAM位寻址区,共128位。(亦能字节访问

)data8直接寻址,共128字节。idata8间接寻址,共256字节。pdata8片外RAM分页间址,共256字节。(MOVX@Ri)xdata16间接寻址,共64k字节。(MOVX@DPTR)code16ROM间接寻址,共64k字节

。(MOVCA,@A+DPTR)2024/12/47经常使用的变量应该置于片内RAM中,要用bdata、data、idata来定义。不经常使用的变量或规模较大的变量应该置于片外RAM中,要用pdata、xdata来定义。默认存储器类型由编译

控制命令的存储模式指令限制。存储模式默认存储类型特点SMALLdata小模式。变量默认在片内RAM。空间小,速度块。COMPACTpdata紧凑模式。变量默认在片外RAM的页(256字节,页号由P2口决定)。LA

RGExdata大模式。变量默认在片外RAM的64KB范围。空间大,速度慢。2024/12/4810.2.380C51硬件结构的C51定义特殊功能寄存器的声明sfr特殊功能寄存器名=地址常数;格式:例如:sfrSCON=0x90;sfrP0=0x80;202

4/12/49特殊功能寄存器中特定位的声明sbit位变量名=特殊功能寄存器名^位的位置(0~7)例如:sfrPSW=0xD0;sbitOV=PSW^2;sbit位变量名=字节地址^位的位置(0~7)例如:sbitOV=0xD0^2

;sbitCY=0xD0^7;sbit位变量名=位地址例如:sbitOV=0xD2;sbitCY=0xD7;2024/12/410内部RAM中可位寻址对象的定义先定义变量的数据类型和存储类型例如:intbdataibase;charbd

ataarray[4];再利用sbit进行声明例如:sbitmybit0=ibase^0;sbitmybit15=ibase^15;sbitary07=array[0]^7;访问示例:ibase=-1;array[2]=‘a’;2024/12/411算术运算符和算术表达式10.2.4C51

的运算符和表达式基本算术运算符例如:+加法运算符;-减法(取负)运算符;*乘法运算符;/除法运算符;%取余数运算符。示例:25.0/20.0=1.2525/20=125%20=5取负运算优先级最高。2024/12/412自增、自减运算符(仅能用于变量)例如:++自增运算符;--自

减运算符;类型转换运算符自动转换,顺序:bit→char→int→long→float强制类型转换,如:(double)a2024/12/413关系运算符和关系表达式关系运算符<小于;<=小于等于;>

大于;>=大于等于;==等于;!=不等于。关系表达式关系表达式的值为逻辑值:真(1)和假(0)2024/12/414逻辑运算符和逻辑表达式逻辑运算符&&逻辑与||逻辑或!逻辑非逻辑表达式逻辑表达式的值为逻辑值:真(1)

和假(0)例:5||0结果为1,2&&0结果为02024/12/415位运算符&按位与|按位或^按位异或~按位取反<<左移>>右移例:P1=P1<<1表示对P1口的所有位左移1位2024/12/416赋值和复合赋值运算符复合赋值运算符+=加法赋值;-=减

法赋值;*=乘法赋值;/=除法赋值;%=取模赋值;符号“=”称为赋值运算符<<=左移位赋值;>>=右移位赋值;&=逻辑与赋值;|=逻辑或赋值;^=逻辑异或赋值;~=逻辑非赋值例:a*=5相当于a=a*5;b&=0x80相当于b=b&0x80。2024/12/417

10.3C51流程控制语句10.3.1C51选择语句条件语句if(条件表达式)语句例如:if(p1!=0){c=20;}if(条件表达式)语句1else语句2例如:if(p1!=0){c=20;}else{c=0;}2024/12/418if(条件

表达式1)语句1elseif(条件表达式2)语句2elseif(条件表达式3)语句3……elseif(条件表达式n)语句nelse语句n+12024/12/419开关语句switch(表达式){case常量表达式1:语句1

;break;case常量表达式2:语句2;break;……case常量表达式n:语句n;break;default:语句n+1;}2024/12/42010.3.2C51循环语句while语句一般形式为:while(条件表达式)语句;

如果条件表达式的结果一开始就为假,则后面的语句一次也不能执行。Do-while语句一般形式为:do语句while(条件表达式);任何条件下,循环体语句至少会被执行一次。2024/12/421for语句

一般形式为:for([初值表达式];[条件表达式];[更新表达式])语句if语句与goto语句结合当型循环形式为:loop:if(表达式){语句gotoloop;}2024/12/422直到型循环形式为:loop:{语句if(表达式)gotoloop;}continue是

一种循环中断语句,它并不跳出循环体;break语句只能跳出它所处的那一层循环;goto语句可以用于跳出多重循环(从内层到外层)。注意:2024/12/42310.4C51的指针类型有一个变量a,利用&a表示变量a的地址。则语句p=&a;把a的地址赋给了指针变量p,则“p指向了变量a”

。*P表示变量a的内容指针变量的定义chardata*p/*定义指针变量*/p=30H/*为指针变量赋值,30H为片内RAM地址*/x=*p/*30H单元的内容送给变量x*/2024/12/424定义时未指定它所指向的对象的存储器类型10.4.1一般指针一般指针占3个字节第一字节

存放该指针的默认存储器类型编码(见表)第二字节存放该指针的高位地址偏移量第三字节存放该指针的低位地址偏移量存储器类型编码存储器类型bdata/data/idataxdatapdatacode编码0x000x010xfe0xff2024/12/425一般指针定义示例:char*xdata

strptr;/*指针本身存于xdata空间,它指向char型数据*/int*datanumber;/*指针本身存于data空间,它指向int型数据*/由于指向对象的存储空间在编译时无法确定(运行时确定),因此必须生成一般代码以保证对任意空间的对象进行存取。所以一般指针所产生的代码速度

较慢。2024/12/42610.4.2基于存储器的指针定义时就指定它所指向的对象的存储器类型指针占1个字节(idata*,data*,pdata*)或2个字节(code*,xdata*)基于存储器指针定义示例:chardata*str;/*指针指向的char型数据存于data空间

*/intxdata*num;/*指针指向的int型数据存于xdata空间*/基于存储器的指针长度比一般指针短,可以节省存储器空间,运行速度快,但它所指对象具有确定的存储器空间,兼容性不好。2024/12/42710.5C51的函数10.5.1C51函数的定义一般形式:返回值类型函数名(形

式参数列表)[编译模式][reentrant][interruptn][usingn]{函数体}编译模式为SMALL、COPACT或LARGEreentrant用于定义可重入函数interruptn用于定义中断函数,n为中断号,可以为0~31usingn确定工作寄存器组,取值为0

~32024/12/42810.5.2C51函数的调用与参数传递主调函数要向被调函数传递所需的参数传递给被调函数的数据称为实际参数,即实参实参向形参的传递是单向的参数传递可以采用寄存器、固定存储器位置方式参数传递寄存器参数传递传递的参数char、1字节指针int、2字节指针long、fl

oat一般指针参数1R7R6、R7R4~R7R1、R2、R3参数2R5R4、R5R4~R7R1、R2、R3参数3R3R2、R3R1、R2、R32024/12/429SMALL模式下,在内部RAM中完成COMPACT模式下,在外部RAM中完成

LARGER模式下,在外部RAM中完成固定存储器位置参数传递80C51单片机不采用堆栈传递参数。但C51提供一种模拟堆栈,从而支持可重入函数的递归调用。10.5.3C51的库函数常用的C51库函数参见附录B.22024/12/4304.5编程举例4.5.1用C语

言实现I/O编程1端口输入/输出(I/O)操作下面的代码显示如何读和写I/O端口(引脚)。sfrP1=0x90;//P1的SFR定义sfrP3=0xB0;//P3的SFR定义unsignedcharval1;unsignedcharval

2;unsignedcharval3;……P1=0xff;//读操作前,置位端口val1=P1;//将P1口的数据传递给变量val1val2=P1&0x0f;//将P1口的低4位数据传递给变量val2P3=P1<<4;//P1左移4位后再从P3.4~P3.7引脚输出2024/1

2/4312I/O端口的位操作指令由于I/O端口具有位寻址功能,因此有关位操作的指令也都适用于它们。sfrP1=0x90;//P1的SFR定义sbitDIPswitch=P1^4;//定义P1口位4为DIP开

关输入sbitgreenLED=P1^5;//定义P1口位5为LED输出……If(DIPswitch==1)//检查P1.4输入是否为高{greenLED=0;//置P1.5输出为低,LED灭}else//若P1.4输入是否为低{greenLED=1;//置P1.5输出为

高,LED亮}2024/12/432【例】利用单片机的P1.4~P1.7接4个发光二极管,P1.0~P1.3接4个开关,要求当开关动作时,对应(低位对低位,即P1.0对应P1.4、P1.1对应P1.5…)的发光二

极管亮或灭,请编程实现。3并行口(字节寻址)应用举例2024/12/433汇编参考程序如下:ORG0000HLJMPLOOPORG0060HLOOP:MOVP1,#0FH;设定P1端口低4位为输入状态MOVA

,P1SWAPAMOVP1,ASJMPLOOPC51参考程序如下:#include<reg51.h>#include<stdio.h>sfrP1=0x90;voidmain(void){for(;;){P1=0x0F;//设定P1端口低4位为输入状

态P1=P1<<4;//左移4位后再从P1.4~P1.7引脚输出}}2024/12/434【例4-32】根据图4-8所示电路,设计闪烁亮灯程序,要求8只发光二极管闪烁点亮,点亮和熄灭时间都为200ms。解:根据硬件电路图可知,当P1.x输出高电平时,LED灯亮。2024/12/

435汇编参考程序如下:ORG0000HLJMPLOOPORG0060HLOOP:MOVA,#00HMOVP1,A;熄灭LEDLCALLDELAYMOVA,#0FFHLCALLDELAY;点亮LEDSJMPLOOPDELAY:……;200ms延时子

程序2024/12/436C51参考程序如下:#include<reg51.h>voiddelay02s(void)//延时0.2s子程序{……}voidmain(void){while(1){P1=0x00;//熄灭LEDdelay02s();P1=0xff;

//点亮LEDdelay02s();}}2024/12/437❖【例4-33】根据图4-8所示电路,设计一个程序,在这些LED上显示计数值,从0x00到0xFF(二进制值00000000到11111111),计数时间间隔为1s。2024/12/438解:汇编参考程序如下:ORG0000HLJM

PSTARTORG0060HSTART:MOVP1,#0;熄灭LEDLCALLDELAYLOOP:INCP1;增量P1LCALLDELAY;点亮LEDSJMPLOOPDELAY:……;1s延时子程序2024/12/439C51参考程序如下:#include<r

eg51.h>#defineLEDP1;voiddelay02s(void)//延时1s{……}voidmain(void){LED=0;//清零P1while(1){LED++;//增量P1delay02s();}}

2024/12/440❖【例4-34】设计一个程序,从P1获取一个字节,等待一段时间,然后将它发送到P2,等待时间间隔为500ms。汇编参考程序如下:ORG0000HLJMPSTARTORG0060HSTART:MOVA,#00H;清ACCMOVP1,#F

F;使P1成为输入LOOP:MOVA,P1LCALLDELAYMOVP2,ASJMPLOOPDELAY:……;500ms延时子程序2024/12/441C51参考程序如下:#include<reg51.h

>#defineLEDP1;voiddelayMS(unsignedint);//延时n×1mSvoidmain(void){unsignedcharmybyte;P1=0xFF;//使P1成为输入while(

1){mybyte=P1;//从P1获取一个字节delay(200);P2=mybyte;//将该字节发送到P2}}2024/12/442❖【例4-35】设计一个程序,从P0获取一个字节,若小于100,将它发送到P1;否则,发送到P2。汇编参考程序如下

:ORG0000HLJMPSTARTORG0060HSTART:MOVA,#00;清ACCMOVP0,#FFH;使P0成为输入LOOP:MOVA,P0CJNZA,#100,PD;与100进行比较PD:

JCPD1;CY=1表示小于100MOVP2,ASJMPLOOPPD1:MOVP1,ASJMPLOOP2024/12/443C51参考程序如下:#include<reg51.h>#defineINP0;#defineOUT1P1

;#defineOUT2P2;voidmain(void){unsignedcharmybyte;P0=0xFF;//使P0成为输入while(1){mybyte=P0;//从P0获取一个字节if(mybyte<100)OUT1=mybyte;//若该字节

小于100,则将它发送到P1elseOUT2=mybyte;//否则,将该字节发送到P2}}2024/12/4444位可寻址的I/O编程❖P0~P3的I/O端口是位可寻址的。能够对单个位进行存取而不干扰端口

的其余位。使用sbit数据类型对P0~P3的单个位进行存取。做到这点的方法是利用Px^y格式,其中x是端口0、1、2、3,y是该端口的位0~7。例如,P1^7指示P1.7。当使用这些方法时,需要将头文件reg51.h(或reg52.h)包含进来。【例4-36】设计

一个程序,用以监控P1.5位。若该位为高电平,则发送55H到P0;否则,AAH发送到P2。2024/12/445汇编参考程序如下:ORG0000HLJMPSTARTORG0060HSTART:SETBP1.5;使P1.5成为输入LOOP:J

BP1.5,LP1;MOVP2,#0AAHSJMPLOOPLP1:MOVP0,#55HSJMPLOOP2024/12/446C51参考程序如下:#include<reg51.h>sbitmybit=P1^5;//声明单个位voidmain(void

){mybit=1;//使P1.5称为输入while(1){if(mybit==1)P0=0x55;elseP2=0xAA;}}2024/12/447【例4-37】一扇屋门的传感器连接到P1.1引脚,而蜂鸣器连接到P1.7

。试设计一个程序,用以监控这扇门的传感器,当此门开着(P1.1引脚为高电平),蜂鸣器响(P1.7引脚为高电平)。汇编参考程序如下:ORG0000HLJMPSTARTORG0060HSTART:SETBP1.5;

使P1.5成为输入LOOP:JBP1.5,LP1;SETBP1.7SJMPLOOPLP1:CLRP1.7SJMPLOOP2024/12/448C51参考程序如下:#include<reg51.h>voiddelayMS(un

signedint);sbitsenser=P1^1;//声明单个位sbitbuzzer=P1^7;//声明单个位voidmain(void){senser=1;//使P1.1成为输入while(1){if(senser==1)buzzer=1;elsebuzzer=0;}}

voiddelayMS(unsignedinttime){……}2024/12/449❖ORG0000H❖SJMPMAIN❖ORG0040H❖MAIN:MOVA,#0FEH❖LOOP:MOVP2,A❖LCALLD_1S❖RLA❖AJMPLOOP❖D_1S:MOVR6,#10

0❖D10MS:MOVR5,#40❖DL:MOVR4,#123❖NOP❖DJNZR4,$❖DJNZR5,DL❖DJNZR6,D10MS❖RET❖END2024/12/450#include<reg52.h>#include<stdio.h>voiddelayms(unsigned);voi

dmain(void){unsignedchari;P1=0x01;do{for(i=0;i<=7;i++){delayms(5000);P1=P1<<1;if(P1==0x0){P1=0x01;}}}while(1);}voiddelayms(unsignedx){u

nsignedcharj;while(x--){for(j=0;j<123;j++){;}}}2024/12/451【例4-17】用嵌套结构构造一个延时函数。解:voiddelay(unsignedi

ntx){unsignedcharj;while(x--){for(j=0;j<125;j++);}}这里,用内循环构造一个基准的延时,调用时通过参数设置外循环的次数,这样就可以形成各种延时关系。ThankYou!感谢聆听

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?