5791|12

84

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

用t1作为中断写的程序,但运行不了,why? [复制链接]

想编写一个p1.1输出方波为100ms(t1做中断)的程序,用汇编我调试好了,但是c却没反应!不知道哪里出错了

 

 #include<reg51.h>
 sbit p0=P1^0;
void main()
 {
    TMOD=0X10;
 TH1=0X3C;
 TL1=0XB0;
 EA=1;
 ET1=1;
 TR1=1;
  }
  void int_3() interrupt 3
  {          
    p0=0;
 TH1=0X3C;
 TL1=0XB0;
   }

此帖出自51单片机论坛

最新回复

高手在人间啊  详情 回复 发表于 2011-7-10 17:37
点赞 关注
 

回复
举报

2130

帖子

0

TA的资源

五彩晶圆(中级)

沙发
 
p0=0;
真的,您太有才了,真的
此帖出自51单片机论坛
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
楼主主程序中缺少死循环,单片机要不停地运转下去一定要有死循环的,中断只是个插曲,
此帖出自51单片机论坛
 
 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

4
 

缺少死循环单片机也是在运行的,不过因为MAIN在C中事实上是个函数,因此在函数末尾会进行子程序返回,即RET指令,但是在调用main前并没有入栈,因此RET指令将系统返回至C:0000地址,因此一切又从头开始,定时器被从新赐值,导致定时器永远不会溢出,永远不会中断,仅此而已。

 

中断函数不断对P1^0赐值,即使发生中断,P1^0输出也永远是0

此帖出自51单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 4楼 leang521 的帖子

你好!我把它改成这样子,但是好像却是没有回到主程序
#include
sbit p0=P1^0;
void main()
{
    TMOD=0X10;
TH1=0X3C;
TL1=0XB0;
EA=1;
ET1=1;
TR1=1;
while(!TF1)
;
  }
  void int_3() interrupt 3
  {         
    p0=0;
TH1=0X3C;
TL1=0XB0;
   }
该怎么样才可以有那样的效果?
谢谢!
此帖出自51单片机论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 5楼 林发扬 的帖子

如果是想用中断,MAIN中最后进入死循环(while(1);)就可以了。中断中p0=0?那不是始终输出0了吗?不停的取反或者与‘1‘就可以了。
此帖出自51单片机论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 4楼 leang521 的帖子

只是运行一次,在中断那里停住了,怎么办?
此帖出自51单片机论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

8
 

回复 7楼 林发扬 的帖子

什么叫在中断哪里停住了
你还是先把那个P0=0改一下吧,不然你永远不知道什么状况

还有,P1^0就P10吧,搞什么p0,
还有P0呢
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

9
 
#include
unsigned char a=0;
sbit p0=P1^0;
void main()
{
TMOD=0X10;
TH1=0X3C;
TL1=0XB0;
EA=1;
ET1=1;
TR1=1;
while(1)
;
}
void int_3() interrupt 3
{
a++;
TH1=0X3C;
TL1=0XB0;
p0=~p0;
if(a==2)
a=0;
}


我用的是AT89c52    12MHz晶振。
此帖出自51单片机论坛
 
 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

10
 
6楼和8楼都对,9楼的太麻烦
p0=!p0;即可
此帖出自51单片机论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

11
 

原帖由 sohappying 于 2011-6-14 21:32 发表 #include unsigned char a=0; sbit p0=P1^0; void main() { TMOD=0X10; TH1=0X3C; TL1=0XB0; EA=1; ET1=1; TR1=1; while(1) ; } void int_3() interrupt 3 { a++; TH1=0X3C; TL1=0XB0; p0=~p0; ...

 

那个a++干嘛捏?

你是想逢两次归0?

用不着,直接取模得了。

 

另外你那个a每次进出中断函数会不会消失啊?

是不是要 static  xxx a;

 

额,这个a 是A?

你想干嘛呢?没看懂

 

居然是a是全局变量!!

没事你搞个全局变量干什么?

中断不能传入变元,你在里面定义一个就好了么,反正a的应用也没超出中断函数。

[ 本帖最后由 辛昕 于 2011-6-15 10:47 编辑 ]
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

84

帖子

0

TA的资源

一粒金砂(中级)

12
 

回复 10楼 leang521 的帖子

谢谢了,非常感谢!
此帖出自51单片机论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

13
 
高手在人间啊
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表