0
点赞
收藏
分享

微信扫一扫

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&nbsp;DU&nbsp;=&nbsp;P2^6;//数码管段选
sbit&nbsp;WE&nbsp;=&nbsp;P2^7;//数码管段选

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

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

/*====================================
函数 :display(uchar i)
参数 :i 显示数值,取值范围0-255
返回值 :无
描述 :三位共阴数码管动态显示
====================================*/
void&nbsp;display(uchar&nbsp;i)
{
uchar&nbsp;bai,&nbsp;shi,&nbsp;ge;
bai&nbsp;=&nbsp;i&nbsp;/&nbsp;100;&nbsp;//236 / 100  = 2
shi&nbsp;=&nbsp;i&nbsp;%&nbsp;100&nbsp;/&nbsp;10; //236 % 100 / 10 = 3
ge&nbsp;&nbsp;=&nbsp;i&nbsp;%&nbsp;10;//236 % 10 =6

//第一位数码管  
P0&nbsp;=&nbsp;0XFF;//清除断码
WE&nbsp;=&nbsp;1;//打开位选锁存器
P0&nbsp;=&nbsp;0XFE;&nbsp;//1111 1110
WE&nbsp;=&nbsp;0;//锁存位选数据

DU&nbsp;=&nbsp;1;//打开段选锁存器
P0&nbsp;=&nbsp;tabel[bai];//
DU&nbsp;=&nbsp;0;//锁存段选数据
delay(5);

//第二位数码管
P0&nbsp;=&nbsp;0XFF;//清除断码
WE&nbsp;=&nbsp;1;//打开位选锁存器
P0&nbsp;=&nbsp;0XFD;&nbsp;//1111 1101
WE&nbsp;=&nbsp;0;//锁存位选数据

DU&nbsp;=&nbsp;1;//打开段选锁存器
P0&nbsp;=&nbsp;tabel[shi];//
DU&nbsp;=&nbsp;0;//锁存段选数据
delay(5);

//第三位数码管
P0&nbsp;=&nbsp;0XFF;//清除断码
WE&nbsp;=&nbsp;1;//打开位选锁存器
P0&nbsp;=&nbsp;0XFB;&nbsp;//1111 1011
WE&nbsp;=&nbsp;0;//锁存位选数据

DU&nbsp;=&nbsp;1;//打开段选锁存器
P0&nbsp;=&nbsp;tabel[ge];//
DU&nbsp;=&nbsp;0;//锁存段选数据
delay(5);
}
//定时器0初始化
void&nbsp;timer0Init()
{
TR0&nbsp;=&nbsp;1; &nbsp;//启动定时器0
TMOD&nbsp;=&nbsp;0X01;&nbsp;//定时器工作模式1,16位定时器计数模式
TH0&nbsp;=&nbsp;0x4b;
TL0&nbsp;=&nbsp;0xfd;&nbsp;//定时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&nbsp;main(){//main函数自身会循环

uchar&nbsp;mSec,&nbsp;Sec;//毫秒和秒储存变量
timer0Init();//定时器0初始化
while(1)
{
if(TF0&nbsp;==&nbsp;1)//判断是否溢出
{
TF0&nbsp;=&nbsp;0;//软件清零溢出标志位
TH0&nbsp;=&nbsp;0x4b;
TL0&nbsp;=&nbsp;0xfd;&nbsp;//定时50ms
mSec++;//50ms到
if(mSec&nbsp;==&nbsp;20)
{
mSec&nbsp;=&nbsp;0;
Sec++;//1秒时间到
}
}
display(Sec);&nbsp;//数码管显示函数
if(Sec&nbsp;&gt;&nbsp;59)
Sec&nbsp;=&nbsp;0;//秒清零 
}
}


举报

相关推荐

0 条评论