×
嵌入式 > 技术百科 > 详情

MSP430随机数产生器

发布时间:2022-04-28 发布时间:
|
  1. //*****************************************************************************  

  2. //  MSP430-随机数的产生  

  3. //  作者:B哥  

  4. //  Email: cbing2000@163.com  

  5. //  May 2008  

  6. //  Built with IAR Embedded Workbench Version: 3.42A  

  7. //  程序功能:产生一个16位的随机数  

  8. //  原理:  

  9. //  AD输入口处于悬浮状态,这样输入的是一个不确定的数字  

  10. //  转换结果的最后一位尤是如此,转换16次(也可以不是16次,  

  11. //  但最大只能是16次,为什么?)后,这16次里有X次转换结果  

  12. //  的LSB是1,则把x放在randomNUM的最高四位,第2次循环得出的  

  13. //  x与第1次的异或,结果放次高四位,依次类推;为什么这样处理  

  14. //  就是让数据更”乱“更“随机”,甚至还可以不同循环里的采样率也不同  

  15. //  *******************************************************  

  16. //  本人遵循技术开放、广交天下朋友的原则,该程序可由任何人  

  17. //  修改使用。如有大虾修改了更为完善的该软件,请发送一份给本  

  18. //  人。谢谢!  

  19. //*********************************************************  

  20. #include "msp430x44x.h"  

  21.  

  22. unsigned char times=0;  

  23. unsigned char cyc;  

  24. unsigned int randomNUM;  

  25. unsigned int OneNums,temp;  

  26.  

  27. void main( void )  

  28. {  

  29.   // Stop watchdog timer to prevent time out reset  

  30. WDTCTL = WDTPW + WDTHOLD;  

  31. unsigned int i;  

  32.  

  33. P6DIR = 0;  

  34. P6SEL = 0x01;  

  35.  

  36. ADC12CTL0 &= ~ENC;  

  37. ADC12CTL0  = ADC12ON+SHT0_6+REFON+MSC;  

  38. ADC12CTL1 |= ADC12SSEL0 + SHP+CONSEQ_2;  

  39. ADC12MCTL0 = INCH_0+SREF_1;                  //通道0  

  40. for(i=0;i<7000;i++)  

  41. {;}                                          

  42. ADC12IE |= 0x01;                               

  43. ADC12CTL0 |= ENC;  

  44. _EINT();  

  45. ADC12CTL0 |= ADC12SC;  

  46. while(1)  

  47.   {  

  48.     LPM3;  

  49.     if(cyc==1)//第1次循环  

  50.     {  

  51.       randomNUM = OneNums<<12;  

  52.       temp=OneNums;  

  53.       OneNums = 0;  

  54.       continue;  

  55.     }  

  56.     if(cyc==2)//第2次循环  

  57.     {  

  58.        randomNUM |= (OneNums^temp)<<8;  

  59.        temp=OneNums;  

  60.        OneNums = 0;  

  61.        continue;  

  62.     }  

  63.     if(cyc==3)//第3次循环  

  64.       {  

  65.        randomNUM |= (OneNums^temp)<<4;  

  66.        temp=OneNums;  

  67.        OneNums = 0;    

  68.        continue;  

  69.       }  

  70.     if(cyc==4)//第4次循环  

  71.       {  

  72.        randomNUM |= OneNums^temp;  

  73.        temp=0;  

  74.        OneNums = 0;  

  75.        cyc=0;  

  76.      }  

  77. //randomNUM即为产生的16位随机数,以下程序用户自行添加  

  78.     _NOP();  

  79.   }//while  

  80. }  

  81.  

  82. #pragma vector=ADC_VECTOR  

  83. __interrupt void ADC12chanle(void)  

  84. {  

  85.    

  86.   unsigned int pp=0;  

  87.      

  88.   if (times<16)  

  89.   {  

  90.     pp = ADC12MEM0 ;  

  91.     times++;  

  92.     //if(ADC12MEM0 & 0x01)不就oK了?为什么还要弄个局部变量pp?  

  93.     if(pp & 0x01)  

  94.     {  

  95.       OneNums++;  

  96.     }  

  97.   }  

  98.   else  

  99.   {//一次循环,16次采样结束  

  100.     cyc++;  

  101.     times=0;  

  102.     LPM3_EXIT;  

  103.   }  

  104. }  


 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
NTMD6N03R2G的技术参数