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

振铃 2013-01-02 11:24:16
#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;
}
}
...全文
339 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
振铃 2013-01-04
  • 打赏
  • 举报
回复
谢谢提醒
引用 3 楼 wangfan027 的回复:
引用 2 楼 wangzhenling 的回复:void clock_external(void) //external oscillator { uchar i; P0SKIP |= 0xC0; P0MDIN &amp;= ~0xC0; //外部晶体振荡器 12M OSCXCN |= 0x67; // Wait……
振铃 2013-01-03
  • 打赏
  • 举报
回复
void clock_external(void) //external oscillator { uchar i; P0SKIP |= 0xC0; P0MDIN &= ~0xC0; //外部晶体振荡器 12M OSCXCN |= 0x67; // Wait for initialization 等待振荡器启振 for(i=0;i<255;i++); //晶体振荡器未用或未使用则处于循环 等待晶体振荡器稳定 while((OSCXCN & 0x80) == 0); //USB为48MHz,系统时钟选择外部时钟 CLKSEL |= 0x01; //内部高频振荡器未使能,系统时钟 选择外部振荡器为系统时钟源并允许丢失时钟检测器? OSCICN = 0x00; } 能再问个问题吗?我用的是C8051340,外部晶振用的是12MHz,我想问for(i=0;i<255;i++)中的255为何值时才是 Wait for 1ms initialization即等待1ms启振?
dceacho 2013-01-03
  • 打赏
  • 举报
回复
引用 2 楼 wangzhenling 的回复:
void clock_external(void) //external oscillator { uchar i; P0SKIP |= 0xC0; P0MDIN &= ~0xC0; //外部晶体振荡器 12M OSCXCN |= 0x67; // Wait for initialization 等待振荡器启振……
比较简单一点的方法就是软件仿真,可以看到具体执行时间,比手算可靠多了
youzi722 2013-01-02
  • 打赏
  • 举报
回复
这个是想延时1ms,由于时钟是12M,延时1ms就是计数器计数SYSCLK/1000次。 而这里程序把定时器0设置为溢出触发中断, 即计数到0xffff(16位定时器计数器)后再加1时溢出,置TF0标志。 定时1ms需要计数65536-SYSCLK/1000个周期,而计数器寄存器是16bits的,从比特值的观点看它和 (-SYSCLK/1000)截取低16bits的值是相同的,就如同16比特的-1是0xffff一样。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧