福建师范大学MCU作业任务内部定时器01应用Word文档格式.docx
- 文档编号:22635826
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:10
- 大小:74.81KB
福建师范大学MCU作业任务内部定时器01应用Word文档格式.docx
《福建师范大学MCU作业任务内部定时器01应用Word文档格式.docx》由会员分享,可在线阅读,更多相关《福建师范大学MCU作业任务内部定时器01应用Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
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;
}
教师评阅:
成绩:
注:
老师如已阅,方便的话能否通知!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 福建师范大学 MCU 作业 任务 内部 定时器 01 应用