找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2299|回复: 0
收起左侧

AT89S52单片机最小系统练习 4位抽奖机程序

[复制链接]
ID:294799 发表于 2019-5-23 23:27 | 显示全部楼层 |阅读模式
实现4个功能 1.可设置上限的抽奖方式一 2.4位随机数抽奖 3.倒计时 4.正计时
IMG_20190523_232200.jpg
单片机代码如下(详细代码见附件):
#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 };
              
/*************函数声明*****************************/  
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 (){
/****************初始化各参数**********************/

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;                        //循环控制变量初始化
o=-1;n=8,msta=0,t=-1;/*m=0;*/ //初始化工作方式0闪烁标志位及跳转信号参数
q=0;w=2;e=3;r=4;              //工作方式0参数初始化
//z=x=c=v=0;                  //抽奖机参数初始化
   
    SBUF=table[0];
    cs4=0;
  for(j=0;j<20;j++)
   {delay(100);
    P0=table_LED[j];}
    cs4=1;
   
/****************进入主循环**********************/
    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)//个位开始闪烁?
           { y=1;
            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;}
       //检测跳转信号
       if(k0==1)
        SBUF=table[8];
       if( ktz1==1)
        { msta=1;
        SBUF=table[1];
        max=q*1000+w*100+e*10+r;
        }
          break;          }
//工作方式1  可设置上限抽奖         
    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;  }
     //检测跳转信号
     keyscan(1);
     keyscan(2);
     if(ktz1==1)
     {msta=3;
      SBUF=table[2];  }  
     if(ktz2==1)
      msta=2;
           break;}
    case 2:    //工作方式1抽奖结果送显
    {
     delay(5);
     disp(z,x,c,v,0,0);
     keyscan(2);
     if(ktz2==1)
      msta=1;
        break; }
   
   //工作方式2 抽奖   
    case 3:
    {   //取随机数
     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);
     //检测跳转信号
     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抽奖结果送显
    {
     delay(5);
     disp(q,w,e,r,0,0);
     keyscan(2);
     if(ktz2==1)
      msta=3;
     break;
   
    }
   
    case 5:      //99分59秒倒计时
     {
      
      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:       //正计时
     {
     
      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;}
              }
                      }}
      
           
/**************************************
       子函数
***************************************/
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;}
//倒计时
void work3(){
     delay(5);
     while(f){
      delay(5);
      keyscan(1);
      keyscan(2);
      key_scan();
      disp(w3,w2,w1,w0,t,y);
      if(ktz2==1)//个位开始闪烁?
           { y=1;
            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;
           
    }  
  //正计时
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下载地址:
小系统实验.zip (68.24 KB, 下载次数: 16)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表