基于51单片机抽奖系统

基于51单片机抽奖系统

(仿真+程序)

功能介绍

具体功能:

1.利用5片74HC495对单片机的IO进行串并转换,进而控制5个1位数码管;

2.采用一个独立按键用于抽奖系统的启停控制;

3.8位拨码开关是用于设定随机数发生器的"种子值"(初始值);

​演示视频:

基于51单片机抽奖系统

添加图片注释,不超过 140 字(可选)

程序

cs 复制代码
#include <reg51.h>
#include <intrins.h>
#include <stdlib.h>
/***公众号:木子单片机****
************************************/
#define TRUE  1
#define FALSE 0

bit  bT0Flg = FALSE;

//U2 595的驱动引脚定义
sbit sbSHCP2 = P2^0;
sbit sbDS2 = P2^1;
sbit sbSTCP2 = P2^2;
//U3 595的驱动引脚定义
sbit sbSHCP3 = P2^3;
sbit sbDS3 = P2^4;
sbit sbSTCP3 = P2^5;
//U4 595的驱动引脚定义
sbit sbSHCP4 = P2^6;
sbit sbDS4 = P2^7;
sbit sbSTCP4 = P3^0;
//U5 595的驱动引脚定义
sbit sbSHCP5 = P3^1;
sbit sbDS5 = P3^3;
sbit sbSTCP5 = P3^4;
//U6 595的驱动引脚定义
sbit sbSHCP6 = P3^5;
sbit sbDS6 = P3^6;
sbit sbSTCP6 = P3^7;

unsigned char temp2,temp3,temp4,temp5,temp6;
bdata unsigned char sw;    //位定义

sbit sw0 = sw ^ 0;
sbit sw1 = sw ^ 1;
sbit sw2 = sw ^ 2;
sbit sw3 = sw ^ 3;
sbit sw4 = sw ^ 4;
sbit sw5 = sw ^ 5;
sbit sw6 = sw ^ 6;
sbit sw7 = sw ^ 7;

unsigned char code SEGtable[]=
{
 	0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,	
};
/*
void Delay(unsigned int x)
{
 	unsigned char i;
	while(x--)
	{
	 	for(i=0;i<120;i++);
	}
} */

//595输入函数2号
void Input5952()
{
 	unsigned char i;
	for(i=0;i<8;i++)
	{
	 	temp2 <<= 1;
		sbDS2   = CY;
		sbSHCP2 = 1;
		_nop_();
		_nop_();
		sbSHCP2 = 0;
	}
}
//595输出函数2号
void Output5952()
{
 	sbSTCP2 = 0;
	_nop_();
	sbSTCP2 = 1;
	_nop_();
	sbSTCP2 = 0;
}
//595输入函数3号
void Input5953()
{
 	unsigned char i;
	for(i=0;i<8;i++)
	{
	 	temp3 <<= 1;
		sbDS3   = CY;
		sbSHCP3 = 1;
		_nop_();
		_nop_();
		sbSHCP3 = 0;
	}
}
//595输出函数3号
void Output5953()
{
 	sbSTCP3 = 0;
	_nop_();
	sbSTCP3 = 1;
	_nop_();
	sbSTCP3 = 0;
}

//595输入函数4号
void Input5954()
{
 	unsigned char i;
	for(i=0;i<8;i++)
	{
	 	temp4 <<= 1;
		sbDS4   = CY;
		sbSHCP4 = 1;
		_nop_();
		_nop_();
		sbSHCP4 = 0;
	}
}
//595输出函数4号
void Output5954()
{
 	sbSTCP4 = 0;
	_nop_();
	sbSTCP4 = 1;
	_nop_();
	sbSTCP4 = 0;
}

//595输入函数5号
void Input5955()
{
 	unsigned char i;
	for(i=0;i<8;i++)
	{
	 	temp5 <<= 1;
		sbDS5   = CY;
		sbSHCP5 = 1;
		_nop_();
		_nop_();
		sbSHCP5 = 0;
	}
}
//595输出函数5号
void Output5955()
{
 	sbSTCP5 = 0;
	_nop_();
	sbSTCP5 = 1;
	_nop_();
	sbSTCP5 = 0;
}

//595输入函数6号
void Input5956()
{
 	unsigned char i;
	for(i=0;i<8;i++)
	{
	 	temp6 <<= 1;
		sbDS6   = CY;
		sbSHCP6 = 1;
		_nop_();
		_nop_();
		sbSHCP6 = 0;
	}
}
//595输出函数6号
void Output5956()
{
 	sbSTCP6 = 0;
	_nop_();
	sbSTCP6 = 1;
	_nop_();
	sbSTCP6 = 0;
}



/*8位拨码开关是用于设定随机数发生器的"种子值"(初始值)。
这个抽奖系统的仿真,主要利用随机数发生器产生随机数,
随机数发生器中的rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,
rand根据这个种子的值产生一系列随机数。如果系统提供的种子没有变化,
每次调用rand函数生成的伪随机数序列都是一样的。
srand(unsigned seed)通过参数seed改变系统提供的种子值,
从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的"随机"。
通常可以利用系统时间来改变系统的种子值,即srand(time(NULL)),
可以为rand函数提供不同的种子值,进而产生不同的随机数序列。*/
void initrand(void)
{
   	unsigned char counter=0;
    P1 = 0xff;
    sw = P1;
    counter = 0;  //统计开关闭合的数码
    if(sw0 == 1)
    {
       counter++;
    }
    if(sw1 == 1)
    {
       counter++;
    }
    if(sw2 == 1)
    {
       counter++;
    }
    if(sw3 == 1)
    {
       counter++;
    }
    if(sw4 == 1)
    {
       counter++;
    }
    if(sw5 == 1)
    {
       counter++;
    }
    if(sw6 == 1)
    {
       counter++;
    }
    if(sw7 == 1)
    {
       counter++;
    }
    srand(counter);       //初始化种子
}


void Timer0Init(void)                           //定时器0初始化函数
{
  TMOD = 0x01;                                  //设置T1工作方式
	TH0 = 0x00;
	TL0 = 0x0C;					                          //100ms定时
  ET0 = 1;                                      //开启定时器0中断
//  TR0 = 1;                                      //启动定时器
}
void Timer0Deal(void) interrupt 1 using 1       //定时器0中断处理函数
{
	ET0 = 0;                       //首先关闭中断
	TH0 = 0x00;                    //然后重新装入预制值
	TL0 = 0x0C;				
  ET0 = 1;                       //打开T0中断
  bT0Flg = TRUE;                  //定时器中断标志位
}
EX_INT0() interrupt 0 using 1         //外部中断0服务函数
{
  if(TR0 == 1)                       //判断当前定时计数器的状态
  {
    TR0 = 0;
  }
  else
  {
    TR0 = 1;
    initrand();   //初始化种子
  }
}

硬件设计

使用元器件:

单片机:AT89C52;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

设计资料

01仿真图

本设计使用proteus7.8和proteus8.9两个版本设计!具体如图!

添加图片注释,不超过 140 字(可选)

02程序

本设计使用软件keil5版本编程设计!具体如图!

添加图片注释,不超过 140 字(可选)

03设计资料

资料获取请关注同名公众号,全部资料包括程序(含注释)、仿真源文件等。具体内容如下,全网最全!

可以关注下方公众号!

点赞分享一起学习成长。

相关推荐
美好的事情总会发生3 分钟前
冯诺依曼结构与哈佛架构深度解析
嵌入式硬件·硬件工程·智能硬件
czhaii2 小时前
单片机自动排列上料控制程序
单片机·嵌入式硬件
KingQian201810 小时前
单片机嵌入式按键库
单片机·嵌入式硬件·嵌入式微库
许有杨10 小时前
STM32的定时器
stm32·单片机·嵌入式硬件
BT-BOX11 小时前
基于STM32的温湿度光照强度仿真设计(Proteus仿真+程序设计+设计报告+讲解视频)
stm32·proteus·音视频
时光の尘12 小时前
FreeRTOS菜鸟入门(十)·消息队列
c语言·stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式实时数据库
mftang13 小时前
解析MCUboot的实现原理和Image结构
嵌入式硬件
hallo-ooo13 小时前
【STM32】定时器
stm32·单片机
二块烧肉16 小时前
STM32 IIC总线
stm32·单片机·嵌入式硬件
weixin_5012789416 小时前
关于用SysTick配置延迟函数的设置
单片机·嵌入式硬件