单片机C语言案例教程电子_第1页
单片机C语言案例教程电子_第2页
单片机C语言案例教程电子_第3页
单片机C语言案例教程电子_第4页
单片机C语言案例教程电子_第5页
已阅读5页,还剩352页未读 继续免费阅读

下载本文档

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

文档简介

单片机C语言案例教程电子第1页/共357页251系列单片机的内部结构示意图

牛牛文库文档分享第2页/共357页351系列单片机引脚功能图

左图为8051系列单片机的引脚功能图,它采用双列直插40引脚封装,它所有引脚的功能我们要全部记住。

牛牛文库文档分享第3页/共357页1.2用单片机芯片组成单片机应用系统1本书单片机学习板电原理路图

牛牛文库文档分享第4页/共357页2本书单片机学习板印刷电路图

牛牛文库文档分享第5页/共357页3本书单片机学习板四位数码管电原理图

牛牛文库文档分享第6页/共357页1.3对单片机编程以实现单片机系统的功能案例1:编程实现,在4位数码管的最左位上显示“8。”案例源程序#include"reg51.h"sbitqw=P2^0;main()

{P0=0;qw=0;}程序的第1行称为预处理命令。第2行是定义位寻址变量。

第3行~第7行是程序的主函数。C程序是由若干个C函数组成,其中必须有一个也只能有一个名为“main”的函数。main函数就是主函数。第3行称为函数头,第4行~第7行称为函数体,第4行的大括号“{”称为函数体的开始标志,第7行的“}”称为函数体的结束标志,开始标志与结束标志之间是若干语句。语句以分号“;”为结束标志。

这个程序运行时的所有功能,是由两个赋值语句具体实现:赋值语句“P0=0;”使口0的8个引脚,即单片机芯片的第39、38、37、36、35、34、33、32全部输出低电平,从而使四位数码管的所有(32只)发光二极管的负极均为低电平;赋值语句“qw=0”使口2的最低位引脚,即单片机芯片的第21脚为低电平,这就使单片机学习板上的PNP管Q3的基极为低电平而导通,从而使最左边位数码管的8只发光二极管正极为高电平。

牛牛文库文档分享第7页/共357页1.4把程序写入单片机芯片的操作平台和操作步骤1首先,在桌面上双击Keil的图标,如下图箭头所指。一建立工程文件

牛牛文库文档分享第8页/共357页2系统进入该软件的初始界面,如下图

牛牛文库文档分享第9页/共357页3在上一图中,须单击菜单栏中的Project菜单及其子菜单NewProject,如下图所示。

牛牛文库文档分享第10页/共357页4于是弹出建立新nVisionz工程项目对话框,如下图:

在上图的“保存在(I)”下拉列表框中选择D盘下的“stc89c52”文件夹,在文件名文本框中,输入工程名“stc89c52”,然后单击“保存”。此时,系统将弹出CPU选择窗口,如下页图。

牛牛文库文档分享第11页/共357页5在列表框中选择并展开“Atmel”,如下图箭头所指

牛牛文库文档分享第12页/共357页6展开“Atmel”项后如下图在上图中往下拉滚动条,选中“AT89C52”,如下页图。

牛牛文库文档分享第13页/共357页7如下图,选中后单击确定。随后,在弹出的询问框中,选择“是(Y)”即可。

牛牛文库文档分享第14页/共357页二建立程序文件1在菜单栏中单击“File”菜单及其子菜单“New”子菜单,此时在工作界面中会弹出一文本编辑窗口,如下图。

说明:单片机程序的编写,就是在上面这一窗口中进行。

牛牛文库文档分享第15页/共357页2把在四位数码管左边显示“8。”的C源程序,从键盘上照敲进去。如下图。

牛牛文库文档分享第16页/共357页3程序敲完后,单击“File”菜单及其子菜单“Save”,如下图

牛牛文库文档分享第17页/共357页4在其弹出的对话框中的文件名文本框中输入相应的文件名“stc89c52.c”,如下图

注意:这里必须输入C51源程序的扩展名“.c”来保存。

牛牛文库文档分享第18页/共357页

第三步,把程序文件加载到工程项目中。

1在ProjectWindows窗口内,展开Tageget1,右击SourceGroup1,如下图。

牛牛文库文档分享第19页/共357页4右击后出现如下界面

在上图菜单中单击“AddFilestoGroup‘SourceGroup1’”,则弹出如下页对话框。

牛牛文库文档分享第20页/共357页

5选中“stc89c52”文件后单击“Add”按钮,再单击“Clese”按钮,则加载工作结束。如下图。

牛牛文库文档分享第21页/共357页

此时若展开SourceGroup1,就能看到stc89c52.c已经加入其中。如下图。

牛牛文库文档分享第22页/共357页第四步,设置编译和链接环境。

1单击ProjectA菜单及其子菜单optionfortarget‘Target1’,

如下图。

牛牛文库文档分享第23页/共357页将弹出编译链接设置界面,如下图。

牛牛文库文档分享第24页/共357页在上图中,单击Output标签后,在复选框GreatHEXFi:上打√,其余可用默认值,然后确定,如下图。

牛牛文库文档分享第25页/共357页第五步,编译成HEX文件。单击Project菜单及其子菜单Ruildalltargetfiles,系统就将.C源程序文件编译成指定格式的.HEX文件.如下图。上图编译信息窗中最后一行告诉我们,源程序有0个错误和0个警告。这是最好结论。有1个错误都不能通过编译,必须针对错误提示信息进行修改。对警告则可改可不改。

牛牛文库文档分享第26页/共357页第六步,将第五步产生.HEX文件下载到单片机芯片中。把单片机学习板上的电源和串口连线与PC机接通,用鼠标依次单击“开始”“程序”“STC_ISP_V4.80”STC_ISP_V4.80”,就进入如下界面.

牛牛文库文档分享第27页/共357页

在MCU类型的下拉列表框中选择”STC89C52RC”,再单击”打开程序文件”按钮,弹出”Openfile(*.hexor*.bin)对话框.如下图.

牛牛文库文档分享第28页/共357页先在上图的下拉列表框中打开“D:\STC89C52”文件夹,随之就出现“STC8051.hex”文件,单击该文件后再单击“打开”按钮,就返回到下载界面,如下图。按下载软件的提示,关闭一下单片机电源再打开,就可看到下载过程和进度,下载完成后,就可看到单片机四位数码管左边显示的”8。”。

牛牛文库文档分享第29页/共357页案例1下载过程与运行效果

牛牛文库文档分享第30页/共357页1.5从数码管显示学单片机编程1.5.1案例2:数码管上的“8。8。”显示1源程序#include"reg51.h"sbitqw =P2^0; sbitbw =P2^1;//增加的一个位寻址变量定义 main(){P0=0;qw=0;bw=0;//增加的一个赋值语句}

2源程序分析:本程序用三个赋值语句实现了它的功能。第一个赋值语句使P0代表的口0的8条I/O引脚输出低电平,从而使四位数码管共32个发光二极管的负极为低电平;第二个赋值语句、第三个赋值语句分别使口2的最低两位引脚输出低电平,从而使PNP管Q2、Q3导通,进而使左边两位数码管的共阳极上为高电平。于是,左边两位数码管上的发光二极管全亮。也就是,在四位数码管的左边显示出“8。8。”。

牛牛文库文档分享第31页/共357页3用流程图表示算法案例2程序的流程图案例1程序的流程图用自然语言描述操作步骤用C语句描术操作步骤

牛牛文库文档分享第32页/共357页4仿案例1程序的上机操作全过程,完成案例2程序的下载和运行5案例2程序的下载操作与运行效果

牛牛文库文档分享第33页/共357页1.5.2案例3:被动形式的“8051”显示#include"reg51.h"sbitqw=P2^0; //定义MCU管脚P2.0位寻址变量名sbitbw=P2^1; //定义MCU管脚P2.1位寻址变量名sbitsw=P2^2; //定义MCU管脚P2.2位寻址变量名sbitgw=P2^3; //定义MCU管脚P2.3位寻址变量名

voidmain(){qw=1;//这四个语句的作用是关断四位数码管

bw=1;sw=1;gw=1;

P0=0x80;//赋"8"的笔段码

qw=0; //接通千位上的数码管

qw=1; //关断千位上的数码管

P0=0xc0;//赋"0"的笔段码

bw=0;bw=1;P0=0x92;//赋"5"的笔段码

sw=0;sw=1;P0=0xf9;//赋"1"的笔段码

gw=0;gw=1;}1源程序

牛牛文库文档分享第34页/共357页2案例源程序要点分析:

本案例中对四位数码管的每一位都要进行控制,因此要定义四个位寻址变量:qw、bw、sw和gw。主函数由五个执行段组成。第一执行段有四个赋值语句,作用是关断四个数码管的显示;第二段有三个赋值语句,作用是在数码管的第1位(从左数到右,下同)上显示“8”后关断;第三段是在数码管的第2位上显示“0”后关断;第四段是在数码管的第3位上显示“5”后关断;第五段是在数码管的第4位上显示“1”后关断。3案例3程序的流程图

牛牛文库文档分享第35页/共357页4案例3程序的下载过程与运行效果

牛牛文库文档分享第36页/共357页15.3案例4:主动形式的“8051”显示3物理现象解惑:案例3中本应一闪而过的“8051”变成了显示长在的“8051”,其原因在于编译系统。单片机程序是在编译系统的迫使下,被动地重复运行,“8051”的显示才永不休止。下面的程序,是程序自己主动地进行“8051”的重复显示。从视觉效果上看,被动形式的“8051”,比主动形式的“8051”亮度要小。1对案例3程序的基本分析:在案例3中,main函数中的最后一个操作是“gw=1;”,这就是关掉第4位数码管的显示,按此程序设计的本来效果,数码管上显示的“8051”应是一闪而过,此后数码管因全部被关断而无任何显示。2案例3程序的一个推论:编译系统有个特殊处理,即在main函数结束而返回的指令处,加了一条跳转指令,迫使单片机程序重新运行。

牛牛文库文档分享第37页/共357页

4源程序#include"reg51.h"sbitqw=P2^0; //定义MCU管脚P2.0位寻址变量名sbitbw=P2^1; //定义MCU管脚P2.1位寻址变量名sbitsw=P2^2; //定义MCU管脚P2.2位寻址变量名sbitgw=P2^3; //定义MCU管脚P2.3位寻址变量名voidmain(){while(1)//循环结构

{qw=1;//这四个语句的作用是关断四位数码管

bw=1;sw=1;gw=1;

P0=0x80;//赋"8"的笔段码

qw=0; //接通千位上的数码管

qw=1; //关断千位上的数码管

P0=0xc0;//赋"0"的笔段码

bw=0;bw=1;P0=0x92;//赋"5"的笔段码

sw=0;sw=1;

P0=0xf9;//赋"1"的笔段码

gw=0;gw=1;}}

牛牛文库文档分享第38页/共357页案例源程序要点分析:与案例3的源程序相比,案例4源程序中的5个执行段,被一个while循环架构所管辖。在此,先简单地说明一个要点,当while后面的小括号中是整数1是,它大括号中的所有语句,将被无数轮重复执行。因此,在案例4程序中,while下面大括号中的那16个赋值语句,从上到下依次执行一轮后,又将回到上面,又从上到下依次执行一轮,再回到上面,如此永无休止地循环下去,从而实现“8051”的正常显示

5案例程序分析及流程图流程图

牛牛文库文档分享第39页/共357页6案例4的下载操作运行效果

牛牛文库文档分享第40页/共357页15.4案例5:模块化的“8051”显示

#include"reg51.h"sbitqw=P2^0; //定义MCU管脚P2.0位寻址变量名sbitbw=P2^1; //定义MCU管脚P2.1位寻址变量名sbitsw=P2^2; //定义MCU管脚P2.2位寻址变量名sbitgw=P2^3; //定义MCU管脚P2.3位寻址变量名Disp_led(){qw=1;//这四个语句的作用是关断四位数码管

bw=1;sw=1;gw=1;

P0=0x80;//赋"8"的笔段码

qw=0; //接通千位上的数码管

qw=1; //关断千位上的数码管

P0=0xc0;//赋"0"的笔段码

bw=0;bw=1;P0=0x92;//赋"5"的笔段码

sw=0;sw=1;P0=0xf9;//赋"1"的笔段码

gw=0;gw=1;}1源程序

牛牛文库文档分享第41页/共357页voidmain(){while(1){Disp_led();}}

牛牛文库文档分享第42页/共357页

案例5这个程序的运行特点是,执行流程从主函数进入后,就进入其中的while循环,while循环的循环体中,只有一个函数调用语句“Disp_led();”,执行这一函数调用语句,程序执行流程就跳转到Disp_led函数中继续执行,即从上到下依次执行那16个赋值语句,第16个赋值语句执行完就是Disp_led函数的结束标志“}”,被调函数运行到其结束标志时,程序执行流程就从被调函数返回到主调函数原调用处继续往下执行,原调用语句下面就是循环体的结束标志“}”,因此又进入下一次“Disp_led();”调用,程序执行流程又跳转到Disp_led函数上执行,Disp_led()执行完毕后又返回到主调函数的循环结构中,从而形成无数次的“Disp_led();”函数调用。

牛牛文库文档分享第43页/共357页5案例5的下载过程及运行效果

牛牛文库文档分享第44页/共357页1.5.5案例6:实用型的“8051”显示

1案例源程序:#include"reg51.h"sbitqw=P2^0; //定义MCU管脚P2.0位寻址变量名sbitbw=P2^1; //定义MCU管脚P2.1位寻址变量名sbitsw=P2^2; //定义MCU管脚P2.2位寻址变量名sbitgw=P2^3; //定义MCU管脚P2.3位寻址变量名Delay(){unsignedinti;for(i=1;i<500;i=i+1){;}}

牛牛文库文档分享第45页/共357页Disp_led(){qw=1;bw=1;sw=1;gw=1;P0=0x80;qw=0;//接通千位上的数码管

Delay();//延时

qw=1;//关断千位上的数码管

P0=0xc0;bw=0;Delay();bw=1;

P0=0x92;sw=0;Delay();sw=1;

P0=0xf9;gw=0;Delay();gw=1;}

牛牛文库文档分享第46页/共357页main(){while(1)Disp_led();}2案例6程序的流程图

牛牛文库文档分享第47页/共357页3案例6程序的下载操作及运行效果

牛牛文库文档分享第48页/共357页1.6案例6源程序的阅读要点1程序的组成案例6的源程序由三部分组成。第一部分是预处理部分,预处理命令都是用“#”号打头,本程序中只有一个文件包含的预处理命令。第二部分是全局变量定义部分。本程序中有四个定义位寻址变量的语句。第三部分是函数定义部分。本程序中定义了三个函数。2文件包含命令的作用文件包含的作用,是将系统或别人的编程文档直接添进我们的程序中,以提高编程的效率和程序的通用性。在“REG51.h”这个头文件中,定义了代表单片机诸多硬件的很多符号,例如P0、P1等等。用文件包含的手段加进我们的程序中,就省去了自己去定义的麻烦。文件包含命令具体的操作,就是在编译时把该文件的全部内容放在该文件包含命令的位置上。

牛牛文库文档分享第49页/共357页3定义位寻址变量的作用用符号来代表单片机的某I/O引脚,从而用对这些符号的赋值来使对应的I/O脚,输出所指定的高电平或低电平。进而用这些I/O引脚去控制单片机外围电路。4函数的作用用函数来实现程序的功能,用函数的调用来提高编程的效率。单片机C程序中,必须有一个且只能有一个名为main的主函数,还可以有若干其它函数。5函数定义的格式要求和组成说明

定义函数的基本格式如下:函数名(){

语句序列

}

牛牛文库文档分享第50页/共357页组成说明:函数名可用英文字符标识,函数名后面的小括号对是函数的标记。函数名及其后的小括号对组成函数的函数头。函数头后的大括号对表示函数体,函数体内是若干语句。注意,函数头后面不能有分号。6函数调用语句

C程序中,主函数main可以调用其它函数,而其它函数都不能调用main函数,但其它函数间可以相互调用。函数调用可以用函数调用语句来实现。main函数中的while循环的循环体语句“Disp_led();”,Disp_led函数中的四个“Delay();”语句,都是函数调用语句。

牛牛文库文档分享第51页/共357页7案例6源程序的程序架构和函数调用层次图程序中共有三个函数:main、Disp_led、Delay,其程序架构见图1-26。当main函数调用Disp_led函数时,main是主调函数,Disp_led是被调函数;当Disp_led函数调用Delay函数时,Disp_led是主调函数,Delay是被调函数。程序架构和函数调用层次图如下。

牛牛文库文档分享第52页/共357页8函数调用时程序执行的流程转移在案例6中,当程序从main函数运行而执行到函数调用语句“Disp_led();”时,程序执行流程就从main函数中,跳转到Disp_led函数,就是从其函数头进入Disp_led函数,并在Disp_led函数中,从上至下依次执行所有语句。当程序在Disp_led函数中运行而执行到“Delay();”语句时,执行流程就从Disp_led函数跳转到Delay函数,也就是从函数头进入Delay函数,当程序执行流程在Delay函数中执行到Delay函数的结束标志“}”时,执行流程就从Delay函数返回到Disp_led函数中,具体就是去执行其调用语句“Delay();”的下一语句。当执行到Disp_led函数的结束标志“}”时,执行流程就从Disp_led函数,返回到调用它的main函数中,具体位置就是while循环语句的循环体。

牛牛文库文档分享第53页/共357页9赋值语句的一般形式和作用赋值语句的一般形式如下:变量名=表达式;其中,变量名用英文字母标识,表达式在本章中暂时用整数。赋值语句的作用就是把赋值号“=”右边的数据赋给左边的变量。因此,赋值号“=”不是表示其左右两边相等的符号,而是表示一种装入操作,这就是把“=”号右边的数据,装入“=”号左边的“仓库”(变量就是仓库)中。如“i=1;”,就是把数据1装入变量i中。又如“i=i+1;”,就是把变量i中的数据取出来加上1后再装入变量i中。

牛牛文库文档分享第54页/共357页10对数码管的编程首先要明确,四位数码管中不能同时有两位以上的数码管被打开显示。只能一位一位地进行显示。要让数码管的某一位显示一位数,只需两个赋值语句。一个赋值语句用来将那个数的笔段码赋给P0,另一个赋值语句用来将相应的位寻址变量置0。11while(1){语句序列}的作用语句while(1){语句序列}是语句while(表达式){语句序列}的特殊形式。while(1){语句序列}的作用就是让大括号中的所有子语句永无休止地执行下去。关于while语句的一般形式和执行规则,见第2章相应内容。

牛牛文库文档分享第55页/共357页12for语句号的作用和执行规律语句for的作用就是让其子句重复执行若干次。例如,有下面的程序段:

ints,n;s=0;for(n=1;n<11;n=n+1){s=s+n;}

从循环头for(n+1;n<11;n=n+1),可推知,其循环体要执行10次,循环结束后,变量s的值是55。关于for语句的一般形式和执行规则,见第2章相应内容。

牛牛文库文档分享第56页/共357页1.7REG51.h头文件简介

系统中自带的头文件“REG51.h”的全部内容如下:/*--------------------------------------------------------------------------REG51.HHeaderfileforgeneric80C51and80C31microcontroller.Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.Allrightsreserved.--------------------------------------------------------------------------*/#ifndef__REG51_H__#define__REG51_H__/*BYTERegister*/sfrP0=0x80;sfrP1=0x90;sfrP2=0xA0;sfrP3=0xB0;sfrPSW=0xD0;sfrACC=0xE0;sfrB=0xF0;sfrSP=0x81;sfrDPL=0x82;sfrDPH=0x83;sfrPCON=0x87;sfrTCON=0x88;sfrTMOD=0x89;

牛牛文库文档分享第57页/共357页sfrTL0=0x8A;sfrTL1=0x8B;sfrTH0=0x8C;sfrTH1=0x8D;sfrIE=0xA8;sfrIP=0xB8;sfrSCON=0x98;sfrSBUF=0x99;/*BITRegister*//*PSW*/sbitCY=0xD7;sbitAC=0xD6;sbitF0=0xD5;sbitRS1=0xD4;sbitRS0=0xD3;sbitOV=0xD2;sbitP=0xD0;

牛牛文库文档分享第58页/共357页/*TCON*/sbitTF1=0x8F;sbitTR1=0x8E;sbitTF0=0x8D;sbitTR0=0x8C;sbitIE1=0x8B;sbitIT1=0x8A;sbitIE0=0x89;sbitIT0=0x88;/*IE*/sbitEA=0xAF;sbitES=0xAC;sbitET1=0xAB;sbitEX1=0xAA;sbitET0=0xA9;sbitEX0=0xA8;/*IP*/sbitPS=0xBC;sbitPT1=0xBB;sbitPX1=0xBA;sbitPT0=0xB9;sbitPX0=0xB8;

牛牛文库文档分享第59页/共357页/*P3*/sbitRD=0xB7;sbitWR=0xB6;sbitT1=0xB5;sbitT0=0xB4;sbitINT1=0xB3;sbitINT0=0xB2;sbitTXD=0xB1;sbitRXD=0xB0;/*SCON*/sbitSM0=0x9F;sbitSM1=0x9E;sbitSM2=0x9D;sbitREN=0x9C;sbitTB8=0x9B;sbitRB8=0x9A;sbitTI=0x99;sbitRI=0x98;#endif

牛牛文库文档分享第60页/共357页

从上面的代码中,我们看到,该头文件主要是用了sfr和sbit这两个关键字,去定义了51系列单片机内部所有寄存器硬件的符号名。如“sfrP0=0x80”,就用“P0”来表示单片机内部地址为0X80的特殊功能寄存器。因此,我们在程序中就可直接用P0表示地址为0X80处的寄存器,进而用语句来操作这个寄存器。如果没有用文件包含的方法包含进来,就只能让我们自己来定义,就要多做很多工作。基于这个道理,我们要在程序中的第一行,放上包含这个文件的预处理命令。这样,就能在程序中,直接使用诸如“P1”,“TH1”“SBUF”等“符号硬件”,省去了用“0X??”去访问单片机的有关硬件,或自己去亲自定义这些符号的麻烦

这就是我们总是在程序的开头,写上一条包含REG51.h文件命令的原因。

牛牛文库文档分享第61页/共357页3.1并驾齐驱的跑马灯1案例效果说明:并驾齐驱的跑马灯显示效果由六场显示组成,并字的含义是四个数码管同步显示同名笔画,即第一场四个数码管都显示笔画a,第二场四个数码管都显示笔画b,第三场四个数码管都显示笔画c,第四场都显示笔画d、第五场都显示笔画e,第六场都显示笔画f。程序整个运行过程如下图。

牛牛文库文档分享第62页/共357页2案例7源程序/*------------------------------------

案例7:并驾齐驱的跑马灯

------------------------------------*/#include"reg51.h"sbitqw =P2^0; //定义MCU管脚P2.0位寻址变量名sbitbw =P2^1;//定义MCU管脚P2.1位寻址变量名sbitsw =P2^2;//定义MCU管脚P2.2位寻址变量名sbitgw =P2^3;//定义MCU管脚P2.3位寻址变量名/*------延时子函数------*/Delay() {unsignedinti;for(i=1;i<25000;i++){;}}

牛牛文库文档分享第63页/共357页/*-------------------------------------------------数码管显示函数-------------------------------------------------*/Disp_led(){//做准备工作

qw=0; /*开通千位(左边第一位)上的数码管显示*/bw=0; //开通百位上的数码管显示

sw=0; //开通十位上的数码管显示

gw=0; //开通个位上的数码管显示

//第一场

P0=0xfe; //把笔划'a'码赋给P0口

Delay(); //延时

//第二场

P0=0xfd;//把单笔划'b'码赋给P0口

Delay(); //延时

//第三场

P0=0xfb;//把单笔划'c'码赋给P0口

Delay();//延时

//第四场

P0=0xf7; //把单笔划'd'码赋给P0口

Delay(); //延时

牛牛文库文档分享第64页/共357页//第五场

P0=0xef;//把单笔划'e'码赋给P0口

Delay();//延时

//第六场

P0=0xdf;//把单笔划'f'码赋给P0口

Delay();//延时}/*-------------------------------------------------主函数重复调用显示函数来实现程序功能-------------------------------------------------*/voidmain(){ while(1) { Disp_led();}}

牛牛文库文档分享第65页/共357页3案例7程序的流程图

牛牛文库文档分享第66页/共357页4案例7程序的下载操作与运行效果

牛牛文库文档分享第67页/共357页3.2迈步边关的巡逻灯1案例效果说明:

边关迈步的巡逻灯显示效果由十二场显示组成。第一场显示千位数码管上的a笔画;第二场显示百位数码管上的a笔画;第三场显示十位数码管上的a笔画;第四场显示个位数码管上的a笔画;第五场显示个位数码管上的b笔画;第六场显示个位数码管上的c笔画;第七场显示个位数码管上的d笔画;第八场显示十位数码管上的d笔画;第九场显示百位数码管上的d笔画;第十场显示千位数码管上的d笔画;第十一场显示千位数码管上的e笔画;第十二场显示千位数码管上的f笔画。示意图如下。

牛牛文库文档分享第68页/共357页2案例源程序/*------------------------------------

案例8:迈步边关的巡逻灯

------------------------------------*/#include"reg51.h"sbitqw =P2^0; //定义MCU管脚P2.0位寻址变量名sbitbw =P2^1;//定义MCU管脚P2.1位寻址变量名sbitsw =P2^2;//定义MCU管脚P2.2位寻址变量名sbitgw =P2^3;//定义MCU管脚P2.3位寻址变量名voidDelay(); //声明函数Delay()voidDisp_led();//声明函数Disp_led/*-------------------------------------------------主函数重复调用数码管显示函数以显示巡逻灯-------------------------------------------------*/voidmain(){

while(1) { Disp_led();

}}

牛牛文库文档分享第69页/共357页/*-------------------------------------------------数码管显示函数-------------------------------------------------*/voidDisp_led(){//准备工作

qw=1; //关断千位上的数码管显示

bw=1; //关断百位上的数码管显示

sw=1; //关断十位上的数码管显示

gw=1; //关断个位上的数码管显示

//第一场

P0=0xfe; //把笔画a的显示码赋给P0口

qw=0; /*开通千位(左边第一位)上的数码管显示*/Delay(); //延时

qw=1;//关断千位上的数码管显示

//第二场

P0=0xfe; //把笔画a的显示码赋给P0口

bw=0; /*开通百位(左起第二位)上的数码管显示*/Delay(); //延时

bw=1; //关断百位上的数码管显示

牛牛文库文档分享第70页/共357页

//第三场

P0=0xfe; //把笔画a的显示码赋给P0口

sw=0; /*开通十位(左起第三位)上的数码管显示*/Delay(); //延时

sw=1; //关断十位上的数码管显示

//第四场

P0=0xfe; //把笔画a的显示码赋给P0口

gw=0;/*开通个位(左起第四位)上的数码管显示*/Delay();//延时

gw=1;//关断个位上的数码管显示

//第五场

P0=0xfd;//把笔画b的显示码赋给P0口

gw=0; /*开通个位(左起第四位)上的数码管显示*/Delay();//延时

gw=1;//关断个位上的数码管显示

牛牛文库文档分享第71页/共357页//第六场

P0=0xfb; //把笔画c的显示码赋给P0口

gw=0; /*开通个位(左起第四位)上的数码管显示*/Delay(); //延时

gw=1; //关断个位上的数码管显示

//第七场

P0=0xf7; //把笔画d的显示码赋给P0口

gw=0; /*开通个位(左起第四位)上的数码管显示*/Delay(); //延时

gw=1; //关断个位上的数码管显示

//第八场

P0=0xf7; //把笔画d的显示码赋给P0口

sw=0;/*开通十位(左起第三位)上的数码管显示*/Delay();//延时

sw=1; //关断十位上的数码管显示

牛牛文库文档分享第72页/共357页//第九场

P0=0xf7; //把笔画d的显示码赋给P0口

bw=0; /*开通百位(左起第二位)上的数码管显示*/Delay(); //延时

bw=1; //关断百位上的数码管显示

//第十场

P0=0xf7;//把笔画a的显示码赋给P0口

qw=0; /*开通千位(左边第一位)上的数码管显示*/Delay(); //延时

qw=1; //关断个位上的数码管显示

//第十一场

P0=0xef;//把笔画e的显示码赋给P0口

qw=0; /*开通千位(左边第一位)上的数码管显示*/Delay(); //延时

qw=1; //关断个位上的数码管显示

牛牛文库文档分享第73页/共357页

//第十二场

P0=0xdf; //把笔画f的显示码赋给P0口

qw=0; /*开通千位(左边第一位)上的数码管显示*/Delay(); //延时

qw=1; //关断个位上的数码管显示}/*------延时函数------*/voidDelay() {unsignedinti;for(i=0;i<25000;i++){;}}

牛牛文库文档分享第74页/共357页3案例8程序的流程图

牛牛文库文档分享第75页/共357页4案例8程序的下载操作与运行效果

牛牛文库文档分享第76页/共357页3.3大江东去的流水灯1案例效果说明:

大江东去的流水灯显示效果由八场显示组成,第一场显示千位数码管上的e、f两笔画;第二场显示千位数码管上的b、c两笔画;第三场显示百位数码管上的e、f两笔画;第四场显示百位数码管上的b、c两笔画;第五场显示十位数码管上的e、f两笔画;第六场显示十位数码管上的b、c两笔画;第七场显示个位数码管上的e、f两笔画;第八场显示个位数码管上的b、c两笔画。各场显示的示意图如下。

牛牛文库文档分享第77页/共357页2案例源程序/*------------------------------------

案例9:大江东去的流水灯

------------------------------------*/#include"reg51.h"sbitqw =P2^0; //定义MCU管脚P2.0位寻址变量名sbitbw =P2^1;//定义MCU管脚P2.1位寻址变量名sbitsw =P2^2;//定义MCU管脚P2.2位寻址变量名sbitgw =P2^3;//定义MCU管脚P2.3位寻址变量名/*-------------------------------------------------主函数重复调用显示函数字以显示巡逻灯-------------------------------------------------*/voidmain(){ while(1) Disp_led();}

牛牛文库文档分享第78页/共357页/*-------------------------------------------------数码管显示函数-------------------------------------------------*/Disp_led(){//第一场

qw=0;/*开通千位(左边第一位)上的数码管显示*/bw=1; //关断百位上的数码管显示

sw=1; //关断十位上的数码管显示

gw=1; //关断个位上的数码管显示

P0=0xcf; //把f、e笔画的显示码赋给P0口

Delay();//延时

//第二场

qw=1; /*开通千位(左边第一位)上的数码管显示*/bw=0; //关断百位上的数码管显示

sw=1; //关断十位上的数码管显示

gw=1; //关断个位上的数码管显示

P0=0xf9; //把b、c笔画的显示码赋给P0口

Delay(); //延时

牛牛文库文档分享第79页/共357页//第三场

qw=1; //关断千位上的数码管显示

bw=0; /*开通百位(左起第二位)上的数码管显示*/sw=1; //关断十位上的数码管显示

gw=1; //关断个位上的数码管显示

P0=0xcf; //把f、e笔画的显示码赋给P0口

Delay(); //延时

//第四场

qw=1; //关断千位上的数码管显示

bw=0; /*开通百位(左起第二位)上的数码管显示*/sw=1; //关断十位上的数码管显示

gw=1; //关断个位上的数码管显示

P0=0xf9; //把c、b笔画的显示码赋给P0口

Delay(); //延时

牛牛文库文档分享第80页/共357页

//第五场

qw=1; //关断千位上的数码管显示

bw=1; //关断百位上的数码管显示

sw=0; /*开通十位(左起第三位)上的数码管显示*/gw=1; //关断个位上的数码管显示

P0=0xcf; //把f、e笔画的显示码赋给P0口

Delay(); //延时

//第六场

qw=1; //关断千位上的数码管显示

bw=1; //关断百位上的数码管显示

sw=0; /*开通十位(左起第三位)上的数码管显示*/gw=1; //关断个位上的数码管显示

P0=0xf9; //把c、b笔画的显示码赋给P0口

Delay(); //延时

牛牛文库文档分享第81页/共357页//第七场

qw=1; //关断千位上的数码管显示

bw=1; //关断百位上的数码管显示

sw=1; //关断十位上的数码管显示

gw=0; /*开通个位(左起第四位)上的数码管显示*/P0=0xcf; //把f、e笔画的显示码赋给P0口

Delay(); //延时

//第八场

qw=1; //关断千位上的数码管显示

bw=1; //关断百位上的数码管显示

sw=1; //关断十位上的数码管显示

gw=0; /*开通个位(左起第四位)上的数码管显示*/P0=0xf9; //把c、b笔画的显示码赋给P0口

Delay(); //延时}/*------延时函数------*/Delay() {unsignedinti;for(i=0;i<25000;i++);}

牛牛文库文档分享第82页/共357页3案例9程序的流程图

牛牛文库文档分享第83页/共357页4案例9程序的下载操作与运行效果

牛牛文库文档分享第84页/共357页3.4孔雀开屏式循环灯1案例效果说明:

本案例的显示效果由4场组成。第一场显示出四个数码管中间的4个竖笔画,第二场显示出四个数码管中间的8个竖笔画,第三场显示出中间的12个竖笔画,第四场显示出全部竖笔画。用这四场的循环显示,模拟孔雀开屏的效果。

牛牛文库文档分享第85页/共357页2案例源程序/*------------------------------------

案例10:孔雀开屏式循环灯

------------------------------------*/#include"reg51.h"sbitqw =P2^0; //定义MCU管脚P2.0位寻址变量名sbitbw=P2^1;//定义MCU管脚P2.0位寻址变量名sbitsw =P2^2;//定义MCU管脚P2.2位寻址变量名sbitgw =P2^3;//定义MCU管脚P2.3位寻址变量名unsignedcharq,b,s,g;//定义相应位的笔画码变量,提高笔画 //显示的灵活性/*------延时函数------*/Delay() {unsignedinti;for(i=0;i<500;i++);}

牛牛文库文档分享第86页/共357页/*-------------------------------------------------数码管显示函数-------------------------------------------------*/Disp_led(){ //准备工作

qw=1; //关断千位上的数码管显示

bw=1; //关断百位上的数码管显示

sw=1; //关断十位上的数码管显示

gw=1; //关断个位上的数码管显示

//第一时段:显示千位上的数码管

P0=q;//用变量为笔划码赋给P0口

qw=0;/*开通千位(左边第一位)上的数码管显示*/Delay(); //延时

qw=1;//关断千位上的数码管显示

牛牛文库文档分享第87页/共357页

//第二时段:显示百位上的数码管

P0=b; //用变量为笔划码赋给P0口

bw=0; /*开通百位(左起第二位)上的数码管显示*/Delay(); //延时

bw=1; //关断百位上的数码管显示

//第三时段:显示十位上的数码管

P0=s; //用变量为笔划码赋给P0口

sw=0; /*开通十位(左起第三位)上的数码管显示*/Delay(); //延时

sw=1; //关断十位上的数码管显示

//第四时段:显示个位上的数码管

P0=g; //用变量为笔划码赋给P0口

gw=0; /*开通个位(左起第四位)上的数码管显示*/Delay(); //延时

gw=1; //关断个位上的数码管显示}

牛牛文库文档分享第88页/共357页/*-------------------------------------------------主函数-------------------------------------------------*/voidmain(){inta,n; while(1) { for(a=1;a<=4;a++) {if(a==1) { q=0xff; b=0xf9; s=0xcf; g=0xff; } if(a==2) {q=0xff;b=0xc9;s=0xc9;g=0xff;}

牛牛文库文档分享第89页/共357页

if(a==3) q=0xf9,b=0xc9,s=0xc9,g=0xcf; if(a==4) q=0xc9,b=0xc9,s=0xc9,g=0xc9;

for(n=1;n<50;n++) Disp_led();} }}

牛牛文库文档分享第90页/共357页3案例10程序的流程图

牛牛文库文档分享第91页/共357页4案例10程序的下载操作与运行效果

牛牛文库文档分享第92页/共357页3.5奔腾不息的”8051”

1案例效果说明:

本案例的显示效果由8场组成。第一场只在千位数码管上显示‘8’;第二场只在千位数码管和百位数码管上分别显示‘8’和‘0’;第三场只在左边三个数码管上分别显示‘8’、‘0’、‘5’;第四场四个数码管分别显示‘8’、‘0’、‘5’、‘1’;第五场关掉全部显示;第六场显示完整的“8051”;第七场关掉全部显示;第八场再显示完整的“8051”。这个奔腾不息的”8051”显示示意图如下图。

牛牛文库文档分享第93页/共357页2案例源程序/*------------------------------------

案例11:奔腾不息的8051------------------------------------*/#include"reg51.h"sbitqw =P2^0; //定义MCU管脚P2.0位寻址变量名sbitbw =P2^1;//定义MCU管脚P2.1位寻址变量名sbitsw =P2^2;//定义MCU管脚P2.2位寻址变量名sbitgw =P2^3;//定义MCU管脚P2.3位寻址变量名bitq=0;bitb=0;bits=0;bitg=0;/*------延时子程序------*/voidDelay() {unsignedinti;for(i=0;i<500;i++){;}}

牛牛文库文档分享第94页/共357页/*-------------------------------------------------数码管显示子程序-------------------------------------------------*/voidDisp_led(){qw=1;bw=1;sw=1;gw=1;

//显示千位上的'8'P0=0x80; //把数字'8'的笔划码赋给P0口

qw=0|q; /*开通千位(左边第一位)上的数码管显示*/Delay(); //延时

qw=1;//关掉显示

//显示百位上的'0'P0=0xc0; //把数字'0'的笔划码赋给P0口

bw=0|b; /*开通百位(左起第二位)上的数码管显示*/Delay(); //延时

bw=1; //关掉显示

牛牛文库文档分享第95页/共357页//显示十位上的'5'P0=0x92; //把数字'5'的笔划码赋给P0口

sw=0|s; /*开通十位(左起第三位)上的数码管显示*/Delay(); //延时

sw=1; //关掉显示

//显示个位上的'1'P0=0xf9; //把数字'1'的笔划码赋给P0口

gw=0|g; /*开通个位(左起第四位)上的数码管显示*/Delay(); //延时

gw=1;//关掉显示}/*-------------------------------------------------主函数重复调用数码管显示函数以显示数字8051-------------------------------------------------*/voidmain(){inta,n;

牛牛文库文档分享第96页/共357页 while(1) { for(a=1;a<=8;a++) {if(a==1) {q=0;b=1;s=1;g=1;} /*关掉右边三个数码管的显示*/ if(a==2){q=0;b=0;s=1;g=1;} /*关掉右边两个数码管的显示*/if(a==3) q=0,b=0,s=0,g=1; /*关掉右边的个数码管的显示*/ if(a==4) q=0,b=0,s=0,g=0; if(a==5) q=1,b=1,s=1,g=1; /*关掉四个数码管的显示*/ if(a==6) q=0,b=0,s=0,g=0; if(a==7) q=1,b=1,s=1,g=1; /*关掉四个数码管的显示*/ if(a==8) q=0,b=0,s=0,g=0; for(n=1;n<50;n++) Disp_led();} }}

牛牛文库文档分享第97页/共357页3案例11程序的流程图

牛牛文库文档分享第98页/共357页4案例11程序的下载操作与运行效果

牛牛文库文档分享第99页/共357页3.69999倒数数的数码管显示1案例效果说明:四位数码管首先显示9999,再显示9998,再9997,…,0002,0001,0000,然后又9999,9998,9997,…,0

温馨提示

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

评论

0/150

提交评论