收藏 分销(赏)

51单片机20个实验,代码详细.doc

上传人:二*** 文档编号:4750125 上传时间:2024-10-11 格式:DOC 页数:115 大小:1.04MB 下载积分:5 金币
下载 相关
51单片机20个实验,代码详细.doc_第1页
第1页 / 共115页
本文档共115页,全文阅读请下载到手机保存,查看更方便
资源描述
. 第一章 单片机系统板说明 一、概述 单片机实验开发系统是一种多功能、高配置、高品质的MCS-51单片机教学与开发设备。适用于大学本科单片机教学、课程设计和毕业设计以及电子设计比赛。 该系统采用模块化设计思想,减小了系统面积,同时增加了可靠性,使得单片机实验开发系统能满足从简单的数字电路实验到复杂的数字系统设计实验,并能一直延伸到综合电子设计等创新性实验项目。该系统采用集成稳压电源供电,使电源系统的稳定性大大提高,同时又具备完备的保护措施。为适应市场上多种单片机器件的应用,该系统采用“单片机板+外围扩展板”结构,通过更换不同外围扩展板,可实验不同的单片机功能,适应了各院校不同的教学需求。 二、 单片机板简介 本实验系统因为自带了MCS-51单片机系统,因此没有配置其他单片机板,但可以根据教学需要随时配置。以单片机板为母板,并且有I/O接口引出,可以很方便的完成所有实验。因此构成单片机实验系统。 1、主要技术参数 (1)MSC-51单片机板 板上配有ATMEL公司的STC89C51芯片。 STC89C51资源:32个I/O口;封装DIP40。 STC89C51开发软件:KEIL C51。 2、MSC-51单片机结构 (1)单片机板中央放置一块可插拔的DIP封装的STC89C51芯片。 (2)单片机板左上侧有一个串口,用于下载程序。 (3)单片机板的四周是所有I/O引脚的插孔,旁边标有I/0引脚的脚引。 (4)单片机板与各个模块配合使用时,可形成—个完整的实验系统。 三、 母板简介 主要技术参数 (1)实验系统电源 实验系统置了集成稳压电源,使整个电源具有短路保护、过流保护功能,提高了实验的稳定性。 主板的右上角为电源总开关,当把220V交流电源线插入主板后,打开电源开关,主板得电工作。为适用多种需要,配置了+5V,+12V,—5V电压供主板和外设需要,通过右上角的插针排和插孔输出到外设。此外,还设有螺旋保险插孔保护实验箱。 (2)RS232接口 RS232接口通过MAX232芯片实现与计算机的串行通讯,通过接口引出信号。 (3)单片机最小系统 单片机最小系统的核心是ATMEL公司的AT89S51单片机,AT89S51右边的按键是复位键,按下时单片机复位,单片机的放两排插孔,分别是:P1.0-P1.7,P0.0-P1.7,P3.0—P3.7, P2.0—P2.7,它们可以实现单片机实验和开发。 (4)模拟量接口 一个模拟量接口,由ICL8038产生,通过插孔引出。 (5)D/A转换器 D/A转换器由DA0832,LM324芯片组成,(8位,0-5V电压输出),对应的接口序号为:数据信号:D0-D7;片选信号:/CS;读有效信号/OE。 (6)A/D转换器 A/D转换器和 D/A转换器相临,主要由ADC0809组成,(8位)对应的接口序号为:模拟输入:IN0-IN7;基准电压:REF+,REF -;读写信号:/RD,/WR;输出信号:D0——D7;检测信号:I/0;地址锁存允许:ALE。 (7)8位拨动开关 8位拨动开关由Kl—K8组成,每一位都有相应LED(Dl—D8)指示,当拨码开关拨上边时输出高电平,LED亮;拨下边时输出低电平,由插孔l—8输出。 (8)24位按键开关 24位按键开关位于主板中下方,由按键Kl—K24组成,有六排,第一排按下时是高电平,弹上时是低电平,由插孔1—4输出;第二排按下时是低电平,弹上时高电平,由插孔1—4输出;第三到第六排是4*4的行列式键盘;由L1—L4,H1—H4输出。 (9)静态显示数码管 静态显示区由数码管DP1—DP6组成,由插孔输出,供静态显示用。 (10)发光二极管显示区 8位红色发光二极管,高电平亮,可作为状态指示用;另一部分是交通灯,由东西南北四组红绿黄发光二极管构成,高电平亮。 (11)动态扫描显示区 系统的显示采用8位8段共阴或共阳数码管(高电平有效),所对应的接口序号为:段码:a,b,c,d,e,f,g,h;位选:L1,L2,L3,L4,L5,L6,L7,L8。 (12)蜂鸣器 蜂鸣器(高电平TTL驱动)从其下方对应输入口,会产生lKHz的信号响声。 (13)继电器控制区 继电器控制区主要由KJ1—KJ3三个继电器及其驱动电路组成,高电平TTL驱动,输出接口分别为JJ1,JJ2,JJ3。 (14)数字温度计 数字温度计使用DS1302温度传感器,输出接口为SCLK、I/O、RESET。 (15)EEPROM EEPROM(AT24C16),用来保存数据信息,接口序号为:串行数据线:SDA;时钟线:SCL;写保护线:WP。 (16)串行A/D A/D转换器主要由MAX192组成,(8位)对应的接口序号为:模拟输入:IN0-IN7;片选信号:/CS;输出信号:DOUT;时钟信号:SCLK;转换开始:SSTRB。 (17)变频模块 (18)直流斩波模块 (19)红外模块 四、 主要实验项目 本实验系统由于采用模块化设计,各模块之间既相互独立,又可相互组合,完成各种类型实验。其中包括验证性基础实验,综合性、设计性、创新性实验以及研究开发性、创新性、及全国电子大赛赛前培训实验等。以下列举了本实验系统能做的部分单片机原理课程实验及课外开放性备选实验项目。 单片机原理课程实验 实验一 LED显示器指示 实验二 软件延时及灯光控制实验 实验三 多级外部中断实验 实验四 脉冲频率的测量实验 实验五 串行口扩展实验 实验六 串行EEPROM的读出和写入实验 实验七 8位A/D、D/A转换器的应用实验 实验八 串行A/D、D/A的应用实验 实验九 直流继电器的驱动及控制实验 实验十 数据采集的软件抗干扰实验 实验十一 密码锁控制器的设计 实验十二 数字温度控制器的设计 实验十三 8255扫描键盘显示实验 实验十四 音乐编程实验 实验十五 声光报警实验 实验十六 可预置可逆计数器实验 实验十七 DS1302时钟芯片的应用实验 实验十八 红外通信接口实验 实验十九 单片机变频调速实验 实验二十 交通灯控制实验 部分备选实验项目 实验一 闪烁灯 实验一 模拟开关灯 实验一 多路开关状态指示 实验一 广告灯的左移右移 实验一 广告灯(利用取表方式) 实验一 报警产生器 实验一 I/O并行口直接驱动LED显示 实验一 按键识别方法之一 实验一 00-99计数器 实验一 定时计数器T0作定时应用技术(一) 实验一 动态数码显示技术 实验一 4×4矩阵式键盘识别技术 实验一 定时计数器T0作定时应用技术(一) 实验一 定时计数器T0作定时应用技术(二) 实验一 “叮咚”门铃 实验一 数字钟 实验一 ADC0809A/D转换器基本应用技术 第二章   Keil C软件使用 Keil C51 软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM 语言和 C 语言的程序设计,界面友好,易学易用。 下面介绍Keil C51软件的使用方法 进入 Keil C51 后,屏幕如下图所示。几秒钟后出现编辑界 启动Keil C51时的屏幕                    进入Keil C51后的编辑界面 简单程序的调试  学习程序设计语言、学习某种程序软件,最好的方法是直接操作实践。下面通过简单的编程、调试,引导大家学习Keil C51软件的基本使用方法和基本的调试技巧。  1)建立一个新工程  单击Project菜单,在弹出的下拉菜单中选中New Project选项  2)然后选择你要保存的路径,输入工程文件的名字,比如保存到C51目录里,工程文件的名字为C51 如下图所示,然后点击保存.  3)这时会弹出一个对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,keil c51几乎支持所有的51核的单片机,我这里还是以大家用的比较多的Atmel 的89C51来说明,如下图所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定.  4)完成上一步骤后,屏幕如下图所示  到现在为止,我们还没有编写一句程序,下面开始编写我们的第一个程序。  5)在下图中,单击“File”菜单,再在下拉菜单中单击“New”选项  新建文件后屏幕如下图所示 此时光标在编辑窗口里闪烁,这时可以键入用户的应用程序了,但笔者建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“Save As”选项单击,屏幕如下图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名,同时,必须键入正确的扩展名。注意,如果用C语言编写程序,则扩展名为(.c);如果用汇编语言编写程序,则扩展名必须为(.asm)。然后,单击“保存”按钮。  6)回到编辑界面后,单击“Target 1”前面的“+”号,然后在“Source Group 1”上单击右键,弹出如下菜单  然后单击“Add File to Group ‘Source Group 1’” 屏幕如下图所示  选中Test.c,然后单击“Add ”屏幕好下图所示  注意到“Source Group 1”文件夹中多了一个子项“Text1.c”了吗?子项的多少与所增加的源程序的多少相同  7)现在,请输入如下的C语言源程序:  #include <reg52.h>          //包含文件  #include <stdio.h>  void main(void)           //主函数  {     SCON=0x52;  TMOD=0x20;  TH1=0xf3;  TR1=1;               //此行及以上3行为PRINTF函数所必须  printf(“Hello I am KEIL. \n”);   //打印程序执行的信息  printf(“I will be your friend.\n”);  while(1);  }  在输入上述程序时,读者已经看到了事先保存待编辑的文件的好处了吧,即Keil c51会自动识别关键字,并以不同的颜色提示用户加以注意,这样会使用户少犯错误,有利于提高编程效率。程序输入完毕后,如下图所示  8)在上图中,单击“Project”菜单,再在下拉菜单中单击“Built Target”选项(或者使用快捷键F7),编译成功后,再单击“Project”菜单,在下拉菜单中单击“Start/Stop Debug Session”(或者使用快捷键Ctrl+F5),屏幕如下所示  9)调试程序:在上图中,单击“Debug”菜单,在下拉菜单中单击“Go”选项,(或者使用快捷键F5),然后再单击“Debug”菜单,在下拉菜单中单击“Stop Running”选项(或者使用快捷键Esc);再单击“View”菜单,再在下拉菜单中单击“Serial Windows #1”选项,就可以看到程序运行后的结果,其结果如下图所示 至此,我们在Keil C51上做了一个完整工程的全过程。但这只是纯软件的开发过程,如何使用程序下载器看一看程序运行的结果呢? 10)单击“Project”菜单,再在下拉菜单中单击“” 在下图中,单击“Output”中单击“Create HEX File” 选项,使程序编译后产生HEX代码,供下载器软件使用。把程序下载到AT89S51单片机中。 第三章   AT89S51单片机下载器软件使用 AT89S51单片机下载器是专门用于下载程序到单片机系统中,该软件使用方便。启动软件之后进入下面的界面(如图3.1所示): 图3.1 在上图中: 1. 界面右边为操作状态显示区; 2. 界面左上为下载芯片选择区,该软件支持多种芯片的程序在线下载,对系统板上的单片机AT89S51是其中一种,软件默认情况下为AT89S51单片机。 3. 界面左边为在线下载的操作区,它可以提供如下的操作 (1). 初始化:启动AT89S51单片机进入ISP下载状态,若启动成功,则状态显示区就会显示如图3.2所示的文字。否则,不成功会有“初始化失败”的字样提示。 图3.2 (2). 特征字:点击一下检测器件,会读出单片机的芯片的特征字,对于AT89S51单片机的特征字为:1E 51 06。 (3). 擦除器件:是把单片机的容擦除干净,即单片机部ROM的容全为FFH。 (4). 写器件:把代码区中的程序代码下载到单片机的部ROM中。注意在编程之前,要对单片机芯片进行擦除操作。 (5). 效验数据:是经过编程之后,对下载到单片机部ROM中的容与代码区的容相比较,若程序下载过程中完全正确,则提示校验正确,否则提示出现错误。那就得需要重新下载程序到ROM中。 (6). 自动:提供了从部ROM从擦除到编程,最后到校验这三个过程。 (7). 读器件:从单片机部ROM中读取容到代码显示区中。 第四章   实验及实践课题 1. 闪烁灯 1.  实验任务 如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。 2.  电路原理图 图4.1.1 3.  系统板上硬件连线 把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。 4.  程序设计容 (1). 延时程序的设计方法 作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理: 498*20+2*20+2=10002 如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒 机器周期 微秒 MOV R6,#20 2个  2 D1: MOV R7,#248 2个  2       2+2×248=498 20× DJNZ R7,$ 2个  2×248             (498 DJNZ R6,D1 2个   2×20=40           10002 因此,上面的延时程序时间为10.002ms。 由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下: DELAY: MOV R5,#20 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET (2). 输出控制 如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。 5. 程序框图    如图4.1.2所示                  图4.1.2 6. 汇编源程序 ORG 0000H START: CLR P1.0 LCALL DELAY SETB P1.0 LCALL DELAY LJMP START DELAY: MOV R5,#20 ;延时子程序,延时0.2秒 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END 7. C语言源程序 #include <AT89X51.H> sbit L1=P1^0; void delay02s(void) //延时0.2秒子程序 { unsigned char i,j,k; for(i=20;i>0;i--) for(j=20;j>0;j--) for(k=248;k>0;k--); } void main(void) { while(1) { L1=0; delay02s(); L1=1; delay02s(); } } 2. 模拟开关灯 1. 实验任务 如图4.2.1所示,监视开关K1(接在P3.0端口上),K1拨上为高电平,拨下为低电平。用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关拨上,L1亮,开关拨下,L1熄灭。 2. 电路原理图 图4.2.1 3. 系统板上硬件连线 (1). 把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”      区域中的L1端口上; (2). 把“单片机系统”区域中的P3.0端口用导线连接到“八路拨动开关”区域中的K1端口上; 4. 程序设计容 (1). 开关状态的检测过程 单片机对开关状态的检测相对于单片机来说,是从单片机的P3.0端口输入信号,而输入的信号只有高电平和低电平两种,当拨开开关K1拨上去,即输入高电平,相当开关断开,当拨动开关K1拨下去,即输入低电平,相当开关闭合。单片机可以采用JB BIT,REL或者是JNB BIT,REL指令来完成对开关状态的检测即可。 (2). 输出控制 如图3所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。 5. 程序框图 开始 K1开关闭合了吗? L1亮 L1灭 图4.2.2 6. 汇编源程序 ORG 00H START: P3.0,LIG CLR P1.0 SJMP START LIG: SETB P1.0 SJMP START END 7. C语言源程序 #include <AT89X51.H> sbit K1=P3^0; sbit L1=P1^0; void main(void) { while(1) { if(K1==0) { L1=0; //灯亮 } else { L1=1; //灯灭 } } } 3. 多路开关状态指示 1. 实验任务 如图4.3.1所示,AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)。 2. 电路原理图 图4.3.1 3. 系统板上硬件连线 (1. 把“单片机系统”区域中的P1.0-P1.3用导线连接到“八路发光二极管指示模块”区域中的L1-L4端口上; (2. 把“单片机系统”区域中的P1.4-P1.7用导线连接到“八路拨动开关”区域中的K1-K4端口上; 4. 程序设计容 (1. 开关状态检测 对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用JB P1.X,REL或JNB P1.X,REL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOV A,P1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。 (2. 输出控制 根据开关的状态,由发光二极管L1-L4来指示,我们可以用SETB P1.X和CLR P1.X指令来完成,也可以采用MOV P1,#1111XXXXB方法一次指示。 5. 程序框图 开始 读P1口数据到ACC中 ACC内容右移4次 ACC内容与F0H相或 ACC内容送入P1口 图4.3.2 6. 方法一(汇编源程序) ORG 0000H START: MOV A,P1 ANL A,#0F0H RR A RR A RR A RR A ORL A,#0F0H MOV P1,A SJMP START END 7. 方法一(C语言源程序) #include <AT89X51.H> unsigned char temp; void main(void) { while(1) { temp=P1>>4; temp=temp | 0xf0; P1=temp; } } 8. 方法二(汇编源程序) ORG 00H START: P1.4,NEXT1 CLR P1.0 SJMP NEX1 NEXT1: SETB P1.0 NEX1: P1.5,NEXT2 CLR P1.1 SJMP NEX2 NEXT2: SETB P1.1 NEX2: P1.6,NEXT3 CLR P1.2 SJMP NEX3 NEXT3: SETB P1.2 NEX3: P1.7,NEXT4 CLR P1.3 SJMP NEX4 NEXT4: SETB P1.3 NEX4: SJMP START END 9. 方法二(C语言源程序) #include <AT89X51.H> void main(void) { while(1) { if(P1_4==0) { P1_0=0; } else { P1_0=1; } if(P1_5==0) { P1_1=0; } else { P1_1=1; } if(P1_6==0) { P1_2=0; } else { P1_2=1; } if(P1_7==0) { P1_3=0; } else { P1_3=1; } } } 4. 广告灯的左移右移 1. 实验任务 做单一灯的左移右移,硬件电路如图4.4.1所示,八个发光二极管L1-L8分别接在单片机的P1.0-P1.7接口上,输出“0”时,发光二极管亮,开始时P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0亮,重复循环。 2. 电路原理图 图4.4.1 3. 系统板上硬件连线 把“单片机系统”区域中的P1.0-P1.7用8芯排线连接到“八路发光二极管指示模块”区域中的L1-L8端口上,要求:P1.0对应着L1,P1.1对应着L2,……,P1.7对应着L8。 4. 程序设计容 我们可以运用输出端口指令MOV P1,A或MOV P1,#DATA,只要给累加器值或常数值,然后执行上述的指令,即可达到输出控制的动作。 每次送出的数据是不同,具体的数据如下表1所示 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 说明 L8 L7 L6 L5 L4 L3 L2 L1 1 1 1 1 1 1 1 0 L1亮 1 1 1 1 1 1 0 1 L2亮 1 1 1 1 1 0 1 1 L3亮 1 1 1 1 0 1 1 1 L4亮 1 1 1 0 1 1 1 1 L5亮 1 1 0 1 1 1 1 1 L6亮 1 0 1 1 1 1 1 1 L7亮 0 1 1 1 1 1 1 1 L8亮 表1 5. 程序框图 图4.4.2 6. 汇编源程序 ORG 0 START: MOV R2,#8 MOV A,#0FEH SETB C LOOP: MOV P1,A LCALL DELAY RLC A DJNZ R2,LOOP MOV R2,#8 LOOP1: MOV P1,A LCALL DELAY RRC A DJNZ R2,LOOP1 LJMP START DELAY: MOV R5,#20 ; D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END 7. C语言源程序 #include <AT89X51.H> unsigned char i; unsigned char temp; unsigned char a,b; void delay(void) { unsigned char m,n,s; for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--); } void main(void) { while(1) { temp=0xfe; P1=temp; delay(); for(i=1;i<8;i++) { a=temp<<i; b=temp>>(8-i); P1=a|b; delay(); } for(i=1;i<8;i++) { a=temp>>i; b=temp<<(8-i); P1=a|b; delay(); } } } 5. 广告灯(利用取表方式) 1. 实验任务 利用取表的方法,使端口P1做单一灯的变化:左移2次,右移2次,闪烁2次(延时的时间0.2秒)。 2. 电路原理图 图4.5.1 3. 系统板上硬件连线   把“单片机系统”区域中的P1.0-P1.7用8芯排线连接到“八路发光二极管指示模块”区域中的L1-L8端口上,要求:P1.0对应着L1,P1.1对应着L2,……,P1.7对应着L8。 4. 程序设计容 在用表格进行程序设计的时候,要用以下的指令来完成 (1). 利用MOV DPTR,#DATA16的指令来使数据指针寄存器指到表的开头。 (2). 利用MOVC A,@A+DPTR的指令,根据累加器的值再加上DPTR的值,就可以使程序计数器PC指到表格所要取出的数据。 因此,只要把控制码建成一个表,而利用MOVC 工,@A+DPTR做取码的操作,就可方便地处理一些复杂的控制动作,取表过程如下图所示: 5. 程序框图 图4.5.2 6. 汇编源程序 ORG 0 START: MOV DPTR,#TABLE LOOP: CLR A MOVC A,A+DPTR CJNE A,#01H,LOOP1 JMP START LOOP1: MOV P1,A MOV R3,#20 LCALL DELAY INC DPTR JMP LOOP DELAY: MOV R4,#20 D1: MOV R5,#248 DJNZ R5,$ DJNZ R4,D1 DJNZ R3,DELAY RET TABLE: DB 0FEH,0FDH,0FBH,0F7H DB 0EFH,0DFH,0BFH,07FH DB 0FEH,0FDH,0FBH,0F7H DB 0EFH,0DFH,0BFH,07FH DB 07FH,0BFH,0DFH,0EFH DB 0F7H,0FBH,0FDH,0FEH DB 07FH,0BFH,0DFH,0EFH DB 0F7H,0FBH,0FDH,0FEH DB 00H, 0FFH,00H, 0FFH DB 01H END 7. C语言源程序 #include <AT89X51.H> unsigned char code table[]={0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f, 0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f, 0x7f,0xbf,0xdf,0xef, 0xf7,0xfb,0xfd,0xfe, 0x7f,0xbf,0xdf,0xef, 0xf7,0xfb,0xfd,0xfe, 0x00,0xff,0x00,0xff, 0x01}; unsigned char i; void delay(void) { unsigned char m,n,s; for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--); } void main(void) { while(1) { if(table[i]!=0x01) { P1=table[i]; i++; delay(); } else { i=0; } } } 6. 报警产生器 1. 实验任务 用P1.0输出1KHz和500Hz的音频信号驱动扬声器,作报警信号,要求1KHz信号响100ms,500Hz信号响200ms,交替进行,P1.7接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。 2. 电路原理图 图4.6.1 3. 系统板上硬件连线 (1. 把“单片机系统”区域中的P1.0端口用导线连接到“扬声器模块”区域中的MIC-IN端口上; (2. 把“单片机系统”区域中的P1.7/RD端口用导线连接到“八路拨动开关”区域中的K1端口上; 4. 程序设计容 (1. 信号产生的方法 500Hz信号周期为2ms,信号电平为每1ms变反1次,1KHz的信号周期为1ms,信号电平每500us变反1次; 5. 程序框图 开始 K1按下了吗? FLAG=0吗? 置200次计数 P1.0输出取反 延时500us 计数值计完了吗? FLAG取反 置200次计数 P1.0输出取反 延时1ms 计数值计完了吗? FLAG取反 图4.6.2 6. 汇编源程序 FLAG BIT 00H ORG 00H START: P1.7,START JNB FLAG,NEXT MOV R2,#200 DV: CPL P1.0 LCALL DELY500 LCALL DELY500 DJNZ R2,DV CPL FLAG NEXT: MOV R2,#200 DV1: CPL P1.0 LCALL DELY500 DJNZ R2,DV1 CPL FLAG SJMP START DELY500: MOV R7,#250 LOOP: NOP DJNZ R7,LOOP RET END 7. C语言源程序 #include <AT89X51.H> #include <INTRINS.H> bit flag; unsigned char count; void dely500(void) { unsigned char i; for(i=250;i>0;i--) { _nop_(); } } void main(void) { while(1) { if(P1_7==0) { for(count=200;count>0;count--) { P1_0=~P1_0; dely500(); } for(count=200;count>0;count--) { P1_0=~P1_0; dely500(); dely500(); } } } } 7. I/O并行口直接驱动LED显示 1. 实验任务 如图13所示,利用AT89S51单片机的P0端口的P0.0-P0.7连接到一个共阴
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服