基于51单片机抽奖系统

基于51单片机抽奖系统

(仿真+程序)

功能介绍

具体功能:

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

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

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

​演示视频:

基于51单片机抽奖系统 

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

程序

#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设计资料

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

可以关注下方公众号!

点赞分享一起学习成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/737280.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

地推利器Xinstall:全方位二维码统计,打造高效地推策略,轻松掌握市场脉搏!

在移动互联网时代&#xff0c;地推作为一种传统的推广方式&#xff0c;依然占据着重要的地位。然而&#xff0c;随着市场竞争的加剧&#xff0c;地推也面临着诸多挑战&#xff0c;如如何有效监测下载来源、解决填码和人工登记的繁琐、避免重复打包和iOS限制、以及如何准确考核推…

Linux基础二

目录 一&#xff0c;tail查看文件尾部指令 二&#xff0c;date显示日期指令 三&#xff0c;cal查看日历指令 四&#xff0c;find搜索指令 五&#xff0c;grep 查找指令 六&#xff0c;> 和>> 重定向输出指令 七&#xff0c; | 管道指令 八&#xff0c;&&逻辑控…

让你的Python代码更简洁:一篇文章带你了解Python列表推导式

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 列表推导式 📒📝 语法📝 条件筛选📝 多重循环📝 列表推导式的优点📝 使用场景📝 示例代码🎯 示例1🎯 示例2⚓️ 相关链接 ⚓️📖 介绍 📖 在Python编程中,列表推导式是一种强大且高效的语法,它允许你用…

江协科技51单片机学习- p14 调试LCD1602显示屏

前言&#xff1a; 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记&#xff0c;在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用&#xff1a; 51单片机入门教程-2…

YouTube API接口:一键获取Playlist视频合集信息

核心功能介绍 在视频内容日益繁荣的今天&#xff0c;YouTube作为全球领先的视频分享平台&#xff0c;为内容创作者、品牌商家以及数据分析师提供了丰富的视频资源。其中&#xff0c;Playlist视频合集作为YouTube上的一种特色内容形式&#xff0c;深受用户喜爱。为了更好地满足…

cpolar:通过脚本自动更新主机名称和端口号进行内网穿透【免费版】

cpolar 的免费版经常会重新分配 HostName 和 Port&#xff0c;总是手动修改太过麻烦&#xff0c;分享一下自动更新配置文件并进行内网穿透的方法。 文章目录 配置 ssh config编写脚本获取 csrf_token打开登陆界面SafariChrome 设置别名 假设你已经配置好了服务器端的 cpolar。 …

计算机视觉解决什么问题?

本节课为「计算机视觉 CV 核心知识」第一节课正式课&#xff1b; 「AI秘籍」系列课程&#xff1a; 人工智能应用数学基础人工智能Python基础人工智能基础核心知识人工智能BI核心知识人工智能CV核心知识 Hi&#xff0c;大家好。我是茶桁。 老同学对我应该都很熟悉了&#xff…

2小时极速入门 TypeScript-慕课网 笔记

TS文档&#xff1a;https://www.tslang.cn/docs/handbook/modules.html 一&#xff0c;什么是TS 注:Typescript无法在浏览器中运行 ,所以需要编译器,将TS转变为JS 问&#xff1a;TS运行这么麻烦&#xff0c;为什么还要有TS&#xff1f; 答&#xff1a;TS强类型 1&#xff0c;规…

图解构建知识体系的过程

点击标题下「蓝色微信名」可快速关注 无论是日常的学习还是工作过程中&#xff0c;每个人其实都可以找到适合自己的学习方式和知识体系&#xff0c;如果方向正确&#xff0c;就可以事半功倍&#xff0c;之前借鉴某些数据库技术的知识体系聊过相关的主题&#xff08;可以参考《搭…

车载以太网权威指南阅读笔记

总体思路&#xff1a; 要基于车载以太网做出相应的机器人以太网神经中枢&#xff0c;需要按照以下步骤&#xff1a; 了解车载以太网&#xff0c;包括但不限于 车载以太网是如何基于汽车需求定义的车载以太网的工作模式车载以太网工作所需要的硬件车载以太网中的数据交互模式 …

Docker如何安装redis

目录 1. 拉取redis的镜像文件 2. 创建redis的容器卷 3. 准备reids的配置文件 4. 以配置文件启动redis 1. 拉取redis的镜像文件 # 默认安装最新版本 如果需要指定版本 docker pull redis:版本号 docker pull redis 详细版本请看dockerhub的官网&#xff1a; hub.docker…

仓颉编程语言入门

华为在 2024 年 6 月 21 日的华为开发者大会上&#xff0c;华为终端 BG 软件部总裁龚体正式官宣了华为自研仓颉编程语言&#xff0c;并发布了 HarmonyOS NEXT 仓颉语言开发者预览版。 仓颉编程语言文件后缀名为 .cj, 以下是第一个入门代码输出&#xff1a;你好&#xff0c;仓颉…

公司倒闭被迫踏上海投简历道路,经历打压受挫后总结的Android面经,互相激励!

红黑树有啥特性? 在oncreate里面可以得到view的宽高吗? view的getwidth和getmesurewidth有啥区别? 遍历hashmap的原理? 23种设计模式 中园博林(有笔试) 如何避免out of menmory和anr? arraymap和hashmap的区别? 如何实现线程同步? 简述android事件分发机制 简…

怎么投资中证全指证券公司指数?

中证全指证券公司指数的代码是399975&#xff0c;有50只成分股&#xff0c;几乎包含了市场上所有主要的证券公司&#xff0c;算是指数基金中投资证券行业的不二选择。 根据天天基金的数据显示&#xff0c;市面上有31只跟踪该指数的基金&#xff0c;规模最大的是南方中证全指证…

EtherCAT笔记(三) —— 主站与从站的硬件组成

1. EtherCAT 主站的硬件组成 EtherCAT主站使用标准以太网控制器&#xff0c;也即EtherCAT主站可以使用以太网控制器的任何设备。当我们有一台带网口的笔记本、工控机&#xff0c;甚至是树莓派也可以作为EtherCAT主站。 EtherCAT协议是对Ethernet协议在实时控制等方面的优化&am…

爬虫笔记14——爬取网页数据写入MongoDB数据库,以爱奇艺为例

下载MongoDB数据库 首先&#xff0c;需要下载MongoDB数据库&#xff0c;下载的话比较简单&#xff0c;直接去官网找到想要的版本下载即可&#xff0c;具体安装过程可以看这里。 pycharm下载pymongo库 pip install pymongo然后在在python程序中我们可以这样连接MongoDB数据库…

git stash Pop 后丢失,要如何找回?

文章目录 须知背景描述解决过程 须知 写在前面&#xff1a;我们都知道 stash list 中如果 pop 出来一条&#xff0c;那 list 里就会少一条&#xff0c;但其实使用 git stash pop 并没有真正地将该条 stash 删掉的&#xff0c;而是删除引用而已&#xff0c;因此当我们误 pop 时…

STM32学习 修改系统主频

前面时钟树的学习说明单片机的主频是可以修改的&#xff0c;那么怎么更改系统的主频&#xff0c;这里做一个简单的介绍。首先要明白&#xff0c;单片机的程序是如何运行&#xff0c;这里简单说明一下。 对应的代码在startup_stm32....文件里面&#xff0c;这里是复位程序的汇编…

vue3封装菜树,递归展示只显示第一层

问题描述 vue3封装菜树&#xff0c;递归展示只显示第一层 解决 需要在递归的组件中导出自己给自己使用

【网络安全的神秘世界】SQL注入漏洞

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 本章知识使用的靶场&#xff1a;DVWA 一、漏洞简介 SQL&#xff1a;结构化查询语言&#xff0c;是一种特殊的编程语言&#…