




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 单 片 机 原 理 及 应用 实 验 指 导 书 (c 语言) 华南师范大学物电学院 微机教研室 宋晖 2011.09 前前 言言 由于单片机具有高可靠性、超小型、低价格、容易产品化等特点,在仪 器仪表智能化、实时工业控制、实时数据采集、智能终端、通信设备、导航 系统、家用电器等控制应用领域,具有十分广泛的用途。由于目前在国内单 片机应用中, mcs-51 系列单片机仍然是一种主流单片机,所以本实验指导 书为学习 mcs-51 单片机的学生,配合 单片机原理 及应用课程的教学, 结合本学院自制 单片机教学实验 板编写了这本实验指导书。 单片机原理 应用及是一门实践性很强的课程,提高教学质量的
2、一 个重要环节是上机实习和训练,无论是学习汇编语言程序设计,还是学习接 口电路和外设与计算机的连接,或者软硬兼施地研制单片机应用系统,不通 过加强动手是不能获得预期效果的。本实验指导书提供多个实验的指导性 材料,有些实验还有一些有一定难度的选做项目,可以根据课时的安排和教 学要求进行取舍。为了达到某些实验的目的,书中提供的参考程序与实际应 用中的程序会有些差别,所以不一定是最优的。 由于时间紧迫,需要赶课程进度与实验时间的同步,加上编者学识有 限,如有不妥之处,欢迎读者批评指正。 实实 验验 须须 知知 1. 实验前必须阅读教科书的有关部分和本实验指导书,了解 实验目的、内容、步骤,做好实验前
3、的准备工作,编写好实验中 要求自编或修改的程序;完成实验前要求完成的准备工作后方可 以上机实验,否则不得上机操作。 2. 各种电源的电压和极性不能接错,严禁带电接线和接插元 器件。通电前须经过指导教师检查认可后方能通电。 3. 不准随意拨弄各种与实验无关的旋钮和开关,凡与本次实 验无关的任何设备都禁止动用和摸弄,注意安全。 4. 严禁用手触摸实验系统印制电路板和元器件的引脚,防止 静电击穿芯片。 5. 实验中若损坏仪器或元器件,应及时向指导教师报告。 6. 在实验室内保持安静和卫生,不得随意走动和喧哗,集中 精力完成实验。 7. 实验完成后,关掉电源,及时整理实验台桌面,保持环境 整洁。 8.
4、 按规定认真完成实验报告,在规定的时间内缴上实验报告。 9. 凡实验或实验报告未能按规定完成的学员,不能参加本课 程的考试或考查。 单片机实验报告格式 实验报告标题 一、实验目的 二、实验内容 三、实验设计及调试: (1)实验分析及内容。 (2)实验电路:画出与实验内容有关的简单实验电路。 (3)实验设计及调试步骤:根据内容写出实验程序。调试程序,观 察结果。 (4)实验调试过程中所遇到的问题、解决问题的思路和解决的方法。 四、实验后的经验教训总结。 五、对实验课的建议 目 录 实验一实验一 实验板使用,实验板使用,keil c51 软件使用软件使用.6 实验二实验二 单片机控制单片机控制 l
5、ed 灯点亮灯点亮.12 实验三实验三 模拟开关灯模拟开关灯.16 实验四实验四 单片机控制数码管实验单片机控制数码管实验.21 实验五实验五 中断系统应用实验中断系统应用实验.25 实验六实验六 led 数码管的动态驱动数码管的动态驱动.29 实验七实验七 定时器定时器/计数器使用计数器使用.32 实验八实验八 数字电子钟数字电子钟.36 实验九实验九 矩阵键盘识别实验矩阵键盘识别实验.37 实验十实验十自动演奏乐曲自动演奏乐曲.41 实验十一实验十一 综合实验综合实验 交通信号灯控制器的设计交通信号灯控制器的设计.45 实验十二实验十二 教学板自检程序设计教学板自检程序设计.46 实验十三
6、实验十三 综合实验:数据采集综合实验:数据采集火灾报警装置的软硬件设计火灾报警装置的软硬件设计.47 附录:实验教学板电路原理图附录:实验教学板电路原理图.48 实验一实验一 实验板使用,实验板使用,keil c51 软件使用软件使用 一、实验目的一、实验目的 1. 熟悉单片机实验板、keil c51软件使用 二、实验说明二、实验说明 本实验介绍实验板的组成、keil c51 软件使用以及烧录软件的使用。通过该实验学生 可以了解单片机编程、调试方法。 三、实验内容及步骤三、实验内容及步骤 1.启动 pc 机,安装好 keil c51 软件以及烧录软件,用串口线连接计算机与实验板 (usb 线提
7、供电源) 。 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输入、编辑源程序保存(汇编源程序:文件名.
8、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 中 运行,在运行过程中若
9、发现错误要重新修改程序,并编译后再下载运行。 五、烧录软件的使用五、烧录软件的使用 1、打开在线烧录程序 2、选择 mcu 类型(stc89c51rc) 1、 点击, 打开工程目录下的 hex 文件 2、 选择端口(一般是 com1) 3、 点击 download 烧录程序 4、 打开实验板上的电源(如果烧录的时候出现问题,点击 stop) 注意:注意: 5 5、6 6 两步骤的顺序不能颠倒!即在两步骤的顺序不能颠倒!即在点击 download 之前要先关掉实验板上的电源。 实验二实验二 单片机控制单片机控制 led 灯点亮灯点亮 一、实验目的一、实验目的 1.进一步熟悉编程和程序调试 2.学
10、习 p1 口的使用方法 3.学习延时子程序的编写和使用 二、实验说明二、实验说明 (1)输出控制。 如图 1 所示 ,当 p1 . 0 端口输出高电平,即 p1.01 时 ,根据发光二极管的单向导电性 可知,这时发光二极管 l1 熄灭;当 p1 .0 端口输出低电平,即 p1 .00 时,发光二极管 l 1 亮;我们可以使用 setb p1.0 指令使 p 1. 0 端口输出高电平 , 使用 clr p1.0 指令 使 p1 .0 端口输出低电平 。 xtal1a 11.0592mhz c3a 22pf c2a 22pf p1.0 1 p1.1 2 p1.2 3 p1.3 4 p1.4 5 p
11、1.5 6 p1.6 7 p1.7 8 rst 9 p3.0/rxd 10 p3.1/txd 11 p3.2/int0 12 p3.3/int1 13 p3.4/t0 14 p3.5/t1 15 p3.6/wr 16 p3.7/rd 17 xtal2 18 xtal1 19 vss 20 p2.0 21 p2.1 22 p2.2 23 p2.3 24 p2.4 25 p2.5 26 p2.6 27 p2.7 28 psen 29 ale/prog 30 ea 31 p0.7 32 p0.6 33 p0.5 34 p0.4 35 p0.3 36 p0.2 37 p0.1 38 p0.0 39 v
12、cc 40 89c51 u1f c3f 10uf vcc vcc p3.0 p3.1 p1.0 p1.1 p1.2 p1.3 p1.4 p1.5 p1.6 p1.7 p0.0 p0.1 p0.2 p0.3 p0.4 p0.5 p0.6 p0.7 ea ale psen p2.7 p2.6 p2.5 p2.4 p2.3 p2.2 p2.1 p2.0 p3.2 p3.3 p3.4 p3.5 p3.6 p3.7 510*8 vcc p1.0 p1.1 p1.2 p1.3 p1.4 p1.5 p1.6 p1.7 reset r2f 100 r1f 1k l0 l1 l2 l3 l4 l5 l6 l7
13、(2)延时子程序的设计方法 作为单片机的指令的执行时间是很短的,数量达微秒级,因此,如果我们要求的闪烁时间 间隔为 0.2 秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序, 来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理: 石英晶体为 12mhz,因此,1 个机器周期为 1 微秒 机器周期 微秒 mov r6,#20 2 个机器周期 2 d1: mov r7,#248 2 个机器周期 220 djnz r7,$ 2 个机器周期 224820 djnz r6,d1 2 个机器周期2204010002 因此,上面的延时程序时间为 10.002ms。 xta
14、l1a 11.0592mhz c3a 22pf c2a 22pf p1.0 1 p1.1 2 p1.2 3 p1.3 4 p1.4 5 p1.5 6 p1.6 7 p1.7 8 rst 9 p3.0/rxd 10 p3.1/txd 11 p3.2/int0 12 p3.3/int1 13 p3.4/t0 14 p3.5/t1 15 p3.6/wr 16 p3.7/rd 17 xtal2 18 xtal1 19 vss 20 p2.0 21 p2.1 22 p2.2 23 p2.3 24 p2.4 25 p2.5 26 p2.6 27 p2.7 28 psen 29 ale/prog 30 ea
15、 31 p0.7 32 p0.6 33 p0.5 34 p0.4 35 p0.3 36 p0.2 37 p0.1 38 p0.0 39 vcc 40 89c51 u1f c3f 10uf vcc vcc p3.0 p3.1 p1.0 p1.1 p1.2 p1.3 p1.4 p1.5 p1.6 p1.7 p0.0 p0.1 p0.2 p0.3 p0.4 p0.5 p0.6 p0.7 ea ale psen p2.7 p2.6 p2.5 p2.4 p2.3 p2.2 p2.1 p2.0 p3.2 p3.3 p3.4 p3.5 p3.6 p3.7 510*8 vcc p1.0 p1.1 p1.2 p
16、1.3 p1.4 p1.5 p1.6 p1.7 reset r2f 100 r1f 1k l0 l1 l2 l3 l4 l5 l6 l7 由以上可知,当 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 r5,d1 ret c 语言延时子程序如下: void delay02s(void) /延时 0.
17、2 秒子程序 unsigned char i,j,k; for(i=20;i0;i-) for(j=20;j0;j-) for(k=248;k0;k-); 三、实验步骤及参考例子三、实验步骤及参考例子 实验步骤说明:实验步骤说明: 本实验需要用到单片机最小应用系统。 用 p1 口做输出口,程序功能使发光二极管点亮。 1.用串行数据通信线连接计算机与实验板,用 usb 给实验板提供电源 3.打开 keil uvision2 仿真软件,首先建立本实验的项目文件,输入源程序(参考程序 1) , 进行编译,直到编译无误。生成 hex 文件。 5.通过 stcisp 下载软件,将 hex 文件下载到实验
18、板内,观察发光二极管显示情况。 参考例子参考例子: (1) 点亮板子上的第一个灯 d0 (2) 让第一个灯闪烁 四、参考程序四、参考程序 (一)适用于 mini80e 实验板 1) #include void main() p1=0 xfe; 2) #include #define uint unsigned int #define uchar unsigned char delay(); void main() while(1) p1=0 xfe; delay(); p1=0 xff; delay(); void delay() uint x,y; for(x=100;x0;x-) for(
19、y=600;y0;y-) ; (二)适用于自制最小系统实验板 (1) #include void main (void) p2=0 x00; p2=0 x10; p0=0 xfe; (2) #include void delay(void); void main (void) p2=0 x00; while(1) p2=0 x10; p0=0 xfe; delay(); /p2=0 x00; p0=0 xff; delay(); void delay(void) int x,y; for(x=600;x0;x-) for(y=100;y0;y-); 六、实验内容六、实验内容 请在 keil 环
20、境下编写以下程序: 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 线构成单个按键电路,各个按键之间相互独 立,一根线上的按键状态不会影响其他输入线上的工作状态,又称独立式键盘接口电路。 检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入相
21、应的按键处理。 编写单片机的键盘检测程序时,一般在检测按下时加入去抖延时,检测松手时就不用加了。 3、参考例子参考例子 1)通过四个按键来控制 led 灯的显示情况: s1:d0 点亮 s2:d1 点亮 s3:d2 点亮 s4:d3 点亮 4、参考程序 (一)适用于自制实验板 #include #define uint unsigned int #define uchar unsigned char uchar flag; uchar key_down; sbit led2 = p00; sbit led3 = p01; sbit led4 = p02; sbit led5 = p03; /*
22、/ void delay(uint k) uint data i,j; for(i=0;ik;i+) for(j=0;j121;j+) ; /*/ uchar scan_key(void) uchar temp; temp=p3; return temp; /*/ void main(void) key_down=0; p3=0 xf7; p2=0 x10; p0=0 xff; while(1) p3=0 xf7; if(p3!=0 xf7) if(p3!=0 xf7) key_down=1; switch(flag) case 0 xe7:led2 = led2;break; case 0
23、xd7:led3 = led3;break; case 0 xb7:led4 = led4;break; case 0 x77:led5 = led5;break; default: break; if(p3=0 xf7) key_down=0; (二)适用与 mini80e 板 #include #define uint unsigned int #define uchar unsigned char uchar flag; /*/ void delay(uint k) uint data i,j; for(i=0;ik;i+) for(j=0;j121;j+) ; /*/ uchar sc
24、an_key(void) uchar temp; temp=p3; return temp; /*/ void main(void) while(1) p3=0 xff; if(p3!=0 xff) delay(20); if(p3!=0 xff) flag=scan_key(); else flag=0; switch(flag) case 0 xfe:p1=0 xfe;break; case 0 xfd:p1=0 xfd;break; case 0 xfb:p1=0 xfb;break; case 0 xf7:p1=0 xf7;break; default:p1=0 xff;break;
25、或者 include #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(uint k) uint data i,j; for(i=0;ik;i+) for(j=0;j121;j+) ; /*/ uchar scan_key(void) uchar temp; temp=p3; return temp; /*/ void
26、 main(void) key_down=0; p3=0 xff; p1=0 xff; while(1) p3=0 xff; if(p3!=0 xff) if(p3!=0 xff) key_down=1; switch(flag) case 0 xfe:led2 = led2;break; case 0 xfd:led3 = led3;break; case 0 xfb:led4 = led4;break; case 0 xf7:led5 = led5;break; default: break; if(p3=0 xff) key_down=0; 5、实验内容 1)8 个按键分别对应 8 盏
27、led 灯的亮灭(针对自制教学板) 2)通过四个按键来控制 led 灯的显示情况: s1:d0-d3 点亮 s2:d2 点亮 s3:d0-d7 点亮 s4:d0-d5 点亮 实验四实验四 单片机控制数码管实验单片机控制数码管实验 一、实验目的一、实验目的 1. 掌握数码管是如何显示出字符 2. 进一步掌握延时子程序的使用 二、实验原理二、实验原理 1.数码管两种接法数码管两种接法 2. 共阴极数码管编码共阴极数码管编码 0 x3f , 0 x06 , 0 x5b , 0 x4f , 0 x66 , 0 x6d , 0 1 2 3 4 5 0 x7d , 0 x07 , 0 x7f , 0 x6
28、f , 0 x77 , 0 x7c , 6 7 8 9 a b 0 x39 , 0 x5e , 0 x79 , 0 x71 , 0 x00 c d e f 无显示 请思考共阳极数码管的编码。 三、参考例子参考例子 1)让第一个数码管显示一个 8 字 a) 对于 mini80e 实验板(共阴极共阴极), 数码管的选通是通过 p2 口控制三八译码器得 到的,要让第一个数码管显示 8 字,那么别的数码管的位选就要关闭,即只打开第一 个数码管的位选。控制位选的 p2 口要输出的数据位 0 xf7(二进制为 1111 0111) 。位选 确定后,在确定段选,要显示的是 8,那么只有 dp 段为 0,其余
29、段为 1,所以 p0 口要 输出 0 x7f(二进制 0111 1111) 。 b) 对于自制实验板(共阳极) ,数码管的选通是通过 p2 口控制的。要让第一个数码管 显示 8 字,那么别的数码管的位选就要关闭,即只打开第一个数码管的位选。控制位 选的 p2 口要输出的数据位 0 x08(二进制为 0000 1000) 。位选确定后,在确定段选,要 显示的是 8,那么只有 dp 段为 1,其余段为 0,所以 p0 口要输出 0 x80(二进制 1000 0000) 。 ab cde g gnd f dp gnd a b c e f g d dp a b c d e f g dp dp g f
30、e d c b a 5v (a)(b) 2)在四个数码管上显示 1,2,3,4 位选:接 p2 口 左边四个数码管 ds3 ds2 ds1 ds0 对应的 p2 口: 0 xf3 0 xf2 0 xf1 0 xf0 右边四个数码管 ds3 ds2 ds1 ds0 对应的 p2 口: 0 xf7 0 xf6 0 xf5 0 xf4 段选:接 p0 口 四、参考程序四、参考程序 (一)(一)mini80e 实验板实验板 1) #include void main(void) while(1) p2=0 xf7; p0=0 x7f; 2) #include #define uint unsigned
31、 int #define uchar unsigned char void delay(); void main(void) while(1) p2=0 xf7; p0=0 x66; delay(); p2=0 xf6; p0=0 x4f; delay(); p2=0 xf5; p0=0 x5b; delay(); p2=0 xf4; p0=0 x06; delay(); void delay() /延时程序 1 uint x,y; for(x=2;x0;x-) for(y=112;y0;y-) ; (二)自制教学实验板(共阳极数码管) (1) #include void main(void)
32、 while(1) p2=0 x08; p0=0 x80; 2) #include #define uint unsigned int #define uchar unsigned char void delay(); void main(void) while(1) p2=0 x08; p0=0 x99; delay(); p2=0 x04; p0=0 xb0; delay(); p2=0 x02; p0=0 xa4; delay(); p2=0 x01; p0=0 xf9; delay(); void delay() /延时程序 1 uint x,y; for(x=2;x0;x-) for
33、(y=112;y0;y-) ; 五、原理图五、原理图 六、实验内容六、实验内容 1)用一位数码管循环显示 09; 2)用数码管显示字母 a-f; 3) 交替点亮 4 个数码管。 (例如:开始时在数码显示器的最右边一位上显示 1 个“0”字, 以后每隔 0.5 秒将“0”字左移 1 位,直到最左边一位后则停止显示。 ) 4)结合实验 3,实现按键与数字的一一对应。 实验五实验五 中断系统应用实验中断系统应用实验 一、实验目的一、实验目的 1.掌握外部中断技术的基本使用方法 2.掌握中断处理程序的编写方法 二、实验说明二、实验说明 1.外部中断的初始化设置共有三项内容:中断总允许即 ea=1,外部
34、中断允许即 exi=1(i=0 或 1) ,中断触发方式设置。中断触发方式设置一般有两种方式:电平触发方式 和脉冲(边沿)触发方式,本实验选用后者,其前一次为高电平后一次为低电平时为有效 中断请求。因此高电平状态和低电平状态至少维持一个周期,中断请求信号由引脚 int0(p3.2)和 int1(p3.3)引入,本实验由 int0(p3.2)引入。 2.中断控制原理: 中断控制是提供给用户使用的中断控制手段。实际上就是控制一些寄存器,51 系列用 于此目的的控制寄存器目的的控制寄存器有四个:tcon 、ie 、scon 及 ip。 3.中断响应的过程: 首先中断采样然后中断查询最后中断响应。采样
35、是中断处理的第一步,对于本实验的 脉冲方式的中断请求,若在两个相邻周期采样先高电平后低电平则中断请求有效,ie0 或 ie1 置“1”;否则继续为“0”。所谓查询就是由 cpu 测试 tcon 和 scon 中各标志位的状态 以确定有没有中断请求发生以及是那一个中断请求。中断响应就是对中断请求的接受,是 在中断查询之后进行的,当查询到有效的中断请求后就响应一次中断。 4. 8051 的中断系统 8051 的中断系统包括 5 个中断源,并提供两个优先级,允许用户对中断源进行独立控制 和中断优先级设置.8051 支持的 5 个中断源分别为外部中断 0、定时器 0 溢出中断、外部中 断 1、定时器
36、1 溢出中断和串口中断。 对应的中断号为 0、1、2、3、4;寄存器有 4 个工 作组可以切换,为 0-3;c51 中,中断服务程序是以中断函数的方式来时实现的。 5.中断函数格式如下: void 函数名函数名() interrupt 中断号中断号 using 工作组工作组 中断服务程序内容; 三、参考例子三、参考例子 1) 右边的三个数码管从“000”开始进行加法计数。按动按键时计数暂停,再按继续计 数。 四、参考程序四、参考程序 (一)适用于自制教学实验板(一)适用于自制教学实验板 #include #define uchar unsigned char #define uint unsi
37、gned int sbit p37=p37; uchar code table10 = 0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90; uchar code wei4 = 0 x08,0 x04,0 x02,0 x01; /*/ 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(
38、i=0;ik;i+) for(j=0;j999)cnt=0; for(i=0;i100;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; (二)适用于(二)适用于 mini80e 实验板实验板 #include #define uchar unsigned char #define uint uns
39、igned int sbit p37=p37; uchar code table10 = 0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f; uchar code wei4 = 0 xf7,0 xf6,0 xf5,0 xf4; /*/ 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
40、(i=0;ik;i+) for(j=0;j999)cnt=0; for(i=0;i100;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、数码管从、数码
41、管从“0000”开始计数,高两位和低两位独立计数。采用两个按键,一个对应开始计数,高两位和低两位独立计数。采用两个按键,一个对应 前两位的暂停和继续,另一个对应后两位的暂停和继续。前两位的暂停和继续,另一个对应后两位的暂停和继续。 实验六实验六 led 数码管的动态驱动数码管的动态驱动 一、实验目的 1、 学习 led 数码管的动态驱动编程。 2、 学习使用定时/计数器。 二、实验内容 编写程序,使实验板上的 4 个 led 数码管稳定显示 4 个不同的数字,并使这四位数从 0000 开始,每秒钟加一。 三、实验说明 在前面实验中,我们已经能够让某一个 led 数码管显示需要的数字,比如选让第
42、一 个 led 显示“1” ,隔一较短的时间(如 5 毫秒)后关闭第一个 led,让第二个 led 显示 “2” ,如此周而复始,让 4 个 led 依次显 1、2、3、4,我们就能看到 4 个 led 上稳 定地显示 4 个不同的数字。当然,每个瞬间只有一个 led 被点亮,大家亮的时间相同, 均为 5 毫秒,4 个 led 数码管点亮一遍需要 20 毫秒,一秒钟各亮 50 次,所以看上去 不会有闪烁感,但亮度只是实验四中 led 亮度的四分之一。 要实现每隔 5 毫秒变换一个 led,最好的方法是使用定时器中断。 四、参考程序 (一)自制实验教学板 c51 参考程序如下: #include
43、 #define u8 unsigned char u8 tab = 0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90; u8 scn = 0 x01,0 x02,0 x04,0 x08;/先点亮左边一个数码管 u8 buf4 = 0,0,0,0;/ 显示缓冲区,开机先显示0000 u8 cnt = 0; / 扫描计数 void main(void) ea = 1; / 允许中断 tmod = 0 x01; / 设定时器 0 为模式 1(16 位) et0 = 1; / 定时器 0 中断允许 th0 = 0 xee; / 晶
44、振 11.0592mhz,5ms tl0 = 0; tr0 = 1; / 开始计数 while(1); / 死循环,等待中断 void timeint(void) interrupt 1 / 定时器 0 中断服务程序 char i; th0 = 0 xee; / 设置定时器时间常数 tl0 = 0; i = cnt / 求应点亮的 led 号(从左到右依次为 0,1,2,3) p0 = tabbufi; / 笔划代码送 p0 口 p2 = scni; / 控制扫描码送 p2 口 if(cnt=200) cnt=0; / 到 1 秒钟,显示的数字加一 for(i=3;i=0;i-) bufi+;
45、 if(bufi=10) bufi=0;/ 加到 10 向前进位 else break; cnt+; (二)mini80e 实验板 c51 参考程序如下: #include #define u8 unsigned char u8 tab = 0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f; u8 scn = 0 xf4,0 xf5,0 xf6,0 xf7;/先点亮左边一个数码管 u8 buf4 = 0,0,0,0;/ 显示缓冲区,开机先显示0000 u8 cnt = 0; / 扫描计数 void main(void) ea
46、 = 1; / 允许中断 tmod = 0 x01; / 设定时器 0 为模式 1(16 位) et0 = 1; / 定时器 0 中断允许 th0 = 0 xee; / 晶振 11.0592mhz,5ms tl0 = 0; tr0 = 1; / 开始计数 while(1); / 死循环,等待中断 void timeint(void) interrupt 1 / 定时器 0 中断服务程序 char i; th0 = 0 xee; / 设置定时器时间常数 tl0 = 0; i = cnt / 求应点亮的 led 号(从左到右依次为 0,1,2,3) p0 = tabbufi; / 笔划代码送 p0
47、 口 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+; 五、实验内容 1、每个按键控制一个数码管,按任意一个键,可在相应的数码管上实现数字加 1。 2、如何让 4 个 led 数码管从 0000 开始,每秒钟自动加 1,前两位代表分,后两位代 表秒? 实验七实验七 定时器定时器/计数器使用计数器使用 一、实验目的一、实验目的 1.学习 89c51 内部定时计数器的使用和编程方法
48、2.进一步掌握中断处理程序的编写方法 二、实验说明二、实验说明 1、51 单片机有。两个 16 位内部定时器/计数器(t/c,timer/ counter) 。若是计数内 部晶振驱动时钟,则是定时器;若是计数 8051 的输入引脚的脉冲信号,则它是计数器。定 时器实际上也是工作在计数方式下,只不过对固定频率的脉冲计数。由于脉冲周期固定由 计数值可以计算出时间,有定时功能。 定时器有关的寄存器有工作方式寄存器 tmod 和控制寄存器 tcon。tmod 用于设 置定时器/计数器的工作方式 0-3,并确定用于定时还是用于计数。tcon 主要功能是为定 时器在溢出时设定标志位,并控制定时器的运行或停
49、止等。 2、tmod 1) m1m0 工作方式控制位 2) c/t 定时器方式或计数器方式选择位 若 c/t=1 时, 为计数器方式; c/t = 0 时, 为定时器方式。 3)gate 定时器/计数器运行门控标志位 当 gate=1 时, t/c 的启动受双重控制,即要求 int0 (或 int1)引脚为高电平且 tr0(或 tr1 )置 1 时, 相应的 t/c 才被选通工作。若 gate=0, t/c 的启动仅受 tr0 (或 tr1)控制,即置 1, t/c 就被选通, 而不管 int0 (或 int1)的电平是高还是低。 3、tcon tf0、tf1 分别是定时器/计数器 t0、 t
50、1 的溢出中断标志位, 加法计数器计满溢出时 置 1, 申请中断, 在中断响应后自动复 0。tf 产生的中断申请是否被接受, 还需要由中断 是否开放来决定。tr1、tr0 分别是定时器 /计数器 t1、 t0 的运行控制位, 通过软件置 1 后, 定时器 /计数器才开始工作, 在系统复位时被清 0。 4、初始化 1)初始化步骤 在使用 51 系列单片机的 t/c 前,应对它进行编程初始化,主要是对 tcon 和 tmod 编程,还需要计算和装载 t/c 的计数初值。一般完成以下几个步骤: (1)确定 t/c 的工作方式编程 tmod 寄存 (2)计算 t/c 中的计数初值,并装载到 th 和
51、tl; (3)t/c 在中断方式工作时,必须开 cpu 中断和源中断编程 ie 寄存器; (4)启动定时器/计数器编程 tcon 中 tr1 或 tr0 位。 2)计数初值的计算 (1)定时器的计数初值: 在定时器方式下,t/c 是对机器周期脉冲计数的,fosc=6mhz,一个机器周期为 12/fosc=2us,则 方式 0 13 位定时器最大定时间隔=213*2us=16.384ms 方式 1 16 位定时器最大定时间隔=216*2us=131.072ms 方式 2 8 位定时器最大定时间隔=28*2us=512us 若 t/c 工作在定时器方式 1 时,要求定时 1ms,求计数值。如设计数
52、初值为 x,则 有: (216-x)*2us=1000us 推出 x=216-500 因此,th,tl 可置 65 536-500 (2)计数器的计数初值 在计数器方式下: 方式 0 13 位计数器的满计数值=213=8192 方式 1 16 位计数器的满计数值=216=65 536 方式 2 8 位计数器的满计数值=28=256 若 t/c 工作在计数器方式 2 时,则要求计数 10 个脉冲的计数初值,如设计数初值 为 x。则有 28-x=10 即 x= 28-10 因此,th=tl=256-10 三、参考例子三、参考例子 1)设单片机晶振频率为 12 mhz,利用定时器在 p1.0 脚输出
53、周期为 2 ms 的方波。 分析:选用定时器 /计数器 t0 作定时器, 输出为 p1.0 引脚, 2 ms 的方波可由间隔 1 ms 的高低电平相间而成, 因而只要每隔 1 ms 对 p1.0 取反一次即可得到这个方波。 机器周期=1212mhz= 1 s 1 ms 内 t0 需要计数 n 次: n= 1 ms1 s = 1000 由于计数器向上计数,为得到 1000 个计数之后的定时器溢出,必须给定时器置初值为:65 536-1000. 2) 在 p1.7 端接有一个发光二极管,要求利用 t/c 控制,使 led 亮 1s,灭 1s,周而复始。 分析:要求定时 1s,t/c 的三种工作方式
54、都不能满足。 (为什么?)对于较长时间的定时, 应采用符合定时的方法。 使 t/c0 工作在定时器方式 1,定时 100ms,定时时间到后 p1.0 反相,即 p1.0 端输 出周期 200ms 的方波脉冲。另设 t/c1 工作在计数器方式 2,对 t1 输出的脉冲计数, 当计满 5 次,定时 1s 时间到,将 p1.7 端方向,改变灯的状态。 采用 6mhz 晶振,方式 1 的最大定时才能达到 100 多 ms。对于 100ms,机器周期 为 12/fosc=2us,需要计数的次数=100*1000/2=50 000,即初值为 65 536-50 000. 方式 2 满 5 次溢出中断,初值
55、为 256-5. 四、参考程序四、参考程序 (一)适用于自制实验教学板 1)设置周期为 2ms 的方波 查询方式: #include sbit p1_0=p10; void main() tmod=0 x01; /t/co 工作在定时器方式 1 16 位定时器 tr0=1; /启动 t/c0 for(;) /主程序循环 th0=(65536-1000)/256; /预置计数初值 tl0=(65536-1000)%256; do p1_0=!p1_0; /p1.0 取反 tf0=0; /软件清 tf0 while(!tf0); /查询等待 tf0 置位 中断方式: #include sbit p
56、1_0=p10; void timer0(void) interrupt 1 using 1 /t/c 中断服务程序入口 tf0=0; /清楚中断标志位 p1_0=!p1_0; /p1.0 取反 th0=(65536-1000)/256; /计数初值重装载 tl0=(65536-1000)%256; void main() tmod=0 x01; /t/co 工作在定时器方式 1 p1_0=0; th0=(65536-1000)/256; /预置计数初值 tl0=(65536-1000)%256; ea=1; /cpu 开中断 tf0=0; et0=1; /t/c0 开中断 tr0=1; /启
57、动 t/c0 开始定时 do while(1); 2) 灯的闪烁,时间间隔为 1s(p1.0 与 p3.5 相连,作为定时器 1 的输入) #include sbit p1_0=p10; sbit p0_7=p07; timer0() interrupt 1 using 1 /t/c0 中断服务程序入口 tf0=0; /清楚中断 t0 标志位 p1_0=!p1_0; /p1.0 取反 th0=(65536-1000)/256; /计数初值重装载 tl0=(65536-1000)%256; timer1() interrupt 3 using 2/t/c1 中断服务程序入口 tf1=0; /清楚
58、中断 t1 标志位 p0_7=!p0_7; /1s 到,灯改变状态 void main() p2=0 x10; /打开 led 电源开关 p0_7=1; /置灯初始灭 p1_0=1; /保证第一次方向便开始计数 tmod=0 x61; /t/co 工作在定时器方式 1,t/c1 工作在计数器方式 2 th0=(65536-10000)/256; /预置计数初值 10 毫秒 tl0=(65536-10000)%256; th1=256-100; tl1=256-100; ip=0x08; /置优先级存储器 ea=1; /cpu 开中断 tf0=0; /清除中断 t0 标志位 tf1=0;/清除中
59、断 t1 标志位 et0=1; /t/c0 开中断 et1=1; /t/c1 开中断 tr0=1; /启动 t/c0 开始定时 tr1=1; /启动 t/c1 do while(1); (二)适用于 mini80e 实验板 (2)p0.7 与 p3.5 相连,作为定时器 1 的输入 #include sbit p1_0=p10; sbit p0_7=p07; timer0() interrupt 1 using 1 /t/c0 中断服务程序入口 tf0=0; /清除中断 t0 标志位 p0_7=!p0_7; /p1.0 取反 th0=(65536-1000)/256; /计数初值重装载 tl0
60、=(65536-1000)%256; timer1() interrupt 3 using 2/t/c1 中断服务程序入口 tf1=0;/清除中断 t1 标志位 p1_0=!p1_0; /1s 到,灯改变状态 void main() p2=0 x10; /打开 led 电源开关 p0_7=1; /置灯初始灭 p1_0=1; /保证第一次方向便开始计数 tmod=0 x61; /t/co 工作在定时器方式 1,t/c1 工作在计 数器方式 2 th0=(65536-10000)/256; /预置计数初值 10 毫秒 tl0=(65536-10000)%256; th1=256-100; tl1=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年汽车冷却风扇合作协议书
- 合作社助力社区生态农业建设协议
- 环境工程设计与实施经验证明(6篇)
- 渔业合作社捕捞与生态环境保护协议
- 社区农田高效农业种植合作协议
- 电信行业智能网络运维与服务提升方案
- 社区居民农产品供应链协同管理协议
- 合作社运营农户模式协议
- 现代管理学战略规划试题及答案评估
- 造纸行业智能化造纸技术与设备升级方案
- 2024年高考全国甲卷英语试卷(含答案)
- 政府购买运输服务协议
- 电梯临时用电施工方案
- GB/T 44510-2024新能源汽车维修维护技术要求
- 高铁接触网工职业技能竞赛理论考试题库500题(含答案)
- 2024年公开选聘事业编教师报名登记表
- 高中英语新课程标准解读课件
- 广东开放大学2024年秋《国家安全概论(S)(本专)》形成性考核作业参考答案
- 小学3-6年级英语知识点(必背)
- 2024风力发电机组运行及维护要求
- 建筑与市政工程无障碍规范知识培训
评论
0/150
提交评论