请教单片机 关于程序执行的几个小问题

huinibi7062 2017-09-01 11:05:23
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit led = P1^0;
u8 timer;
void main (void)
{
TMOD = 0x01;
TH0 = (65535-50000) / 256;
TL0 = (65535-50000) % 256;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1)
{
;
}
}
void timer0_service(void) interrupt 1
{
TH0 = (65535-50000) / 256;
TL0 = (65535-50000) % 256;
timer ++;
if (timer == 20)
{
timer = 0;
led = ~led;
}
}

不用在意具体内容,有几个疑问
1. main 函数中 并没有调用 下面定义的函数,为什么下面的函数还得以执行 。main函数 和 其他函数的关系是怎么样的。其他函数的执行和main函数有关么?

2.main 函数中有一个 while (1); 也就是说程序一直在main函数中循环着 为什么单片机还能执行下面函数的语句
...全文
242 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2017-09-05
  • 打赏
  • 举报
回复
引用 3 楼 geziliu 的回复:
1, 中断函数是硬件调用的,所以不是走的你MAIN流程 2,while(1)一直停住了,并没有往下执行
这个说法应该有误吧? while(1)其实并没有停住,而是一直在死循环(while 本身就有N条的机器指令构成)
worldy 2017-09-05
  • 打赏
  • 举报
回复
主程序是程序计数器控制运行(PC寄存器指出下一条要执行的指令); void timer0_service(void) interrupt 1是由硬件触发运行的,也就是硬件计时,当时间到,就会触发这个程序的运行
geziliu 2017-09-05
  • 打赏
  • 举报
回复
引用 6 楼 worldy 的回复:
[quote=引用 3 楼 geziliu 的回复:] 1, 中断函数是硬件调用的,所以不是走的你MAIN流程 2,while(1)一直停住了,并没有往下执行
这个说法应该有误吧? while(1)其实并没有停住,而是一直在死循环(while 本身就有N条的机器指令构成)[/quote] 我指的停住了就是停在这里一直循环执行了,没有再向下执行了。
uid123 2017-09-04
  • 打赏
  • 举报
回复
学习了。原来中断是这样用的。
geziliu 2017-09-03
  • 打赏
  • 举报
回复
1, 中断函数是硬件调用的,所以不是走的你MAIN流程 2,while(1)一直停住了,并没有往下执行
sshyidishui 2017-09-02
  • 打赏
  • 举报
回复
下面那个是中断处理函数,可以理解为一种特殊的跳转。即当触发中断时,CPU自动跳转到这个地址执行。用户程序不能直接调用它
tianxj001 2017-09-02
  • 打赏
  • 举报
回复
void timer0_service(void) interrupt 1===time0中断服务程序 中断是单片机一个普遍具有的功能,也是一个非常强大的功能,一般来说芯片越牛,其中断就越多也越复杂。 其特点就是可以打断主程序和级别比自己低的中断程序,让自己先执行,完事了在逐级退回去原来被打断的程序。 这里主函数其实只是对time0进行了初始化,允许time0申请中断然后启动time0,剩下就直接进入死循环,后面就直接只有time0中断会定时的触发并运行。

27,372

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧