C51单片机定时器及数码管控制实验报告Word文档格式.docx

上传人:b****4 文档编号:16905761 上传时间:2022-11-27 格式:DOCX 页数:12 大小:1.30MB
下载 相关 举报
C51单片机定时器及数码管控制实验报告Word文档格式.docx_第1页
第1页 / 共12页
C51单片机定时器及数码管控制实验报告Word文档格式.docx_第2页
第2页 / 共12页
C51单片机定时器及数码管控制实验报告Word文档格式.docx_第3页
第3页 / 共12页
C51单片机定时器及数码管控制实验报告Word文档格式.docx_第4页
第4页 / 共12页
C51单片机定时器及数码管控制实验报告Word文档格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

C51单片机定时器及数码管控制实验报告Word文档格式.docx

《C51单片机定时器及数码管控制实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《C51单片机定时器及数码管控制实验报告Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。

C51单片机定时器及数码管控制实验报告Word文档格式.docx

A、达到□ B、基本达到□ C、未达到□

实验报告就是否规范:

A、规范□ B、基本规范□ C、不规范□

实验过程就是否详细记录:

A、详细□ B、一般□ C、没有□注:

5个A为优4个A为良3个A为及格其余为不及格。

教师签名:

 

一、实验目的

1.掌握定时器T0、T1的方式选择与编程方法,了解中断服务程序的设计方法,学会实时程序的调试技巧。

2.掌握LED数码管动态显示程序设计方法。

二、实验原理

1.89C51单片机有五个中断源(89C52有六个),分别就是外部中断请求0、外部中断请求1、定时器/计数器0溢出中断请求、定时器/计数器0溢出中断请求及串行口中断请求。

每个中断源都对应一个中断请求位,它们设置在特殊功能寄存器TCON与SCON中。

当中断源请求中断时,相应标志分别由TCON与SCON的相应位来锁寄。

五个中断源有二个中断优先级,每个中断源可以编程为高优先级或低优先级中断,可以实现二级中断服务程序嵌套。

在同一优先级别中,靠内部的查询逻辑来确定响应顺序。

不同的中断源有不同的中断矢量地址。

中断的控制用四个特殊功能寄存器IE、IP、TCON(用六位)与SCON(用二位),分别用于控制中断的类型、中断的开/关与各种中断源的优先级别。

中断程序由中断控制程序(主程序)与中断服务程序两部分组成:

1)中断控制程序用于实现对中断的控制;

2)中断服务程序用于完成中断源所要求的中断处理的各种操作。

C51的中断函数必须通过interruptm进行修饰。

在C51程序设计中,当函数定义时用了interruptm修饰符,系统编译时把对应函数转化为中断函数,自动加上程序头段与尾段,并按MCS-51系统中断的处理方式自动把它安排在程序存储器中的相应位置。

在该修饰符中,m的取值为0~31,对应的中断情况如下:

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控制其运行。

定时器的中断由中断允许寄存器IE,中断优先权寄存器IP中的相应位进行控制。

定时器T0的中断入口地址为000BH,T1的中断入口地址为001BH。

定时器的编程包括:

1)置工作方式。

2)置计数初值。

3)中断设置。

4)启动定时器。

定时器/计数器由四种工作方式,所用的计数位数不同,因此,定时计数常

数也就不同。

3.单片机的拉电流比较小(100~200uA),灌电流比较大(最大就是25mA,一般不能超过10mA),不能直接驱动数码管,需要扩流电路。

可以用三级管来驱动,但就是51单片机只有32个I/O口,可能需要外接多种器件,I/O口就是不够用的。

故可选用74HC573锁存器来解决这个问题,开发板上数码管的硬件设计电路图,如图1所示。

TX-1C实验开发板用两个74HC573锁存器(输出电流较大,接口简单),通过P0口控制六个数码管的段选及位选,其中P2、6控制锁存器U1(DULA),P2、7控制锁存器U2(WELA)。

单片机控制锁存器的锁存端,进而控制锁存器的输出,这种分时控制的方法可方便地控制任意数码管显示任意数字。

图1LED数码管电路原理图

三、实验内容

利用动态扫描与定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。

到此保持住。

计算初值公式

定时模式1th0=(216-定时时间)/256tl0=(216-定时时间)%256

四、实验步骤

1、按实验要求在KeilC中创建项目,编辑、编译程序。

2、将编译生成的目标码文件(后缀为、Hex)下载到实验板电路中。

3、在实验板中运行程序,观察实验运行结果并记录。

五、实验结果

开始时数码管的数字就是765432,随后就是765429,流水灯显示的就是第一个灯,实验结果如下图所示:

当数码管显示765406时,流水灯显示就是第六个灯,实现现象如下图所示:

当数码管显示765398时,流水灯显示的就是第七个灯,由于LED灯变化快,难以捕捉到此时刻,以下图片就是随后LED闪烁,数码管保持765398的现象:

最后流水灯全部关闭,数码管显示HELLO字样的现象:

六、心得体会

通过这次实验,巩固了流水灯的操作,在此之上,加深了八段数码管的动态显示的理解,对定时器中断的理解与运用,虽然在实验的的过程中遇到了各种各样的问题,但就是在老师与同学们的帮助下,我失算顺利的完成了这次实验,为后续的学习打下了坚实的基础。

七、思考

1.若用定时器1方式2,程序如何修?

答:

对定时器/计数器的工作方式进行修改,即:

TMOD=0x21;

//0010’0001

2.若显示从“99”开始递减,程序如何修改?

答:

只需选择第一个与第二个数码管即可,当递减到0时停止,或者继改回数字99,程序的其她部分基本不变。

八、源代码

#include<

reg52、h>

intrins、h>

#defineucharunsignedchar

#defineuintunsignedint

sbitled1=P1^0;

sbitdula=P2^6;

sbitwela=P2^7;

ucharcodetable[]={//建一张table数组,元素就是0~F字样

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

ucharcodeHello[]={//建一张HELLO数组,元素就是H,E,L,L,O字样

0x76,0x79,0x38,0x38,0x3f};

voidinit();

//main()函数初始化的函数的声名

voiddelayms(uint);

//延时函数声名

voiddisplay(uchar,uchar,uchar);

//数码管显示函数声名

voiddisHello();

//HELLO显示函数声名

ucharnum1,num2,bai,shi,ge;

//定义全局变量

intcount,temp;

voidmain()

{

init();

while

(1)

{

if(num1==10)//定时器每次计时50ms,当计满500ms时,LED灯流动

{

num1=0;

P1=_crol_(P1,1);

//循环左移

}

if(num2==2)//当计满0、1s时,数码管的值减1

num2=0;

count--;

if(count==398)//当数码管减到765398时,保持该数,8个LED灯闪//烁

{

TR1=0;

TR0=0;

bai=count/100;

//获得398的个、十、百位

shi=count/10%10;

ge=count%10;

display(bai,shi,ge);

//显示数码管的六位数

P1=0x00;

//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=0xff;

//关闭LED灯

disHello();

//显示HELLO

}

else

display(bai,shi,ge);

//当没计满3s时,继续显示之前的6位数

}

}

bai=count/100;

shi=count/10%10;

ge=count%10;

display(bai,shi,ge);

}

}

voidinit()//main()函数的初始化

TMOD=0x11;

//定时器T0,T1的工作方式都就是1

TH0=(65536-45872)/256;

//T0计数寄存器的初始化

TL0=(65536-45872)%256;

TH1=(65536-45872)/256;

//T1计数寄存器的初始化

TL1=(65536-45872)%256;

P1=0xfe;

//LED的初始化

count=432;

//计数器的初始化,因为只有后三位变化

EA=1;

//打开总中断

ET0=1;

//打开计时器T0

TR0=1;

//打开计时器T1

ET1=1;

//开启计时器T0

TR1=1;

//开启计时器T1

voiddisHello()//HELLO显示程序

wela=1;

P0=0xfe;

wela=0;

P0=0xff;

dula=1;

P0=Hello[0];

dula=0;

delayms(5);

wela=1;

P0=0xfd;

P0=Hello[1];

P0=0xfb;

P0=Hello[2];

P0=0xf7;

P0=Hello[3];

P0=0xef;

P0=Hello[4];

voiddisplay(ucharbai,ucharshi,ucharge)//数码管显示程序

P0=table[7];

P0=table[6];

P0=table[5];

P0=table[bai];

P0=table[shi];

P0=0xdf;

P0=table[ge];

voiddelayms(uintxms)

uinti,j;

for(i=0;

i<

xms;

i++)

for(j=0;

j<

110;

j++);

voidT0_time()interrupt1//定时器T0程序

num1++;

}

voidT1_time()interrupt3//定时器T1程序

num2++;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1