当前位置: 首页 > news >正文

基于单片机十六路抢答器系统Proteus仿真(含全部资料)

全套资料包含:Proteus仿真源文件+keil C语言源程序+AD原理图+流程图+元器件清单+说明书等

资料下载:

通过网盘分享的文件:资料分享
链接: 百度网盘 请输入提取码 提取码: tgnu


目录

资料下载:

Proteus仿真功能

项目文件资料:

一、Proteus仿真源文件

二、AD原理图文件

二、报告说明书

三、系统流程图

四、Keil c语言程序源代码


项目功能:

功能讲解:
抢答器具有数据锁存和显示功能.当某一路抢答成功时.发光二极管立即点亮.并在该电路上显示该路的号数.直到主持人按复位开关为止.此时其他人抢答无效。
抢答器具有定时抢答功能.且抢答时间可以由主持人设定(如97s).当主持人按下“开始”按钮后.要求定时器立即倒计时.并在显示器上显示时间.同时发出“滴”的声响。
在设定的时间内抢答.则抢答有效.定时器停止工作.显示器上显示选手的编号和抢答时刻的时间.并保持到主持人将系统清零
如果定时器的时间已到.却没有选手抢答.则本次抢答无效.系统会短暂的报警.并且封锁输入电路禁止选手超时抢答.时间显示器上显示00.


项目文件:

一、Proteus仿真源文件

​​

二、AD原理图文件

二、报告说明书

三、系统流程图

​​

四、器件清单

QuantityReferencesValue
2C9-C1074HC573
1R110k
1R21k
17R3-R19100
1R22AT89S52
1Q1PNP
1Q2
16D1-D16LED-GREEN
1LS110uF
1LS2SPEAKER
1RP1RESPACK-8

五、Keil c语言程序源代码(部分)

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
#define uchar unsigned char;  //定义数据类型 程序中遇到unsigned char 则用uchar替换
#define uint unsigned int;	  //定义数据类型 程序中遇到unsigned int 则用uint替换
sbit add=P2^0;	
sbit jian=P2^1;	
sbit beep=P2^2;		//定义报警输入端口
sbit start=P2^3;		
sbit WEI=P2^7;      //定义锁存使能端口 位锁存
sbit DUAN=P2^6;     //定义锁存使能端口 段锁存
sbit key1=P1^0;
sbit key2=P1^1;
sbit key14=P3^5;
sbit key15=P3^6;
sbit key16=P3^7;
uchar code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
uchar code dofly_WeiMa[10]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
uchar code table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar TempData[8]; //存储显示值的全局变量
//函数声明
void DelayUs2x(unsigned char t); 
void DelayMs(unsigned char t);
void Delay(unsigned char t);
void Display(unsigned char FirstBit,unsigned char Num);
void check1();
void check2();
void keyscan();
uchar n,m,num,t,time;
bit flag;
/*---------------------------------------------------主函数
---------------------------------------------------*/
void main (void)
{   EA=1;TMOD=0x11;TH0=(65536-50000)/256;//这是50ms的TL0=(65536-50000)%256;ET0=1;TR0=0; time=97; num=0; flag=0;   while (1)         //主循环{TempData[2]=dofly_DuanMa[time/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[3]=dofly_DuanMa[time%10];if(num!=0)m=1;if(start==0){DelayMs(10); if(start==0){	flag=1;while(!start);}}if(add==0){DelayMs(10); if(add==0){	time++;while(!add);}}if(jian==0){DelayMs(10); if(jian==0){	time--;while(!jian);}}if(time>=99)time=99;if(flag==0){if(num!=0)m=1;keyscan(); check2();}if(flag==1){	TR0=1;if(num!=0)m=1;	keyscan(); check1();}//主循环中添加其他需要一直工作的程序	}
}
void timer_t0() interrupt 1
{TH0=(65536-50000)/256;//这是50ms的TL0=(65536-50000)%256;t++;beep=0;if(t==20)//设置为20,就是1s为高1s为低{beep=1;t=0;time--;TempData[2]=dofly_DuanMa[time/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[3]=dofly_DuanMa[time%10];if(time<=0){time=0;			}			} 
}
void timer_t1() interrupt 3
{TH1=(65536-50000)/256;//这是50ms的TL1=(65536-50000)%256;Display(0,8); //数码管显示函数
}
void check1()
{if(num==1){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[4]=table[0];beep=1;Display(0,8); //数码管显示函数TR0=0;	while(m);}  		if(num==2){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[4]=table[1];beep=1;Display(0,8); //数码管显示函数TR0=0;	while(m);} if(num==3){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[4]=table[2];beep=1;Display(0,8); //数码管显示函数	TR0=0;	while(m);}  		if(num==4){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[4]=table[3];beep=1;Display(0,8); //数码管显示函数	TR0=0;	while(m);}if(num==5){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[4]=table[4];beep=1;Display(0,8); //数码管显示函数TR0=0;	while(m);	}  		if(num==6){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[4]=table[5];beep=1;Display(0,8); //数码管显示函数TR0=0;	while(m);	}if(num==7){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[4]=table[6];beep=1;Display(0,8); //数码管显示函数TR0=0;	while(m);}  		if(num==8){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[4]=table[7];beep=1;Display(0,8); //数码管显示函数TR0=0;	while(m);	}if(num==9){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[5]=table[0];beep=1;Display(0,8); //数码管显示函数TR0=0;	while(m);	}  		if(num==10){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[5]=table[1];beep=1;Display(0,8); //数码管显示函数TR0=0;	while(m);	}if(num==11){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[5]=table[2];beep=1;Display(0,8); //数码管显示函数TR0=0;	while(m);	}  		if(num==12){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[5]=table[3];beep=1;Display(0,8); //数码管显示函数TR0=0;	while(m);	}if(num==13){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[5]=table[4];beep=1;Display(0,8); //数码管显示函数TR0=0;	while(m);	}if(num==14){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[5]=table[5];beep=1;Display(0,8); //数码管显示函数TR0=0;	while(m);	}  		if(num==15){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[5]=table[6];beep=1;Display(0,8); //数码管显示函数TR0=0;	while(m);	}if(num==16){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[5]=table[7];beep=1;Display(0,8); //数码管显示函数TR0=0;	while(m);	}
}
void check2()
{if(num==1){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[3]=0x40;TempData[4]=table[0];Display(0,8); //数码管显示函数TR0=0;	while(m);}  		if(num==2){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[3]=0x40;TempData[4]=table[1];Display(0,8); //数码管显示函数TR0=0;	while(m);} if(num==3){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[3]=0x40;TempData[4]=table[2];Display(0,8); //数码管显示函数	TR0=0;	while(m);}  		if(num==4){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[3]=0x40;TempData[4]=table[3];Display(0,8); //数码管显示函数	TR0=0;	while(m);}if(num==5){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[3]=0x40;TempData[4]=table[4];Display(0,8); //数码管显示函数TR0=0;	while(m);	}  		if(num==6){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[3]=0x40;TempData[4]=table[5];Display(0,8); //数码管显示函数TR0=0;	while(m);	}if(num==7){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[3]=0x40;TempData[4]=table[6];Display(0,8); //数码管显示函数TR0=0;	while(m);}  		if(num==8){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[3]=0x40;TempData[4]=table[7];Display(0,8); //数码管显示函数TR0=0;	while(m);	}if(num==9){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[3]=0x40;TempData[5]=table[0];Display(0,8); //数码管显示函数TR0=0;	while(m);	}  		if(num==10){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[3]=0x40;TempData[5]=table[1];Display(0,8); //数码管显示函数TR0=0;	while(m);	}if(num==11){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[5]=table[2];Display(0,8); //数码管显示函数TR0=0;	while(m);	}  		if(num==12){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[3]=0x40;TempData[5]=table[3];Display(0,8); //数码管显示函数TR0=0;	while(m);	}if(num==13){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[3]=0x40;TempData[5]=table[4];Display(0,8); //数码管显示函数TR0=0;	while(m);	}if(num==14){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[3]=0x40;TempData[5]=table[5];Display(0,8); //数码管显示函数TR0=0;	while(m);	}  		if(num==15){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[3]=0x40;TempData[5]=table[6];Display(0,8); //数码管显示函数TR0=0;	while(m);	}if(num==16){TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[1]=dofly_DuanMa[num%10];TempData[2]=0x40;//分解显示信息,如要显示68,则68/10=6  68%10=8  TempData[3]=0x40;TempData[5]=table[7];Display(0,8); //数码管显示函数TR0=0;	while(m);	}
}
void keyscan() 
{if(key1==0){DelayMs(10); if(key1==0){	num=1;while(!key1);}}if(key2==0){DelayMs(10); if(key2==0){	num=2;while(!key2);}}if(key3==0){DelayMs(10); if(key3==0){	num=3;while(!key3);}}if(key4==0){DelayMs(10); if(key4==0){	num=4;while(!key4);}}if(key5==0){DelayMs(10); if(key5==0){	num=5;while(!key5);}}if(key6==0){DelayMs(10); if(key6==0){	num=6;while(!key6);}}if(key7==0){DelayMs(10); if(key7==0){	num=7;while(!key7);}}if(key8==0){DelayMs(10); if(key8==0){	num=8;while(!key8);}}if(key9==0){DelayMs(10); if(key9==0){	num=9;while(!key9);}}if(key10==0){DelayMs(10); if(key10==0){	num=10;while(!key10);}}if(key11==0){DelayMs(10); if(key11==0){	num=11;while(!key11);}}if(key12==0){DelayMs(10); if(key12==0){	num=12;while(!key12);}}if(key13==0){DelayMs(10); if(key13==0){	num=13;while(!key13);}}if(key14==0){DelayMs(10); if(key14==0){	num=14;while(!key14);}}if(key15==0){DelayMs(10); if(key15==0){	num=15;while(!key15);}}if(key16==0){DelayMs(10); if(key16==0){	num=16;while(!key16);}}	
}
void DelayUs2x(unsigned char t)
{   while(--t);
}
void DelayMs(unsigned char t)
{   while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}
}
void Delay(unsigned char t)
{   unsigned char x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);
}
/*------------------------------------------------显示函数,用于动态扫描数码管输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{unsigned char i;for(i=0;i<Num;i++){ DataPort=0;   //清空数据,防止有交替重影DUAN=1;     //段锁存DUAN=0;DataPort=dofly_WeiMa[i+FirstBit]; //取位码 WEI=1;     //位锁存WEI=0;DelayMs(2); // 扫描间隙延时,时间太长会闪烁,太短会造成重影}
}     

六、全套资料包含

​​

七:项目资源获取

需要完整的资料可以点击下面的名片关注,回复“资料”!

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

http://www.dtcms.com/a/361236.html

相关文章:

  • 国产化PDF处理控件Spire.PDF教程:在 Java 中将 PDF 转换为 CSV(轻松提取 PDF 表格)
  • 存储掉电强制拉库引起ORA-01555和ORA-01189/ORA-01190故障处理---惜分飞
  • 数据库常见故障类型
  • Proteus 仿真 + STM32CubeMX 协同开发全教程:从配置到仿真一步到位
  • 希尔排序。
  • 关于命名参数占位符的分析(主要以PHP为例)
  • 详细介绍 JMeter 性能测试
  • Java泛型通配符详解:搞懂?/extends/super用法,避开集合操作踩坑点
  • 快递地址归类排序实现(Java Python)
  • Jenkins 自动构建Vue 项目的一个大坑
  • JVM核心机制:类加载与内存结构详解
  • OpenHarmony智能语音框架深度拆解:从VAD到唤醒词打造你的AI语音智能体
  • 自动化软件测试工具Parasoft C/C++test如何实现运行时错误的检测与修复
  • 面试经典150题[021]:反转字符串中的单词(LeetCode 151)
  • 【XR技术概念科普】VST(视频透视)vs OST(光学透视):解码MR头显的两种核心技术路径
  • 「数据获取」《中国住户调查年鉴》(2000-2024)(获取方式看绑定的资源)
  • SQLark:一款面向信创应用开发者的数据库开发和管理工具
  • Jmeter实现参数化的4种方式
  • Windows神器,按键屏蔽
  • 【机器学习学习笔记】pandas基础
  • (纯新手教学)计算机视觉(opencv)实战十二——模板匹配(cv2.matchTemplate)
  • UE角色取消被Decal影响
  • Jetson AGX Orin平台R36.3.0版本1080P25fps MIPI相机图像采集异常调试记录
  • 基于单片机电动车充电桩/充电车棚环境监测设计
  • 基于RS-485接口的芯片的FPGA驱动程序
  • 吴恩达机器学习作业十二:协同过滤(电影推荐系统)
  • 广电手机卡到底好不好?
  • Git基础使用和PR贡献
  • .Net程序员就业现状以及学习路线图(二)
  • Android面试指南(六)