找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3456|回复: 0
收起左侧

MSP430单片机临界代码

[复制链接]
ID:108615 发表于 2016-3-14 19:54 | 显示全部楼层 |阅读模式
本程序是《MSP430系列单片机系统工程设计与实践》书里面的源码,(包含工程文件(例3.9.10) )完整例程下载:http://www.51hei.com/bbs/dpj-46245-1.html


关于本程序的详细解说大家可以点击上图下载电子书

  1. #include <msp430x42x.h>

  2. float Val=123.4;
  3. char Flag=0;

  4. unsigned int SR_Val;
  5. unsigned char DINT_Count=0;
  6. void EnterCritical()                                        /*进入临界代码区*/
  7. {
  8. if(DINT_Count==0)                                         // 只对最外层操作。
  9. {
  10. SR_Val=__get_SR_register();   // 保存当前中断状所在的态寄存器
  11. _DINT();                                                // 关中断
  12.               }
  13.     DINT_Count ++;                                                // 嵌套层数计数+1
  14. }

  15. void ExitCritical()                                         /*退出临界代码区*/
  16. {
  17.   DINT_Count--;                                                // 嵌套层数计数-1
  18. if((DINT_Count==0)&&(SR_Val & GIE)) _EINT();  // 只对最外层操作。
  19. }                                                                                                  // 根据保存的状态恢复中断
  20. /*

  21. void EnterCritical(unsigned int *SR_Val)
  22. {
  23.    *SR_Val = __get_SR_register();//保存中断状态
  24.    _DINT();
  25. }

  26. void ExitCritical(unsigned int *SR_Val)
  27. {
  28.    if(*SR_Val & GIE)   _EINT();  //恢复中断状态
  29. }
  30. */


  31. void main( void )
  32. {  float Temp;
  33.    unsigned int GIE_Val;
  34.    WDTCTL= WDTPW +WDTHOLD;
  35.    P2OUT=0;
  36.    P2DIR|=BIT0;           // P2.0指示灯
  37.    BTCTL = BT_ADLY_250;   // 中断周期250ms
  38.    IE2 |= BTIE;                  // 允许BasicTimer中断
  39.    _EINT();                  // 允许总中断
  40.    while(1)
  41.    {
  42.      EnterCritical();
  43.      Temp=Val;
  44.      ExitCritical();
  45.      if((Temp!=123.4)&&(Temp!=56.78)) //如果既非123.4也非56.78
  46.      {   
  47.        P2OUT|=BIT0;                   // 才会执行到这一句(亮灯)
  48.      }   
  49.    }
  50. }

  51. #pragma vector = BASICTIMER_VECTOR        // BasicTimer定时器中断(1/4秒)
  52. __interrupt void BT_ISR(void)               //
  53. {
  54.    Flag^=1;
  55.    if(Flag) Val=123.4;                  // Val在123.4与56.78之间切换
  56.    else     Val=56.78;
  57. }
复制代码



回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表