微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 我是新手刚接触单片机,问个定时器设初始值的问题,望高手解答

我是新手刚接触单片机,问个定时器设初始值的问题,望高手解答

时间:10-02 整理:3721RD 点击:
void TimerConfiguration()
{
    TMOD = 0x01; //选择工作方式1          0x01=0001  意思是GATE =0   C/T=0   M1=0   MO=1         用TRx控制定时器开始   选择定时器  使用方式1(16位定时器)                                 
    TH0 = 0x3C;         //设置初始值,定时50MS                请问这里的50ms是怎么算的?
    TL0 = 0xB0;
    EA = 1;                         //打开总中断
    ET0 = 1;                 //打开定时器0允许中断
    TR0 = 1;                 //启动定时器0
}

晶振频率是 11.926740 MHZ  

这是定时器里的一段C代码,  TH0=0x3C;  TL0 = 0xB0;    //设置初始值,定时50MS                请问这里的50ms是怎么算的?
晶振频率是 11.926740 MHZ  ,是不是可以当成12MHZ的

路过,加油学!

我明白了 ,,
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语言)的编程中?
求高手帮帮忙!在线等。
满意答案
网友回答 2014-05-15
单片机定时器的方式一是一个十六位的定时器。但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;
一样的。
区别在于一个人工算,直接赋值;一个交给单片机去算。

51只能算整数,不能算小数的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top