找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1886|回复: 23
打印 上一主题 下一主题
收起左侧

单片机定时器对数码管的影响

[复制链接]
跳转到指定楼层
楼主
ID:1084208 发表于 2023-7-5 17:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当我开一个定时器去运行数码管的显示时,它是可以正常显示的,但当我开两个定时器时,数码管就不显示了,我把二个定时器也试过了用4ms运行一次,数码管也同样不显示,只有当屏蔽掉第二个定时器时,数码管才能正常显示,在第二个定时器里面我没有放任何东西,我想知道到底是不是我结构的问题,是否有人做过数码管的框架,如果有,请指导我一下,我现在这边做跑步机的速度显示,一共有三个按键,一个按键是启动和停止,一个按键是速度上升,一个按键是速度下降。麻烦大伙帮我看看代码,我的按键是ADC按键,然后显示的函数都放到了main.c文件里面,显示数码管时我把赋值和段位选的函数分开来了,谢谢~

f868f3e5b77b772990b19b2a15d14fb.png (22.52 KB, 下载次数: 56)

f868f3e5b77b772990b19b2a15d14fb.png

222.PNG (69.07 KB, 下载次数: 63)

222.PNG

20230706下午,可同时用两个定时器且数码管能正常显示,T2定时器中断删掉数码管不显示.rar

106.89 KB, 下载次数: 20

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2023-7-5 22:21 | 只看该作者
那么多警告,不先解决一下吗?

回复

使用道具 举报

板凳
ID:1085441 发表于 2023-7-6 00:05 | 只看该作者
我是尽量不用多个中断,否则总有一些意外的问题。
回复

使用道具 举报

地板
ID:213173 发表于 2023-7-6 07:17 | 只看该作者
没有认真读懂别人的模板,胡乱套用当然玩不转。
回复

使用道具 举报

5#
ID:1084208 发表于 2023-7-6 08:41 | 只看该作者
cnfloatleaf 发表于 2023-7-6 00:05
我是尽量不用多个中断,否则总有一些意外的问题。

用两个定时器就出现不显示的现象,而且我还是一个定时器100us执行一次,一个定时器2ms执行一次,这样都会影响到数码管的显示,想不通
回复

使用道具 举报

6#
ID:1084208 发表于 2023-7-6 08:45 | 只看该作者
lkc8210 发表于 2023-7-5 22:21
那么多警告,不先解决一下吗?

哦哦,这些刚刚解决,都是变量定义放在那不用,现在都删了。很奇怪,定义两个定时器,一个定时器100us执行一次(这个放数码管的显示,每2ms就显示一次,每50ms就赋值一次,这样子人的眼睛察觉不到闪烁),另外一个定时器2ms执行一次,但里面什么都没放,但为什么有了这个定时器数码管就不显示了,这个我想不通。
回复

使用道具 举报

7#
ID:161164 发表于 2023-7-6 11:03 | 只看该作者
时间煮雨我煮鱼 发表于 2023-7-6 08:45
哦哦,这些刚刚解决,都是变量定义放在那不用,现在都删了。很奇怪,定义两个定时器,一个定时器100us执 ...

再上传吧
回复

使用道具 举报

8#
ID:1085441 发表于 2023-7-6 13:51 | 只看该作者
时间煮雨我煮鱼 发表于 2023-7-6 08:41
用两个定时器就出现不显示的现象,而且我还是一个定时器100us执行一次,一个定时器2ms执行一次,这样都会 ...

用2个中断和就要考虑2个中断会发生冲突,你可否这样试试?在一个中断前暂时禁止另一个中断,等中断结束再回复该中断使能,看看能不能解决问题。
回复

使用道具 举报

9#
ID:584814 发表于 2023-7-6 14:47 | 只看该作者
1、据说有多个警告什么的,最好处理先;
2、一个定时器也可以定出多个时间;
3、不是每个器件都和说明书讲的一样可靠。
回复

使用道具 举报

10#
ID:1084208 发表于 2023-7-6 15:07 | 只看该作者

上传了
回复

使用道具 举报

11#
ID:1084208 发表于 2023-7-6 15:14 | 只看该作者

我现在把T2定时器的初始化屏蔽掉了,就是用个#if 0    #endif给他这样屏蔽,奇怪的是,我不能删掉T2定时器的中断,不然数码管就不会显示,只有把T2定时器的中断打开,才能让他正常显示,
就像下面这个
//定时器初始化
#if 0
T2MOD=0x00
T2CON=0x00
RCAP2H=(65536-10000)/256
RCAP2L=(65536-10000)%256
TR2=0
ET2=1;
TR2=1;
#endif

void timer2(void) interrupt 5  //这一个删了数码管就不会显示
{

}
回复

使用道具 举报

12#
ID:1084208 发表于 2023-7-6 16:08 | 只看该作者
man1234567 发表于 2023-7-6 14:47
1、据说有多个警告什么的,最好处理先;
2、一个定时器也可以定出多个时间;
3、不是每个器件都和说明书 ...

有时候不处理会有什么情况吗,因为我习惯不处理,都是一些变量没有外部引用。
回复

使用道具 举报

13#
ID:213173 发表于 2023-7-6 21:02 | 只看该作者
时间煮雨我煮鱼 发表于 2023-7-6 16:08
有时候不处理会有什么情况吗,因为我习惯不处理,都是一些变量没有外部引用。


Buzzer()运行时间在中断函数中远远大于中断周期,无论如何也不至于定10us中断吧。你叫main函数如何运行?还把极其简单的数码管扫描代码写得无比复杂,点阵屏也不至于如此。
/*****************************************************
*函数名称:void Buzzer();
*函数功能:蜂鸣器
*入口参数:void
*出口参数:void
*****************************************************/
#if 1
void Buzzer()
{       
        if(beep_num)
        {
                beep_p = 1;
                delay_ms(60);
                beep_p = 0;
                beep_num--;
        }       
        else
        {
                beep_p =0;
        }       
}
#endif

/**************************************************
*函数名称:void timer0/1/2() interrupt 1/3/5
*函数功能:定时器中断产生方波
*入口参数:void
*出口参数:void
10us执行一次
**************************************************/
void timer1() interrupt 3
{
        static unsigned char f_10us1 = 0,T_CNT = 0;
        if(++f_10us1 >= 1)   //10us运行一次
        {
                f_10us1 = 0;
                f_10us = 1;
        }
        if(++T_CNT >= 2)     //20us运行一次
        {
                T_CNT = 0;
                Buzzer();       
        }
       
}





回复

使用道具 举报

14#
ID:1084208 发表于 2023-7-7 08:39 | 只看该作者
wulin 发表于 2023-7-6 21:02
Buzzer()运行时间在中断函数中远远大于中断周期,无论如何也不至于定10us中断吧。你叫main函数如何运行 ...

这个delay_ms(60)不是真正的60ms,我就是在delay_ms()函数里面放个变量循环60次就跳出来了。
回复

使用道具 举报

15#
ID:1084208 发表于 2023-7-7 08:41 | 只看该作者
wulin 发表于 2023-7-6 21:02
Buzzer()运行时间在中断函数中远远大于中断周期,无论如何也不至于定10us中断吧。你叫main函数如何运行 ...

这个蜂鸣器函数去掉跟不去掉都没有影响,之前试过了。
回复

使用道具 举报

16#
ID:1084208 发表于 2023-7-7 08:42 | 只看该作者
wulin 发表于 2023-7-6 21:02
Buzzer()运行时间在中断函数中远远大于中断周期,无论如何也不至于定10us中断吧。你叫main函数如何运行 ...

现在能正常显示了,我发的这份代码,只是不太理解T2定时器的中断必须打开,不打开的话就会不显示
回复

使用道具 举报

17#
ID:1084208 发表于 2023-7-7 08:52 | 只看该作者
wulin 发表于 2023-7-6 21:02
Buzzer()运行时间在中断函数中远远大于中断周期,无论如何也不至于定10us中断吧。你叫main函数如何运行 ...

老哥如果有思路也可以跟我讲讲,这边做跑步机的显示板,因为我这边按键是ADC去判断3个按键按下,第一个按键是启动/停止,第二个按键是加速,第三个按键是减速,我这里是把速度的赋值与数码管的显示分开了,如果不分开,再加上有ADC数值的判断,这样会导致数码管轮询会让肉眼识别到,我之前试过写到一起,就是出现了这种情况,或者会出现一种情况就是我按键按下去,数码管一边显示另一边不显示,因为我按键那里有时候在减速和加速那里会有个延时,不让速度突然降到0,或者按下去立马到速度的最大值,所以我延时按下去慢慢加上去,或者慢慢减下来,但这种延时对于数码管也有影响,写在一起数码管就有问题了,什么情况都可能出现,所以我就分开写了,如果你有好的方法或者思路以及模板,也麻烦老哥推荐我,谢谢
回复

使用道具 举报

18#
ID:213173 发表于 2023-7-7 11:27 | 只看该作者
时间煮雨我煮鱼 发表于 2023-7-7 08:52
老哥如果有思路也可以跟我讲讲,这边做跑步机的显示板,因为我这边按键是ADC去判断3个按键按下,第一个按 ...

软件都是基于硬件编写的,你要把硬件电路发上来(至少是构思)。
回复

使用道具 举报

19#
ID:1084208 发表于 2023-7-7 11:31 | 只看该作者
wulin 发表于 2023-7-7 11:27
软件都是基于硬件编写的,你要把硬件电路发上来(至少是构思)。

哦哦,有原理图
回复

使用道具 举报

20#
ID:1084208 发表于 2023-7-7 13:16 | 只看该作者
wulin 发表于 2023-7-7 11:27
软件都是基于硬件编写的,你要把硬件电路发上来(至少是构思)。

原理图我发出来了,有时间麻烦你帮我看看
回复

使用道具 举报

21#
ID:213173 发表于 2023-7-8 16:21 | 只看该作者
时间煮雨我煮鱼 发表于 2023-7-7 13:16
原理图我发出来了,有时间麻烦你帮我看看

没有用过赛元单片机,但51内核的单片机都差不多。在你的程序及硬件基本构架下改写了数码管驱动,ADC按键扫描,无源蜂鸣器驱动。只能作为功能演示,具体参数还得慢慢调试。电机驱动、测速及意外急停等安全措施你自己添加吧。 23.07.08.rar (31.65 KB, 下载次数: 7)

回复

使用道具 举报

22#
ID:1084208 发表于 2023-7-10 08:36 | 只看该作者
wulin 发表于 2023-7-8 16:21
没有用过赛元单片机,但51内核的单片机都差不多。在你的程序及硬件基本构架下改写了数码管驱动,ADC按键 ...

好的,谢谢,刚刚运行下载是显示一个0,后面我再改改
回复

使用道具 举报

23#
ID:1084208 发表于 2023-7-11 15:00 | 只看该作者
wulin 发表于 2023-7-8 16:21
没有用过赛元单片机,但51内核的单片机都差不多。在你的程序及硬件基本构架下改写了数码管驱动,ADC按键 ...

老哥,我有个问题
就是你这份代码的那个定时器是怎么算的
//12MHz
TL0 = 0X18     //1ms
TH0 = 0XFC
TL1 = 0X38     //200us
TH1 = 0X38
回复

使用道具 举报

24#
ID:161164 发表于 2023-7-12 13:34 | 只看该作者
时间煮雨我煮鱼 发表于 2023-7-11 15:00
老哥,我有个问题
就是你这份代码的那个定时器是怎么算的
//12MHz

Timer0,16位模式:65536 - 1000us = 64536 = 0xFC18
Timer1,8 位模式:256 - 200us = 56 = 0x38
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表