原创 采用定时器0产生多个时间间隔(转展)

2009-6-15 18:17 1234 0 分类: MCU/ 嵌入式

采用单片机定时器0产生多个时间间隔。程序中使用定时器0每50ms中断一次,然后用全局变量tt,t1,t2,t3,t4,t5对中断次数计数,获得100ms,1s,2s,4s,8s,16s间隔,在各个定时间隔内,分别使LED灯亮灭一次。源程序如下:
#include < AT89X51.H>
unsigned char tt,t1,t2,t3,t4,t5; //全局时间隔变量
unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90}; //七段数码管译码表
void main(void) //主函数
{
TMOD=0x01; //定时器0运行在工作模式1,GATE=0,C/T=0
TH0=(65536-15536)/256; //设置定时器0高8位初值
TL0=(65536-15536)%256; //设置定时器0低8位初值
//若是机器周期为1μs,则计数50000,相当于50ms。
TR0=1; //启动定时器
ET0=1; //允许定时器0中断
EA=1; //允许总中断
while(1) //无限循环
{
if(t1>5) P2_0=0; else P2_0=1; //根据时间间隔变量值闪烁LED灯
if(t2>10) P2_1=0; else P2_1=1;
if(t3>20) P2_2=0; else P2_2=1;
if(t4>40) P2_3=0; else P2_3=1;
if(t5>80) P2_4=0; else P2_4=1;
P1=dispcode[t4/10]; //显示间隔变量t4的十位
P0=dispcode[t4%10]; //显示间隔变量t4的个位
}}
void t0(void) interrupt 1 //定时器0中断服务程序
{
TH0=(65536-15536)/256; //设置定时器0高8位初值(3CH)
TL0=(65536-15536)%256; //设置定时器0低8位初值(B0H)
tt++; //每中断一次,tt加1
if(tt==2) //如果tt等于2,相当于100ms,执行如下语句
{
tt=0; //将tt清0,所以tt的计数值为0---1---2(0),每个间隔为50ms
t1++;
if(t1==10){t1=0;}
t2++;
if(t2==20){t2=0;}
t3++;
if(t3==40){t3=0;}
t4++;
if(t4==80){t4=0;}
t5++;
if(t5==160){t5=0;}
P2_6=~P2_6; //每100ms,P2_6连接的LED灯闪烁一次
} }











广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
yqh815 2009-06-15 17:32
单片机与蜂鸣器
#include "reg52.h"unsigned char Count;sbit _Speak =P2^3 ;   //讯响器控制脚 unsigned char code SONG[] ={   ...
广告
我要评论
0
0
广告
关闭 热点推荐上一条 /1 下一条