T0中断实现长延时下其他任务的实现例子.doc_第1页
T0中断实现长延时下其他任务的实现例子.doc_第2页
T0中断实现长延时下其他任务的实现例子.doc_第3页
T0中断实现长延时下其他任务的实现例子.doc_第4页
全文预览已结束

下载本文档

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

文档简介

T0中断实现长延时下其他任务的实现例子(C51)作者:月夜听风 发布时间:2009-11-4 阅读次数:1806 字体大小: 【小】 【中】【大】一、定时器中断说明: 1.如果不会使用51单片机的定时器和中断,那么学单片机就没有多大意义,因为中断这项功能为实现单片机多任务提高了便利。 2.当对计时要求精确时,一般是采用定时计数中断的方法产生一个精确的时间单位,比如5ms,然后结合软件办法达到所需目的。 3.定时中断模块分为两个部分:定时部分和中断服务部分。 定时部分工作原理如下:首先设置定时器工作方式、初始化值、设置定时器中断和开启中断,例如: TMOD=0X01;/指定T0,工作方式1 TH0=-(5000/256); /加载高字节计数初值 TL0=-(5000%256); /加载低字节计数初值 IE=0X82; /允许T0产生中断 TR0=1; /启动T0中断 中断服务函数部分的作用:一是重置定时器T0的初始值、二是记录中断次数,每中断一次,计数单元count加1.二、模块代码:1. 定时部分,如:void init_timer() TMOD=0X01; /设置T0工作方式1 TH0=-(5000/256); /加载高字节计数初值 TL0=-(5000%256); /加载低字节计数初值 IE=0X82;/允许T0产生中断 TR0=1;/启动T0中断 2. 中断服务函数,如:void T0_srv(void) interrupt 1 TH0=-(5000/256); /重新加载高字节计数初值 TL0=-(5000%256); count+; 说明:该定时器定时时间为5ms,即5ms产生一次中断。计数单元count使用前首先要定义。三、电路图:(此图数码管显示参照了XY850/XY900开发板部分,下面程序只指定后2个数码管显示)四、功能说明: 1. 用定时器实现长时间延时(通电一分钟后点亮LED一分钟、然后熄灭一分钟再点亮,循环); 2. 在程序中我们还要做一个任务:按键(接P3.2)计数099数码管显示。 / = 以上做到互不影响。四、程序实例(单片机同时进行2个任务):/-/程序名称:用T0实现1分钟定时点亮LED + 按键数码管计数/实验硬件:XY850或XY900_USB单片机开发系统板, 晶体11.0592/程序编写:月夜听风 mail: mcusy_ /-#include #define uchar unsigned char sbit duan= P33; /数码管段选通端sbit wei= P34; /数码管位选通端sbit Key= P32; /定义手动按键sbit LED =P20; /定义输出端口P2.0为LEDuchar count =0 ; /定义5MS的计数单元/清0uchar sec= 0; /定义秒单位/清0uchar shi,ge,num,s ; /定义要显示的十位、个位计数和num,svoid init_timer();/声明定时函数void out(); /声明LED输出函数 void out_DIS(); /声明数码管计数部分输出函数 uchar code table=0xc0,0xf9,0xa4,0xb0, / 0,1,2,3 0x99,0x92,0x82,0xf8,0x80,0x90,0xff;/ 4,5,6,7,8,9,off 数码管显示码table_wei=0x02,0x01,0x08,0x04,0x20,0x10,0x80,0x40;/07依次位码表/-延时函数-void delay(void)/延时unsigned char x,y;for(x=10;x0;x-)for(y=220;y0;y-);/-主函数-main() init_timer();/调用T0初始化 while(1)/循环 out() ;/调用LED输出 out_DIS(); /调用数码管手动计数 /-定时函数-void init_timer() /以下初值约50ms(晶体11.0592) TMOD=0X01; /设置T0工作方式1 TH0=-(4800/256); /加载高字节计数初值 TL0=-(4800%256); /加载低字节计数初值 IE=0X82; /允许T0产生中断 TR0=1; /启动T0中断 /-T0中断服务函数-void T0_src(void) interrupt 1 TH0=-(4800/256); /重新加载高字节计数初值 TL0=-(4800%256); count+; /计数单元值加1 /-LED一分钟间隔输出模块-void out() /以下若想做到超过一分钟或更长时间怎么办?想想看 if(count=200) /中断200次后 sec+;count=0; /秒加1,count清0 if(sec=60) /秒计满60次? LED=LED; sec=0;/反向输出1次,清0 /-按键计数数码管输出模块-void out_DIS() if(Key=0) /检测按键 num+; /数加1 if(num=100) /是否加满100? num=0; /清零 for(s=0;s=20;s+)/按键速度 shi=num/10; /提取十位 ge=num%10; /提取个位 duan=1;P0=tableshi;duan=0;/选通段,显示十位 wei=1;P0=tabl

温馨提示

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

最新文档

评论

0/150

提交评论