两个定时器/计时器配合使用实现500MS的延时

本文介绍了如何结合使用两个定时器,在单片机环境下实现精确的500毫秒延时功能。通过配置定时器寄存器和中断处理,确保延时精度。
摘要由CSDN通过智能技术生成

#include<reg52.h>



sbit P3_5 = P3^5;  //T1的脉冲输入口
sbit P1_1 = P1^1;  //定义LED的引脚


//实现延时500MS
//T0定时10MS,T1计数50次


void init_timer0();  //定时10MS
void init_timer1(); //计数50次
void init_timer()
{
 init_timer0();
 init_timer1();
}
void init_timer0()  //定时10MS
{
TMOD  = 0x41;    
TH0   = (65536-10000)/256;
TL0   = (65536-10000)%256;
EA    =  1;      //IE 总中断允许
ET0   =  1;  
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于51单片机的定时器程序,可实现数码管前两位60秒倒计时: ```c #include <reg52.h> #define uint unsigned int #define uchar unsigned char sbit LSA=P2^2; //定义数码管位选引脚LSA sbit LSB=P2^3; sbit LSC=P2^4; sbit beep=P1^5; //定义蜂鸣器控制引脚 uchar num=60; //计时器初始值为60秒 uchar code table[17]={ //数码管显示字符表 0x3f, //0 0x06, //1 0x5b, //2 0x4f, //3 0x66, //4 0x6d, //5 0x7d, //6 0x07, //7 0x7f, //8 0x6f, //9 0x77, //A 0x7c, //B 0x39, //C 0x5e, //D 0x79, //E 0x71, //F 0x00 //空 }; void delayms(uint xms) //延时函数 { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void Display(uchar num) //数码管显示函数 { LSA=1; //位选1 LSB=1; LSC=1; P0=table[num/100]; //显示百位 delayms(5); //延时5ms LSA=0; //位选2 LSB=1; LSC=1; P0=table[num%100/10]; //显示十位 delayms(5); //延时5ms LSA=1; //位选3 LSB=0; LSC=1; P0=table[num%10]; //显示个位 delayms(5); //延时5ms } void Timer0Init(void) //定时器初始化函数 { TMOD|=0x01; //设置定时器0为模式1(16位定时器) TH0=0xFC; //给定时器赋初值,定时1ms TL0=0x66; ET0=1; //打开定时器0中断允许 TR0=1; //启动定时器0 EA=1; //打开总中断允许 } void main() { Timer0Init(); //初始化定时器 while(1) { Display(num); //数码管显示剩余时间 if(num==0) //计时结束 { beep=1; //蜂鸣器响 delayms(500); //延时0.5秒 beep=0; //蜂鸣器停止响 num=60; //计时器重置为60秒 } } } void Timer0() interrupt 1 //定时器0中断函数 { TH0=0xFC; //给定时器赋初值,定时1ms TL0=0x66; num--; //计时器值减1 } ``` 该程序在上一个程序的基础上,增加了数码管显示功能,以显示剩余时间。在每次计时结束时,蜂鸣器响起并重置计时器值为60秒。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值