您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 单片机C语言案例教程电子教案
单片机C语言案例教程电子教案第1章单片机基础第3章用数码管模拟的循环灯第4章中断资源的应用编程第5章日历时钟DS1302的应用编程第6章AT24C02的应用编程第7章DS18B20的应用编程第8章有时控功能和温度显示的电子钟项目设计第9章16×16点阵LED汉字显示屏项目设计第10章使用片内EEPROM存储器第11章单片机与PC的串行通信第12章单片机片外数据存储器的扩充第13章A/D转换与D/A转换简介第1章单片机基础1我们所说的单片机,是一块集成电路芯片。下面的三个型号的单片机芯片,都属于8051系列,其品牌为STC。它们的内部组成可认为完全相同,都能直接用在本书单片机学习板的MCU插座上,但性能有所差异。左上为STC89C52的实物图,其片内存储器容量大于STC89C51。左中为STC90C52的实物图,可替代STC89C52,且性能更好。1.1单片机是块集成电路芯片左下为STC12C5A32的实物图,是所谓的1T单片机,其工作速度比上面两个型号快得多。251系列单片机的内部结构示意图351系列单片机引脚功能图左图为8051系列单片机的引脚功能图,它采用双列直插40引脚封装,它所有引脚的功能我们要全部记住。1.2用单片机芯片组成单片机应用系统1本书单片机学习板电原理路图2本书单片机学习板印刷电路图3本书单片机学习板四位数码管电原理图1.3对单片机编程以实现单片机系统的功能•案例1:编程实现,在4位数码管的最左位上显示“8。”案例源程序#includereg51.hsbitqw=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只发光二极管正极为高电平。1.4把程序写入单片机芯片的操作平台和操作步骤1首先,在桌面上双击Keil的图标,如下图箭头所指。一建立工程文件2系统进入该软件的初始界面,如下图3在上一图中,须单击菜单栏中的Project菜单及其子菜单NewProject,如下图所示。4于是弹出建立新nVisionz工程项目对话框,如下图:在上图的“保存在(I)”下拉列表框中选择D盘下的“stc89c52”文件夹,在文件名文本框中,输入工程名“stc89c52”,然后单击“保存”。此时,系统将弹出CPU选择窗口,如下页图。5在列表框中选择并展开“Atmel”,如下图箭头所指6展开“Atmel”项后如下图在上图中往下拉滚动条,选中“AT89C52”,如下页图。7如下图,选中后单击确定。随后,在弹出的询问框中,选择“是(Y)”即可。二建立程序文件1在菜单栏中单击“File”菜单及其子菜单“New”子菜单,此时在工作界面中会弹出一文本编辑窗口,如下图。说明:单片机程序的编写,就是在上面这一窗口中进行。2把在四位数码管左边显示“8。”的C源程序,从键盘上照敲进去。如下图。3程序敲完后,单击“File”菜单及其子菜单“Save”,如下图4在其弹出的对话框中的文件名文本框中输入相应的文件名“stc89c52.c”,如下图注意:这里必须输入C51源程序的扩展名“.c”来保存。第三步,把程序文件加载到工程项目中。1在ProjectWindows窗口内,展开Tageget1,右击SourceGroup1,如下图。4右击后出现如下界面在上图菜单中单击“AddFilestoGroup‘SourceGroup1’”,则弹出如下页对话框。5选中“stc89c52”文件后单击“Add”按钮,再单击“Clese”按钮,则加载工作结束。如下图。此时若展开SourceGroup1,就能看到stc89c52.c已经加入其中。如下图。第四步,设置编译和链接环境。1单击ProjectA菜单及其子菜单optionfortarget‘Target1’,如下图。将弹出编译链接设置界面,如下图。在上图中,单击Output标签后,在复选框GreatHEXFi:上打√,其余可用默认值,然后确定,如下图。第五步,编译成HEX文件。单击Project菜单及其子菜单Ruildalltargetfiles,系统就将.C源程序文件编译成指定格式的.HEX文件.如下图。上图编译信息窗中最后一行告诉我们,源程序有0个错误和0个警告。这是最好结论。有1个错误都不能通过编译,必须针对错误提示信息进行修改。对警告则可改可不改。第六步,将第五步产生.HEX文件下载到单片机芯片中。把单片机学习板上的电源和串口连线与PC机接通,用鼠标依次单击“开始”“程序”“STC_ISP_V4.80”STC_ISP_V4.80”,就进入如下界面.在MCU类型的下拉列表框中选择”STC89C52RC”,再单击”打开程序文件”按钮,弹出”Openfile(*.hexor*.bin)对话框.如下图.先在上图的下拉列表框中打开“D:\STC89C52”文件夹,随之就出现“STC8051.hex”文件,单击该文件后再单击“打开”按钮,就返回到下载界面,如下图。按下载软件的提示,关闭一下单片机电源再打开,就可看到下载过程和进度,下载完成后,就可看到单片机四位数码管左边显示的”8。”。案例1下载过程与运行效果1.5从数码管显示学单片机编程1.5.1案例2:数码管上的“8。8。”显示1源程序#includereg51.hsbitqw=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。”。3用流程图表示算法案例2程序的流程图案例1程序的流程图用自然语言描述操作步骤用C语句描术操作步骤4仿案例1程序的上机操作全过程,完成案例2程序的下载和运行5案例2程序的下载操作与运行效果1.5.2案例3:被动形式的“8051”显示#includereg51.hsbitqw=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源程序2案例源程序要点分析:本案例中对四位数码管的每一位都要进行控制,因此要定义四个位寻址变量:qw、bw、sw和gw。主函数由五个执行段组成。第一执行段有四个赋值语句,作用是关断四个数码管的显示;第二段有三个赋值语句,作用是在数码管的第1位(从左数到右,下同)上显示“8”后关断;第三段是在数码管的第2位上显示“0”后关断;第四段是在数码管的第3位上显示“5”后关断;第五段是在数码管的第4位上显示“1”后关断。3案例3程序的流程图4案例3程序的下载过程与运行效果15.3案例4:主动形式的“8051”显示3物理现象解惑:案例3中本应一闪而过的“8051”变成了显示长在的“8051”,其原因在于编译系统。单片机程序是在编译系统的迫使下,被动地重复运行,“8051”的显示才永不休止。下面的程序,是程序自己主动地进行“8051”的重复显示。从视觉效果上看,被动形式的“8051”,比主动形式的“8051”亮度要小。1对案例3程序的基本分析:在案例3中,main函数中的最后一个操作是“gw=1;”,这就是关掉第4位数码管的显示,按此程序设计的本来效果,数码管上显示的“8051”应是一闪而过,此后数码管因全部被关断而无任何显示。2案例3程序的一个推论:编译系统有个特殊处理,即在main函数结束而返回的指令处,加了一条跳转指令,迫使单片机程序重新运行。4源程序#includereg51.hsbitqw=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;}}案例源程序要点分析:与案例3的源程序相比,案例4源程序中的5个执行段,被一个while循环架构所管辖。在此,先简单地说明一个要点,当while后面的小括号中是整数1是,它大括号中的所有语句,将被无数轮重复执行。因此,在案例4程序中,while下面大括号中的那16个赋值语句,从上到下依次执行一轮后,又将回到上面,又从上到下依次执行一轮,再回到上面,如此永无休止地循环下去,从而实现“8051”的正常显示5案例程序分析及流程图流程图6案例4的下载操作运行效果15.4案例5:模块化的“8051”显示#includereg51.hsbitqw=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源程序voidmain(){while(1){Disp_led();}}案例5这个程序的运行特点是,执行流程从主函数进入后,就进入其中的while循环,while循环的循环体中,只有一个函数调用语句“Disp_led();”,执行这一函数调用语句,程序执行流程就跳转到Disp_led函数中继续执行,即从上到下依次执行那16个赋值语句,第16个赋值语句执行完就是Disp_led函数的结束标志“}”,被调函数运行到其结束标志时,程序执行流程就从被调函数返回到主调函数原调用处继续往下执行,原调用语句下面就是循环体的结束标志“}”,因此又进入下一次“Disp_led();”调用,程序执行流程又跳转到Disp_led函
本文标题:单片机C语言案例教程电子教案
链接地址:https://www.777doc.com/doc-68276 .html