51单片机定时器的问题。计算初值。程序的编写问题。设fosc=12MHz。初值50ms。
我看到C语言中是这样的:TMOD=0X10;//设置定时器1为模式一,即16位计算模式TH1=(65536-50000)/256;//给计数寄存器赋值,50毫秒时间TL1...
我看到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语言)的编程中???
求高手帮帮忙!!!在线等。。。。 展开
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语言)的编程中???
求高手帮帮忙!!!在线等。。。。 展开
2个回答
展开全部
单片机定时器的方式一是一个十六位的定时器。但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;
一样的。
区别在于一个人工算,直接赋值;一个交给单片机去算。
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;
一样的。
区别在于一个人工算,直接赋值;一个交给单片机去算。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询