/*在本論壇找到的資料
非常感謝: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
- }
- }
- */
復制代碼
|