坛里的高手总是如云,虽然我的这个问题可能很简单,但我自己想不出一个好的方案,所以就还是要请求坛里高手给点解决思路。
我想问一下,用STC89c52写一个定时程序,有类似设定多组闹钟的功能,但闹钟只是简单的驱动蜂鸣器这一动作而已。具体的说,就是有多种行为动作,动作一,日期时间定时,时间到了驱动IO口1(如p2^1)指定时长后自动关闭;动作二,日期时间定时,时间到了驱动IO口2(如p2^2)指定时长后自动关闭……。动作可能有不同类型的四五种,但可以自行选择,不一定每一动作都设定了要执行,而且也不一定是动作一的定时时间一定比动作二的定时时间早,还有要注意的就是,动作交叉的情况,就是说,可能动作一执行的时候,还没有到关闭时,动作二的定时执行时间来了,或者还有的时候,动作一动作二甚至动作三都相继执行了,都还未到关闭动作时,动作四的定时时间也来了。不知道这样描述大家看明白了没?(读书的时候,小说看少了,语文实在是差啊

)
定时设置的数据结构我准备这样规定:
struct DateTime
{
unsigned char second;
unsigned char min;
unsigned char hour;
...
}
struct forRunTime
{
unsigned char actionID; 动作编号
DateTime actionDate; 动作执行时间:年月日时分秒20140213093000数据类型float或自定或就用字符数组
unsigned int actionHowLong; 动作执行多久,单位分钟
sbit actionIO; 动作驱动的IO口
bit actionRepeat; 动作是否重复
unsigned int RepeatMode; 动作重复模式:0不重复;1按小时重复;2按天重复;3按周重复;4按月重复(及下一月同一日期执行)
unsigned int RepeatNum; 上面重复模式单位下的数值,如此数值为2时,重复模式为1时表示下一动作在此设定动作的下2小时执行,重复模式为3时,表示2周后执行。
}
将要执行的动作加入到执行定时时间表,执行到每一动作后,如果此动作属不重复的,就自动从动作表中删除,如需要重复的,就改动动作执行时间再投入定时监听列表中。执行定时时间表保存在外接的AT24CXX I2C接口EEPROM存储模块中
假设当前设定的动作定时表如下
actionID actionDate actionHowLong actionIO actionRepeat RepeatMode RepeatNum
3 20140302080500 20 P2^5 1 2 15
1 20140215091000 15 P2^2 1 1 12
4 20140214063000 30 P2^3 1 3 1
2 20140215133000 60 P2^1 1 4 15
5 20140217101000 25 P2^4 0 0 0
请问各们大侠,这种定时中断如何编程实现?感谢大家提供参考方案或程序代码,有可行的代码的话我将送50M币表示感谢!