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

上传人:29 文档编号:241599882 上传时间:2024-07-08 格式:PPT 页数:52 大小:351.11KB
返回 下载 相关 举报
第4章80C51单片机C语言程序设计课件_第1页
第1页 / 共52页
第4章80C51单片机C语言程序设计课件_第2页
第2页 / 共52页
第4章80C51单片机C语言程序设计课件_第3页
第3页 / 共52页
点击查看更多>>
资源描述
2024/7/81第第4 4章章 80C5180C51的的C C语言程序设计语言程序设计单片机单片机C语言概述语言概述4.1C51的的数据类型数据类型与运算与运算4.2C51流程流程控制语句控制语句4.3C51的的指针类型指针类型4.4C51的的函数函数4.5C51编程编程实例实例4.6v2023/8/131 第第4章章 80C51的的C语语言程序言程序设计单设计单片机片机2024/7/8210.1 单片机单片机C语言概述语言概述 10.1.1 C5110.1.1 C51程序开发过程程序开发过程 编译器能自动完成变量的存储单元的分配编译器能自动完成变量的存储单元的分配 对常用功能模块和算法编制相应的函数,方便移植对常用功能模块和算法编制相应的函数,方便移植 采用采用C51C51的优点的优点 C C语言具有良好的可读性、可移植性和基本的硬件操作能力语言具有良好的可读性、可移植性和基本的硬件操作能力 。C51C51程序开发过程程序开发过程 编写源程序编写源程序 建立工程,加入源程序建立工程,加入源程序 编译生产目标程序编译生产目标程序 仿真调试、写存储器仿真调试、写存储器v2023/8/13210.1 单单片机片机C语语言概述言概述 10.1.12024/7/83v2023/8/1332024/7/8410.2.1 C5110.2.1 C51的数据类型的数据类型10.2 C51的数据类型与运算的数据类型与运算 数据类型决定其数据类型决定其取值范围取值范围、占用、占用存储器的大小存储器的大小及可参与及可参与哪种运算。哪种运算。数据类型数据类型长度长度(位位)取值范围取值范围字符型字符型signed char8-128127unsigned char80255整整 型型signed int16-3276832767unsigned int16065535长整型长整型signed long32-2147488364821474883647unsigned long3204294967295浮点型浮点型float321.75494E-383.402823E+38位位 型型bit10,1sbit10,1访问访问SFRsfr80255sfr1616065535v2023/8/13410.2.1 C51的数据的数据类类型型10.22024/7/85尽可能采用无符号格式尽可能采用无符号格式bitbit用用于于定定义义位位变变量量的的名名字字,编编译译器器会会对对其其分分配配地址(地址(RAMRAM的的20H20H2FH 2FH 区域区域)sbitsbit用用于于定定义义位位变变量量的的名名字字和和地地址址,地地址址是是确确定定的且不用编译器分配(的且不用编译器分配(SFRSFR及及RAMRAM的的20H20H2FH 2FH 区域区域)C51C51编译器在编译时会自动进行类型转换编译器在编译时会自动进行类型转换 几点说明:几点说明:v2023/8/135 尽可能采用无符号格式几点尽可能采用无符号格式几点说说明:明:2024/7/8610.2.2 C5110.2.2 C51数据的存储类型数据的存储类型C51C51的存储的存储器器类型类型存储器类型存储器类型长度(位)长度(位)对应单片机存储器对应单片机存储器bdata1片内片内RAM位寻址区,共位寻址区,共128位。(亦能字节访问)位。(亦能字节访问)data8直接寻址,共直接寻址,共128字节。字节。idata8间接寻址,共间接寻址,共256字节。字节。pdata8片外片外 RAM分页间址,共分页间址,共256字节。(字节。(MOVX Ri)xdata16间接寻址,共间接寻址,共64k字节。(字节。(MOVX DPTR)code16ROM间接寻址,共间接寻址,共64k字节。(字节。(MOVC A,A+DPTR)v2023/8/13610.2.2 C51数据的存数据的存储类储类型型C52024/7/87经经常常使使用用的的变变量量应应该该置置于于片片内内RAMRAM中中,要要用用bdatabdata、datadata、idataidata来定义。来定义。不不经经常常使使用用的的变变量量或或规规模模较较大大的的变变量量应应该该置置于于片片外外RAMRAM中中,要用要用pdatapdata、xdataxdata来定义。来定义。默认存储器类型由编译控制命令的存储模式指令限制。默认存储器类型由编译控制命令的存储模式指令限制。存储模式存储模式默认默认存储类型存储类型特特 点点SMALL data 小模式。小模式。变量默认在片内变量默认在片内RAM。空间小,速度块。空间小,速度块。COMPACTpdata紧凑模式。变量默认在片外紧凑模式。变量默认在片外RAM的页(的页(256字节,页号由字节,页号由P2口决定)。口决定)。LARGExdata大模式。大模式。变量默认在片外变量默认在片外RAM的的64KB范围。空间大,速度慢。范围。空间大,速度慢。v2023/8/137 经经常使用的常使用的变变量量应该应该置于片内置于片内RAM中,要用中,要用2024/7/8810.2.3 80C5110.2.3 80C51硬件结构的硬件结构的C51C51定义定义特殊功能寄存器的声明特殊功能寄存器的声明 sfrsfr 特殊功能寄存器名特殊功能寄存器名 =地址常数;地址常数;格式:格式:例如:例如:sfr SCON=0 x90sfr SCON=0 x90;sfr P0=0 x80sfr P0=0 x80;v2023/8/13810.2.3 80C51硬件硬件结结构的构的C52024/7/89特殊功能寄存器中特殊功能寄存器中特定位特定位的声明的声明 sbit sbit 位变量名位变量名=特殊功能寄存器名特殊功能寄存器名 位的位置(位的位置(0 07 7)例如:例如:sfr PSW=0 xD0sfr PSW=0 xD0;sbit OV=PSW2 sbit OV=PSW2;sbit sbit 位变量名位变量名 =字节地址字节地址 位的位置(位的位置(0 07 7)例如:例如:sbit OV=0 xD02sbit OV=0 xD02;sbit CY=0 xD07 sbit CY=0 xD07;sbit sbit 位变量名位变量名 =位地址位地址 例如:例如:sbit OV=0 xD2sbit OV=0 xD2;sbit CY=0 xD7 sbit CY=0 xD7;v2023/8/139 特殊功能寄存器中特定位的声明特殊功能寄存器中特定位的声明 sbit2024/7/810内部内部RAMRAM中可位寻址对象的定义中可位寻址对象的定义 先先定义变量的数据类型和存储类型定义变量的数据类型和存储类型 例如:例如:int bdata ibaseint bdata ibase;char bdata array4 char bdata array4;再再利用利用sbitsbit进行声明进行声明 例如:例如:sbit mybit0=ibase0sbit mybit0=ibase0;sbit mybit15=ibase15 sbit mybit15=ibase15;sbit ary07=array07sbit ary07=array07;访问示例:访问示例:ibase=-1ibase=-1;array2=array2=a a;v2023/8/1310 内部内部RAM中可位中可位寻寻址址对对象的定象的定义义 先定先定2024/7/811算术运算符和算术表达式算术运算符和算术表达式 10.2.4 C5110.2.4 C51的运算符和表达式的运算符和表达式 基本算术运算符基本算术运算符 例如:例如:+加法运算符;加法运算符;-减法(取负)运算符;减法(取负)运算符;*乘法运算符;乘法运算符;/除法运算符;除法运算符;%取余数运算符取余数运算符。示例:示例:25.0/20.0=1.25 25.0/20.0=1.25 25/20=125/20=125%20=5 25%20=5 取负运算优先级最高。取负运算优先级最高。v2023/8/1311 算算术术运算符和算运算符和算术术表达式表达式 10.2.42024/7/812自增、自减运算符(自增、自减运算符(仅能用于变量仅能用于变量)例如:例如:+自增运算符;自增运算符;-自减运算符;自减运算符;类型转换运算符类型转换运算符 自动转换,顺序:自动转换,顺序:bitcharintlongfloatbitcharintlongfloat 强制类型转换,如:(强制类型转换,如:(doubledouble)a a v2023/8/1312 自增、自减运算符(自增、自减运算符(仅仅能用于能用于变变量)量)类类2024/7/813关系运算符关系运算符和和关系表达式关系表达式 关系运算符关系运算符 小于;小于;=大于;大于;=大于等于;大于等于;=等于;等于;!=不等于。不等于。关系表达式关系表达式关系表达式的值为逻辑值:真(关系表达式的值为逻辑值:真(1 1)和假()和假(0 0)v2023/8/1313 关系运算符和关系表达式关系运算符和关系表达式 关系运算符关系运算符2024/7/814逻辑运算符逻辑运算符和和逻辑表达式逻辑表达式 逻辑运算符逻辑运算符&逻辑与逻辑与|逻辑或逻辑或 !逻辑非逻辑非 逻辑表达式逻辑表达式逻辑表达式的值为逻辑值:真(逻辑表达式的值为逻辑值:真(1 1)和假()和假(0 0)例:例:5|05|0结果为结果为1 1,2&02&0结果为结果为0 0 v2023/8/1314 逻辑逻辑运算符和运算符和逻辑逻辑表达式表达式 逻辑逻辑运算符运算符2024/7/815位运算符位运算符&按位与按位与|按位或按位或 按位异或按位异或 按位取反按位取反 右移右移 例:例:P1=P11P1=P11表示对表示对P1P1口的所有位左移口的所有位左移1 1位位 v2023/8/1315 位运算符位运算符&按位与例:按位与例:P2024/7/816赋值和复合赋值运算符赋值和复合赋值运算符 复合赋值运算符复合赋值运算符 +=+=加法赋值;加法赋值;-=-=减法赋值;减法赋值;*=乘法赋值;乘法赋值;/=/=除法赋值;除法赋值;%=%=取模赋值;取模赋值;符号符号“=”称为赋值运算称为赋值运算符符 =右移位赋值;右移位赋值;&=&=逻辑与赋值;逻辑与赋值;|=|=逻辑或赋值;逻辑或赋值;=逻辑异或赋值;逻辑异或赋值;=逻辑非赋值逻辑非赋值 例:例:a*=5a*=5相当于相当于a=a*5a=a*5;b&=0 x80b&=0 x80相当于相当于b=b&0 x80b=b&0 x80。v2023/8/1316 赋值赋值和复合和复合赋值赋值运算符运算符 复合复合赋值赋值运运2024/7/81710.3 C51流程控制语句流程控制语句 10.3.1 C5110.3.1 C51选择语句选择语句 条件语句条件语句ifif(条件表达式)语句(条件表达式)语句 例如:例如:if if(p1p1!=0=0)c=20 c=20;ifif(条件表达式)语句(条件表达式)语句1 1 else else 语句语句2 2 例如:例如:if if(p1p1!=0=0)c=20 c=20;else c=0 else c=0;v2023/8/131710.3 C51流程控制流程控制语语句句 10.2024/7/818ifif(条件表达式(条件表达式1 1)语句)语句1 1 else if else if(条件表达式(条件表达式2 2)语句)语句2 2 else if else if(条件表达式(条件表达式3 3)语句)语句3 3 else if else if(条件表达式(条件表达式n n)语句)语句n n else else 语句语句n+1 n+1 v2023/8/1318if(条件表达式(条件表达式1)语语句句12024/7/819开关语句开关语句switch switch(表达式)(表达式)case case 常量表达式常量表达式1 1:语句:语句1 1;breakbreak;case case 常量表达式常量表达式2 2:语句:语句2 2;breakbreak;case case 常量表达式常量表达式n n:语句:语句n n;breakbreak;default default:语句:语句n+1n+1;v2023/8/1319 开关开关语语句句switch(表达式)(表达式)2024/7/82010.3.2 C5110.3.2 C51循环语句循环语句 whilewhile语句语句 一般形式为:一般形式为:whilewhile(条件表达式)语句;(条件表达式)语句;如果条件表达式的结果一开始就为假,则后面的语句一如果条件表达式的结果一开始就为假,则后面的语句一次也不能执行。次也不能执行。Do-whileDo-while语句语句 一般形式为:一般形式为:dodo语句语句 whilewhile(条件表达式);(条件表达式);任何条件下,循环体语句至少会被执行一次。任何条件下,循环体语句至少会被执行一次。v2023/8/132010.3.2 C51循循环语环语句句 whi2024/7/821forfor语句语句一般形式为:一般形式为:forfor(初值表达式初值表达式;条件表达式条件表达式;更新表达式更新表达式)语句)语句ifif语句与语句与gotogoto语句结合语句结合 当型循环当型循环 形式为:形式为:looploop:ifif(表达式)(表达式)语句语句 goto loopgoto loop;v2023/8/1321for 语语句一般形式句一般形式为为:if语语句与句与got2024/7/822直到型循环直到型循环 形式为:形式为:looploop:语句语句 ifif(表达式)(表达式)goto loopgoto loop;continuecontinue是一种循环中断语句,它并不跳出循环体;是一种循环中断语句,它并不跳出循环体;breakbreak语句只能跳出它所处的那一层循环;语句只能跳出它所处的那一层循环;gotogoto语句可以用于跳出多重循环(从内层到外层)。语句可以用于跳出多重循环(从内层到外层)。注意:注意:v2023/8/1322 直到型循直到型循环环continue是一种循是一种循环环中中2024/7/82310.4 C51的指针类型的指针类型 有一个变量有一个变量a a,利用,利用&a&a表示变量表示变量a a的地址的地址 。则语句。则语句 p=&a p=&a;把把a a的地址赋给了指针变量的地址赋给了指针变量p p,则,则“p p指向了变量指向了变量a a”。*P P表示变量表示变量a a的内容的内容 指针变量的定义指针变量的定义 char data*p/*char data*p/*定义指针变量定义指针变量*/p=30H /*p=30H /*为指针变量赋值,为指针变量赋值,30H30H为片内为片内RAMRAM地址地址*/x=*p /*30H x=*p /*30H单元的内容送给变量单元的内容送给变量x*/x*/v2023/8/132310.4 C51的指的指针类针类型型 有一个有一个变变2024/7/824定义时定义时未指定未指定它所指向的它所指向的对象的存储器对象的存储器类型类型 10.4.1 10.4.1 一般指针一般指针 一般指针占一般指针占3 3个字节个字节第一字节存放该指针的第一字节存放该指针的默认默认存储器类型编码(存储器类型编码(见表见表)第二字节存放该指针的第二字节存放该指针的高高位地址偏移量位地址偏移量第三字节存放该指针的第三字节存放该指针的低低位地址偏移量位地址偏移量 存储器类型编码存储器类型编码 存储器类型存储器类型bdata/data/idataxdatapdatacode编码编码0 x000 x010 xfe0 xffv2023/8/1324 定定义时义时未指定它所指向的未指定它所指向的对对象的存象的存储储器器类类型型2024/7/825一般指针定义示例:一般指针定义示例:charchar*xdata strptr*xdata strptr;/*/*指针本身存于指针本身存于xdata xdata 空间,它指向空间,它指向charchar型数据型数据*/intint *data number *data number;/*/*指针本身存于指针本身存于data data 空间,它指向空间,它指向intint型数据型数据*/由于指向对象的存储空间在编译时无法确定(由于指向对象的存储空间在编译时无法确定(运行时确定运行时确定),),因此必须生成一般代码以保证对任意空间的对象进行存取。所因此必须生成一般代码以保证对任意空间的对象进行存取。所以以一般指针所产生的代码速度较慢一般指针所产生的代码速度较慢。v2023/8/1325 一般指一般指针针定定义义示例:示例:char*xdat2024/7/82610.4.2 10.4.2 基于存储器的指针基于存储器的指针定义时就定义时就指定指定它所指向的它所指向的对象的存储器对象的存储器类型类型 指针占指针占1 1个字节(个字节(idata*idata*,data*data*,pdata*pdata*)或)或2 2个个字节(字节(code*code*,xdata*xdata*)基于存储器指针定义示例:基于存储器指针定义示例:charchar data *str data *str;/*/*指针指向的指针指向的charchar型数据存于型数据存于data data 空间空间 */intint xdata*num xdata*num;/*/*指针指向的指针指向的intint型数据存于型数据存于xdata xdata 空间空间 */基于存储器的指针长度比一般指针短,可以节省存储器基于存储器的指针长度比一般指针短,可以节省存储器空间,空间,运行速度快运行速度快,但它所指对象具有确定的存储器空间,但它所指对象具有确定的存储器空间,兼容性不好兼容性不好。v2023/8/132610.4.2 基于存基于存储储器的指器的指针针定定义时义时2024/7/82710.5 C51的函数的函数 10.5.1 C5110.5.1 C51函数的定义函数的定义一般形式一般形式:返回值类型返回值类型 函数名(形式参数列表)函数名(形式参数列表)编译模式编译模式reentrantinterrupt nusing nreentrantinterrupt nusing n 函数体函数体 编译模式为编译模式为SMALLSMALL、COPACTCOPACT或或LARGELARGEreentrantreentrant用于定义可重入函数用于定义可重入函数interrupt n interrupt n 用于定义中断函数用于定义中断函数,n,n为中断号为中断号,可以为可以为0 03131using n using n 确定工作寄存器组,取值为确定工作寄存器组,取值为0 03 3 v2023/8/132710.5 C51的函数的函数 10.5.12024/7/82810.5.2 C5110.5.2 C51函数的调用与参数传递函数的调用与参数传递 主调函数要向被调函数传递所需的参数主调函数要向被调函数传递所需的参数传递给被调函数的数据称为实际参数,即实参传递给被调函数的数据称为实际参数,即实参实参向形参的传递是单向的实参向形参的传递是单向的参数传递可以参数传递可以采用寄存器采用寄存器、固定存储器位置方式、固定存储器位置方式 参数传递参数传递寄存器参数传递寄存器参数传递传递的参数传递的参数char、1字节指针字节指针int、2字节指针字节指针long、float一般指针一般指针参数参数1R7R6、R7R4R7R1、R2、R3参数参数2R5R4、R5R4R7R1、R2、R3参数参数3R3R2、R3R1、R2、R3v2023/8/132810.5.2 C51函数的函数的调调用与参数用与参数2024/7/829SMALLSMALL模式下,在内部模式下,在内部RAMRAM中完成中完成 COMPACTCOMPACT模式下,在外部模式下,在外部RAMRAM中完成中完成LARGERLARGER模式下,在外部模式下,在外部RAMRAM中完成中完成固定存储器位置参数传递固定存储器位置参数传递 80C51单片机不采用堆栈传递参数。但C51提供一种模拟堆栈,从而支持可重入函数的递归调用。10.5.3 C5110.5.3 C51的库函数的库函数常用的C51库函数参见附录B.2 v2023/8/1329SMALL 模式下,在内部模式下,在内部RAM中完成中完成 2024/7/8304.5 编程举例编程举例 4.5.1 用用C语言实现语言实现I/O编程编程 1 端口输入端口输入/输出(输出(I/O)操作)操作下面的代码显示如何读和写下面的代码显示如何读和写I/O端口(引脚)。端口(引脚)。sfrP1=0 x90;/P1的的SFR定义定义sfrP3=0 xB0;/P3的的SFR定义定义unsigned char val1;unsigned char val2;unsigned char val3;P1=0 xff;/读操作前,置位端口读操作前,置位端口val1=P1;/将将P1口的数据传递给变量口的数据传递给变量val1val2=P1&0 x0f;/将将P1口的低口的低4位数据传递给变量位数据传递给变量val2P3=P14;/P1左移左移4 位后再从位后再从P3.4P3.7 引脚输出引脚输出v2023/8/13304.5编编程程举举例例 4.5.1 用用C语语言言2024/7/8312 I/O 端口的位操作指令端口的位操作指令由于由于I/O 端口具有位寻址功能,因此有关位操作的指令也都端口具有位寻址功能,因此有关位操作的指令也都适用于它们。适用于它们。sfrsfrP1=0 x90;P1=0 x90;/P1 /P1的的SFRSFR定义定义sbitsbitDIPswitch=P14;DIPswitch=P14;/定义定义P1P1口位口位4 4为为DIPDIP开关输入开关输入sbitsbitgreenLED=P15;greenLED=P15;/定义定义P1P1口位口位5 5为为LEDLED输出输出If(DIPswitch=1)If(DIPswitch=1)/检查检查P1.4P1.4输入是否为高输入是否为高 greenLED=0;greenLED=0;/置置P1.5P1.5输出为低,输出为低,LEDLED灭灭 elseelse/若若P1.4P1.4输入是否为低输入是否为低 greenLED=1;greenLED=1;/置置P1.5P1.5输出为高,输出为高,LEDLED亮亮 v2023/8/13312 I/O 端口的位操作指令端口的位操作指令2024/7/832【例例】利用单片机的利用单片机的P1.4P1.7 接接4 个发光二个发光二极管,极管,P1.0P1.3 接接4 个开关,要求当开关动个开关,要求当开关动作时,对应(低位对低位,即作时,对应(低位对低位,即P1.0对应对应P1.4、P1.1对应对应P1.5)的发光二极管亮或灭,请编)的发光二极管亮或灭,请编程实现。程实现。3 并行口(字节寻址)应用举例并行口(字节寻址)应用举例v2023/8/1332【例】【例】利用利用单单片机的片机的P1.4P1.72024/7/833汇编参考程序如下:汇编参考程序如下:ORG0000H LJMPLOOP ORG 0060HLOOP:MOV P1,#0FH;设定设定P1 端口低端口低4 位为输入状态位为输入状态MOV A,P1SWAP AMOV P1,ASJMP LOOPC51 参考程序如下:参考程序如下:#include#include sfr P1=0 x90;void main(void)for(;)P1=0 x0F;/设定设定P1 端口低端口低4 位为输入状态位为输入状态P1=P14;/左移左移4 位后再从位后再从P1.4P1.7 引脚引脚输出输出v2023/8/1333 汇编汇编参考程序如下:参考程序如下:2024/7/834【例例4-32】根据图根据图4-8 所示电路,设计闪烁亮灯程序,要所示电路,设计闪烁亮灯程序,要求求8 只发光二极管闪烁点亮,点亮和熄灭时间都为只发光二极管闪烁点亮,点亮和熄灭时间都为200 ms。解解:根据硬件电路图可知,当:根据硬件电路图可知,当P1.x 输出高电平时,输出高电平时,LED 灯灯亮。亮。v2023/8/1334【例【例4-32】根据根据图图4-8 所示所示电电路路2024/7/835汇编参考程序如下:汇编参考程序如下:ORG0000H LJMPLOOP ORG 0060HLOOP:MOV A,#00HMOV P1,A;熄灭熄灭LEDLCALL DELAYMOV A,#0FFHLCALL DELAY;点亮点亮LEDSJMP LOOPDELAY:;200ms 延时子程序延时子程序v2023/8/1335 汇编汇编参考程序如下:参考程序如下:2024/7/836C51 参考程序如下:参考程序如下:#include void delay02s(void)/延时延时0.2s 子程序子程序void main(void)while(1)P1=0 x00;/熄灭熄灭LEDdelay02s();P1=0 xff;/点亮点亮LEDdelay02s();v2023/8/1336C51 参考程序如下:参考程序如下:2024/7/837v【例例4-33】根据图根据图4-8 所示电路,设计一个程所示电路,设计一个程序,在这些序,在这些LED上显示计数值,从上显示计数值,从0 x00到到0 xFF(二进制值(二进制值0000 0000 到到 1111 1111),计数时间间隔为),计数时间间隔为1s。v2023/8/1337【例【例4-33】根据根据图图4-8 所示所示电电路路2024/7/838解解:汇编参考程序如下:汇编参考程序如下:ORG 0000H LJMP START ORG 0060HSTART:MOV P1,#0;熄灭熄灭LED LCALL DELAYLOOP:INC P1 ;增量增量P1 LCALL DELAY;点亮点亮LED SJMP LOOPDELAY:;1s 延时子程序延时子程序v2023/8/1338 解:解:汇编汇编参考程序如下:参考程序如下:2024/7/839C51 参考程序如下:参考程序如下:#include#defineLEDP1;void delay02s(void)/延时延时1svoid main(void)LED=0;/清零清零P1while(1)LED+;/增量增量P1delay02s();v2023/8/1339C51 参考程序如下:参考程序如下:2024/7/840v【例例4-34】设计一个程序,从设计一个程序,从P1获取一个字节,等获取一个字节,等待一段时间,然后将它发送到待一段时间,然后将它发送到P2,等待时间间隔为,等待时间间隔为500 ms。汇编参考程序如下:汇编参考程序如下:ORG0000H LJMPSTART ORG 0060HSTART:MOV A,#00H;清清ACC MOV P1,#FF;使使P1成为输入成为输入LOOP:MOV A,P1 LCALL DELAY MOV P2,A SJMP LOOPDELAY:;500ms 延时子程序延时子程序v2023/8/1340【例【例4-34】设计设计一个程序,从一个程序,从P1获获取取2024/7/841C51 参考程序如下:参考程序如下:#include#defineLEDP1;void delayMS(unsigned int);/延时延时n1mSvoid main(void)unsigned char mybyte;P1=0 xFF;/使使P1成为输入成为输入while(1)mybyte=P1;/从从P1获取一个字节获取一个字节delay(200);P2=mybyte;/将该字节发送到将该字节发送到P2v2023/8/1341C51 参考程序如下:参考程序如下:2024/7/842v【例例4-35】设计一个程序,从设计一个程序,从P0获取一个字节,获取一个字节,若小于若小于100,将它发送到,将它发送到P1;否则,发送到;否则,发送到P2。汇编参考程序如下:汇编参考程序如下:ORG0000H LJMPSTART ORG 0060HSTART:MOV A,#00 ;清清ACC MOV P0,#FFH;使使P0成为输入成为输入LOOP:MOV A,P0 CJNZ A,#100,PD;与与100进行比较进行比较PD:JC PD1 ;CY=1表示小于表示小于100MOV P2,ASJMP LOOPPD1:MOV P1,ASJMP LOOPv2023/8/1342【例【例4-35】设计设计一个程序,从一个程序,从P0获获取取2024/7/843C51 参考程序如下:参考程序如下:#include#defineINP0;#defineOUT1 P1;#defineOUT2 P2;void main(void)unsigned char mybyte;P0=0 xFF;/使使P0成为输入成为输入while(1)mybyte=P0;/从从P0获取一个字节获取一个字节if(mybyte100)OUT1=mybyte;/若该字节小于若该字节小于100,则将它发送到,则将它发送到P1else OUT2=mybyte;/否则,将该字节发送到否则,将该字节发送到P2v2023/8/1343C51 参考程序如下:参考程序如下:2024/7/8444 位可寻址的位可寻址的I/O编程编程vP0P3的的I/O端口是位可寻址的。能够对单个端口是位可寻址的。能够对单个位进行存取而不干扰端口的其余位。使用位进行存取而不干扰端口的其余位。使用sbit数数据类型对据类型对P0P3的单个位进行存取。做到这点的单个位进行存取。做到这点的方法是利用的方法是利用Pxy格式,其中格式,其中x是端口是端口0、1、2、3,y是该端口的位是该端口的位07。例如,。例如,P17指示指示P1.7。当使用这些方法时,需要将头文件。当使用这些方法时,需要将头文件reg51.h(或(或reg52.h)包含进来。)包含进来。【例例4-36】设计一个程序,用以监控设计一个程序,用以监控P1.5位。若位。若该位为高电平,则发送该位为高电平,则发送55H到到P0;否则,;否则,AAH发送到发送到P2。v2023/8/13444 位可位可寻寻址的址的I/O编编程程P0P3的的2024/7/845汇编参考程序如下:汇编参考程序如下:ORG0000HLJMPSTART ORG 0060HSTART:SETB P1.5;使使P1.5成为输入成为输入LOOP:JB P1.5,LP1;MOV P2,#0AAHSJMP LOOPLP1:MOV P0,#55HSJMP LOOPv2023/8/1345 汇编汇编参考程序如下:参考程序如下:2024/7/846C51 参考程序如下:参考程序如下:#include sbitmybit=P15;/声明单个位声明单个位void main(void)mybit=1;/使使P1.5称为输称为输入入while(1)if(mybit=1)P0=0 x55;elseP2=0 xAA;v2023/8/1346C51 参考程序如下:参考程序如下:2024/7/847【例例4-37】一扇屋门的传感器连接到一扇屋门的传感器连接到P1.1引脚,而引脚,而蜂鸣器连接到蜂鸣器连接到P1.7。试设计一个程序,用以监控这。试设计一个程序,用以监控这扇门的传感器,当此门开着(扇门的传感器,当此门开着(P1.1引脚为高电平),引脚为高电平),蜂鸣器响(蜂鸣器响(P1.7引脚为高电平引脚为高电平)。汇编参考程序如下:汇编参考程序如下:ORG 0000H LJMP START ORG 0060H START:SETB P1.5;使使P1.5成为输入成为输入 LOOP:JB P1.5,LP1;SETB P1.7 SJMP LOOP LP1:CLR P1.7 SJMP LOOPv2023/8/1347【例【例4-37】一扇屋】一扇屋门门的的传传感器感器连连接到接到P2024/7/848C51 参考程序如下:参考程序如下:#include void delayMS(unsigned int);sbitsenser=P11;/声明单个位声明单个位sbitbuzzer=P17;/声明单个位声明单个位void main(void)senser=1;/使使P1.1成为输入成为输入while(1)if(senser=1)buzzer=1;else buzzer=0;void delayMS(unsigned int time)v2023/8/1348C51 参考程序如下:参考程序如下:2024/7/849vORG 0000HORG 0000HvSJMP MAINSJMP MAINvORG 0040HORG 0040HvMAIN:MOVMAIN:MOV A,#0FEHvLOOP:MOVMOV P2,Av LCALLLCALL D_1Sv RL Av AJMP LOOPvD_1S:MOVMOV R6,#100vD10MS:MOVMOV R5,#40vDL:MOVMOV R4,#123v NOPNOPv DJNZDJNZ R4,$v DJNZDJNZ R5,DLv DJNZDJNZ R6,D10MSv RETv ENDv2023/8/1349ORG 0000HD_1S:MOV R2024/7/850#include#include#include#include void void delaymsdelayms(unsigned)(unsigned);void main(void)void main(void)unsigned char i unsigned char i;P1=0 x01P1=0 x01;dodo for(i=0for(i=0;i=7i=7;i+)i+)delaymsdelayms(5000)(5000);P1=P11P1=P11;if(P1=0 x0)P1=0 x01if(P1=0 x0)P1=0 x01;while(1)while(1);void void delaymsdelayms(unsigned x)(unsigned x)unsigned char j unsigned char j;while(x-)while(x-)for(j=0 for(j=0;j123j123;j+)j+);v2023/8/1350#include v2024/7/851【例例4-174-17】用嵌套结构构造一个延时函数。用嵌套结构构造一个延时函数。解:解:void delay(unsigned int x)void delay(unsigned int x)unsigned char j;unsigned char j;while(x-)while(x-)for(j=0;j125;j+);for(j=0;j125;j+);这里,用内循环构造一个基准的延时,调用时这里,用内循环构造一个基准的延时,调用时通过参数设置通过参数设置外循环的次数,这样就可以形成各种延时关系。外循环的次数,这样就可以形成各种延时关系。v2023/8/1351【例【例4-17】用嵌套用嵌套结结构构造一个延构构造一个延时时vThank You!
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


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

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


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