MSP430隨機(jī)數(shù)產(chǎn)生器
//*****************************************************************************
// MSP430-隨機(jī)數(shù)的產(chǎn)生
// 作者:B哥
// Email: cbing2000@163.com
// May 2008
// Built with IAR Embedded Workbench Version: 3.42A
// 程序功能:產(chǎn)生一個(gè)16位的隨機(jī)數(shù)
// 原理:
// AD輸入口處于懸浮狀態(tài),這樣輸入的是一個(gè)不確定的數(shù)字
// 轉(zhuǎn)換結(jié)果的最后一位尤是如此,轉(zhuǎn)換16次(也可以不是16次,
// 但最大只能是16次,為什么?)后,這16次里有X次轉(zhuǎn)換結(jié)果
// 的LSB是1,則把x放在randomNUM的最高四位,第2次循環(huán)得出的
// x與第1次的異或,結(jié)果放次高四位,依次類推;為什么這樣處理
// 就是讓數(shù)據(jù)更”亂“更“隨機(jī)”,甚至還可以不同循環(huán)里的采樣率也不同
// *******************************************************
// 本人遵循技術(shù)開放、廣交天下朋友的原則,該程序可由任何人
// 修改使用。如有大蝦修改了更為完善的該軟件,請(qǐng)發(fā)送一份給本
// 人。謝謝!
//*********************************************************
#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次循環(huán)
{
randomNUM = OneNums<<12;
temp=OneNums;
OneNums = 0;
continue;
}
if(cyc==2)//第2次循環(huán)
{
randomNUM |= (OneNums^temp)<<8;
temp=OneNums;
OneNums = 0;
continue;
}
if(cyc==3)//第3次循環(huán)
{
randomNUM |= (OneNums^temp)<<4;
temp=OneNums;
OneNums = 0;
continue;
}
if(cyc==4)//第4次循環(huán)
{
randomNUM |= OneNums^temp;
temp=0;
OneNums = 0;
cyc=0;
}
//randomNUM即為產(chǎn)生的16位隨機(jī)數(shù),以下程序用戶自行添加
_NOP();
}//while
}
#pragma vector=ADC_VECTOR
__interrupt void ADC12chanle(void)
{
unsigned int pp=0;
if (times<16)
{
pp = ADC12MEM0 ;
times++;
//if(ADC12MEM0 & 0x01)不就oK了?為什么還要弄個(gè)局部變量pp?
if(pp & 0x01)
{
OneNums++;
}
}
else
{//一次循環(huán),16次采樣結(jié)束
cyc++;
times=0;
LPM3_EXIT;
}
}