福建师范大学MCU作业内部定时器01应用_第1页
福建师范大学MCU作业内部定时器01应用_第2页
福建师范大学MCU作业内部定时器01应用_第3页
福建师范大学MCU作业内部定时器01应用_第4页
福建师范大学MCU作业内部定时器01应用_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验报告5内部定时器0/1应用实验目的1、 理解单片机内部定时器的工作原理及使用方法2、 了解单片机定时中断程序的编写和调试方法3、 掌握定时器的基本使用方法实验环境pc机一台 和keil c51软件内容与步骤用定时器编写一个秒计时器过程分析 通过编程前画出流程图,使整个程序框架清晰了,编写起来更简单。结果总结通过本次实验,让我加深了对定时器的理解及其能够更好的利用它。在实验中,因为没有重赋初值而出现了奇怪的问题,通过不断的思考和尝试终于得以解决。思考题: 1、 在实验程序基础上编写一个24小时计时时钟。 见附录2、 说说把显示程序放在主程序和定时中断程序的优缺点。 答:显示程序放在主程序时会

2、一直占用空间执行,但执行速度比较快显示程序放在中断程序是通过中断服务程序中被调用而执行的,每中断一次调用一次,故执行耗时间。附录 1.用定时器编写一个秒计时器运行32秒后(左秒数位,右毫秒位):#includereg52.h#define disp_null 10#define led_num 8char dispbuf8;unsigned int msec=0,sec=0;unsigned char disppot=0;unsigned char code ledcode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00;void

3、dispflash(void)p3=0xff; /将所有数码管都置为不亮p2=ledcodedispbufdisppot; /送该数码管的数据p3=(1=led_num)disppot=0; /指针轮换void sysinit(void)tmod=0x01; /设置定时器0为方式1tr0=1; /启动定时器0进行计数et0=1; /开启定时器0中断功能ea=1; /开启总中断void printf_num(void)dispbuf7=msec%10;dispbuf6=(msec/10)%10;dispbuf5=msec/100;dispbuf4=disp_null;dispbuf3=disp_

4、null;dispbuf2=sec%10;dispbuf1=(sec/10)%10;dispbuf0=sec/100;/主函数void main() sysinit(); /初始化while(1) printf_num(); / 将这个数的每一位分解到显示缓冲区#define fre 12000000.0 /系统时钟频率#define inc_time (1000000/(fre/12) /每个计时时钟的周期时间,采用12分频,单位微妙#define need_time(time) (65535-(unsigned int)(time/inc_time) /计时time时间需要多少个计数个数#

5、define count_t(time) tl0=need_time(time);th0=need_time(time)8 /定时时间预置给高,低位8位的tho tlovoid time0int(void) interrupt 1count_t(1000);/给定时器赋需要定时的时间初值 单位微妙dispflash(); /进行数码管显示刷新msec+ ;if( msec= 1000 ) /毫秒与秒的进制 msec= 0, sec+ ; 2. 在实验程序基础上编写一个24小时计时时钟运行状态:#include reg52.h#define disp_null 10/ 显示为空#define d

6、isp_equ 11/ 显示等号#define led_num 8/ 共有8个数码管char dispbuf8;/ 显示缓冲区unsigned int msec= 0;/ 毫秒unsigned char sec= 52, min= 59, hour= 12;/ 秒,分,时/*函数:flashdisp,该函数实现动态显示的一次刷新-入口:无出口:无*/unsigned char disppot=0 ;/ 数码管动态扫描指针unsigned char code ledcode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x48 ;

7、void dispflash( void ) p3= 0xff ;/ 将所有数码管都置为不亮p2= ledcodedispbufdisppot; / 送该数码管的数据p3= (1= led_num ) disppot= 0 ;/ 指针轮换/*函数:pntnum,将一个数转成显示的格式-入口:无出口:无*/void pntnum( void )dispbuf7= sec%10; dispbuf6= sec/10;dispbuf5= disp_equ;dispbuf4= min%10;dispbuf3= min/10;dispbuf2= disp_equ;dispbuf1= hour%10;dis

8、pbuf0= hour/10;/* 函数:定时器0初始配置 功能:1000us中断一回,对毫秒变量和秒变量进行进位操作*/void sysinit( void )tmod= 0x01 ; / 设置定时器0为方式1tr0= 1 ;/ 启动定时器0进行记数et0= 1 ;/ 开启定时器0中断功能ea= 1 ;/ 开启总中断/*函数:main,系统主函数-入口:无出口:无*/void main( )sysinit( );while( 1 )pntnum( ); / 将这个数的每一位分解到显示缓冲区/#define fre 11059200.0/ 系统时钟频率#define fre 12000000.

9、0/ 系统时钟频率#define inc_time (1000000/(fre/12)/ 每个计时时钟的周期时间,采用12分频,单位微秒#define need_time(time) (65536-(unsigned int)(time/inc_time)/ 计时time时间需要多少个 计数个数#define count_t(time) tl0= need_time(time); th0= need_time(time)8/ 定时时间预置值给高、低位8位的 th0 tl0/* 函数:定时器0中断程序 功能:2000us中断一回,对毫秒变量和秒变量进行进位操作*/void time0int( void ) interrupt 1 count_t(2000) ;/ 给定时器赋需要定时的时间初值(单位微秒)dispflash( ) ;/ 进行数码管显示刷新/ 以下进行时间调整msec+ ;if( m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论