【单片机】定时器设初值的问题,谢谢!
已知单片机系统晶振频率为6MHz,若要求定时值为10ms时,定时器T0工作在方式1时,TH0=?TL0=?我记得公式是(65536-10*1000)/256(65536-...
已知单片机系统晶振频率为 6MHz,若要求定时值为10ms时,定时器T0工作在方式1时,TH0 = ? TL0 = ?
我记得公式是(65536 - 10 * 1000) / 256
(65536 - 10 * 1000) % 256
可这样算好像是12MHz的算法,6MHz的初值运算方法不同?
请问具体怎么算呢? 展开
我记得公式是(65536 - 10 * 1000) / 256
(65536 - 10 * 1000) % 256
可这样算好像是12MHz的算法,6MHz的初值运算方法不同?
请问具体怎么算呢? 展开
3个回答
展开全部
已知单片机系统晶振频率为 6MHz,若要求定时值为10ms时,定时器T0工作在方式1时,TH0 = ? TL0 = ?
TH0 = 0x0EC;
TL0 = 0x78;
不要死记公式,记着定时器的溢出速率有关,晶振频率不同,定时器溢出速率也不同
假设t0工作于方式1(16位最大65535)那么定时时间=(65536-X)再乘以机器周期(12m晶振时为1us)
例如定时50000us(既50ms)(晶振12m,机器周期1us)
首先在主函数或初始化函数中写入(就是在运行定时中断函数之前运行)
TMOD=0X01;//T0工作于定时模式,方式1
TH0=(65536-50000)/256;//给定时器高8位赋值,其中50000就是定时机器周期
TL0=(65536-50000)%256;//给定时器高8位赋值
EA=ET0=TR0=1;//开总中断,开定时中断,启动定时器。
然后定时器开始工作。
定时中断函数
void timer0() interrupt 1
{
TH0=(65536-50000)/256;//重新赋值
TL0=(65536-50000)%256;
TH0 = 0x0EC;
TL0 = 0x78;
不要死记公式,记着定时器的溢出速率有关,晶振频率不同,定时器溢出速率也不同
假设t0工作于方式1(16位最大65535)那么定时时间=(65536-X)再乘以机器周期(12m晶振时为1us)
例如定时50000us(既50ms)(晶振12m,机器周期1us)
首先在主函数或初始化函数中写入(就是在运行定时中断函数之前运行)
TMOD=0X01;//T0工作于定时模式,方式1
TH0=(65536-50000)/256;//给定时器高8位赋值,其中50000就是定时机器周期
TL0=(65536-50000)%256;//给定时器高8位赋值
EA=ET0=TR0=1;//开总中断,开定时中断,启动定时器。
然后定时器开始工作。
定时中断函数
void timer0() interrupt 1
{
TH0=(65536-50000)/256;//重新赋值
TL0=(65536-50000)%256;
展开全部
6m比12m一个周期时间长一倍 所以65535减去的数值也是原来的一半
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先根据6MHZ算出时钟周期,然后时钟周期*12就是机器周期,算出的机器周期为2us。然后根据要求的定时值为10ms,得出需要5000个机器周期才能满足条件。下面就好办了
TH0=(65536-5000)/256 ;
TL0= (65536-5000)%256 ;
65536-5000得到的数就是你的初值,意思是从初值开始计数,当记到65536时程序运行了5000个机器周期,也就是10ms。
算起来并不难,希望能帮到你,帮到每一个需要的人。
TH0=(65536-5000)/256 ;
TL0= (65536-5000)%256 ;
65536-5000得到的数就是你的初值,意思是从初值开始计数,当记到65536时程序运行了5000个机器周期,也就是10ms。
算起来并不难,希望能帮到你,帮到每一个需要的人。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询