MSP430随机数产生器
扫描二维码
随时随地手机看文章
//*****************************************************************************
// 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;
}
}