STC89C52单片机 定时器

怎么去设置定时?

例如:
定时 50微秒

	首先  50000 ÷ 1.085  =  46,082.94930875576	从 0 开始加 19,453 次会溢出	    这样的计算会有误差,但是影响比较小可以忽略不计
	TH0 = (65535 - 46082) / 256; 	// 将商放在高八位
	TL0 = (65535 - 46082) % 256;	// 将余数放在低八位
	
	或者 65535 - 46082 = 19453

	十六进制得到:4BFD
	二进制得到:0100 1011 1111 1101 
	将得到的十六进制分别放入 TH0 和 TL0;
	TH0 = 0x4b;
	TL0 = 0xfd; //定时50ms

定时器

定时器0工作模式1 16位定时模式,数码管动态显示0-10秒表。

#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选

//共阴数码管段选表0-9
uchar  code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};

/*====================================
函数	: delay(uint z)
参数	:z 延时毫秒设定,取值范围0-65535
返回值	:无
描述	:12T/Fosc11.0592M毫秒级延时
====================================*/
void delay(uint z)
{
	uint x,y;
	for(x = z; x > 0; x--)
		for(y = 114; y > 0 ; y--); 		
} 

/*====================================
函数	:display(uchar i)
参数	:i 显示数值,取值范围0-255
返回值	:无
描述	:三位共阴数码管动态显示
====================================*/
void display(uchar i)
{
	uchar bai, shi, ge;
	bai = i / 100; //236 / 100  = 2
	shi = i % 100 / 10;	//236 % 100 / 10 = 3
	ge  = i % 10;//236 % 10 =6
	
	//第一位数码管  		
	P0 = 0XFF;//清除断码
	WE = 1;//打开位选锁存器
	P0 = 0XFE; //1111 1110
	WE = 0;//锁存位选数据
	
	DU = 1;//打开段选锁存器
	P0 = tabel[bai];//
	DU = 0;//锁存段选数据
	delay(5);

	//第二位数码管
	P0 = 0XFF;//清除断码
	WE = 1;//打开位选锁存器
	P0 = 0XFD; //1111 1101
	WE = 0;//锁存位选数据
	
	DU = 1;//打开段选锁存器
	P0 = tabel[shi];//
	DU = 0;//锁存段选数据
	delay(5);

	//第三位数码管
	P0 = 0XFF;//清除断码
	WE = 1;//打开位选锁存器
	P0 = 0XFB; //1111 1011
	WE = 0;//锁存位选数据
	
	DU = 1;//打开段选锁存器
	P0 = tabel[ge];//
	DU = 0;//锁存段选数据
	delay(5);
}
//定时器0初始化
void timer0Init()
{
	TR0 = 1;	 //启动定时器0
	TMOD = 0X01; //定时器工作模式1,16位定时器计数模式
	TH0 = 0x4b;
	TL0 = 0xfd; //定时50ms

	/*
	   怎么去定时?例如定时 50微秒
		首先  50000 ÷ 1.085  =  46,082.94930875576	从 0 开始加 19,453 次会溢出	    这样的计算会有误差,但是影响比较小可以忽略不计
		TH0 = (65535 - 46082) / 256; 	// 将商放在高八位
		TL0 = (65535 - 46082) % 256;	// 将余数放在低八位
		
		或者 65535 - 46082 = 19453
		十六进制得到:4BFD
		二进制得到:0100 1011 1111 1101 
		将得到的十六进制分别放入 TH0 和 TL0;
		TH0 = 0x4b;
		TL0 = 0xfd; //定时50ms
	*/
}

void main(){//main函数自身会循环
	
	uchar mSec, Sec;//毫秒和秒储存变量
	timer0Init();//定时器0初始化
	while(1)
	{
		if(TF0 == 1)//判断是否溢出
		{
			TF0 = 0;//软件清零溢出标志位
			TH0 = 0x4b;
			TL0 = 0xfd; //定时50ms
			mSec++;//50ms到
			if(mSec == 20)
			{
				mSec = 0;
				Sec++;//1秒时间到
			}					
		}
		display(Sec); //数码管显示函数
		if(Sec > 59)
			Sec = 0;//秒清零 
	}	
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值