• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

我是初学者,遇到了些问题

我是初学者,遇到了些问题
1,假如说一个程序有3条语句,分别为1,2,3.是不是一个机器周期执行一条语句
2,如果是外部中断的话,假如在执行到语句1时,有中断指令,就先执行中断指令,然后再回来执行语句2?
3,如果是定时器/计数器中断,是不是在启动TR=1时程序就开始在后台进行+1的操作了,与此同时程序在同步进行?如果是的话,以定时器为例,我想在执行完语句1后延时再执行语句2,但是按照定时器的+1运算和程序语句执行是同步的,要是在定时器的定时时间还没到时,程序已经运行到语句2了怎么办?

谢谢大家! 我的QQ:530883031  xscn1986@163.com
互相交流!
全部回复(3)
正序查看
倒序查看
njyd
LV.8
2
2007-02-27 19:24
  1、对51系列来说,一条指令至少一个机器周期,还有两个、三个机器的周期的.
  2、基本上对,还要允许中断.
  3、定时器可以认为是与CPU互相独立的电路,除了对定时器控制的指令外,其他语句对定时器运行无关.定时器靠硬件+1.
  你可以在语句1和语句2之间加上检测定时器状态的语句,当定时器达到状态时再运行语句2.
  也可以用定时器中断,中断时运行语句2.
  如果延时不长可以用一小段程序延时.
0
回复
2007-02-28 08:27
@njyd
  1、对51系列来说,一条指令至少一个机器周期,还有两个、三个机器的周期的.  2、基本上对,还要允许中断.  3、定时器可以认为是与CPU互相独立的电路,除了对定时器控制的指令外,其他语句对定时器运行无关.定时器靠硬件+1.  你可以在语句1和语句2之间加上检测定时器状态的语句,当定时器达到状态时再运行语句2.  也可以用定时器中断,中断时运行语句2.  如果延时不长可以用一小段程序延时.
我举个例子吧,简单些的.
void main()
{
   语句1;
   语句2;
   语句3;
}

void 定时器1() interrupt 3
{
  TH1=......
  TL1=......
}

我的意思是,如果一个机器周期是0.5秒,而且一个机器周期执行一条语句.
            定时器的延时时间是1秒.
            所以说当程序运行时,主程序和定时器在同时工作(定时器打开),主程序在
            语句1、2、3、1、2、3......的执行,我的目的是当执行完1时延时1秒再执
            行2,但是实际情况当定时器计数器记满溢出之后置相应的溢出标志时是1秒此
            时刚好主程序中执行完语句2,于是就在2结束后延时1秒了,没有达到我的目
            的.
0
回复
njyd
LV.8
4
2007-03-05 22:46
@电源插头
我举个例子吧,简单些的.voidmain(){  语句1;  语句2;  语句3;}void定时器1()interrupt3{  TH1=......  TL1=......}我的意思是,如果一个机器周期是0.5秒,而且一个机器周期执行一条语句.            定时器的延时时间是1秒.            所以说当程序运行时,主程序和定时器在同时工作(定时器打开),主程序在            语句1、2、3、1、2、3......的执行,我的目的是当执行完1时延时1秒再执            行2,但是实际情况当定时器计数器记满溢出之后置相应的溢出标志时是1秒此            时刚好主程序中执行完语句2,于是就在2结束后延时1秒了,没有达到我的目            的.
  俺一直用汇编,你的例子看的有点迷糊.
  看你的意思,好象是1、2、3一直在循环.那么不管定时器有无溢出,一秒钟内语句1、2、3已经运行许多许多次了.
  如果一定要在1后一秒再运行2,可以在1后面开定时中断,然后进入空循环,在定时中断后再运行2.当然也可以运行其他程序,在中断处理程序中运行2.
  如果主程序衡环时间很短,也可以在中断程序中设一个标志,主程序循环中不断检查这个标志,见到标志置位才运行2.当然循环中如果不见标志置位要跳过2.
0
回复