1、基于51单片机随机数产生基于51单片机随机数产生一:系统主要功能与设计方案 功能:可以根据需要产生给定范围内的任何数字(0-999),显 示 于数码管上。 设计方案:利用51单片机内部的定时器与中断结合,来模仿随机数的产生;单片机编程上电后,定时器便启动开始计数,计数范围可以 预先设置,其设置的上限值被储存在24c02中;当中断0口产生低电平,进入中断函数读取定时器所跑的数值,经处理送入数码管显示。二:电路的硬件 电路搭建如下图,这里我们采用74ls595来驱动数码管,另外,为了防止电流过大这里串联一个75欧电阻用于限流;当操控启动按键后,三个数码管开始跑数字,操控“选择”锁定当前显示的数字,
2、达到随机数产生的目的;考虑到,不同的人对随机数产生的范围要求不同,这里,通过操控“储存,加1,加10,”预设的上限值存储在24c02中。三:软件设计#include #include #define uchar unsigned char #define uint unsigned int #define delay _nop_() /* 定义空指令 */ sbit ds0= P20; /74ls595移位寄存器 sbit st0=P21; sbit sh0=P22; sbit ds1= P23; sbit st1=P24; sbit sh1=P25; sbit ds2= P26; sbit
3、st2=P27; sbit sh2=P07;sbit p30=P30; / 启动 sbit p31=P31; / 加1 sbit p32=P32; / 选择sbit p35=P35; / 存储sbit p36=P36; / 加10 sbit scl=P00; /I2C 时钟 sbit dat=P01; /I2C 数据 bit ack; /*应答标志位*/ uchar temp,a,j,aa,flag,flag1,flag2,flag3; uchar b,c,d; uchar bb,cc,dd; uchar x,y,z,f,xx; uchar code tab = 0xfc,0x60,0xda,
4、0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6 ; /共阴 void delay1 (uint Z) uint x,y; for(x=Z;x0;x-) for(y=110;y0;y-); void write0(unsigned char a) unsigned char i; st0=0; for (i=0;i=1; st0=1; void write1(unsigned char a) unsigned char i; st1=0; for (i=0;i=1; st1=1; void write2(unsigned char a) unsigned char i; s
5、t2=0; for (i=0;i=1; st2=1; void init () scl=1; dat=1; a=0; p30=1; p31=1; p32=1;p35=1;p36=1;bb=0; temp=0; TMOD=0x02; TH0=0x00; TL0=0x00; EA=1; ET0=1; TR0=1;IT0=1;EX0=1; void start24() dat=1; delay; scl=1; delay; delay; delay; delay; delay; dat=0;delay; void stop24() dat=0; delay; delay; scl=1; delay;
6、 delay; dat=1; delay;delay;delay;delay;delay;void respons24()uchar i;scl=1; delay;while (dat=1) &(i255);scl=0;delay;delay;delay;void write24(uchar a) uchar i,temp; temp=a; scl=0; delay; delay; for (i=0;i8;i+) temp=temp1; dat=CY; delay;delay;delay;delay; delay; scl=1; delay; delay;delay;delay; scl=0;
7、 delay;delay; dat=1;/释放总线 delay; delay;delay;delay;uchar read24()uchar i,j,k;scl=0;delay;delay;delay;delay;dat=1;/释放总线delay;delay;delay;for (i=0;i8;i+) scl=1; delay;delay;delay;delay; j=dat; k=(k1)|j; delay; scl=0; delay; delay;delay;delay; return k; void writein(uchar address,uchar date) start24();
8、 write24(0xa0); respons24(); write24(address); respons24(); write24(date); respons24(); stop24(); uchar readout(uchar address) start24(); write24(0xa0); respons24(); write24(address); respons24(); start24(); write24(0xa1); respons24(); temp=read24(); return temp; void main () init () ;/ 初始化 temp=rea
9、dout(0) ;/ 读取24c02内数值 delay1(20); / 等待读出 cc=(temp&0xf0)/16; dd=(temp&0x0f)%16; temp=cc*16+dd; while (1) if(p31=0) /加1while(p31!=1) flag=0; flag1=1; flag2=0; if(flag1=1) temp+; x=temp/100;y=temp%100/10;z=temp%10; write0(tabz); write1(taby); write2(tabx); flag1=0; if(p36=0)/加10while(p36!=1) flag=0;fla
10、g1=0;flag2=1; if(flag2=1) temp=f*10; x=temp/100;y=temp%100/10;z=temp%10; write0(tabz); write1(taby); write2(tabx); flag2=0; f+; if (p30=0) /启动 while (p30!=1); flag=1; if (flag=1) write0(tabj); delay1 (20); write1(tab10-j); delay1 (30); write2(tabj); delay1 (30); j+; if (j=9) j=0; if(p35=0) /存储用户设置的随
11、机数产生范围到24c02 while(p35!=1) flag=0;flag1=0;flag2=0;flag3=1; if(flag3=1) xx=temp; writein(0,(xx/16)4|(xx%16); delay1(2000); flag3=0; flag=1; void timer0() interrupt 1 TH0=0; TL0=0; aa+; if (aa=temp) aa=0; void int0() interrupt 0 flag=0; d=aa/100; c=aa%100/10; b=aa%10; write0(tabb); write1(tabc); write2(tabd);