logo资料库

用单片机产生随机数的两种方法.doc

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
方法一:定时器直接随机取值 每按一次按键生成一个随机数,这个随机数实际是把定时器的值给取出来 了,并不能算绝对的随机、方法二才是真正意义上的随机。 仿真如下: #include sbit k1=P1^0; void delay(unsigned int i) { unsigned int j,k; for(j=0;j
} unsigned int sum1,sum2; unsigned char led[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0X40}; void init() interrupt 1 { TH0=0X00;TL0=0X00; } void display() { P2=led[sum1%10]; P3=0xfe; delay(2); P3=0xff; P2=led[sum1/10%10]; P3=0xfd; delay(2); P3=0xff; P2=led[sum2%10];
P3=0xfb; delay(2); P3=0xff; P2=led[sum2/10%10]; P3=0xf7; delay(2); P3=0xff; } void main() { TMOD=0X01; TH0=0X00;TL0=0X00; EA=1;ET0=1;TR0=1; while(1) { if(k1==0){while(k1==0);sum1=TL0;sum2=TH0;} display(); } }
方法二:用定时器加 rand()随机函数来实现 单片机上电之后通过按键去启动取随机数,若是单片机上电就立即取 随机数的话,那每次上电随机的结果都是一样的。然后是 0 到 9 不重复的 随机数,程序中用了循环来判断是否和前面取的随机数相同,相同则进入 下次取随机数,不同则存入数组。 程序如下: #include #include //包含 rand()随机函数的头文件 unsigned char t,k,i,j,a,f,n[10]; //t 是计时变量,k 是按键标志,i 是数组下标,f 是随机数重复标志,n[10] 是存放随机数的数组 void init() //初始化函数 { t=0; i=0; f=0; k=0; TMOD=0x02; //设置定时器 0 为工作方式 2 TH0=7; //装初值 TL0=7; EA=1; //开总中断 ET0=1; //开定时器 0 中断 TR0=1; //启动定时 0
EX0=1; //开外部中断 0,同按键的效果一样 IT0=1; //下降沿触发 } void main() { init(); while(1) { while(k) //外部中断 0 触发循环 { if(!i) //i=0 时取第一个随机数放入数组 n[0] { srand(t); //随机数初始化 a=(char)(rand()%10); //取随机数(0~9) n[0]=a; //存入数组 i++; //数组下标加 1 } else while(i<10) //存放剩下的 9 个随机数 { srand(t); //随机数初始化 a=(char)(rand()%10); //取随机数 for(j=0;j
f=1; //标志置 1 } if(f) //有重复执行 { f=0; //标志清 0 continue; //结束本次循环 } n[i]=a; //不同则存入数组中 i++; //数组下标加 1 } } } } void inter0() interrupt 0 //外部中断 0 { k=1; //按键标志置 1,主函数执行取随机数 } void time0() interrupt 1 //定时器 0 中断 { t++; //时间加 1 if(t==100) t=0; }
分享到:
收藏