標(biāo)題: AT89S52單片機(jī)最小系統(tǒng)練習(xí) 4位抽獎(jiǎng)機(jī)程序 [打印本頁(yè)]

作者: Longing    時(shí)間: 2019-5-23 23:27
標(biāo)題: AT89S52單片機(jī)最小系統(tǒng)練習(xí) 4位抽獎(jiǎng)機(jī)程序
實(shí)現(xiàn)4個(gè)功能 1.可設(shè)置上限的抽獎(jiǎng)方式一 2.4位隨機(jī)數(shù)抽獎(jiǎng) 3.倒計(jì)時(shí) 4.正計(jì)時(shí)

單片機(jī)代碼如下(詳細(xì)代碼見附件):
#include <reg52.h>
#include "main.h"
#include "delay.h"
#include "keyscan.h"
#include "disp.h"
#include "key_scan.h"
#include <stdio.h>
#include <stdlib.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09, //0 1 2 3 4 5 6 7 8 9
             0x11,0xc1,0x63,0x85,0x61,0x71};    //SBUF送顯斷碼表   //A b C d E F
uchar code table_LED[]={0X7F,0X3F,0X1F,0X0F,0X07,0X03,0X01,0X00,0XFE,0XFC,0XF8,
                           0XF0,0XE0,0XC0,0X80,0X00,0X00,0X00,0X00,0X00 };
              
/*************函數(shù)聲明*****************************/  
void work0();
void work3();
void work4();
char w0,w2;
uchar w1,w3,t1;
char t,y,o,p,m,n,msta;
uchar f,g;

void main (){
/****************初始化各參數(shù)**********************/

char j;/*o,p,m,n,msta*/
char q,w,e,r,/*t,*/y;     //工作方式0送顯變量
int max,temp;
uchar z,x,c,v;
f=g=1;                        //循環(huán)控制變量初始化
o=-1;n=8,msta=0,t=-1;/*m=0;*/ //初始化工作方式0閃爍標(biāo)志位及跳轉(zhuǎn)信號(hào)參數(shù)
q=0;w=2;e=3;r=4;              //工作方式0參數(shù)初始化
//z=x=c=v=0;                  //抽獎(jiǎng)機(jī)參數(shù)初始化
   
    SBUF=table[0];
    cs4=0;
  for(j=0;j<20;j++)
   {delay(100);
    P0=table_LED[j];}
    cs4=1;
   
/****************進(jìn)入主循環(huán)**********************/
    while(1)
    {   
  

switch(msta)
  {
//工作方式0
     case 0:
       {   
        delay(5);  
         key_scan();      
        disp(q,w,e,r,t,y);
        keyscan(1);
        keyscan(2);
          if(ktz2==1)//個(gè)位開始閃爍?
           { y=1;
            o++;   //閃爍指針下調(diào)
           switch(o)
           { case 0: t=0;break;
            case 1: t=1;break;
            case 2: t=2;break;
            case 3: t=3;break;
           }
           if(o==4)
            { o=-1;
            y=0;}
           }
    //0~7按鍵的翻譯                                
         if(key1>0)
     {
            for(p=0;p<=8;p++)      
            {
             if(key1&0x01)         
             {
              switch(t)
             { case 0: r=m;break;
              case 1: e=m;break;
              case 2: w=m;break;
              case 3: q=m;break;}}
             key1>>=1;
             m++;}
                  m=0;}
    //8~11按鍵的翻譯
      if(key2>0)
       {
              for(p=0;p<=2;p++)
                {
            if((key2&0x01)==1)
              {switch(t)
              { case 0: r=n;break;
               case 1: e=n;break;
               case 2: w=n;break;
               case 3: q=n;break;}}
              key2>>=1;
              n++;}
                          n=8;}
       //檢測(cè)跳轉(zhuǎn)信號(hào)
       if(k0==1)
        SBUF=table[8];
       if( ktz1==1)
        { msta=1;
        SBUF=table[1];
        max=q*1000+w*100+e*10+r;
        }
          break;          }
//工作方式1  可設(shè)置上限抽獎(jiǎng)         
    case 1:
    {temp=rand()%(max+1);
    z=temp/1000%10;
     x=temp/100%10;
     c=temp/10%10;
     v=temp/1%10;
     delay(5);
   disp(z,x,c,v,0,0);
//   delay(3);
//   v++;
//     if (v>9)
//     {c++;v=0;}
//     if(c>9)
//     {x++;c=0;}
//     if(x>9)
//     {z++;x=0;}
//     if(z>9)
//      z=0;
//
//  if((z==q)&&(x==w)&&(c==e)&&(v==r))   //將最大值送顯后清零
//   {for(i=0;i<4;i++)
//    {  disp(z,x,c,v,0,0);
//        delay(3); }
//         z=x=c=v=0;  }
     //檢測(cè)跳轉(zhuǎn)信號(hào)
     keyscan(1);
     keyscan(2);
     if(ktz1==1)
     {msta=3;
      SBUF=table[2];  }  
     if(ktz2==1)
      msta=2;
           break;}
    case 2:    //工作方式1抽獎(jiǎng)結(jié)果送顯
    {
     delay(5);
     disp(z,x,c,v,0,0);
     keyscan(2);
     if(ktz2==1)
      msta=1;
        break; }
   
   //工作方式2 抽獎(jiǎng)   
    case 3:
    {   //取隨機(jī)數(shù)
     q=rand()%10;
     w=rand()%10;
     e=rand()%10;
     r=rand()%10;
     delay(5);
     disp(q,w,e,r,0,0);
     keyscan(1);
     keyscan(2);
     //檢測(cè)跳轉(zhuǎn)信號(hào)
     if(ktz1==1)
     {msta=5;SBUF=table[3];w3=w2=9;w0=9;w1=5;}
//     if(ktz1==1)
//     { msta=0; SBUF=table[0];q=0;w=2;e=3;r=4;}
     if(ktz2==1)
      msta=4;
     break;}
   
    case 4:  //工作方式2抽獎(jiǎng)結(jié)果送顯
    {
     delay(5);
     disp(q,w,e,r,0,0);
     keyscan(2);
     if(ktz2==1)
      msta=3;
     break;
   
    }
   
    case 5:      //99分59秒倒計(jì)時(shí)
     {
      
      if(w3==0&&w2==0&&w1==0&&w0==0)
     {while(g){
      keyscan(1);
      delay(5);
      disp(0,0,0,0,0,0);
      f++;
      if(ktz1==1)
      {g=0;msta=6;SBUF=table[4];}
      if(f==200)
      {P2=0xff;
         f=0;
      delay(1000);}}   
     }
      work3();
     
     break;}
    case 6:       //正計(jì)時(shí)
     {
     
      work4();
       if(w3==9&&w2==9&&w1==5&&w0==9)
      {while(g)
       { keyscan(1);
        
        delay(5);
      disp(9,9,5,9,0,0);
      f++;
      if(f==200)
      {P2=0xff;
         f=0;
      delay(1000);}
      keyscan(1);
      if(ktz1==1)
      {g=0;}
     
      }}
       if(ktz1==1)
     {
      q=0;w=2; e=3;r=4;
      msta=0;
      SBUF=table[0];
      
    }
     
     break;}
              }
                      }}
      
           
/**************************************
       子函數(shù)
***************************************/
void work0(){
  
  
    t1++;
  if(t1==200)
  { w0--;
    t1=0;}
  if(w1==0&&w0==-1)
  {w1=5;
    w0=9;
    w2--;}
   
  if(w0==-1)
    {w0=9;
    w1--;}
   if(w2==-1)
   {w2=9;
    w3--;
   }
   disp(w3,w2,w1,w0,0,0);
   return;}
//倒計(jì)時(shí)
void work3(){
     delay(5);
     while(f){
      delay(5);
      keyscan(1);
      keyscan(2);
      key_scan();
      disp(w3,w2,w1,w0,t,y);
      if(ktz2==1)//個(gè)位開始閃爍?
           { y=1;
            o++;   //閃爍指針下調(diào)
           switch(o)
           { case 0: t=0;break;
            case 1: t=1;break;
            case 2: t=2;break;
            case 3: t=3;break;
           }
           if(o==4)
            { o=-1;
            y=0;}
           }
    //0~7按鍵的翻譯                                
         if(key1>0)
     {
            for(p=0;p<=8;p++)      
            {
             if(key1&0x01)         
             {
              switch(t)
             { case 0: w0=m;break;
              case 1: w1=m;break;
              case 2: w2=m;break;
              case 3: w3=m;break;}}
             key1>>=1;
             m++;}
                  m=0;}
    //8~11按鍵的翻譯
      if(key2>0)
       {
              for(p=0;p<=2;p++)
                {
            if((key2&0x01)==1)
              {switch(t)
              { case 0: w0=n;break;
               case 1: w1=n;break;
               case 2: w2=n;break;
               case 3: w3=n;break;}}
              key2>>=1;
              n++;}
                          n=8;}
          if(ktz1==1)
            { f=0;delay(20);}
     }
      keyscan(1);
     if(ktz1==1)
     {msta=6;SBUF=table[4];w3=w2=w1=w0=0;}
        work0();
     keyscan(2);
     if(ktz2==1)
      f=1;
       return;
           
    }  
  //正計(jì)時(shí)
void work4(){
     uchar t;
      keyscan(1);
      keyscan(2);
        delay(5);
      disp(w3,w2,w1,w0,0,0);
      t++;
      if(t==200)
      {
       t=0;
       w0++;}
      if(w0==10)
      {w0=0;
       w1++;
        if(w1==6)
       {w1=0;
        w2++;}
       if(w2==10)
       {w2=0;
        w3++;}
            }
      if(ktz1==1)
      {msta=0;SBUF=table[0];}
      if(ktz2==1)
      {  f=1;
       while(f)
       { keyscan(1);
        keyscan(2);
        delay(5);
        disp(w3,w2,w1,w0,0,0);
        if(ktz2==1)
         f=0;
      if(ktz1==1)
      w0=w1=w2=w3=0;}}
    return;}
        
全部資料51hei下載地址:
小系統(tǒng)實(shí)驗(yàn).zip (68.24 KB, 下載次數(shù): 16)





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1