/*在本论坛找到的资料
非常感谢:lyh一点点 的《基于单片机的5位显示抽奖器(含仿真和程序)》
在《基于单片机的5位显示抽奖器(含仿真和程序)》的基础上做出的修改(595控制数码管)
由于手头只有三极管控制的共阳数码管模块,所以自己修改程序
随机显示范围可以自行修改:把270改成任意数
num=rand()%270; //获得0~270之间的随机
randdata=rand()%(300-200+1)+200 //获得200~300之间的随机数*/
//以下为程序源码:
- #include <reg52.h>
- #include <intrins.h>
- #include <stdlib.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar code table[]= //共阳数码管编码0~F
- {0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xc0,0x86,0x8e};
- uchar ge,shi,bai,t;
- uint num;
- sbit key1=P2^0;
- sbit D1=P1^1;
- sbit D2=P1^2;
- sbit D3=P1^3;
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void display()
- {
- bai=num/100; //输出百位
- shi=num%100/10;//输出十位
- ge=num%10; //输出个位
- D1=0;
- P0=table[bai];
- delay(10);
- P0=0xff;
- D1=1;
- D2=0;
- P0=table[shi];
- delay(10);
- P0=0xff;
- D2=1;
- D3=0;
- P0=table[ge];
- delay(10);
- D3=1;
- }
- void key()
- {
- if(key1==0)
- {
- delay(10);
- if(key1==0)
- {
- while(!key1);
- TR0=~TR0;
- srand(t); //初始化种子,函数srand(t)在stdlib.h
- }
- }
- }
- void main()
- {
- // EX0=1; //使能外部中断0
- // IT0=1; //设置外部中断0触发方式为低脉冲
- num=0;
- EA=1; //开总中断
- ET0=1;
- TMOD=0x01; //设置T1工作方式
- TH0=(65536-45872)/256; //50ms定时
- TL0=(65536-45872)%256;
- TR0=0;
- while(1)
- {
- key();
- display();
- }
- }
- void T0_time() interrupt 1
- {
- // ET0=0; //首先关闭中断
- TH0=(65536-45872)/256; //然后重新装入预制值
- TL0=(65536-45872)%256;
- // ET0=1; //打开T0中断
- t++;
- if(t==20) //如果到了20次,说明1000ms时间到
- {
- t=0; //然后把t清零
- }
- num=rand()%270; //获得0~270之间的随机数,函数rand()在stdlib.h
- //randdata=rand()%(300-200+1)+200 //获得200~300之间的随机数,函数rand()在stdlib.h
- }
- /*
- EX_INT0() interrupt 0 using 1 //外部中断0服务函数
- {
- if(TR0==1) //判断当前定时计数器的状态
- {
- TR0=0;
- }
- else
- {
- TR0=1;
- srand(t); //初始化种子,函数srand(t)在stdlib.h
- }
- }
- */
复制代码
|