加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入

AT89C51单片机的8位竞赛抢答器的proteus仿真设计_倒计时可调

06/28 13:42
2147
服务支持:
技术交流群

完成交易后在“购买成功”页面扫码入群,即可与技术大咖们分享疑惑和经验、收获成长和认同、领取优惠和红包等。

虚拟商品不可退

当前内容为数字版权作品,购买后不支持退换且无法转移使用。

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
放大
实物图
相关方案
  • 方案介绍
  • 相关文件
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

任务要求

本设计是以抢答为出发点。考虑到依需设定限时回答的功能,利用AT89C51单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。用开关做键盘输出,发光二极管蜂鸣器发出提示。同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;在软件中还应用了外部中断,通过中断解除抢答的锁存,似的设计更加灵活,实用性更强。
本设计主要设计指标:
(1) 按键输入模块,包括主持人时间加,时间减,开始抢答,新一轮4个按键和选手1号到4号共抢4答按键;
(2) 显示模块,可以抢答实现倒计时和显示抢答选手编号。
(3) 蜂鸣器模块,用于倒计时提醒,倒计时开始后发出短暂的声响,声响持续的时间为0.5s左右。

仿真

在这里插入图片描述
在这里插入图片描述
程序

4.1 主程序

主程序完成外部中断初始化、定时器初始化、蜂鸣器模块初始化。主程序扫描主持人不断扫描按键,进行对应的操作。
进入主程序后,显示显示预设的倒计时数字20,程序扫描主持人按键倒计时加减键和开始按键。按下开始按键后,倒计时开始工作,实时刷新倒计时数字,每倒计时1秒蜂鸣器beep引脚拉低0.5秒,蜂鸣器短鸣0.5秒。在扫描到选手按下按键后,倒计时定时器停止工作,显示选手编号和按下抢答键的时间。

主要(关键)代码:

	EA=1;
   EX0=1;//外部中断0
	IT0=1;//设置下降沿触发中断0
	TMOD=0x11;
	TH0=(65536-50000)/256;//这是50ms的
	TL0=(65536-50000)%256;
	ET0=1;
	TR0=0; 
	TH1=(65536-50000)/256;//这是50ms的
	TL1=(65536-50000)%256;
	ET1=1;
	TR1=1; 
	time=20; //定时时间
	num=0; //选手编号
	flag=0; //抢答模式标志位
	beep=0;//蜂鸣器为0 不响

此段程序是完成外部中断初始化、定时器初始化、蜂鸣器模块初始化。完成后进入大循环。

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);
			}
	}

这段函数完成了倒计时的显示和扫描是否开始倒计时。在没有开始抢答时,选手按下按键会显示选手编号和清零时间,一起防止选手抢答。开始抢答后,标志位flag变为1。开始执行按键扫描函数check2();

void check1()
{
	if(num==1)
	{
		TempData[0]=dofly_DuanMa[num/10];
//分解显示信息,如要显示68,则68/10=6  68%10=8  
		TempData[1]=dofly_DuanMa[num%10];
		beep=0;
		Display(0,8); //数码管显示函数
		TR0=0;	
		while(m);
	}  	  		

假如按键1按下,会显示选手编号。同时程序会卡在while(m);循环。此时除了新一轮按键之外的任何按键都系统没有任何变化。

新一轮按键是系统复位,即使程序一直在执行while(m)循环,按下按键后,程序会执行一次硬件复位,将变量清零,函数重新执行按键扫描。

4.2 按键扫描子函数

关键代码介绍

if(key1==0)
{
	DelayMs(10); 
	if(key1==0)
	{	
		num=1;
		while(!key1);
	}
}

程序一直判断按键引脚电压,按下按键电压为0。按键会产生抖动,需要进行消抖处理,演示10毫秒后,如果按键电压还是0,令按键数目num为1。表示按下的按键是按键1。供主函数处理按键消息。

4.3显示子程序
关键代码介绍

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;

       	DataPort=TempData[i]; //取显示数据,段码
       	DUAN=1;     //段锁存
       	DUAN=0;
       
	   	DelayMs(2); // 扫描间隙延时,时间太长会闪烁,太短会造成重影

	}
}  

该函数用于动态扫描数码管。输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示,如输入0表示从第一个显示。 Num表示需要显示的位数,如需要显示99两位数值则该值输入2。显示主要控制74HC573锁存数据。先清除数据,清段锁存。然后选择位码。开位锁存将数据存在位锁存器,选择到了需要显示的数码管。位锁存完成后将数据写进段锁存数据,将需要显示的数据写到数码管中。

4.4蜂鸣器提示子函数
蜂鸣器的正极接到VCC(+5V)电源上面,蜂鸣器的负极接到三极管的发射极E,三极管的基极B经过限流电阻R3后由单片机的beep引脚控制,当beep输出低电平时,三级管QS截止,没有电流流过线圈,蜂鸣器不发声;当beep输出高电平时,三级管导通,这样蜂鸣器的电流形成回路,发出声音。因此,我们可以通过程序控制beep脚的电平来使蜂鸣器发出声音和关闭。

if(t==20)//设置为20,就是0.5s为高0.5s为低
{
	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;			
	}			
}

在50ms一次的定时器0中断中,每10次中断令蜂鸣器置零。第20次中断令蜂鸣器置一。以此产生0.5s短暂提醒。
在这里插入图片描述

测试

1.初始化。
在这里插入图片描述
2.未按下开始抢答键,选手抢答无效。
 抢答无效

3.按下开始抢答键,进入抢答倒计时。

抢答倒计时
3.有选手按下抢答键,显示选手号码及剩余时间。
抢答成功

在这里插入图片描述

  • 设计资料获取联系方式.doc

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
ATXMEGA64A4U-CU 1 Microchip Technology Inc IC MCU 8BIT 64KB FLASH 49VFBGA
$4.53 查看
ATXMEGA192D3-MH 1 Atmel Corporation RISC Microcontroller, 16-Bit, FLASH, AVR RISC CPU, 32MHz, CMOS, 9 X 9 MM, 1 MM HEIGHT, 0.50 MM PITCH, GREEN, MO-220VMMD, MLF-64
$5.62 查看
MKL02Z32VFG4R 1 Freescale Semiconductor RISC MICROCONTROLLER

ECAD模型

下载ECAD模型
暂无数据 查看

相关推荐

电子产业图谱