实验3 定时器0

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

相关文档
最新文档