福建师范大学MCU作业任务内部定时器01应用Word文档格式.docx

上传人:b****7 文档编号:22635826 上传时间:2023-02-05 格式:DOCX 页数:10 大小:74.81KB
下载 相关 举报
福建师范大学MCU作业任务内部定时器01应用Word文档格式.docx_第1页
第1页 / 共10页
福建师范大学MCU作业任务内部定时器01应用Word文档格式.docx_第2页
第2页 / 共10页
福建师范大学MCU作业任务内部定时器01应用Word文档格式.docx_第3页
第3页 / 共10页
福建师范大学MCU作业任务内部定时器01应用Word文档格式.docx_第4页
第4页 / 共10页
福建师范大学MCU作业任务内部定时器01应用Word文档格式.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

福建师范大学MCU作业任务内部定时器01应用Word文档格式.docx

《福建师范大学MCU作业任务内部定时器01应用Word文档格式.docx》由会员分享,可在线阅读,更多相关《福建师范大学MCU作业任务内部定时器01应用Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。

福建师范大学MCU作业任务内部定时器01应用Word文档格式.docx

2、说说把显示程序放在主程序和定时中断程序的优缺点。

答:

显示程序放在主程序时会一直占用空间执行,但执行速度比较快显示程序放在中断程序是通过中断服务程序中被调用而执行的,每中断一次调用一次,故执行耗时间。

附录

1.用定时器编写一个秒计时器

运行32秒后(左秒数位,右毫秒位):

#include"

reg52.h"

#defineDISP_NULL10

#defineLED_NUM8

charDispBuf[8];

unsignedintmSec=0,Sec=0;

unsignedcharDispPot=0;

unsignedcharcodeLEDCODE[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7d,0x07,0x7F,0x6F,0x00};

voidDispFlash(void)

{

P3=0xff;

//将所有数码管都置为不亮

P2=LEDCODE[DispBuf[DispPot]];

//送该数码管的数据

P3=~(1<

<

DispPot);

//选择第几个数码管

DispPot++;

if(DispPot>

=LED_NUM)

DispPot=0;

//指针轮换

}

 

voidSysInit(void)

TMOD=0x01;

//设置定时器0为方式1

TR0=1;

//启动定时器0进行计数

ET0=1;

//开启定时器0中断功能

EA=1;

//开启总中断

voidPrintf_NUM(void)

DispBuf[7]=mSec%10;

DispBuf[6]=(mSec/10)%10;

DispBuf[5]=mSec/100;

DispBuf[4]=DISP_NULL;

DispBuf[3]=DISP_NULL;

DispBuf[2]=Sec%10;

DispBuf[1]=(Sec/10)%10;

DispBuf[0]=Sec/100;

//主函数

voidmain()

{

SysInit();

//初始化

while

(1)

{

Printf_NUM();

//将这个数的每一位分解到显示缓冲区

}

#defineFRE12000000.0//系统时钟频率

#defineINC_TIME(1000000/(FRE/12))//每个计时时钟的周期时间,采用12分频,单位微妙

#defineNEED_TIME(TIME)(65535-(unsignedint)(TIME/INC_TIME))//计时TIME时间需要多少个计数个数

#defineCOUNT_T(TIME)TL0=NEED_TIME(TIME);

TH0=NEED_TIME(TIME)>

>

8//定时时间预置给高,低位8位的THOTLO

voidTime0Int(void)interrupt1

COUNT_T(1000);

//给定时器赋需要定时的时间初值单位微妙

DispFlash();

//进行数码管显示刷新

mSec++;

if(mSec>

=1000)//毫秒与秒的进制

{

mSec=0,Sec++;

}

2.在实验程序基础上编写一个24小时计时时钟

运行状态:

#include"

#defineDISP_NULL10//显示为空

#defineDISP_EQU11//显示等号

#defineLED_NUM8//共有8个数码管

//显示缓冲区

unsignedintmSec=0;

//毫秒

unsignedcharSec=52,Min=59,Hour=12;

//秒,分,时

/******************************************************

函数:

FlashDisp,该函数实现动态显示的一次刷新

-------------------------------------------------------

入口:

出口:

******************************************************/

unsignedcharDispPot=0;

//数码管动态扫描指针

unsignedcharcodeLEDCODE[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7d,0x07,0x7F,0x6F,0x00,0x48};

voidDispFlash(void)

P3=0xff;

//将所有数码管都置为不亮

P2=LEDCODE[DispBuf[DispPot]];

//送该数码管的数据

P3=~(1<

DispPot);

//选择第几个数码管

DispPot++;

if(DispPot>

=LED_NUM)DispPot=0;

//指针轮换

PntNum,将一个数转成显示的格式

voidPntNum(void)

DispBuf[7]=Sec%10;

DispBuf[6]=Sec/10;

DispBuf[5]=DISP_EQU;

DispBuf[4]=Min%10;

DispBuf[3]=Min/10;

DispBuf[2]=DISP_EQU;

DispBuf[1]=Hour%10;

DispBuf[0]=Hour/10;

/****************************************************

函数:

定时器0初始配置

功能:

1000uS中断一回,对毫秒变量和秒变量进行进位操作

*****************************************************/

voidSysInit(void)

TMOD=0x01;

//设置定时器0为方式1

TR0=1;

//启动定时器0进行记数

ET0=1;

//开启定时器0中断功能

EA=1;

//开启总中断

main,系统主函数

voidmain()

SysInit();

while

(1)

PntNum();

//将这个数的每一位分解到显示缓冲区

//#defineFRE11059200.0//系统时钟频率

#defineFRE12000000.0//系统时钟频率

#defineINC_TIME(1000000/(FRE/12))//每个计时时钟的周期时间,采用12分频,单位微秒

#defineNEED_TIME(TIME)(65536-(unsignedint)(TIME/INC_TIME))//计时TIME时间需要多少个计数个数

#defineCOUNT_T(TIME)TL0=NEED_TIME(TIME);

TH0=NEED_TIME(TIME)>

8//定时时间预置值给高、低位8位的TH0TL0

定时器0中断程序

2000uS中断一回,对毫秒变量和秒变量进行进位操作

voidTime0Int(void)interrupt1

COUNT_T(2000);

//给定时器赋需要定时的时间初值(单位微秒)

DispFlash();

//进行数码管显示刷新

//以下进行时间调整

mSec++;

if(mSec<

500)return;

//如果没有到需要调整的值,退出

if(Sec<

60)return;

Sec=0;

Min++;

if(Min<

Min=0;

Hour++;

if(Hour>

=24)Hour=0;

}

教师评阅:

成绩:

注:

老师如已阅,方便的话能否通知!

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

当前位置:首页 > 工程科技 > 建筑土木

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

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