嵌入式定时器实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

昆明理工大学信息工程与自动化学院学生实验报告

(2013 —2014 学年第 2 学期)

课程名称:嵌入式技术及应用开课实验室:信自楼504 2014年5月 9 日

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

二、实验原理

89C51单片机有五个中断源(89C52有六个),分别是外部中断请求0、外部中断请求1、定时器/计数器0溢出中断请求、定时器/计数器0溢出中断请求及串行口中断请求。每个中断源都对应一个中断请求位,它们设置在特殊功能寄存器TCON和SCON中。当中断源请求中断时,相应标志分别由TCON和SCON的相应位来锁寄。五个中断源有二个中断优先级,每个中断源可以编程为高优先级或低优先级中断,可以实现二级中断服务程序嵌套。在同一优先级别中,靠内部的查询逻辑来确定响应顺序。不同的中断源有不同的中断矢量地址。

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

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

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

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

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

三、实验内容

在实验板上完成如下功能:

●用定时器T0的方式1,实现第一个发光二极管以200ms的间隔闪烁;

●用定时器T1的方式1,实现数码管前两位59s循环计时。

实验板数码管电路原理如图1所示。

计算初值公式

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

tl0=(216-定时时间) % 256

图1 LED数码管电路原理图

四、实验步骤

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

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

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

1.实验原理补充:

89C51的定时计数器的结构及工作方式

2.工作方式

定时器方式:

设置为定时工作方式时,定时器计数89C51片内振荡器输出经12分频后的脉冲,即每个机器周期使定时器(T0或T1)的数值加1直至计满溢出。当89C5l 采用12MHz晶体时,一个机器周期为1μs,计数频率为1MHz。

计数器方式:

设置为计数工作方式时,通过引脚T0(P3.4)或T1(P3.5)对外部脉冲信号计数。当输入脉冲信号产生由1至0的下降沿时,计数器的值加1。在每个机器周期的S5P2期间采样T0或T1引脚的输入电平,若前一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。此后的机器周期S3P1期间,新的数值装入计数器。所以,检测一个1至0的跳变需要二个机器周期,故最高计数频率为振荡频率的二十四分之一。

除了可以选择定时器或计数器工作方式外,每个定时器/计数器还有四种工作模式,也就是每个定时器可构成四种电路结构模式。其中,0~2模式对T0和T1都是一样的,模式3对两者是不同的。

定时器共有两个控制字,由软件写入TMOD和TCON两个8位寄存器,用来设置T0或T1的操作模式和控制功能。当89C51系统复位时,两个寄存器所有位都被清0。

MODE 0工作方式(Timer 0为例)

3.实验代码:

#include

#define uint unsigned int #define uchar unsigned char sbit U1 = P2^6;

sbit U2 = P2^7; sbit LED = P1^0;

uchar count,count1,second,shi,ge;

uchar code table[]={ 0x3f,0x06,0x5B ,0x4F,0x66,0 void delay(uint z)

{

..

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--); }

void init()

{

TMOD=0x11;//0001'0001

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

EA=1;

ET0=1;ET1=1;

TR0=1;TR1=1;

}

void display(uchar aa,uchar bb) {

U2=1;

P0=0xfe;//1111'1110

U2=0;

U1=1;

P0=table[aa];

U1=0;

delay(5);

U2=1;

P0=0xfd;//1111'1101

U2=0;

U1=1;

P0=table[bb];

U1=0;

delay(5);

} void main()

{

init();

while(1)

{

shi=second/10;

ge=second%10;

display(shi,ge);

}

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

count++;

if(count==4)

{

count=0;

LED=~LED;

}

}

void timer1() interrupt 3

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

count1++;

if(count1==20)

{

count1=0;

second++;

if(second==60)

second=0;

}

}

4.实验截图

相关文档
最新文档