运行代码 复制代码 //***************************************************************************** // 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; } }