打印

中断未发生,时间未到,单片机要去做其他事情,怎么办?

[复制链接]
2803|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangzk|  楼主 | 2010-6-30 10:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不可否认,我很菜。问这么easy的问题。

不过这么easy的问题,我也没想明白。请您不吝指教。当然我会按时结贴给分的。

书归正传吧~~

我的中断程序是实现一个秒表功能,液晶显示。对于最终计时结果,此外还要有计算功

能。计算功能是放在中断里好,还是放在主程序?放在中断里不好吗?会影响计时精度

吗?


还有,中断未发生,时间未到,单片机要去液晶页面上显示其他数据,怎么办?


void main ()
{
  SP=0x5f;
  req=0;
  busy=1;
  TMOD=0x01;
  ET0=1;
  EA=1;
  TH0=0x3c;
  TL0=0xb0;
  TR0=1;   
  while(1);////等待中断
}

/////////中断程序///////////

相关帖子

沙发
ayb_ice| | 2010-6-30 11:19 | 只看该作者
主程序那死循环没有事情做,浪费了

使用特权

评论回复
板凳
wangzk|  楼主 | 2010-6-30 11:21 | 只看该作者
死循环等待时间到啊  

不死循环 有更好方法啊?查询?

使用特权

评论回复
地板
zq1987731| | 2010-6-30 11:28 | 只看该作者
本帖最后由 zq1987731 于 2010-6-30 11:32 编辑

以50ms作为定时时基,中断20次到达1秒后秒针增1然后刷新LCD显示?
这么做对于“玩玩”的程序来说没什么问题,但严格来说,你会发现几个缺陷...
    用单片机定时器实现的秒表定时,若晶振为理想器件,你这程序也会有累计误差,稍微推导一下就知道你的硬件部分用了12MHz,对12分频的51一个周期是1μs,符合人的十进制整数观,因此很多人就觉得这样计时准确,殊不知11.0592MHz、22.1184MHz这样的频率才更适合机器精确定时,因为进入中断ISR时无需重载TL0,这样便可以使额外开销造成的TL0计数不被覆盖。
    主程序架构一般分为强实时任务、弱实时任务、普通任务,把任务都放在中断ISR中便会影响其他中断的响应,一般不会采取这种方法。
    个人建议你将LCD显示,计算等等都放在主程序中,并额外设置个全局FLAG,中断只负责定时器重载并将该FLAG置1,随后主循环中对该FLAG轮询,若为1,进入的同时将该FLAG清0,秒计数器增1,若秒计数器的值到达20,进入“秒刷新”事件,计算并显示。

使用特权

评论回复
5
aiping1987| | 2010-6-30 15:03 | 只看该作者
液晶显示部分程序放在while(1)里面

使用特权

评论回复
6
yczhang| | 2010-6-30 15:40 | 只看该作者
我觉着只要正确处理好程序,把计算功能和显示程序放在哪里都可以的,只要把中断的指令时间计算好,是不会影响计时精度的.

另外,为什么4楼会认为1秒钟刷新一次液晶屏呢,它是秒表,不是一般的时钟哎!

使用特权

评论回复
7
zq1987731| | 2010-6-30 17:39 | 只看该作者
边打字边偷菜开小差了没注意,把秒表当时钟了..................:L
秒表的话处理原理是一样的,只是把“刷新显示”这部分移动到FLAG轮询条件成立并置0之后立即执行,当然想要提高秒表的显示精度,可以尝试把时基减小

使用特权

评论回复
8
ecomputer| | 2010-6-30 22:05 | 只看该作者
这样写程序是不行的,哈哈,楼主应该是学生,中断一般是为了处理实时性任务而留的,你现在只有这么几个小任务处理都 放中断 里感觉 不出来 ,通用的做法是在中断中做标志 ,剩下的事情放到主程 序中来做

使用特权

评论回复
9
程序匠人| | 2010-7-1 10:36 | 只看该作者
正确的做法应该是:

1、显示程序放在主程序中。为显示程序设立一个“显示使能标志”。每次进显示程序之前,先判断这个标志是否有效。如果有效就刷新显示,如果无效就跳过这个显示程序。每次执行完刷新显示的任务后记得要清除“显示使能标志”。

2、定时中断负责定期置位“显示使能标志”。比如说你要0.5S更新一次显示,那就做一个0.5S的定时;或者做一个更小的定时,然后累加到0.5S后再置位“显示使能标志”。

3“时间未到,单片机要去液晶页面上显示其他数据,怎么办?”——这个很好解决,在你想刷新显示的任何时候,只要去把“显示使能标志”置位即可。

关于这个给功能设立“使能标志”的思路,是一种非常高效的调度机制。可以推而广之,用在其它功能上(比如按键、通讯、ADC、等等),从而提高系统的实时性。

有机会的话,去看一下《匠人手记》的第3篇《编程思路漫谈》。

使用特权

评论回复
10
wangzk|  楼主 | 2010-7-1 10:47 | 只看该作者
感谢匠人  感谢1987  菜鸟我要好好琢磨了  谢谢

使用特权

评论回复
11
ZHOUNACHU| | 2010-7-1 11:14 | 只看该作者
实现秒表功能的话,LZ不妨试试Timer2,它是自动填装定时器初值的,精度应该会更高,,

使用特权

评论回复
12
一棵小草| | 2010-7-1 13:44 | 只看该作者
我的中断程序是实现一个秒表功能,液晶显示。对于最终计时结果,此外还要有计算功能。计算功能是放在中断里好,还是放在主程序?放在中断里不好吗?会影响计时精度吗?
1987和匠人说的对,都放在主程序中好,原因就是方便修改,维护,扩展等。放在中断里面不好,因为会觉得乱,修改不方便,如果有很多个任务呢?都放中断能行吗?肯定不行。当然,不会影响精度的,因为你一进中断就重载,定时器也跟着跑了。还有一个题外话就是,处理函数的时间不能大于计时基数。

还有,中断未发生,时间未到,单片机要去液晶页面上显示其他数据,怎么办?
不知道你是指什么意思?但是,刷新显示时,每次都刷新整个屏幕是正确的做法。你不会是,计秒时显示秒,算到分再显示分吧?这样不好。还是其他,反正我的意思就是,刷新显示时,要整个屏幕的来。

使用特权

评论回复
13
wangzk|  楼主 | 2010-7-1 16:11 | 只看该作者
谢谢 小草 点播 :)

使用特权

评论回复
14
hotpower| | 2010-7-1 23:16 | 只看该作者
都是好老师…

使用特权

评论回复
15
程序匠人| | 2010-7-1 23:18 | 只看该作者
……还有,中断未发生,时间未到,单片机要去液晶页面上显示其他数据,怎么办?
不知道你是指什么意思?但是,刷新显示时,每次都刷新整个屏幕是正确的做法。你不会是,计秒时显示秒,算到分再显示分吧?这样不好。还是其他,反正我的意思就是,刷新显示时,要整个屏幕的来。 ...
一棵小草 发表于 2010-7-1 13:44


关于这个刷新的时机问题。一般是这样的:

1、如果显示屏上有时钟,并且有显示秒,一般半秒钟刷一次即可。再快也无意义。所以,这个可以用定时器来传递“显示使能标志”

2、但是有一种情况例外,就是当我们通过键盘或通讯去修改了显示内容时,往往希望能够及时更新到显示屏上,这个时候如果再按半秒显示一次,就会发生滞后。这是不友善的。所以,可以在遇到这种情况时,在执行按键或解析通讯的程序中,主动去刷新“显示使能标志”。

使用特权

评论回复
16
一棵小草| | 2010-7-2 13:14 | 只看该作者
关于这个刷新的时机问题。一般是这样的:

1、如果显示屏上有时钟,并且有显示秒,一般半秒钟刷一次即可。再快也无意义。所以,这个可以用定时器来传递“显示使能标志”

2、但是有一种情况例外,就是当我们通过键 ...
程序匠人 发表于 2010-7-1 23:18


刷机整屏需要的时间,大约几百us,而人能反映的时间在100ms左右。所以,增加那个几百us的处理函数,我认为没关系。这样做,觉得移植方便,而且不容易出错。

使用特权

评论回复
17
wangzk|  楼主 | 2010-7-2 16:40 | 只看该作者

我看可以结贴了

ls各位的话 我再慢慢体会吧  谢谢啦:)

使用特权

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

本版积分规则

个人签名:[url=http://huiqianxi.taobao.com]http://huiqianxi.

91

主题

680

帖子

0

粉丝