打印

求教C51数码管不能正常动态加一刷新,代码里有详细注释。

[复制链接]
3430|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
epdaly|  楼主 | 2011-12-4 22:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 epdaly 于 2011-12-4 22:16 编辑

用定时器跟中断功能做的数码管不能正常动态刷新,代码里有详细注释。我是想按一秒进一的速度来运行的,但出来的结果是进一的速度飞快。请各位看看,代码哪里出了问题。 中断实现动态LED显示_1.rar (1.26 KB)

相关帖子

沙发
xlsbz| | 2011-12-4 22:16 | 只看该作者
我晕 你这个代码写得好像挺规范的啊

使用特权

评论回复
板凳
xlsbz| | 2011-12-4 22:18 | 只看该作者
EA  = 1;  //打开中断总开关
        ET0 = 1;  //打开定时器0中断开关

这两句 颠倒一下是不是更合理

使用特权

评论回复
地板
xlsbz| | 2011-12-4 22:19 | 只看该作者
uint8 j;

static  uint8 j;

使用特权

评论回复
5
xlsbz| | 2011-12-4 22:20 | 只看该作者
static  uint8 j = 0;;// 要赋初值  规范做法

使用特权

评论回复
6
xlsbz| | 2011-12-4 22:22 | 只看该作者
(65536-1000)/256;   


(65536 - 1000) / 256;  数字之间空格  可能更好看些

使用特权

评论回复
7
xlsbz| | 2011-12-4 22:24 | 只看该作者
void int_timer0(void) interrupt 1   

INIT  名字似乎不好

使用特权

评论回复
8
xlsbz| | 2011-12-4 22:24 | 只看该作者
写得听规范    楼主的问题可能是加个static就会解决  我说的是可能哦

使用特权

评论回复
9
epdaly|  楼主 | 2011-12-4 22:29 | 只看该作者
非常感谢楼上这么好的意见,我试一下看问题解决没有。 8# xlsbz

使用特权

评论回复
10
epdaly|  楼主 | 2011-12-4 22:33 | 只看该作者
刚试了,时间显示加一的速度还是很快。看来不是变量j的问题。 8# xlsbz

使用特权

评论回复
11
xlsbz| | 2011-12-4 22:49 | 只看该作者
你的这个定时器 最长能达到1秒么  好像没有这么长吧


确实不是j的问题
   因为 j 在中断里面   加不加static  都一样

        if(1000 == sum)
        {
                sum = 0;
                sec++;
                ledcon();//判断sec数值,数码管要不要进位。                       
        }
       
        reled();相机 //刷新数码管函数

是不是
        if(1000 == sum)
        {
                sum = 0;
                sec++;
                ledcon();//判断sec数值,数码管要不要进位。       


                            reled();相机 //刷新数码管函数               
        }

使用特权

评论回复
12
xlsbz| | 2011-12-4 22:50 | 只看该作者
哈哈  弄程序 最忌讳我这种 瞎猜式的。

最好是用脑袋思考   不要胡乱尝试

使用特权

评论回复
13
yanshanbao| | 2011-12-4 22:57 | 只看该作者
ls 正解

使用特权

评论回复
14
xhtxzxw| | 2011-12-5 00:55 | 只看该作者
你把所有的(65536-1000)都改成64536,应该就没问题了吧.
编译器处理65536这个常数出问题了.

使用特权

评论回复
15
searover79| | 2011-12-5 13:19 | 只看该作者
定时器的工作方式设置了么?TMOD

使用特权

评论回复
16
Wonsevol| | 2011-12-5 13:35 | 只看该作者
不错、、、

使用特权

评论回复
17
longquanboy| | 2011-12-5 13:39 | 只看该作者
本帖最后由 longquanboy 于 2011-12-5 13:58 编辑

TH0 及TL0是否整型数据,在单片机里面,整形数据就是只有16位,而非32位的系统,那么65536已经溢出了,16位的最大数据只能是65535,你在编译的时候就编译器就会出错了,如果你要这样定义的话,TH0 = (long)((65536-1000)/256);把后面的强制转换为32位的,计算后在赋值给TH0,同理TL0 =(long)((65536-1000)%256);

使用特权

评论回复
18
longquanboy| | 2011-12-5 13:43 | 只看该作者
本帖最后由 longquanboy 于 2011-12-5 14:59 编辑

TH0 = (65536-1000)/256;其中65536在十六进制下就应该是0,装入TH0的值应该是
(0-1000)/256,TH0应该是无符号整型数据,那么具体的数值就要看编译器是如何处理的,但估计时间都不长,因此才会出现快速进入你的中断系统

使用特权

评论回复
19
epdaly|  楼主 | 2011-12-5 15:46 | 只看该作者
感谢楼上的意见,在下受教了。晚上有空再试一下看问题解决没有。 17# longquanboy

使用特权

评论回复
20
q1074926748| | 2011-12-5 18:28 | 只看该作者
恩,你的这个程序和我写过的一个差不多,出现的问题一样,我问过一个人,他说:者很有可能是你定义的刷新函数的时间不适合,不同的单片机刷新时间设置不同

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

81

主题

122

帖子

1

粉丝