注意:访问本站需要Cookie和JavaScript支持!请设置您的浏览器! 打开购物车 查看留言付款方式联系我们
初中电子 单片机教材一 单片机教材二
搜索上次看见的商品或文章:
商品名、介绍 文章名、内容
首页 电子入门 学单片机 免费资源 下载中心 商品列表 象棋在线 在线绘图 加盟五一 加入收藏 设为首页
本站推荐:
谈谈单片机C语言编程中不经意间的一个小错误
文章长度[3732] 加入时间[2007/1/5] 更新时间[2024/7/2 21:48:20] 级别[0] [评论] [收藏]
我们知道,51单片机有几个不同的中断源。
对于一个系统的设计,通常在初始化程序里面需要定义各个中断等
比如:
    TMOD = 0x21;        // T1  mode 2 T0,mode 1 //GATE C/T M1 M0 GATE C/T M1 M0
    TL1  = 0xfd;        // 0xfa=4800 bps  0xfd=9600 bps
    TH1  = 0xfd;
    TH0  = -(10000/256);
    TL0  = -(10000%256);
    PCON = 0;           //波特率不变等设置
    SCON = 0x50;        //串口1方式1,允许接收
    IT0  = 1;           //外部中断0下降沿有效
    IT1  = 1;           //外部中断1下降沿有效
    TR0  = 1;           //启动定时器0
    TR1  = 1;           //启动定时器1
    ET0  = 1;           //开放定时器0中断
    ES   = 0;           //串行中断
    EX0  = 0;           //外部中断0
    EX1  = 0;           //外部中断1
    EA = 1;
可以看到,我们一共有:定时中断0,定时中断1,外部中断0,外部中断1,串行中断。
这五个中断是最基本的中断源。对于各位的设计,我相信这一段代码在不同的程序重通常都不会自己重复敲打进去了。应该是从以前某个代码中直接复制过来吧。
此时会有一个小问题存在而被你忽略。
    之前已经完成的代码中,你很有可能已经使用了全部5个中断,但是,一个刚开发的系统,也许还只是用到了其中的三个或者两个中断,而中断你全部开启了。这个意味着什么呢?
换算到汇编中可以比较明显的看到问题:
    org    0000h
    ljmp  main
    org    0003h   //中断0入口
    ljmp  int1        //中断1处理
    org    000bh   //中断1入口
    ljmp  int2        //中断1处理
    org    0013h   ……
    ljmp  int3
    org    001bh
    ljmp  int4
    org    0023h
    ljmp  int5
main:
    ……
    ret
int1
    reti
int2
   reti
……
可以知道,设置EX0 = 1意味着如果在外部中断0上存在中断信号,程序会跳转到0003h处运行
而下一条就是跳转到对应的中断处理程序。
 
假如我们的系统所有的中断都开启,但是你的中断处理程序此时只有一个。比如是串口中断开启。
那就意味着如果有定时中断也好,外部中断也好,全部都会让你执行串口中断处理函数。
因为你根本就没有让中断跳转到对应处理函数的过程,于是一直往下运行,从而发生未知的故障。
 
又比如你没有 串口中断处理函数,但是你开启了串口中断,你的程序在调试阶段又有一个串口发送数据的函数,那意味着什么?意味着你发送数据的时候有可能进入串口中断入口,而此时没有一个跳转命令到串口处理函数,那么只好重新运行主函数了。
 
   程序就全部乱套了。
1、 本站不保证以上观点正确,就算是本站原创作品,本站也不保证内容正确。
2、如果您拥有本文版权,并且不想在本站转载,请书面通知本站立即删除并且向您公开道歉! 以上可能是本站收集或者转载的文章,本站可能没有文章中的元件或产品,如果您需要类似的商品请 点这里查看商品列表!
本站协议 | 版权信息 |  关于我们 |  本站地图 |  营业执照 |  发票说明 |  付款方式 |  联系方式
深圳市宝安区西乡五壹电子商行——粤ICP备16073394号-1;地址:深圳西乡河西四坊183号;邮编:518102
E-mail:51dz$163.com($改为@);Tel:(0755)27947428
工作时间:9:30-12:00和13:30-17:30和18:30-20:30,无人接听时可以再打手机13537585389