|
发表于 2011-7-27 09:14:57
|
显示全部楼层
可以考虑这样,51的代码
void mainc(void)
{
while(1)
{
while(!F10MS);
F10MS = 0;
...
}
}
如果速度够快的话,就5MS跑一次主程序,然后可以在等待定时标志的时候插入一些对时间比较不敏感的代码,比如LED切换等,但执行时间不要太长.
中断尽量不要用C的中断编写方式,因为那可能会占用比较多的堆栈以及增加不必要的代码执行时间,
然后中断里面这样做
USING 1
CSEG AT 0x000B
;/***************************************************************************************
;定时器0溢出中断向量
;***************************************************************************************/
PUSH PSW ;
PUSH ACC ;保护现场
SETB RS0 ;使用第1组工作组寄存器
...
;定时中断服务程序
DJNZ cnt_10ms,exit_int ;10mS计时
MOV cnt_10ms,#TMR_SET_10MS ;
SETB F10MS ;10mS标志
exit_int:
POP ACC ;恢复现场
POP PSW ;
RETI ;
启动代码
;/***************************************************************************************
;段声明
;***************************************************************************************/
MYCODES SEGMENT CODE ;代码段
;/***************************************************************************************
;引入的外部函数/变量
;***************************************************************************************/
EXTRN CODE(mainc) ;C代码入口
DSEG AT 0x70
;/***************************************************************************************
;定义堆栈空间
;***************************************************************************************/
MYSTACKS: DS 16 ;预留16个字节作为堆栈空间
CSEG AT 0x0000
;/***************************************************************************************
;RAM初始化
;***************************************************************************************/
MOV R0,#0x7F ;2
MOV @R0,#0x00 ;2
DJNZ R0,$ - 2 ;2
LJMP START ;3
RSEG MYCODES
;/***************************************************************************************
;系统初始化
;***************************************************************************************/
START:
MOV SP,#MYSTACKS ;设置堆栈指针
MOV TMOD,#0x02 ;设置定时器
;MOV TL0,#(256 - 125) ;省略,由TH0载入
MOV TH0,#(256 - 125) ;125uS溢出时间常数
...
;其他初始化
MOV IE,#0x82 ;开启中断,启动定时器
SETB TR0
LJMP mainc ;C代码入口 |
|