独闷闷网

 找回密码
 立即注册
搜索
查看: 4268|回复: 0
打印 上一主题 下一主题
收起左侧

[原创] 网友“西安-老赵”在定时中断中用状态机的办法实现18B20驱动程序

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-11 16:21:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
西安-老赵:
18B20我在时间中断中用状态机的办法实现程序

木丁西—黄冈:
请问什么是状态机?

西安-老赵:
计数器就是个状态机,数字电路分为组合电路和时序电路.状态机就是时序电路.
下面是我的程序节选。
  1. interrupt 12 void TPM2CH0_ISR(void){

  2. TPM2C0SC_CH0F=0;
  3.    
  4. //PTDD_PTDD7=~PTDD_PTDD7;   
  5.    
  6. if(tcount!=0) tcount--;

  7. if(otcount1!=0) otcount1--;
  8. if(otcount2!=0) otcount2--;

  9. if(blitcount!=0) blitcount--;

  10. else     PTBD_PTBD6=1;


  11. switch(onewireflag){
  12.             case  ONEWIREFLAG0: onewire_reset_ts1ts2();        //onewire reset
  13.                                                     onewireflag= ONEWIREFLAG1;
  14.                                                   break;
  15.                                                         
  16.                   case  ONEWIREFLAG1: PTFDD_PTFDD2=0;         //presence delay
  17.                             PTFDD_PTFDD3=0;
  18.                             PTFD_PTFD2=1;
  19.                             PTFD_PTFD3=1;
  20.                             onewireflag= ONEWIREFLAG2;
  21.                                                   break;
  22.                            
  23.         case ONEWIREFLAG2:
  24.                                       write_byte_ts1(0xcc); // skip rom
  25.                                       write_byte_ts2(0xcc);
  26.                                                           onewireflag= ONEWIREFLAG3;
  27.                                                           break;
  28.                  
  29.                   case  ONEWIREFLAG3:        write_byte_ts1(0x44);        // Start Conversion
  30.                                       write_byte_ts2(0x44);
  31.                                       
  32.                                       tmcount=90;
  33.                                                           onewireflag= ONEWIREFLAG4;
  34.                                                           break;
  35.                  
  36.             case  ONEWIREFLAG4:        tmcount--;
  37.                                                     if (tmcount==0)          //wait 4500ms for conversion complete
  38.                                                     onewireflag= ONEWIREFLAG5;               
  39.                                                     break;
  40.                  
  41.                   case  ONEWIREFLAG5: onewire_reset_ts1ts2();        //onewire reset
  42.                                                     onewireflag= ONEWIREFLAG6;
  43.                                                   break;
  44.                                                   
  45.                                                   
  46.         case  ONEWIREFLAG6: PTFDD_PTFDD2=0;         //presence delay
  47.                             PTFDD_PTFDD3=0;
  48.                             PTFD_PTFD2=1;
  49.                             PTFD_PTFD3=1;
  50.                             onewireflag= ONEWIREFLAG7;
  51.                                                   break;
  52.                  
  53.             case  ONEWIREFLAG7:
  54.                                 write_byte_ts1(0xcc); // skip rom
  55.                                 write_byte_ts2(0xcc);
  56.                                                           onewireflag= ONEWIREFLAG8;
  57.                                                           break;
  58.                    
  59.                  
  60.                   case  ONEWIREFLAG8: write_byte_ts1(0xbe);
  61.                                       write_byte_ts2(0xbe); //Read Scratch Pad
  62.                                                           onewireflag= ONEWIREFLAG9;
  63.                                                           break;
  64.                  
  65.                   case  ONEWIREFLAG9:        tmlobyte1=read_byte_ts1();//read temperature  low byte
  66.                                       tmlobyte2=read_byte_ts2();
  67.                                                           onewireflag= ONEWIREFLAG10;                                  
  68.                                                           break;
  69.                  
  70.                   case  ONEWIREFLAG10:tmhibyte1=read_byte_ts1();//read temperature  high byte
  71.                                       tmhibyte2=read_byte_ts2();
  72.                                       
  73.                                       
  74.                                      // databuffer[0]=tmlobyte1|(tmhibyte1<<8);
  75.                                       databuffer[0]=tmhibyte1;
  76.                                       databuffer[1]=tmlobyte1;
  77.                                       
  78.                                      // databuffer[1]=tmlobyte2|(tmhibyte2<<8);
  79.                                       
  80.                                       databuffer[2]=tmhibyte2;
  81.                                       databuffer[3]=tmlobyte2;
  82.                                       
  83.                                       PTDD_PTDD7=~PTDD_PTDD7;
  84.                  
  85.                                                           onewireflag= ONEWIREFLAG0;       
  86.                                                           break;
  87.             default:  
  88.                                  break;               
  89.                  
  90.           }


  91. switch(keyhit){

  92. case 0: if(PTDD_PTDD4==0)
  93.           keyhit=1;
  94.           break;
  95.   
  96. case 1:if(PTDD_PTDD4==0)
  97.          
  98.           keyhit=2;
  99.           else  keyhit=0;   
  100.           break;
  101.                         
  102. case 2:
  103.           if(PTDD_PTDD4==0)

  104.           keyvalue1=5;

  105.           keyhit=3;
  106.          
  107.   case 3: if(PTDD_PTDD4==1){
  108.    
  109.           keyhit=0;
  110.           keyvalue=keyvalue1;
  111.           blitcount=200;
  112.           PTBD_PTBD6=0;
  113.   
  114.           }
  115.                  
  116. default:

  117.                 break;         


  118. }
  119.         
  120.    
  121. }
复制代码

西安-老赵:
延时用定时器,不死等,定时器时标到了,判断状态要不要翻转。

鸿哥--深圳:
这个状态机写得很好,一步一步切换非常好。有时候,也可以根据条件,直接从第1步切换到第3步或者第8步,不一定要切换到第2步,这个就是状态机的灵魂精华。

乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2024-11-29 18:22 , Processed in 0.149934 second(s), 18 queries .

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