MSP430随机数产生器


运行代码  复制代码
  1.  

  2. //*****************************************************************************  
  3. //  MSP430-随机数的产生  
  4. //  作者:B哥  
  5. //  Email: cbing2000@163.com  
  6. //  May 2008  
  7. //  Built with IAR Embedded Workbench Version: 3.42A  
  8. //  程序功能:产生一个16位的随机数  
  9. //  原理:  
  10. //  AD输入口处于悬浮状态,这样输入的是一个不确定的数字  
  11. //  转换结果的最后一位尤是如此,转换16次(也可以不是16次,  
  12. //  但最大只能是16次,为什么?)后,这16次里有X次转换结果  
  13. //  的LSB是1,则把x放在randomNUM的最高四位,第2次循环得出的  
  14. //  x与第1次的异或,结果放次高四位,依次类推;为什么这样处理  
  15. //  就是让数据更”乱“更“随机”,甚至还可以不同循环里的采样率也不同  
  16. //  *******************************************************  
  17. //  本人遵循技术开放、广交天下朋友的原则,该程序可由任何人  
  18. //  修改使用。如有大虾修改了更为完善的该软件,请发送一份给本  
  19. //  人。谢谢!  
  20. //*********************************************************  
  21. #include "msp430x44x.h"  
  22.  
  23. unsigned char times=0;  
  24. unsigned char cyc;  
  25. unsigned int randomNUM;  
  26. unsigned int OneNums,temp;  
  27.  
  28. void main( void )  
  29. {  
  30.   // Stop watchdog timer to prevent time out reset  
  31. WDTCTL = WDTPW + WDTHOLD;  
  32. unsigned int i;  
  33.  
  34. P6DIR = 0;  
  35. P6SEL = 0x01;  
  36.  
  37. ADC12CTL0 &= ~ENC;  
  38. ADC12CTL0  = ADC12ON+SHT0_6+REFON+MSC;  
  39. ADC12CTL1 |= ADC12SSEL0 + SHP+CONSEQ_2;  
  40. ADC12MCTL0 = INCH_0+SREF_1;                  //通道0  
  41. for(i=0;i<7000;i++)  
  42. {;}                                          
  43. ADC12IE |= 0x01;                               
  44. ADC12CTL0 |= ENC;  
  45. _EINT();  
  46. ADC12CTL0 |= ADC12SC;  
  47. while(1)  
  48.   {  
  49.     LPM3;  
  50.     if(cyc==1)//第1次循环  
  51.     {  
  52.       randomNUM = OneNums<<12;  
  53.       temp=OneNums;  
  54.       OneNums = 0;  
  55.       continue;  
  56.     }  
  57.     if(cyc==2)//第2次循环  
  58.     {  
  59.        randomNUM |= (OneNums^temp)<<8;  
  60.        temp=OneNums;  
  61.        OneNums = 0;  
  62.        continue;  
  63.     }  
  64.     if(cyc==3)//第3次循环  
  65.       {  
  66.        randomNUM |= (OneNums^temp)<<4;  
  67.        temp=OneNums;  
  68.        OneNums = 0;    
  69.        continue;  
  70.       }  
  71.     if(cyc==4)//第4次循环  
  72.       {  
  73.        randomNUM |= OneNums^temp;  
  74.        temp=0;  
  75.        OneNums = 0;  
  76.        cyc=0;  
  77.      }  
  78. //randomNUM即为产生的16位随机数,以下程序用户自行添加  
  79.     _NOP();  
  80.   }//while  
  81. }  
  82.  
  83. #pragma vector=ADC_VECTOR  
  84. __interrupt void ADC12chanle(void)  
  85. {  
  86.    
  87.   unsigned int pp=0;  
  88.      
  89.   if (times<16)  
  90.   {  
  91.     pp = ADC12MEM0 ;  
  92.     times++;  
  93.     //if(ADC12MEM0 & 0x01)不就oK了?为什么还要弄个局部变量pp?  
  94.     if(pp & 0x01)  
  95.     {  
  96.       OneNums++;  
  97.     }  
  98.   }  
  99.   else  
  100.   {//一次循环,16次采样结束  
  101.     cyc++;  
  102.     times=0;  
  103.     LPM3_EXIT;  
  104.   }  
  105. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值