打印

MSP430随机数的产生

[复制链接]
4307|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
马善松|  楼主 | 2011-12-8 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  • 费了九牛二虎之力,弄出个简单的,时钟的方法不会,有待高人再做解答  
  • //*****************************************************************************  
  • //  MSP430-随机数的产生  
  • //  作者:B哥  
  • //  Email: cbing2000@163.com  
  • //  May 2008  
  • //  Built with IAR Embedded Workbench Version: 3.42A  
  • //  程序功能:产生一个16位的随机数  
  • //  原理:  
  • //  AD输入口处于悬浮状态,这样输入的是一个不确定的数字  
  • //  转换结果的最后一位尤是如此,转换16次(也可以不是16次,  
  • //  但最大只能是16次,为什么?)后,这16次里有X次转换结果  
  • //  的LSB是1,则把x放在randomNUM的最高四位,第2次循环得出的  
  • //  x与第1次的异或,结果放次高四位,依次类推;为什么这样处理  
  • //  就是让数据更”乱“更“随机”,甚至还可以不同循环里的采样率也不同  
  • //  *******************************************************  
  • //  本人遵循技术开放、广交天下朋友的原则,该程序可由任何人  
  • //  修改使用。如有大虾修改了更为完善的该软件,请发送一份给本  
  • //  人。谢谢!  
  • //*********************************************************  
  • #include "msp430x44x.h"  
  • unsigned char times=0;  
  • unsigned char cyc;  
  • unsigned int randomNUM;  
  • unsigned int OneNums,temp;  
  • void main( void )  
  • {  
  •   // Stop watchdog timer to prevent time out reset  
  • WDTCTL = WDTPW + WDTHOLD;  
  • unsigned int i;  
  • P6DIR = 0;  
  • P6SEL = 0x01;  
  • ADC12CTL0 &= ~ENC;  
  • ADC12CTL0  = ADC12ON+SHT0_6+REFON+MSC;  
  • ADC12CTL1 |= ADC12SSEL0 + SHP+CONSEQ_2;  
  • ADC12MCTL0 = INCH_0+SREF_1;                  //通道0  
  • for(i=0;i<7000;i++)  
  • {;}                                          
  • ADC12IE |= 0x01;                              
  • ADC12CTL0 |= ENC;  
  • _EINT();  
  • ADC12CTL0 |= ADC12SC;  
  • while(1)  
  •   {  
  •     LPM3;  
  •     if(cyc==1)//第1次循环  
  •     {  
  •       randomNUM = OneNums<<12;  
  •       temp=OneNums;  
  •       OneNums = 0;  
  •       continue;  
  •     }  
  •     if(cyc==2)//第2次循环  
  •     {  
  •        randomNUM |= (OneNums^temp)<<8;  
  •        temp=OneNums;  
  •        OneNums = 0;  
  •        continue;  
  •     }  
  •     if(cyc==3)//第3次循环  
  •       {  
  •        randomNUM |= (OneNums^temp)<<4;  
  •        temp=OneNums;  
  •        OneNums = 0;   
  •        continue;  
  •       }  
  •     if(cyc==4)//第4次循环  
  •       {  
  •        randomNUM |= OneNums^temp;  
  •        temp=0;  
  •        OneNums = 0;  
  •        cyc=0;  
  •      }  
  • //randomNUM即为产生的16位随机数,以下程序用户自行添加  
  •     _NOP();  
  •   }//while  
  • }  
  • #pragma vector=ADC_VECTOR  
  • __interrupt void ADC12chanle(void)  
  • {  
  •   unsigned int pp=0;  
  •   if (times<16)  
  •   {  
  •     pp = ADC12MEM0 ;  
  •     times++;  
  •     //if(ADC12MEM0 & 0x01)不就oK了?为什么还要弄个局部变量pp?  
  •     if(pp & 0x01)  
  •     {  
  •       OneNums++;  
  •     }  
  •   }  
  •   else  
  •   {//一次循环,16次采样结束  
  •     cyc++;  
  •     times=0;  
  •     LPM3_EXIT;  
  •   }  
  • }  

相关帖子

沙发
zheng522| | 2011-12-8 13:54 | 只看该作者
转换次数可以很多次啊,我以前用做AD的可以有几次都可以的,你的这产生随机数的思路很特别,学习了,我有时间了也来试试。。。

使用特权

评论回复
板凳
TI_MCU| | 2011-12-8 14:41 | 只看该作者
1. 转换次数是根据你的算法定的,长短不一定要16位。转换次数越多,生成随机数所需要的时间自然越长,使用中需要考虑下是否经济
2. pp变量不是必须的

使用特权

评论回复
地板
xlhtracy| | 2011-12-8 15:28 | 只看该作者
转换次数可以很多次

使用特权

评论回复
5
sqcumt123| | 2011-12-15 09:56 | 只看该作者
好好学习一下,原来还可以这样

使用特权

评论回复
6
ajin505| | 2012-12-3 09:06 | 只看该作者
学习了
用标准函数中的rand不是也能生成伪随机数吗

使用特权

评论回复
7
superman2012| | 2012-12-3 23:16 | 只看该作者
这种方法原来没用过,学习了,以后试试。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

131

帖子

0

粉丝