C单片机定时器及数码管控制实验报告_第1页
C单片机定时器及数码管控制实验报告_第2页
C单片机定时器及数码管控制实验报告_第3页
C单片机定时器及数码管控制实验报告_第4页
C单片机定时器及数码管控制实验报告_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、昆明理工大学信息工程与自动化学院学生实验报告( 201 201 学年 第 1 学期 )课程名称:单片机技术开课实验室:年月 日年级、专业、班学号姓名成绩实验项目名称定时器及数码管控制实验指导教师教师评语该同学是否了解实验仪器原理:a.了解b.基本了解c.不了解该同学的实验能力: a.强 b.中等 c. 差该同学的实验是否达到要求: a. 达到 b. 基本达到c.未达到实验报告是否规范: a.规范 b. 基本规范c.不规范实验过程是否详细记录: a.详细 b. 一般c.没有注: 5 个 a 为优 4 个 a为良 3个 a 为及格其余为不及格。教师签名:年月日一、 实验目的1 掌握定时器 t0、t

2、1 的方式选择和编程方法, 了解中断服务程序的设计方法, 学会实时程序的调试技巧。2 掌握 led 数码管动态显示程序设计方法。二、 实验原理189c51 单片机有五个中断源 (89c52 有六个 ) ,分别是外部中断请求 0 、外部中 断请求 1 、定时器 / 计数器 0 溢出中断请求、定时器 / 计数器 0 溢出中断请求及串行口中断请求。每个中断源都对应一个中断请求位,它们设置在特殊功能寄存器 tcon 和 scon 中。当中断源请求中断时,相应标志分别由 tcon 和 scon 的相应位 来锁寄。五个中断源有二个中断优先级,每个中断源可以编程为高优先级或低优先级中断,可以实现二级中断服务

3、程序嵌套。在同一优先级别中,靠内部的查询逻辑来确定响应顺序。不同的中断源有不同的中断矢量地址。中断的控制用四个特殊功能寄存器 ie 、 ip、 tcon (用六位 ) 和 scon( 用二位 ) ,分别用于控制中断的类型、中断的开关和各种中断源的优先级别。中断程序由中断控制程序(主程序)和中断服务程序两部分组成:1)中断控制程序用于实现对中断的控制;2)中断服务程序用于完成中断源所要求的中断处理的各种操作。c51 的中断函数必须通过 interrupt m 进行修饰。在 c51 程序设计中,当函数定 义时用了 interrupt m 修饰符,系统编译时把对应函数转化为中断函数,自动加 上程序头

4、段和尾段,并按 mcs-51 系统中断的处理方式自动把它安排在程序存储器中的相应位置。在该修饰符中, m 的取值为 031,对应的中断情况如下:0外部中断 0 1定时 / 计数器 t0 2外部中断 1 3定时 / 计数器 t1 4串行口中断5定时 / 计数器 t2 其它值预留。89c51 单片机内设置了两个可编程的 16 位定时器 t0 和 t1,通过编程,可以 设定为定时器和外部计数方式。t1 还可以作为其串行口的波特率发生器。2定时器 t0 由特殊功能寄存器 tl0 和 th0 构成, 定时器 t1 由 th1 和tl1 构成, 特殊功能寄存器 tmod 控制定时器的工作方式, tcon

5、控制其运行。定时器的中断由中断允许寄存器 ie , 中断优先权寄存器 ip 中的相应位进行控制。定时器 t0 的中断入口地址为 000bh,t1 的中断入口地址为 001bh。定时器的编程包括:1) 置工作方式。2) 置计数初值。3) 中断设置。4) 启动定时器。定时器 / 计数器由四种工作方式, 所用的计数位数不同, 因此,定时计数常数也就不同。3单片机的拉电流比较小( 100200ua ), 灌电流比较大(最大是 25ma ,一般不 能超过 10ma ) ,不能直接驱动数码管,需要扩流电路。可以用三级管来驱动,但 是 51 单片机只有 32 个 i/o 口,可能需要外接多种器件, i/o

6、口是不够用的。 故可选用 74hc573 锁存器来解决这个问题, 开发板上数码管的硬件设计电路图,如图 1 所示。tx-1c 实验开发板用两个 74hc573 锁存器(输出电流较大, 接口简单),通过 p0 口控制六个数码管的段选及位选,其中控制锁存器 u1(dula ) , 控制锁存器 u2(wela ) 。单片机控制锁存器的锁存端,进而控制锁存器的输出,这种分时控制的方法可方便地控制任意数码管显示任意数字。图 1 led 数码管电路原理图三、 实验内容利用动态扫描和定时器 1 在数码管上显示出从 765432 开始以 1/10 秒的速 度往下递减直至 765398 并保持显示此数,与此同时

7、利用定时器 0 以 500ms 速度 进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止 然后全部开始闪烁, 3 秒后(用 t0 定时)流水灯全部关闭、数码管上显示出 “hello ” 。到此保持住。计算初值公式定时模式 1 th0=(216-定时时间 ) / 256 tl0=(216-定时时间 ) % 256 四、 实验步骤1、 按实验要求在 keilc 中创建项目,编辑、编译程序。2、 将编译生成的目标码文件(后缀为.hex)下载到实验板电路中。3、 在实验板中运行程序,观察实验运行结果并记录。五、 实验结果开始时数码管的数字是765432, 随后是 765429, 流水

8、灯显示的是第一个灯,实验结果如下图所示:当数码管显示 765406时,流水灯显示是第六个灯,实现现象如下图所示:当数码管显示 765398时,流水灯显示的是第七个灯,由于led灯变化快,难以捕捉到此时刻,以下图片是随后led闪烁,数码管保持765398的现象:最后流水灯全部关闭,数码管显示hello 字样的现象:六、 心得体会通过这次实验,巩固了流水灯的操作,在此之上,加深了八段数码管的动态显示的理解, 对定时器中断的理解和运用, 虽然在实验的的过程中遇到了各种各样的问题, 但是在老师和同学们的帮助下,我失算顺利的完成了这次实验,为后续的学习打下了坚实的基础。七、 思考1若用定时器 1 方式

9、2 ,程序如何修答:对定时器 / 计数器的工作方式进行修改,即:tmod = 0 x21 ;/0010 0001 2若显示从“ 99”开始递减,程序如何修改答:只需选择第一个和第二个数码管即可,当递减到0 时停止,或者继改回数字 99,程序的其他部分基本不变。八、 源代码#include #include #define uchar unsigned char #define uint unsigned int sbit led1 = p10; sbit dula = p26; sbit wela = p27; uchar code table= /建一张 table 数组,元素是 0f字样0

10、 x3f,0 x06,0 x5b,0 x4f, 0 x66,0 x6d,0 x7d,0 x07, 0 x7f,0 x6f,0 x77,0 x7c, 0 x39,0 x5e,0 x79,0 x71; uchar code hello= /建一张 hello 数组,元素是 h,e,l,l,o 字样0 x76,0 x79,0 x38,0 x38,0 x3f; void init();/main()函数初始化的函数的声名void delayms(uint); / 延时函数声名void display(uchar,uchar,uchar);/数码管显示函数声名void dishello(); /hell

11、o显示函数声名uchar num1,num2,bai,shi,ge; /定义全局变量int count,temp; void main() init(); while(1) if(num1=10)/定时器每次计时 50ms ,当计满 500ms时,led灯流动 num1=0; p1 = _crol_(p1,1); /循环左移 if(num2=2)/当计满时,数码管的值减1 num2 = 0; count-; if(count=398)/当数码管减到 765398时,保持该数, 8 个 led灯闪/ 烁 tr1 = 0; tr0 = 0; bai = count/100;/获得 398 的个、十

12、、百位shi = count/10%10; ge = count%10; display(bai,shi,ge); /显示数码管的六位数p1 = 0 x00; /8个 led闪烁的初始状态num1 = 0; /重新启动定时器 t0 时,num1重新初始化为 0 tr0 = 1; while(1) if(num1%10=0) /8 个 led每隔 500ms闪烁 p1 = p1; /led灯取反if(num1 = 60) /当计满 3s 时,关闭 led灯,在数码管上显/ 示 hello tr0 = 0; /关闭定时器 t0 p1 = 0 xff; /关闭 led灯dishello(); / 显

13、示 hello else display(bai,shi,ge); /当没计满 3s 时, 继续显示之前的 6 位数 bai = count/100; shi = count/10%10; ge = count%10; display(bai,shi,ge); void init() /main()函数的初始化 tmod = 0 x11; / 定时器 t0,t1 的工作方式都是 1 th0 = (65536-45872)/256; /t0计数寄存器的初始化tl0 = (65536-45872)%256; th1 = (65536-45872)/256;/t1计数寄存器的初始化tl1 = (65

14、536-45872)%256; p1 = 0 xfe; /led 的初始化count = 432; /计数器的初始化,因为只有后三位变化ea = 1; /打开总中断et0 = 1; /打开计时器 t0 tr0 = 1; /打开计时器 t1 et1 = 1; /开启计时器 t0 tr1 = 1; /开启计时器 t1 void dishello()/hello显示程序 wela = 1; p0 = 0 xfe; wela = 0; p0 = 0 xff; dula = 1; p0 = hello0; dula = 0; delayms(5); wela = 1; p0 = 0 xfd; wela

15、= 0; p0 = 0 xff; dula = 1; p0 = hello1; dula = 0; delayms(5); wela = 1; p0 = 0 xfb; wela = 0; p0 = 0 xff; dula = 1; p0 = hello2; dula = 0; delayms(5); wela = 1; p0 = 0 xf7; wela = 0; p0 = 0 xff; dula = 1; p0 = hello3; dula = 0; delayms(5); wela = 1; p0 = 0 xef; wela = 0; p0 = 0 xff; dula = 1; p0 = h

16、ello4; dula = 0; delayms(5); void display(uchar bai,uchar shi,uchar ge) /数码管显示程序 wela = 1; p0 = 0 xfe; wela = 0; p0 = 0 xff; dula = 1; p0 = table7; dula = 0; delayms(5); wela = 1; p0 = 0 xfd; wela = 0; p0 = 0 xff; dula = 1; p0 = table6; dula = 0; delayms(5); wela = 1; p0 = 0 xfb; wela = 0; p0 = 0 xf

17、f; dula = 1; p0 = table5; dula = 0; delayms(5); wela = 1; p0 = 0 xf7; wela = 0; p0 = 0 xff; dula = 1; p0 = tablebai; dula = 0; delayms(5); wela = 1; p0 = 0 xef; wela = 0; p0 = 0 xff; dula = 1; p0 = tableshi; dula = 0; delayms(5); wela = 1; p0 = 0 xdf; wela = 0; p0 = 0 xff; dula = 1; p0 = tablege; dula = 0; del

温馨提示

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

评论

0/150

提交评论