如何让其他延时程序进行时不影响数码管动态扫描

  • 动态
  • 如何
  • 影响
  • 数码管
  • 程序
  • Suwian
  • LV2工程师
  • |      2016-10-26 10:05:06
  • 浏览量 3347
  • 回复:19
例如:使用定时器进行一分钟的定时,然后在数码管上显示时,分,秒,然后每到1分钟蜂鸣器会报警3声. 当我进行蜂鸣器的延时时,数码管的动态扫描会暂停我所延时的时间.(单片机现象数码管在蜂鸣器响的时候不显示) 所以问一下大家有什么好的解决方法,谢谢.稍后上传我的源代码. 再次感谢!
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:7
Suwian 2016-10-27
嗯嗯,谢啦
0   回复
举报
发布
Suwian 2016-10-27
MOP 发表于 2016-10-27 00:44 嗨,電路中那個半圓形應該就是Beeper了,下面電晶體PNP放大電流用,那接角就是P2.3,即P23 故
我的编译器改了那个BEEPER以后,下面那个时钟程序就报错,然后我就把BEEPER(1)和BEEPER(0)改成了直接用P23,之后可以运行,但是那个VAL<3的那个判断语句好像是蜂鸣器响的时长而非次数,现在时间有点晚,我明天在修改,感谢您的耐心指导!
0   回复
举报
发布
MOP 回复 2016-10-27
本帖最后由 MOP 于 2016-10-27 03:18 编辑 嗨,這版本是時長沒錯,不過要改成間隔1秒,共三次也是So easy的,您說Macro問題,C/C++不同外,C99規則也不同,改為以下就可過
#define BEEPER(X) ((X)? (P23=1):(P23=0))
改為三次版本的話,這樣比較方便,如下定義
#define BEEPER P23
然後,改判斷式如下
    if(beeper)

  {

    if(val
以上第1秒會叫,第2秒關,第3秒叫,第4秒關,第5秒叫,第6秒之後都是關,共叫3次:)
0   回复
举报
Suwian 回复 2016-10-27
MOP 发表于 2016-10-27 02:43 嗨,這版本是時長沒錯,不過要改成間隔1秒,共三次也是So easy的,您說Macro問題,C/C++不同外,C99規則也不同, ...
之前的alarm()函数的第一个入口的判断为if(MIN>0&&val==0)这个是否也是需要相应的修改,因为第二次进来这个val!=0了。还有那个ALARM_TIME也是要改成6的吧,然后最后的那个判断函数if(beeper)的否则里那个BEEPER应该等于1吧,不然之后会一直响的。这是我的疑问如果说错了帮我解惑一下,谢谢
0   回复
举报
MOP 2016-10-26
本帖最后由 MOP 于 2016-10-26 22:13 编辑 噗,我文章有提醒您要自己定義Beeper的PIN腳位設置成GPIO輸出,因為我看你的Code似乎沒看到Beeper的定義腳位,記得要設置成Push-pull Output
假設Beeper接在P30腳位



那麼

sbit  P30 = P3^0;



#define BEEPER(X) ((X)? P30=1:P30=0)
0   回复
举报
发布
Suwian 2016-10-26
本帖最后由 Suwian 于 2016-10-26 21:22 编辑 谢谢您的帮忙解答,我先消化理解一下!我把你给我的那些代码加入到程序里了,但是蜂鸣器没有发出声音,我的芯片是STC89C52的,我是初学者所以对于一些概念性的东西可能理解的不是很透彻,
0   回复
举报
发布
Suwian 2016-10-26
uint i= 3; while(i--) { fm = 0; delay(100); fm = 1; delay(100); } i = 3
0   回复
举报
发布
Suwian 回复 2016-10-26
我说的延时是上面那个delay
0   回复
举报
Suwian 回复 2016-10-26
楼主现在在外面,等回去把原程序贴下,谢谢大家!
0   回复
举报
瞎折腾 回复 2016-10-26
我想你应该这样实现,把蜂鸣器的响的时间做一个基数,然后一分钟等于1/基数,这样就是你中断的时间,你在定时器里设置这个时间,检测时间是不是到了,到了以后蜂鸣器响,然后判断蜂鸣器响的次数,这样没进一次中断检测一下蜂鸣器并耗不了多少时间的, 响三次需要翻转电平六次,这样变量等于六的时候蜂鸣器不响,到了一分钟变量置0就可以了!不理解的话晚上给你代码
0   回复
举报
独行客 2016-10-26
数码管扫描用定时器中断控制状态机,一次扫描显示一位,不要直接在主程序里面扫描延时显示
0   回复
举报
发布
Eagleson 2016-10-26
单片机程序,数码管扫描显示,及计时 可以用一个定时器中断来完成, 比如 8 个数码管 定时器用 2 ~ 2.5 mS,每次中断 刷新 一个数码管,同时可以 设置一个标志位 在主程序 中记录中断 次数作为 定时 或者 延时, 如 2.5mS 40次 就是 100mS,如果计时精度 要求高的 可以另外 用一个定时器, 学会使用定时器,很多问题很好解决的。
1   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子