实验3 定时器0
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验3 定时器0和定时器1
一、实验目的
1、学会用C语言进行定时器应用程序的设计。
二、实验内容
1、在同一个程序中实现:用定时器0的方式1实现第一个LED灯以1000ms间隔闪烁,用定时器1的方式1实现数码管前两位59秒循环计时。
三、实验步骤
1、硬件连接
(1)使用MicroUSB数据线,将实验开发板与微型计算
机连接起来;
(2)在实验开发板上,用数据线将相应接口连接起来;
2、程序烧入软件的使用
使用普中ISP软件将HEX文件下载至单片机芯片内。
查看结果是否正确。
四、实验结果——源代码
#include
typedef unsigned int u16;
typedef unsigned char u8;
sbit led = P2^0;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u16 t1;
u16 t2;
u8 sec;
u8 DisplayData[2];
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void Time0Init()
{
TMOD |= 0x01;
TH0=0xFc;
TL0=0x18;
EA=1;
ET0=1;
TR0=1;
}
void Time1Init()
{
TMOD |= 0x10;
TH1=0Xd8;
TL1=0Xf0;
EA=1;
ET1=1;
TR1=1;
}
void delay(u16 i)
{
while(i--);
}
void datapros()
{
DisplayData[0]=smgduan[sec%10];
DisplayData[1]=smgduan[sec/10]; }
void DigDisplay()
{
u8 i;
for(i=0;i<2;i++)
{
switch(i)
{
case 0:LSA=0;LSB=0;LSC=0;break;
case 1:LSA=1;LSB=0;LSC=0;break;
}
P0=DisplayData[i];
delay(100);
P0=0x00;
}
}
void main()
{
Time0Init();
Time1Init();
while(1);
}
void Time0() interrupt 1
{
TH0=0xFC;
TL0=0x18;
t1++;
if(t1==1000)
{
t1=0;
led=~led;
}
}
void Time1() interrupt 2
{
TH1=0Xd8;
TL1=0Xf0;
t2++;
if(t2==100)
{
t2=0;
sec++;
if(sec>=60)
{
sec=0;
}
}
datapros();
DigDisplay();
}
五、实验体会——结果分析
位定义P2.0、P2.2、P2.3、P2.4口,P2.0控制第一个LED灯,初始化定时器0,选择工作方式1,也就是16位定时/计数器,赋初值为1ms,编写定时器0中断函数,定义全局变量t1,当t1自增到1000即计数了1000次,每次1ms,重置定时器0,并使第一个LED灯状态翻转,实现第一个LED灯以1000ms间隔闪烁;定时器1初始化方式同定时器0,但初值为10ms,定义全局变量t2,当t2自增到100即计数100次每次10ms相当于1s时,使全局变量sec自增1,当sec 增加到第60s时,数码管重新以00开始计时,数码管段选保存在数组里,位选只有1和2位,因为只显示0-59s计数,通过循环选择。
现象为:第一个LED灯以1000ms间隔闪烁,数码管的前两位以00开始计数到
59再重新以00开始不断循环。