嵌入式定时器实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.实验截图