51单片机定时器的问题。计算初值。程序的编写问题。设fosc=12MHz。初值50ms。

我看到C语言中是这样的:
TMOD=0X10;//设置定时器1为模式一,即16位计算模式
TH1=(65536-50000)/256; //给计数寄存器赋值,50毫秒时间
TL1=(65536-50000)%256;
为什么这里是/256和%256???

又看到汇编的书中
定时功能的计算初值的公式:X=2^n-t/mc (t是定时时间,mc是机器周期)
计算:X=2^16-50*1000/1=65536-50000=3CB0H
因此
MOV TMOD,#10H ;设置定时器1为1模式,即16位计算模式
MOV TH1,#03CH ;给计数寄存器赋值,50毫秒时间
MOV TL1,#0B0H
为什么这里装入16进制数?而且是分开装入的?

最重要的问题是,后者计算初值的方法是否可以用在前者(C语言)的编程中???
求高手帮帮忙!!!在线等。。。。

单片机定时器的方式一是一个十六位的定时器。但51单片机是8位的,装不下十六位数据,所以,想要用单片机来装一个十六位的数怎么弄?单片机提供了两个寄存器(8位的)来装这个十六位的数。
c语言中怎么实现把一个十六位的数装进两个八位的寄存器里?就是:
TH1=(65536-50000)/256; //把(65536-50000)这个初值的高八位取出来,放在TH1,用十六进制表示是03CH
TL1=(65536-50000)%256; //把(65536-50000)这个初值的低八位取出来,放在TL1,用十六进制表示是0B0H
在c语言中,直接写
TH1 = 0X3C;
TL1 = 0XB0;
效果跟
TH1=(65536-50000)/256; //给计数寄存器赋值,50毫秒时间
TL1=(65536-50000)%256;
一样的。
区别在于一个人工算,直接赋值;一个交给单片机去算。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-27
单片机一个寄存器有256个单元共有256个地址,用两位16进制数表示,即存储器的地址(00H~FFH)。存储器中每个存储单元可存放一个八位二进制信息。
就是说你想把一个大于2的8次方(即256)的初值装进去得用到两个寄存器,于是就有所谓的高八位寄存器TH1和低八位寄存器TL1。TL1装满之后,向TH1进1。
一个是C语言的方法,一个是汇编的方法。
多看看书吧。追问

那两种方法是一样的么?