做网站排名的,网页qq登录保护在哪里,江苏中兴建设有限公司网站,百度快速收录seo工具软件定时/计数器实现功能#xff1a;
#xff08;1#xff09;定时功能#xff1a;
定时/计数器说明#xff08;最高单次计时时间是71毫秒65535*1.085us#xff0c;1.085us是机器周期#xff09;#xff1a; 使用51定时/计数器步骤: 定时/计算器控制寄存器#xff1a;…定时/计数器实现功能
1定时功能
定时/计数器说明最高单次计时时间是71毫秒65535*1.085us1.085us是机器周期 使用51定时/计数器步骤: 定时/计算器控制寄存器 设置定时寄存器的工作模式 将想计时的时间这个时间意思是想让定时/计数器经过多长时间溢出溢出后就说明达到了你设定的时间转化为微秒级50毫秒50000微妙再用转化后的数除以1.085机器周期时间得到的数就是要加的次数 定时/计数器总共加65535次就会溢出提前有一个初始值就可减少达到溢出的的次数。
例子想50毫秒后定时/计数器溢出50毫秒50000微妙 第一种方式50000除以1.085得到46082次然后就可以将高八位TH046082/256意思是有多少个256放入高八位中低八位TL046082%256意思是将剩余的256放到低八位中。 第二种方式也可以用65535减46082得到初值再将十进制初值转化为十六进制将前两位给TH0后两位给TL0
计时器代码示例
#includereg52.h
#includeintrins.h#define uint unsigned int
#define uchar unsigned charsbit beepP2^3;
sbit DUAN P2^6;//数码管段选
sbit WEIP2^7; //数码管位选
uchar temp;
//共阴极数码管段选表0——9code表示数组中的数据在程序执行过程中不能被修改
//加code存放的是ROM区不加code存放的是RAM区
uchar code table[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(void) //误差 -0.000000000001us
{unsigned char a,b;for(b15;b0;b--)for(a152;a0;a--);
} void display(uint i)
{ uint bai,shi,ge;baii/100;shii%100/10;gei%10;P00xff;//清除断码WEI1;//打开位选锁存器P0 0xfe;//1111 1110 给第一个数码管接地让它工作WEI 0;//关闭位选锁存器进行段选显示数字DUAN1;//打开段选锁存器P0 table[bai];DUAN 0;//锁存段选锁存器delay();P00xff;//清除断码WEI1;P0 0xfd;WEI 0;DUAN1;P0 table[shi];DUAN 0;delay();P00xff;//清除断码WEI1;P0 0xfb;WEI 0;DUAN1;P0 table[ge];DUAN 0; delay();
}
//定时器0初始化
void timeInit()
{TR01;//启动定时器0TMOD0x01;//定时器工作模式一16位定时计时模式//TH00x4b;//TL00xfd;//定时50毫秒TH0(65535-46082)/256;TL0(65535-46082)%256;//定时50毫秒
}void main()
{uchar msec,sec;//声明毫秒和秒储存变量timeInit();while(1){if(TF01){TF00;//软件清0溢出标志位TH00x4b;TL00xfd;//重放初值msec;//50毫秒到if(msec20){msec0;sec;//一秒时间到if(sec100)sec0;//计时到100秒从1开始 } }display(sec); //数码管显示时间}
}2计数功能
#includereg52.h
#includeintrins.h#define uint unsigned int
#define uchar unsigned charsbit DUAN P2^6;//数码管段选
sbit WEIP2^7; //数码管位选
sbit LED1P1^0;
uchar temp;
//共阴极数码管段选表0——9code表示数组中的数据在程序执行过程中不能被修改
//加code存放的是ROM区不加code存放的是RAM区
uchar code table[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(void) //误差 -0.000000000001us
{unsigned char a,b;for(b15;b0;b--)for(a152;a0;a--);
} void display(uint i)
{ uint bai,shi,ge;baii/100;shii%100/10;gei%10;P00xff;//清除断码WEI1;//打开位选锁存器P0 0xfe;//1111 1110 给第一个数码管接地让它工作WEI 0;//关闭位选锁存器进行段选显示数字DUAN1;//打开段选锁存器P0 table[bai];DUAN 0;//锁存段选锁存器delay();P00xff;//清除断码WEI1;P0 0xfd;WEI 0;DUAN1;P0 table[shi];DUAN 0;delay();P00xff;//清除断码WEI1;P0 0xfb;WEI 0;DUAN1;P0 table[ge];DUAN 0; delay();
}
//计数器0初始化
void jishuInit()
{TR01;//启动计数器0TMOD|0x05;//定时器工作模式一16位计数模式TH00;TL00;
}
//定时器1初始化
void timeInit()
{TR1 1;//启动定时器1TMOD|0x10;//定时器工作模式一16位定时模式TH10x4b;TL10xfd;
}void main()
{uchar msec;//声明毫秒和秒储存变量jishuInit();//计数器0初始化timeInit();//定时器1初始化while(1){if(TF11){TF10;//软件清0溢出标志位TH10x4b;TL10xfd;//重放初值msec;//50毫秒到if(msec10)//定时500毫秒到{msec0;LED1~LED1;//产生方波}}display(TL0); //数码管显示时间}
}定时器中断
中断情况下TF由硬件清0若无中断则有软件清0。 代码示例
#includereg52.h
#includeintrins.h#define uint unsigned int
#define uchar unsigned charsbit beepP2^3;
sbit DUAN P2^6;//数码管段选
sbit WEIP2^7; //数码管位选uchar temp;
uchar msec,sec;//声明毫秒和秒储存变量
//共阴极数码管段选表0——9code表示数组中的数据在程序执行过程中不能被修改
//加code存放的是ROM区不加code存放的是RAM区
uchar code table[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(void) //误差 -0.000000000001us
{unsigned char a,b;for(b15;b0;b--)for(a152;a0;a--);
} void display(uint i)
{ uint bai,shi,ge;baii/100;shii%100/10;gei%10;P00xff;//清除断码WEI1;//打开位选锁存器P0 0xfe;//1111 1110 给第一个数码管接地让它工作WEI 0;//关闭位选锁存器进行段选显示数字DUAN1;//打开段选锁存器P0 table[bai];DUAN 0;//锁存段选锁存器delay();P00xff;//清除断码WEI1;P0 0xfd;WEI 0;DUAN1;P0 table[shi];DUAN 0;delay();P00xff;//清除断码WEI1;P0 0xfb;WEI 0;DUAN1;P0 table[ge];DUAN 0; delay();
}
//定时器0初始化
void timeInit()
{EA1;//打开总中断ET01;//打开中断允许位TR01;//启动定时器0TMOD0x01;//定时器工作模式一16位定时计时模式//TH00x4b;//TL00xfd;//定时50毫秒TH0(65535-46082)/256;TL0(65535-46082)%256;//定时50毫秒
}void time0() interrupt 1//中断函数
{TH00x4b;TL00xfd;//重放初值msec;//50毫秒到if(msec20)//1s时间到{msec0;sec;//一秒时间到if(sec100)sec0;//计时到100秒从1开始 } }void main()
{timeInit();while(1){display(sec); //数码管显示时间}
}定时器中断进行数码管动态扫描
#include reg52.h
#include intrins.h#define uint unsigned int
#define uchar unsigned charsbit DU P2^6;//数码管段选
sbit WE P2^7;//数码管位选
sbit key_s2 P3^0;//独立按键S2
sbit key_s3 P3^1;//独立按键S3
uchar num;//数码管显示的值//共阴数码管段选表
uchar code SMGduan[] {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
//数码管位选码
uchar code SMGwei[] {0xfe, 0xfd, 0xfb};
//毫秒级延时函数定义
void delay(uint z)
{uint x,y;for(x z; x 0; x--)for(y 114; y 0 ; y--);
} void display(uchar i)
{static uchar wei; P0 0XFF;//清除断码WE 1;//打开位选寄存器P0 SMGwei[wei];WE 0;//锁存位选寄存器switch(wei){case 0: DU 1; P0 SMGduan[i / 100]; DU 0; break;case 1: DU 1; P0 SMGduan[i % 100 / 10]; DU 0; break; case 2: DU 1; P0 SMGduan[i % 10]; DU 0; break; }wei;if(wei 3)wei 0;
}
//定时器0初始化
void timer0Init()
{EA 1; //打开总中断ET0 1;//打开定时器0中断TR0 1; //启动定时器0TMOD 0X01; //定时器工作模式16位定时模式TH0 0xED;TL0 0xFF; //定时5ms
}void main()//main函数自身会循环
{ timer0Init();//?¨ê±?÷03?ê??ˉwhile(1){if(key_s2 0)//判断S2是否被按下{delay(20);//按键消抖if(key_s2 0){if(num ! 120)num;while(!key_s2);//松手检测} }if(key_s3 0)//判断S3是否被按下{delay(20);//按键消抖if(key_s3 0){if(num 0)num--;while(!key_s3);//松手检测} }}
} //定时器中断函数
void timer0() interrupt 1
{TH0 0xED;TL0 0xFF; //定时5msdisplay(num); //数码管显示函数
}