void Timer0_ISR (void) interrupt 1 //1ms
{
TH0 = (-SYSCLK/1000) >> 8;
TL0 = -SYSCLK/1000;
if (Count1ms) Count1ms--;
}
TH0和TL0分辨是计数器的高8位和低8位没错吧?
SYSCLK是系统频率
那个负号是什么意思??难道能够给他负数??求高手解答,为什么要这么写,作用是什么?
关于单片机定时器C语言编程,这段程序看不懂
答案:4 悬赏:10 手机版
解决时间 2021-02-06 10:14
- 提问者网友:棒棒糖
- 2021-02-05 10:52
最佳答案
- 五星知识达人网友:末日狂欢
- 2021-02-05 12:08
因为每个CLK后TL0是向上加1的,并且在FFFF变成0000的时候才中断,所以正式的写法应该是(0x10000-SYSCLK)/1000,而对于一个两字节宽的数,0x10000-SYSCLK就等于~SYSCLK,但~SYSCLK更省代码和时间
全部回答
- 1楼网友:何以畏孤独
- 2021-02-05 14:21
对于51而言,开通中断不必理会,硬件会自动处理;如果关闭断中断,即不使用中断可以用以下语句复位。
tf0=0;//也可以tf1、tf2等等
或者
tcon|=0x20;//如果使用其他定时器数据作相应变动
这仅作抛砖引玉,其他如果单片机有待完善。建议多看看硬件手册,即使我们只作软件。
- 2楼网友:琴狂剑也妄
- 2021-02-05 13:21
分析这个问题必须把SYSCLK、TH0、TL0的定义贴出来。
- 3楼网友:迟山
- 2021-02-05 12:28
TH0和TL0是这样计算的:TH0 = (65536-(SYSCLK/1000)) >> 8;
TL0 =65536 -(SYSCLK/1000);
负号:省去65536,因为负数在单片机中以补码形式存在。
补码:SYSCLK/1000进行反码(变为16位二进制,每位取反),再加1
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯