为什么89C51单片机里面有TH0=(65536-50000)/256;TL0=(65536-50000)%256;

由于89C51的晶振频率为12MHZ,机器周期是1us,则每1us产生一次计数,例如需要进行50ms的计时,对机器周期进行50000计数就可以得到,T0可以对机器周期进行65536次计数,为了不让T0溢出,我们需要对定时器/计数器赋初值,加上一个数就能等于65536,也就是65536和50000的差值,这个值就是初值:15536。

除以256是因为计时器第二种方式中是由一个高8位(TL0)和低8位(TH0)存储组成的:

如果要把差值装进这两个8位,低8位最多只能装256个机器周期,256个周期满了就用高8位的,意思是说低8位满一次高8位加1,那么高8位装多少,低8位就满了几次,算法就是用差值除256取其整数,接下来就是剩下小于256次数的就放在低8位,就是差值的余数。如果我要放一个超过256的数,需要超过先放高八位,把剩下的部分放在低八位中,TH0=(65536-50000)/256就是把TL0中放不下的部分放在TH0中,再把剩下的部分放在TL0中。

void timer(0) interrupt 1

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

flag++;

if(flag==20)

{}

}

  • 26
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
基于stc89c51单片机的秒表设计全文共3页,当前为第1页。基于stc89c51单片机的秒表设计全文共3页,当前为第1页。基于stc89c51单片机的秒表 基于stc89c51单片机的秒表设计全文共3页,当前为第1页。 基于stc89c51单片机的秒表设计全文共3页,当前为第1页。 //基于stc89c51单片机的秒表 //应用定时器和中断的知识。 //两个按键。K1是启动/暂停按键。K2是复位按键。 //显示数字从0-99. //zzuli_wuzhipeng #include<reg51.h> #define uchar unsigned char #define uint unsigned int uchar count=0,time=0,K1num=0; uchar seg_date[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; // 共阳极数码管段码表 sbit K1=P3^0; sbit K2=P3^1; uchar ge=0,shi=0; void delay(uint xms) //简单延时程序 { uint i,j; for (i=xms;i>0;i--) for(j=115;j>0;j--); 基于stc89c51单片机的秒表设计全文共3页,当前为第2页。基于stc89c51单片机的秒表设计全文共3页,当前为第2页。} 基于stc89c51单片机的秒表设计全文共3页,当前为第2页。 基于stc89c51单片机的秒表设计全文共3页,当前为第2页。 void display() // 显示程序 { shi=time/10; // 分离十位 ge=time%10;// 分离个位 P2=0x01; P1=seg_date[ge];//显示个位 delay(1); P2=0x02; P1=seg_date[shi];//显示十位 delay(1); } void key() // 键盘处理程序 { if( K1==0 ) // K1键功能 { K1num++; delay(1); if( K1==0 ) { while(!K1); if( K1num==1 ) {TR0=1; } if( K1num==2 ) {TR0=0;K1num=0; } } } if(K2==0) // K2键功能 { delay(1) ; if (K2==0) { while (!K2); TR0=0; time=0; TR0=1; } } } void main () //主函数 基于stc89c51单片机的秒表设计全文共3页,当前为第3页。基于stc89c51单片机的秒表设计全文共3页,当前为第3页。{ 基于stc89c51单片机的秒表设计全文共3页,当前为第3页。 基于stc89c51单片机的秒表设计全文共3页,当前为第3页。 TMOD=0x01; // 设定定时器工作方式 TH0=0x4c;TL0=0x00; // 设定定时器初值 EA=1;ET0=1; TR0=0; while (1) { key(); display(); } } void timer0() interrupt 1 // 中断程序 { TH0=0x4c;TL0=0x00; //设定定时器初值 count++; if(count==20) { count=0; time++; } if(time==100) { time=0; } } 基于stc89c51单片机的秒表设计

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值