《《单片机原理及应用》实验指导书(C语言).docx》由会员分享,可在线阅读,更多相关《《单片机原理及应用》实验指导书(C语言).docx(37页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、单片机原理及应用实验指导书(C语言) 单 片 机 原 理 及 应用 实 验 指 导 书 (C语言) XX高校物电学院 微机教研室 XX 2011 前 言 由于单片机具有高牢靠性、超小型、低价格、简单产品化等特点,在仪器仪表智能化、实时工业限制、实时数据采集、智能终端、通信设备、导航系统、家用电器等限制应用领域,具有非常广泛的用途。由于目前在国内单片机应用中,MCS-51系列单片机仍旧是一种主流单片机,所以本试验指导书为学习MCS-51单片机的学生,协作单片机原理及应用课程的教学,结合本学院自制单片机教学试验板编写了这本试验指导书。 单片机原理应用及是一门实践性很强的课程,提高教学质量的一个重要
2、环节是上机实习和训练,无论是学习汇编语言程序设计,还是学习接口电路和外设与计算机的连接,或者软硬兼施地研制单片机应用系统,不通过加强动手是不能获得预期效果的。本试验指导书供应多个试验的指导性材料,有些试验还有一些有肯定难度的选做项目,可以依据课时的支配和教学要求进行取舍。为了达到某些试验的目的,书中供应的参考程序与实际应用中的程序会有些差别,所以不肯定是最优的。 由于时间紧迫,须要赶课程进度与试验时间的同步,加上编者学识有限,如有不妥之处,欢迎读者指责指正。 实 验 须 知 1. 试验前必需阅读教科书的有关部分和本试验指导书,了解试验目的、内容、步骤,做好试验前的打算工作,编写好试验中要求自编
3、或修改的程序;完成试验前要求完成的打算工作后方可以上机试验,否则不得上机操作。 2. 各种电源的电压和极性不能接错,严禁带电接线和接插元器件。通电前须经过指导老师检查认可后方能通电。3. 不准随意拨弄各种与试验无关的旋钮和开关,凡与本次试验无关的任何设备都禁止动用和摸弄,留意平安。4. 严禁用手触摸试验系统印制电路板和元器件的引脚,防止静电击穿芯片。5. 试验中若损坏仪器或元器件,应刚好向指导老师报告。6. 在试验室内保持宁静和卫生,不得随意走动和喧哗,集中精力完成试验。7. 试验完成后,关掉电源,刚好整理试验台桌面,保持环境整齐。8. 按规定仔细完成试验报告,在规定的时间内缴上试验报告。9.
4、 凡试验或试验报告未能按规定完成的学员,不能参与本课程的考试或考查。 单片机试验报告格式 试验报告标题 一、试验目的 二、试验内容 三、试验设计及调试: (1)试验分析及内容。 (2)试验电路:画出与试验内容有关的简洁试验电路。(3)试验设计及调试步骤:依据内容写出试验程序。调试程序,视察结果。(4)试验调试过程中所遇到的问题、解决问题的思路和解决的方法。四、试验后的阅历教训总结。五、对试验课的建议 目 录 试验一 试验板运用,KEIL C51软件运用 6 试验二 单片机限制LED灯点亮 12 试验三 模拟开关灯 16 试验四 单片机限制数码管试验 21 试验五 中断系统应用试验 25 试验六
5、 LED 数码管的动态驱动 29 试验七 定时器/计数器运用 32 试验八 数字电子钟 36 试验九 矩阵键盘识别试验 37 试验十 自动演奏乐曲 41 试验十一 综合试验 交通信号灯限制器的设计 45 试验十二 教学板自检程序设计 46 试验十三 综合试验:数据采集火灾报警装置的软硬件设计 47 附录:试验教学板电路原理图 48 试验一 试验板运用,Keil C51软件运用 一、试验目的 1. 熟识单片机试验板、Keil C51软件运用 二、试验说明 本试验介绍试验板的组成、Keil C51软件运用以及烧录软件的运用。通过该试验学生可以了解单片机编程、调试方法。三、试验内容及步骤 1.启动P
6、C机,安装好Keil C51软件以及烧录软件,用串口线连接计算机与试验板(USB线供应电源)。2.打开Keil uVision2仿真软件,首先建立本试验的项目文件,接着建立源程序,编译无误后,全速运行程序。3.可把源程序编译成可执行文件,用烧录器烧录到89芯片中。四、Keilc 软件运用说明 1、打开程序: 双击程序 2、新建工程:Project New Project保存工程选择CPU(一般选ATMEL公司的AT89S51) -17- 3、设置工程:右击Options for Target 1 选择Create HEX (输出HEX文件)。 -18- 4、新建源文件:选FileNew输入、编
7、辑源程序保存(汇编源程序:文件名.asm;C源程序:文件名.c) 5、为工程添加源文件:在Project出口File页上单击文件组,选择Add Files to GroupSource Group 1选项,选择你的源文件和文件类型,然后点击ADD,再点击close。 -19- 6、编译:点击 ,或右击Target 1 Build Target F7,就可对源程序进行编译。当程序有语法错误时,会在输出窗口(Output Windows)中显示错误信息和警告信息,修改编译胜利后会生成 HEX文件。 7、下载、调试: 编译胜利后,用在线烧录程序将.HEX文件下载到单片机内部ROM中运行,在运行过程中
8、若发觉错误要重新修改程序,并编译后再下载运行。 五、烧录软件的运用 1、打开在线烧录程序 2、选择MCU类型(STC89C51RC) 1、 点击, 打开工程书目下的hex文件 2、 选择端口(一般是COM1) 3、 点击Download烧录程序 4、 打开试验板上的电源(假如烧录的时候出现问题,点击stop) 留意: 5、6 两步骤的依次不能颠倒!即在点击Download之前要先关掉试验板上的电源。 试验二 单片机限制LED灯点亮 一、试验目的 1.进一步熟识编程和程序调试 2.学习P1口的运用方法 3.学习延时子程序的编写和运用 二、试验说明 (1)输出限制。 如图1所示 ,当P1 . 0端
9、口输出高电平,即P1.01时 ,依据发光二极管的单向导电性 可知,这时发光二极管L1熄灭;当 P1 .0端口输出低电平,即 P1 .00时,发光二极管L 1亮;我们可以运用SETB P1.0指令使 P 1. 0端口输出高电平 , 运用CLR P1.0指令使 P1 .0 端口输出低电平 。 (2)延时子程序的设计方法 作为单片机的指令的执行时间是很短的,数量达微秒级,因此,假如我们要求的闪耀时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面详细介绍其原理: 石英晶体为12MHz,因此,1个机器周期为1微秒 机
10、器周期 微秒 MOV R6,#20 2个机器周期 2 D1: MOV R7,#248 2个机器周期 220 DJNZ R7,$ 2个机器周期 224820 DJNZ R6,D1 2个机器周期2204010002 因此,上面的延时程序时间为10.002ms。 由以上可知,当R610、R7248时,延时5ms,R620、R7248时,延时10ms,以此为基本的计时单位。如要求0.2秒200ms,10msR5200ms,则R520,汇编延时子程序如下: DELAY: MOV R5,#20 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ
11、 R5,D1 RET C语言延时子程序如下: 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-); 三、试验步骤及参考例子 试验步骤说明: 本试验须要用到单片机最小应用系统。用P1口做输出口,程序功能使发光二极管点亮。1.用串行数据通信线连接计算机与试验板,用USB给试验板供应电源 3.打开Keil uVision2仿真软件,首先建立本试验的项目文件,输入源程序(参考程序1),进行编译,直到编译无误。生成hex文件。5.通
12、过STCISP下载软件,将hex文件下载到试验板内,视察发光二极管显示状况。参考例子: (1) 点亮板子上的第一个灯D0 (2) 让第一个灯闪耀 四、参考程序 (一)适用于mini80E试验板 1) #include<reg52.h> void main() P1=0xfe; 2) #include<reg52.h> #define uint unsigned int #define uchar unsigned char delay(); void main() while(1) P1=0xfe; delay(); P1=0xff; delay(); void del
13、ay() uint x,y; for(x=100;x>0;x-) for(y=600;y>0;y-) ; (二)适用于自制最小系统试验板 (1) #include <reg52.h> void main (void) P2=0x00; P2=0x10; P0=0xfe; (2) #include <reg52.h> void delay(void); void main (void) P2=0x00; while(1) P2=0x10; P0=0xfe; delay(); /P2=0x00; P0=0xff; delay(); void delay(void
14、) int x,y; for(x=600;x>0;x-) for(y=100;y>0;y-); 六、试验内容 请在keil环境下编写以下程序: 1)点亮最终一个LED(或者随意一个LED,或者随意几个LED) 2)让点亮的LED闪耀 3)点亮板子上的D0、D2、D4、D6灯,与D1、D3、D5、D7灯交替闪耀 4)设计出流水灯程序,从D7D0或从D0-D7 试验三 模拟开关灯 1试验目的 1.进一步熟识编程和程序调试 2.学习独立按键的运用方法 2试验说明 假如系统只需几个按键,可干脆采纳I/O线构成单个按键电路,各个按键之间相互独立,一根线上的按键状态不会影响其他输入线上的工作状
15、态,又称独立式键盘接口电路。检测是否有键闭合,如有键闭合,则去除键抖动,推断键号并转入相应的按键处理。编写单片机的键盘检测程序时,一般在检测按下时加入去抖延时,检测松手时就不用加了。3、参考例子 1)通过四个按键来限制LED灯的显示状况: S1:D0点亮 S2:D1点亮 S3:D2点亮 S4:D3点亮 4、参考程序 (一)适用于自制试验板 #include <REG51.H> #define uint unsigned int #define uchar unsigned char uchar flag; uchar key_down; sbit LED2 = P00; sbit
16、LED3 = P01; sbit LED4 = P02; sbit LED5 = P03; /*/ void delay(uint k) uint data i,j; for(i=0;i<k;i+) for(j=0;j<121;j+) ; /*/ uchar scan_key(void) uchar temp; temp=P3; return temp; /*/ void main(void) key_down=0; P3=0xf7; P2=0x10; P0=0xff; while(1) P3=0xf7; if(P3!=0xf7)(key_down=0) delay(20); if
17、(P3!=0xf7)(key_down=0) flag=scan_key(); key_down=1; switch(flag) case 0xe7:LED2 = LED2;break; case 0xd7:LED3 = LED3;break; case 0xb7:LED4 = LED4;break; case 0x77:LED5 = LED5;break; default: break; if(P3=0xf7) key_down=0; (二)适用与mini80E板 #include <REG51.H> #define uint unsigned int #define uchar
18、 unsigned char uchar flag; /*/ void delay(uint k) uint data i,j; for(i=0;i<k;i+) for(j=0;j<121;j+) ; /*/ uchar scan_key(void) uchar temp; temp=P3; return temp; /*/ void main(void) while(1) P3=0xff; if(P3!=0xff) delay(20); if(P3!=0xff) flag=scan_key(); else flag=0; switch(flag) case 0xfe:P1=0xf
19、e;break; case 0xfd:P1=0xfd;break; case 0xfb:P1=0xfb;break; case 0xf7:P1=0xf7;break; default:P1=0xff;break; 或者 include <REG51.H> #define uint unsigned int #define uchar unsigned char uchar flag; uchar key_down; sbit LED2 = P10; sbit LED3 = P11; sbit LED4 = P12; sbit LED5 = P13; /*/ void delay(u
20、int k) uint data i,j; for(i=0;i<k;i+) for(j=0;j<121;j+) ; /*/ uchar scan_key(void) uchar temp; temp=P3; return temp; /*/ void main(void) key_down=0; P3=0xff; P1=0xff; while(1) P3=0xff; if(P3!=0xff)(key_down=0) delay(20); if(P3!=0xff)(key_down=0) flag=scan_key(); key_down=1; switch(flag) case 0
21、xfe:LED2 = LED2;break; case 0xfd:LED3 = LED3;break; case 0xfb:LED4 = LED4;break; case 0xf7:LED5 = LED5;break; default: break; if(P3=0xff) key_down=0; 5、试验内容 1)8个按键分别对应8盏led灯的亮灭(针对自制教学板) 2)通过四个按键来限制LED灯的显示状况: S1:D0-D3点亮 S2:D2点亮 S3:D0-D7点亮 S4:D0-D5点亮 试验四 单片机限制数码管试验 一、试验目的 1. 驾驭数码管是如何显示出字符 2. 进一步驾驭延时子程
22、序的运用 二、试验原理 1.数码管两种接法 2. 共阴极数码管编码 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0 1 2 3 4 5 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 6 7 8 9 A B 0x39 , 0x5e , 0x79 , 0x71 , 0x00 C D E F 无显示 请思索共阳极数码管的编码。三、参考例子 1)让第一个数码管显示一个8字 A) 对于MINI80E试验板(共阴极), 数码管的选通是通过P2口限制三八译码器得到的,要让第一个数码管显示8字,那么别的数码管的位选就要关闭,即只打开
23、第一个数码管的位选。限制位选的P2口要输出的数据位0xf7(二进制为1111 0111)。位选确定后,在确定段选,要显示的是8,那么只有dp段为0,其余段为1,所以P0口要输出0x7f(二进制0111 1111)。B) 对于自制试验板(共阳极),数码管的选通是通过P2口限制的。要让第一个数码管显示8字,那么别的数码管的位选就要关闭,即只打开第一个数码管的位选。限制位选的P2口要输出的数据位0x08(二进制为0000 1000)。位选确定后,在确定段选,要显示的是8,那么只有dp段为1,其余段为0,所以P0口要输出0x80(二进制1000 0000)。2)在四个数码管上显示1,2,3,4 位选:
24、接P2口 左边四个数码管 DS3 DS2 DS1 DS0 对应的P2口: 0xf3 0xf2 0xf1 0xf0 右边四个数码管 DS3 DS2 DS1 DS0 对应的P2口: 0xf7 0xf6 0xf5 0xf4 段选:接P0口 四、参考程序 (一)mini80e试验板 1) #include<reg52.h> void main(void) while(1) P2=0xf7; P0=0x7f; 2) #include<reg52.h> #define uint unsigned int #define uchar unsigned char void delay(
25、); void main(void) while(1) P2=0xf7; P0=0x66; delay(); P2=0xf6; P0=0x4f; delay(); P2=0xf5; P0=0x5b; delay(); P2=0xf4; P0=0x06; delay(); void delay() /延时程序1 uint x,y; for(x=2;x>0;x-) for(y=112;y>0;y-) ; (二)自制教学试验板(共阳极数码管) (1) #include<reg52.h> void main(void) while(1) P2=0x08; P0=0x80; 2)
26、 #include<reg52.h> #define uint unsigned int #define uchar unsigned char void delay(); void main(void) while(1) P2=0x08; P0=0x99; delay(); P2=0x04; P0=0xb0; delay(); P2=0x02; P0=0xa4; delay(); P2=0x01; P0=0xf9; delay(); void delay() /延时程序1 uint x,y; for(x=2;x>0;x-) for(y=112;y>0;y-) ; 五、
27、原理图 六、试验内容 1)用一位数码管循环显示09; 2)用数码管显示字母A-F; 3) 交替点亮4个数码管。(例如:起先时在数码显示器的最右边一位上显示1个“0”字,以后每隔0.5秒将“0”字左移1位,直到最左边一位后则停止显示。) 4)结合试验3,实现按键与数字的一一对应。 试验五 中断系统应用试验 一、试验目的 1.驾驭外部中断技术的基本运用方法 2.驾驭中断处理程序的编写方法 二、试验说明 1.外部中断的初始化设置共有三项内容:中断总允许即EA=1,外部中断允许即EXi=1(i=0或1),中断触发方式设置。中断触发方式设置一般有两种方式:电平触发方式和脉冲(边沿)触发方式,本试验选用后
28、者,其前一次为高电平后一次为低电平常为有效中断恳求。因此高电平状态和低电平状态至少维持一个周期,中断恳求信号由引脚INT0(P3.2)和INT1(P3.3)引入,本试验由INT0(P3.2)引入。 2.中断限制原理: 中断限制是供应给用户运用的中断限制手段。事实上就是限制一些寄存器,51系列用于此目的的限制寄存器有四个:TCON 、IE 、SCON 及IP。3.中断响应的过程: 首先中断采样然后中断查询最终中断响应。采样是中断处理的第一步,对于本试验的脉冲方式的中断恳求,若在两个相邻周期采样先高电平后低电平则中断恳求有效,IE0或IE1置“1”;否则接着为“0”。所谓查询就是由CPU测试TCO
29、N和SCON中各标记位的状态以确定有没有中断恳求发生以及是那一个中断恳求。中断响应就是对中断恳求的接受,是在中断查询之后进行的,当查询到有效的中断恳求后就响应一次中断。 4. 8051的中断系统 8051的中断系统包括5个中断源,并供应两个优先级,允许用户对中断源进行独立限制和中断优先级设置.8051支持的5个中断源分别为外部中断0、定时器0溢出中断、外部中断1、定时器1溢出中断和串口中断。 对应的中断号为0、1、2、3、4;寄存器有4个工作组可以切换,为0-3;C51中,中断服务程序是以中断函数的方式来时实现的。5.中断函数格式如下: void 函数名() interrupt 中断号 usi
30、ng 工作组 中断服务程序内容; 三、参考例子 1) 右边的三个数码管从“000”起先进行加法计数。按动按键时计数暂停,再按接着计数。 四、参考程序 (一)适用于自制教学试验板 #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit P37=P37; uchar code table10 = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; uchar code wei4 = 0x08,0x04,0x02,0x01; /*/ uin
31、t cnt; bit flag; /*/ void init(void) bit flag=0; /设置标记 EA=1;/开中断 EX0=1; /外部中断0开中断 IT0=1; /外部中断0的触发方式 /*/ void delay(uint k) uint data i,j; for(i=0;i<k;i+) for(j=0;j<121;j+); /*/ void main(void) uchar i; P37=0; init(); while(1) if(flag)cnt+; if(cnt>999)cnt=0; for(i=0;i<100;i+) P0=tablecnt
32、/100; P2=wei2; delay(1); P0=table(cnt%100)/10; P2=wei1; delay(1); P0=tablecnt%10; P2=wei0; delay(1); /*/ void extern_int0(void) interrupt 0 using 0 flag=!flag; (二)适用于MINI80E试验板 #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit P37=P37; uchar code table10 = 0x3f,0x06
33、,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; uchar code wei4 = 0xf7,0xf6,0xf5,0xf4; /*/ uint cnt; bit flag; /*/ void init(void) bit flag=0; /设置标记 EA=1;/开中断 EX0=1; /外部中断0开中断 IT0=1; /外部中断0的触发方式 /*/ void delay(uint k) uint data i,j; for(i=0;i<k;i+) for(j=0;j<121;j+); /*/ void main(void) uchar i; P37
34、=0; init(); while(1) if(flag)cnt+; if(cnt>999)cnt=0; for(i=0;i<100;i+) P0=tablecnt/100; P2=wei2; delay(1); P0=table(cnt%100)/10; P2=wei1; delay(1); P0=tablecnt%10; P2=wei0; delay(1); /*/ void extern_int0(void) interrupt 0 using 0 flag=!flag; 五、试验内容 1、运用外部中断1实现上述功能(留意C51中的不同中断号) 2、数码管从“0000”起先计
35、数,高两位和低两位独立计数。采纳两个按键,一个对应前两位的暂停和接着,另一个对应后两位的暂停和接着。 试验六 LED 数码管的动态驱动 一、试验目的 1、 学习 LED 数码管的动态驱动编程。 2、 学习运用定时/计数器。二、试验内容 编写程序,使试验板上的4个LED数码管稳定显示4个不同的数字,并使这四位数从0000起先,每秒钟加一。三、试验说明 在前面试验中,我们已经能够让某一个 LED 数码管显示须要的数字,比如选让第一个 LED显示“1”,隔一较短的时间(如 5 毫秒)后关闭第一个 LED,让其次个 LED 显示“2”,如此周而复始,让 4 个 LED 依次显 1、2、3、4,我们就能
36、看到 4 个 LED 上稳定地显示 4 个不同的数字。当然,每个瞬间只有一个 LED 被点亮,大家亮的时间相同,均为 5 毫秒,4 个 LED数码管点亮一遍须要 20 毫秒,一秒钟各亮 50 次,所以看上去不会有闪耀感,但亮度只是试验四中 LED 亮度的四分之一。要实现每隔 5 毫秒变换一个 LED,最好的方法是运用定时器中断。四、参考程序 (一)自制试验教学板C51参考程序如下: #include <REG51.H> #define U8 unsigned char U8 tab = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9
37、0; U8 scn = 0x01,0x02,0x04,0x08;/先点亮左边一个数码管 U8 buf4 = 0,0,0,0;/ 显示缓冲区,开机先显示“0000“ U8 cnt = 0; / 扫描计数 void main(void) EA = 1; / 允许中断 TMOD = 0x01; / 设定时器 0 为模式 1(16 位) ET0 = 1; / 定时器 0 中断允许 TH0 = 0xee; / 晶振 11.0592MHz,5mS TL0 = 0; TR0 = 1; / 起先计数 while(1); / 死循环,等待中断 void timeint(void) interrupt 1 / 定
38、时器 0 中断服务程序 char i; TH0 = 0xee; / 设置定时器时间常数 TL0 = 0; i = cnt 0x03; / 求应点亮的 LED 号(从左到右依次为 0,1,2,3) P0 = tabbufi; / 笔划代码送 P0 口 P2 = scni; / 限制扫描码送 P2 口 if(cnt=200) cnt=0; / 到 1 秒钟,显示的数字加一 for(i=3;i>=0;i-) bufi+; if(bufi=10) bufi=0;/ 加到 10 向前进位 else break; cnt+; (二)mini80e试验板C51参考程序如下: #include <
39、REG51.H> #define U8 unsigned char U8 tab = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; U8 scn = 0xf4,0xf5,0xf6,0xf7;/先点亮左边一个数码管 U8 buf4 = 0,0,0,0;/ 显示缓冲区,开机先显示“0000“ U8 cnt = 0; / 扫描计数 void main(void) EA = 1; / 允许中断 TMOD = 0x01; / 设定时器 0 为模式 1(16 位) ET0 = 1; / 定时器 0 中断允许 TH0 = 0xee; / 晶振 11.0592MHz