首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

TL0 = -SYSCLK/1000,为啥这样赋值

2013-01-23 
TL0 -SYSCLK/1000,为什么这样赋值本帖最后由 wangzhenling 于 2013-01-02 15:18:15 编辑#define SYSCLK

TL0 = -SYSCLK/1000,为什么这样赋值
本帖最后由 wangzhenling 于 2013-01-02 15:18:15 编辑 #define SYSCLK 12000000   //SYSCLK in 12M

void delay_ms(uint ms)
{
uint i; 
//定时器0禁止(TR0=0)且没有溢出(TF0=0) 
TCON &= ~0x30; 
// 当TR0=1时定时器0工作,与/ITN0的逻辑电平无关,定时器0实,16位定时功能,由TOM位(CKCON.3)定义的时钟+1,
TMOD &= ~0x0f;
TMOD |= 0x01;
//定时器使用系统时钟,未分频
CKCON |= 0x04;

for(i=0;i<ms;i++) 

TR0 = 0;
TH0 = (-SYSCLK/1000) >> 8; 
TL0 = -SYSCLK/1000;
TR0 = 1; 
while (TF0 == 0);
TF0 = 0; 
}
}  定时, delay 单片机
[解决办法]
这个是想延时1ms,由于时钟是12M,延时1ms就是计数器计数SYSCLK/1000次。

而这里程序把定时器0设置为溢出触发中断, 即计数到0xffff(16位定时器计数器)后再加1时溢出,置TF0标志。

定时1ms需要计数65536-SYSCLK/1000个周期,而计数器寄存器是16bits的,从比特值的观点看它和
(-SYSCLK/1000)截取低16bits的值是相同的,就如同16比特的-1是0xffff一样。
[解决办法]

引用:
void clock_external(void)       //external oscillator
{   
    uchar i;
P0SKIP 
[解决办法]
= 0xC0;  
P0MDIN &amp;= ~0xC0;
//外部晶体振荡器 12M
    OSCXCN 
[解决办法]
= 0x67;
// Wait for initialization  等待振荡器启振……

 比较简单一点的方法就是软件仿真,可以看到具体执行时间,比手算可靠多了

热点排行