标题: [已解决]奇怪,我的单片机计数器0工作1状态下只能计10299以下的数? [打印本页]

作者: wolfinn    时间: 2022-3-11 13:52
标题: [已解决]奇怪,我的单片机计数器0工作1状态下只能计10299以下的数?
工作1是16位的啊,最高可以60000多的计数量的。单片机芯片是STC516RD+的。好奇怪!

作者: wolfinn    时间: 2022-3-11 13:54
计数器1一样的,工作方式1也是只能计10299以下的数(包括10299)。
作者: hhh402    时间: 2022-3-11 19:42
程序呢?你怎么确定只能够计数到10299?
作者: 188610329    时间: 2022-3-11 20:14
10299  =>   0010 1000 0011 1011

所以,你也不用去捉摸其他有的没有的,就是你程序写错了。
作者: ghdtgjhn    时间: 2022-3-11 23:35
就像楼上说的  绝对是程序的问题
作者: wolfinn    时间: 2022-3-12 11:02
程序是没有问题的,一个个数代进去试的,高开10299就不运行了。比如是10000的话,另一全局变量定时来就加1.满100清零,相当开一秒,延后时钟运算显示,定时10299以下一切正常,想改比如50000,全局变量满20清零,也相当于1秒,然后时钟就不跳了。
作者: wolfinn    时间: 2022-3-12 11:09
本帖最后由 wolfinn 于 2022-3-12 11:19 编辑

你们也别武断的说我的程序错了,这只是改TH0和THL0=(65536-10000)/2565;THL0=(65536-10000)%2565;改这个10000这个数而已,从10000到10299都可以,再多1都不行。
作者: wolfinn    时间: 2022-3-12 11:16
用定时0时TMOD为0x01,用定时1时TMOD为0x10。两定时都是在可以跳的情况下改值的,正常时秒能跳,满60秒分钟也能跳,。
作者: wolfinn    时间: 2022-3-12 11:30
除了一个可能没试,就是在外面给的是10299,中断里面重装时给10300,这样应该能跳一个秒数。
作者: 188610329    时间: 2022-3-12 16:42
wolfinn 发表于 2022-3-12 11:09
你们也别武断的说我的程序错了,这只是改TH0和THL0=(65536-10000)/2565;THL0=(65536-10000)%2565;改这个100 ...

说实话,我是真不知道,这样  空空而谈,对你解决问题有什么帮助么? 前面,已经把 10299 的2进制给你看了,现在,我在跟你讲几个基本原理,

首先,定时器,是计数到 65535,然后再 +1 溢出之后, 归0, 所以 TH0 和 TL0 都会计数达到 0xFF (255) 然后溢出,这个原则是不变的。
然后,所谓的13位定时器, 他是用的 TH0 的8位   和 TL0 的5位, 从这个意义上来讲, 你单纯看 TH0  和 TL0 的值,它也是会计数到 6万多的。
再然后,你说你用:
改TH0和THL0=(65536-10000)/2565;THL0=(65536-10000)%2565;
撇开, THL0 这个名称是不存在的, 2565 这个数值的奇怪之处, 都当你是论坛里的笔误。你也不是计数只能到 10299 而是 从 5万多开始计数。

至于为什么不动,基于发个贴证明你自己方法没错,都能有那么多“笔误”,我依然认为你的程序里存在着这样那样的“笔误”,这就是我说的你的程序是错的。至少,就算我可以理解你是笔误,但是编译器不会管,编译出来的程序,最终的结果,就是“错”的。
作者: happy2058    时间: 2022-3-12 17:52
当你发现想不通的时候,就是程序问题。
作者: wolfinn    时间: 2022-3-12 18:33
188610329 发表于 2022-3-12 16:42
说实话,我是真不知道,这样  空空而谈,对你解决问题有什么帮助么? 前面,已经把 10299 的2进制给你看 ...

别说我错了,我只改四处10000这个值,先50000,40000,30000,10000,多次改,最后发现10000处可以动。然后为了找这个值。500加,300加,然后几十加,10300以下从没有出现过不动的。
作者: wolfinn    时间: 2022-3-12 18:35
10299的二进制我也会算,一般不算出来,用公式让机器去做,这样知道是多少定时值。
作者: wolfinn    时间: 2022-3-12 18:38
现在是改四处10299就马上行,10300马上不行。你别说我用的是方式1,方式1的最大值是8192,16进制是0x2000
作者: mtdzok    时间: 2022-3-12 19:23
如果程序没错,那一定就是芯片错了!
作者: rundstedt    时间: 2022-3-12 19:35
编译器在预编译阶段运算THL0=(65536-10000)/2565;THL0=(65536-10000)%2565;溢出了。
作者: wolfinn    时间: 2022-3-12 19:39
mtdzok 发表于 2022-3-12 19:23
如果程序没错,那一定就是芯片错了!

终于有人说句象样的话了,我只说一个现象,不放程序上来不是让人来解决问题的。那样我觉得学不到东西。对别人也是种折磨。有空我找找看,以前我买过几个真AT89C52的,换个芯片试试。
作者: wolfinn    时间: 2022-3-12 19:41
用10000的值跑7个多小时,做的时钟没问题。就改这四个10000的数,看在什么地方定时器会停。,
作者: wolfinn    时间: 2022-3-12 19:42
发表于 2022-3-12 19:35
编译器在预编译阶段运算THL0=(65536-10000)/2565;THL0=(65536-10000)%2565;溢出了。

真正程序没错的,在论坛打多了个5.
作者: wolfinn    时间: 2022-3-12 20:04
我也直接写入换算出来的值,还是不运行。现在是10300可以运行了。
作者: wolfinn    时间: 2022-3-12 20:13
最新消息,现在是10305不行,10304可以。哈哈,奇怪的芯片。
作者: wolfinn    时间: 2022-3-12 20:24
发表于 2022-3-12 19:35
编译器在预编译阶段运算THL0=(65536-10000)/2565;THL0=(65536-10000)%2565;溢出了。

讨论一下,这是常量运算,不会溢出吧?最多是得0,运行一次就停止了。
作者: Y_G_G    时间: 2022-3-12 23:25
在通常情况下,99%是代码的问题,你这个问题,99.99%是你代码的问题
整了两天,你就只说不行,它怎么个不行?你怎么知道它不行?为什么不把代码上传一下?
你把代码上传一下,基本就能解决问题
在很多情况下,是代码的问题,你这芯片还能下载,基本就是好的
作者: wolfinn    时间: 2022-3-13 07:04
问题解决。找到我旧的AT89S52芯片,换个实验版烧进去,故障一样的。查了下程序,原来我把定时器0初始化语句放WHILE(1)大循环里了,放前面OK。
作者: wolfinn    时间: 2022-3-13 07:07
本帖最后由 wolfinn 于 2022-3-13 09:31 编辑

又来了新问题,普中5的实验板,烧不了AT89S52的芯片。用别的板子WIN7 64位又不认USBaSP驱动。下载几个据说是WIN7 64位USBaSP的都不行。又有得搞。装了个XP系统才能烧。

作者: wolfinn    时间: 2022-3-13 10:23
万能的某一个宝,找了家卖USBASP下载线的商户,从商品描述里找到了一个21.3M的驱动下载地址,下完装入OK。现在是STC的51芯片只能用STC的软件下载。AT89S52的只能用AVR_fighter来下载,两者不能互用。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1