谭久刚《单片机应用技术》1-6

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《单片机应用技术》课程开发小组子情境1-6:C51编程控制流水灯任务1-6-3任务1-6-2任务1-6-1C51编程上位机控制流水灯C51编程键盘控制流水灯C51编程控制灯的闪烁及流动显示《单片机应用技术》课程开发小组任务1-6-1:C51编程控制灯的闪烁及流动显示任务要求:利用C51编程控制灯的闪烁及流动显示C51编程定时中断控制灯的显示C51编程软件延时控制灯的闪烁及流动C51编程控制灯的亮灭Step1Step2Step3任务实施步骤知识点小结《单片机应用技术》课程开发小组Step1.C51编程控制灯的亮灭1.点亮任意小灯C51程序设计1)点亮任意小灯C51源程序#includereg51.h//51系列单片机头文件voidmain()//主函数{P1=0xFE;/*点亮第一个发光二极管*/while(1);/*死循环,防止程序跑飞*/}1)C51程序基本结构同标准C,一般C51程序具有如下基本结构,预处理#include//注释1主函数voidmain()/*注释2*/{主函数体…………}2).reg51.h头文件C51编程访问特殊功能寄存器之前,必须先进行定义。为了用户处理方便,C51编译器把MCS-51单片机的常用的特殊功能寄存器和特殊位进行了定义,放在一个“reg51.h”或“reg52.h”的头文件中。类型名称基本数据类型长度取值范围无符号字符型数据unsignedchar1字节0~255有符号字符型数据signedchar1字节-128~+127无符号整型数据unsignedint2字节0~65535有符号整型数据signedint2字节-32768~+32767无符号长整型数据unsignedlong4字节0~4294967295有符号长整型数据signedlong4字节-2147483648~+2147483647浮点数据float4字节1.175494E-38~3.402823E+38位变量(编译可变)bit1位0或1位变量(编译不可变)sbit1位0或1特殊功能寄存器sfr1字节0~25516位特殊功能寄存器sfr162字节0~65535①特殊功能寄存器定义特殊功能寄存器须通过sfr或sfr16类型说明符进行定义,sfr是一个C51扩展的数据类型,定义时须指明它们所对应的片内RAM单元的地址。格式如下:sfr或sfr16特殊功能寄存器名=地址;sfr用于对MCS-51单片机中单字节的特殊功能寄存器进行定义,sfr16用于对双字节特殊功能寄存器进行定义。特殊功能寄存器名一般用大写字母表示。地址一般用直接地址形式。例如:sfrPSW=0xd0;sfrP1=0x90;sfr16DPTR=0x82;②位变量定义这也是C51中扩充的数据类型,用于访问MCS-51单片机中的可寻址的位单元。在C51中,支持两种位类型:bit型和sbit型。它们在内存中都只占一个二进制位,其值可以是“1”或“0”。sbit位类型符用于定义在可位寻址字节或特殊功能寄存器中的位,定义时须指明其位地址,可以是位直接地址,可以是可位寻址变量带位号,也可以是特殊功能寄存器名带位号。格式如下:sbit位变量名=位地址;sbitCY=0xD7;sfrP1=0x90;sbitP1_0=P1^0;sbitP1_1=0x90^1;3)while语句while语句在C51中用于实现当型循环结构,它的格式如下:while(表达式){语句;/*循环体*/}while语句后面的表达式是能否循环的条件,后面的语句是循环体。当表达式为非0(真)时,就重复执行循环体内的语句;当表达式为0(假),则中止while循环,程序将执行循环结构之外的下一条语句。它的特点是:先判断条件,后执行循环体,在循环体中对条件进行改变,然后再判断条件,如条件成立,则再执行循环体,如条件不成立,则退出循环。如条件第一次就不成立,则循环体一次也不执行。当写成:while(1){……}上面程序段中,条件表达式内容一直为“1”(真),则CPU将一直执行花括弧内的循环体。如果直接写成“while(1);”,注意,在while(1)后有一个“;”,即循环体为空语句,则相当于汇编中的“LJMP$”。《单片机应用技术》课程开发小组Step1.C51编程控制灯的亮灭C51程序编译结果ROM地址机器代码汇编源程序C:0x0000020003LJMPC:0003C:0x0003787FMOVR0,#0x7F;初始化RAMC:0x0005E4CLRAC:0x0006F6MOV@R0,AC:0x0007D8FDDJNZR0,C:0006C:0x0009758107MOVSP(0x81),#0x07;初始化SPC:0x000C02000FLJMPmain(C:000F)C:0x000F7590FEMOVP1(0x90),#0xFEC:0x001280FESJMPC:00121.点亮任意小灯C51程序设计2)点亮任意小灯C51程序仿真《单片机应用技术》课程开发小组Step2.C51编程软件延时控制灯的闪烁及流动1.C51软件延时控制灯的闪烁1)LED1闪烁控制C51源程序#includereg51.h//51系列单片机头文件sbitled1=P1^0;//声明单片机P1口的第一位unsignedinti,j;/*****************************主函数***************************/voidmain(){while(1)//大循环{led1=0;/*点亮第一个发光二极管*/for(i=1000;i0;i--)//延时for(j=125;j0;j--);led1=1;/*关闭第一个发光二极管*/for(i=1000;i0;i--)//延时for(j=125;j0;j--);}}C51变量变量是在程序运行过程中其值可以改变的量,例如上面的i。一个变量由两部分组成:变量名和变量值。变量在使用前必须进行定义,指出变量的数据类型和存储模式,以便编译系统为它分配相应的存储单元。定义的格式如下:[存储种类]数据类型说明符[存储器类型]变量名1[=初值],变量名2[=初值]…;类型名称基本数据类型长度取值范围无符号字符型数据unsignedchar1字节0~255有符号字符型数据signedchar1字节-128~+127无符号整型数据unsignedint2字节0~65535有符号整型数据signedint2字节-32768~+32767无符号长整型数据unsignedlong4字节0~4294967295有符号长整型数据signedlong4字节-2147483648~+2147483647浮点数据float4字节1.175494E-38~3.402823E+38位变量(编译可变)bit1位0或1位变量(编译不可变)sbit1位0或1特殊功能寄存器sfr1字节0~25516位特殊功能寄存器sfr162字节0~65535存储种类auto使用auto定义的变量称为自动变量,其作用范围在定义它的函数体或复合语句内部,动态分配,定义变量时,如果省略存储种类,则该变量默认为自动(auto)变量。extern使用extern定义的变量称为外部变量。static使用static定义的变量称为静态变量,定以后,一直存在。它又分为内部静态变量和外部静态变量。register使用register定义的变量称为寄存器变量。它定义的变量存放在CPU内部的寄存器中,处理速度快,但数目少。C51编译器编译时能自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,用户可以无需专门声明。存储器类型描述data直接寻址的片内RAM低128B,访问速度快bdata片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问idata间接寻址访问的片内RAM,允许访问全部片内RAMpdata用Ri间接访问的片外RAM的低256Bxdata用DPTR间接访问的片外RAM,允许访问全部64k片外RAMcode程序存储器ROM64k空间存储模式SMALL模式SMALL模式称为小编译模式,在SMALL模式下,编译时,函数参数和变量被默认在片内RAM中,存储器类型为data。COMPACT模式COMPACT模式称为紧凑编译模式,在COMPACT模式下,编译时,函数参数和变量被默认在片外RAM的低256字节空间,存储器类型为pdata。LARGE模式LARGE模式称为大编译模式,在LARGE模式下,编译时函数参数和变量被默认在片外RAM的64K字节空间,存储器类型为xdata。for循环语句for(表达式1;表达式2;表达式3){语句;}/*循环体*/for语句后面带三个表达式,它的执行过程如下:①先求解表达式1的值;②求解表达式2的值,如表达式2的值为真,则执行循环休中的语句,如表达式2的值为假,则结束for循环,转到第④步;③若表达式2的值为真,则执行完循环体中的语句后,求解表达式3,然后转到第②步;④退出for循环,执行下面的一条语句。在for循环中,一般表达式1给循环变量赋初值;表达式2为条件表达式,对循环变量进行判断;表达式3为循环变量更新表达式,使循环变量能不满足条件而退出循环。利用循环嵌套设计1s软件延时程序voidmain(){unsignedintj;for(j=0;j125;j++);}for后循环体为空语句,满足条件不做任何事,再修改循环变量,直到条件为假退出循环。该程序通过不断执行循环次数修改及条件判断语句达到延时目的,改变循环次数便可调整延时时间。以此循环为个基准延时,再利用外循环调用延时程序便形成循环嵌套,1s延时程序如下。voidmain(){unsignedinti,j;for(i=1000;i0;i--){for(j=0;j125;j++);}}显然,利用这种延时方法很难实现精确延时,只能用于延时精度要求不高的场合,当然,可以通过细调循环次数来减小延时误差,例如将外循环次数调整为990时,可以适当减小延时误差。《单片机应用技术》课程开发小组Step2.C51编程软件延时控制灯的闪烁及流动2.C51编程延时子函数实现灯的闪烁#includereg51.hsbitled1=P1^0;//声明单片机P1口的第一位voiddelay1s();//声明子函数/*****************************主函数***************************/voidmain()//主函数{while(1)//大循环{led1=0;/*点亮第一个发光二极管*/delay1s();//调用延时子函数led1=1;/*关闭第一个发光二极管*/delay1s();//调用延时子函数}}/**********************不带参数延时1s子函数**********************/voiddelay1s()//函数定义{unsignedinti,j;//子函数体for(i=990;i0;i--)for(j=125;j0;j--);}[extern]函数类型函数名(形式参数表);函数的声明是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便调用函数时系统进行对照检查,如果子函数写在主函数之前则无需单独声明,之后则必须先作声明。函数的声明后面要加分号。如果声明的函数在文件内部,则声明时不用extern,如果声明的函数不在文件内部,而在另一个文件中,声明时须带extern,指明使用的函数在另一个文件中。函数定义的一般格式如下:函数类型函数名(形式参数表)[reentrant][usingn]形式参数说明{局部变量定义函数体}函数类型函数类型说明了函数返回值的数据类型。函数名函数名是用户为自定义函数取的名字以便调用函数时使用。形式参数表形式参数表用于列录在主调函数与被调用函数之间进行数据传递的形式参数。例如:voiddelay1s();定义函数delay1s,无返回值,无形参voiddel

1 / 28
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功