IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 2021-10-14 -> 正文阅读

[嵌入式]2021-10-14

基于STC89c51单片机的四路抢答器

编程软件 Keil uVision5
题目:
四路抢答器
其中主持人操控S5与S6两个按键。选手共四位,分别操控S1–S4中的一个按键。
当主持人按下抢答开始按键S5后,倒计时开始,计时10s。此后最先按下按键的选手号码将显示与数码管上,并且蜂鸣器发出响声,后来按下的将无显示。若十秒计时结束后,再按下按键也不会显示。若主持人没有按开始键,就有选手抢答,则视为犯规。此时犯规的选手号码将被显示于数码管上(最多显示三位犯规选手,不显示时间),同时,蜂鸣器一直发出长笛声报警 而当主持人按下清零键S6后,一切状态均恢复,可以开始新一轮的抢答。
按键和数码管功能简介
S5 抢答开始 S6 清零 S1–S4 分别为1到4号选手按键
数码管:两段显示时间 一段显现选手号码

/**************************************说明****************************************************************
项目:四路抢答器
功能:	S5 抢答开始	 S6 清零	S1--S4   分别为1到4号选手按键(已经实现)
	  抢答未开始时 选手抢答犯规并且发出警报 并且显示犯规人数和选手 不能超过三个 (已经实现)
作者:焦子龙
日期:2021.9.30
注:
**********************************************************************************************************/

#include "reg51.h"
typedef unsigned int u16;
typedef unsigned char u8;

#define GPIO_DIG P0          //宏定义
#define GPI0_KEY P1          //宏定义 矩阵按键
#define T 150


sbit Beep = P1 ^ 5;             //蜂鸣器

sbit LSA = P2 ^ 2;              //矩阵按键
sbit LSB = P2 ^ 3;
sbit LSC = P2 ^ 4;

u8 Keyvalue = 100, k = 0, flag = 0, fg[4] = { 0 };
u8 q, w, e, r;
u16 x = 0, c = 1;

u8 code smgduan[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };
void InitTimer0(void)        //蜂鸣器定时器
{
	TMOD = 0x10;
	TH0 = 0x0FF;
	TL0 = 0xce;
	EA = 1;
	ET0 = 0;
	TR0 = 0;
}

void InitTimer1(void)       //10s倒计时定时器
{
	TMOD = 0x01;
	TH1 = 0xFC;
	TL1 = 0x66;
	EA = 1;
	ET1 = 1;
	TR1 = 1;
}

void delay(u16 n)           //延时函数
{
	while (n--);
}

void delay_ms(u16 x)        //精确到ms的延时函数
{
	u8 l, m;
	for (l = 0;l <= x;l++)

		for (m = 0;m < 123;m++);
}

void keydown()              //矩阵按键
{
	char a = 0;
	GPI0_KEY = 0X0F;                       //行0000  列1111
	if (GPI0_KEY != 0x0F)
	{
		delay(100);
		if (GPI0_KEY != 0x0F)
		{
			GPI0_KEY = 0X0F;
			switch (GPI0_KEY)
			{
			case 0x07: Keyvalue = 0; break;        // 0000 0111
			case 0x0b: Keyvalue = 1; break;        // 0000 1011
			case 0x0d: Keyvalue = 2; break;        // 0000 1101
			case 0x0e: Keyvalue = 3; break;        // 0000 1110
			}

			GPI0_KEY = 0XF0;                            //行1111  列0000		
			switch (GPI0_KEY)
			{
			case 0x70: Keyvalue = Keyvalue;    break;       // 0111 0000
			case 0xb0: Keyvalue = Keyvalue + 4;  break;       // 1011 0000 
			case 0xd0: Keyvalue = Keyvalue + 8;  break;       // 1101 0000 
			case 0xe0: Keyvalue = Keyvalue + 12; break;       // 1110 0000 
			}
			while ((a < 50) && (GPI0_KEY != 0XF0))
			{
				delay(100);
				a++;
			}
		}
	}
}

void Display(u16 num)          //数码管显示时间
{
	u16 bits, ten;

	bits = num % 10;               //个位
	ten = num / 10;	               //十位


	LSA = 1;LSB = 0;LSC = 0;
	P0 = smgduan[ten];
	delay(T);

	LSA = 0;LSB = 0;LSC = 0;
	P0 = smgduan[bits];
	delay(T);

}

void caipan()                  //裁判按键
{
	if (Keyvalue == 4)
	{
		/*关闭定时器1*/
		TR0 = 0;
		ET0 = 0;
		/*打开定时器2,开始倒计时*/
		TR1 = 1;
		/*选手开始抢答标志*/
		c = 1;
		/*刷新时间*/
		x = 10;
		k = 0;
		q = 0;
		w = 0;
		e = 0;
		r = 0;
		Keyvalue = 100;
	}

	if (Keyvalue == 5)
	{
		/*所有定时器,标志位清零*/
		TR1 = 0;
		TR0 = 0;
		ET0 = 0;
		c = 0;
		x = 0;
		fg[0] = 0;
		fg[1] = 0;
		fg[2] = 0;
		fg[3] = 0;
		flag = 0;
	}

}
void fangui()                     //抢答未开始,选手犯规,并且标记
{
	if (flag < 3)
	{
		switch (Keyvalue)
		{
		case 0:ET0 = 1;TR0 = 1;if (q == 0) { flag++;q++; }delay(9000);Keyvalue = 50;fg[0] = 1;break;            //s1    
		case 1:ET0 = 1;TR0 = 1;if (w == 0) { flag++;w++; }delay(9000);Keyvalue = 50;fg[1] = 2;break;            //s2
		case 2:ET0 = 1;TR0 = 1;if (e == 0) { flag++;e++; }delay(9000);Keyvalue = 50;fg[2] = 3;break;            //s3
		case 3:ET0 = 1;TR0 = 1;if (r == 0) { flag++;r++; }delay(9000);Keyvalue = 50;fg[3] = 4;break;            //s4
		}
	}

}

void fanguirs()                 //显示犯规人数,最多显示三个
{
	switch (flag)
	{
	case 0:LSA = 1;LSB = 1;LSC = 0; P0 = smgduan[0];delay(300); break;
	case 1:LSA = 1;LSB = 1;LSC = 0; P0 = smgduan[1];delay(300); break;
	case 2:LSA = 1;LSB = 1;LSC = 0; P0 = smgduan[2];delay(300); break;
	case 3:LSA = 1;LSB = 1;LSC = 0; P0 = smgduan[3];delay(300); break;
	}
}

void fanguir()              //显示犯规的选手,最多显示三位
{
	LSA = 1;LSB = 1;LSC = 1;P0 = smgduan[fg[0]];delay(T);
	LSA = 0;LSB = 1;LSC = 1;P0 = smgduan[fg[1]];delay(T);
	LSA = 1;LSB = 0;LSC = 1;P0 = smgduan[fg[2]];delay(T);
	LSA = 0;LSB = 0;LSC = 1;P0 = smgduan[fg[3]];delay(T);
}

void xuanshou()                               //选手抢答
{
	if (Keyvalue == 0 && x > 0 && k == 0)    //按下s1按键蜂鸣器做出一段时间响声并跳出
	{
		if (k == 0)
		{
			TR0 = 1;
			ET0 = 1;                        //打开定时器1(打开蜂鸣器)
			delay(5000);
			TR0 = 0;
			ET0 = 0;                        //关闭定时器1(关闭蜂鸣器)
			k = 1;
		}
	}

	else if (Keyvalue == 1 && x > 0 && k == 0)    //按下s2按键蜂鸣器做出一段时间响声并跳出
	{
		if (k == 0)
		{
			TR0 = 1;
			ET0 = 1;
			delay(5000);
			TR0 = 0;
			ET0 = 0;
			k = 2;
		}

	}

	else if (Keyvalue == 2 && x > 0 && k == 0)    //按下s3按键蜂鸣器做出一段时间响声并跳出
	{
		if (k == 0)
		{
			TR0 = 1;
			ET0 = 1;
			delay(5000);
			TR0 = 0;
			ET0 = 0;
			k = 3;
		}

	}

	else if (Keyvalue == 3 && x > 0 && k == 0)    //按下s4按键蜂鸣器做出一段时间响声并跳出
	{
		if (k == 0)
		{
			TR0 = 1;
			ET0 = 1;
			delay(5000);
			TR0 = 0;
			ET0 = 0;
			k = 4;
		}
	}

	else if (k == 1)                         //1号选手抢答到并且一直显示
	{
		TR1 = 0;
		LSA = 1;LSB = 1;LSC = 1;
		P0 = smgduan[1];
		delay(T);
	}

	else if (k == 2)                         //2号选手抢答到并且一直显示
	{
		TR1 = 0;
		LSA = 0;LSB = 1;LSC = 1;
		P0 = smgduan[2];
		delay(T);
	}

	else if (k == 3)                         //3号选手抢答到并且一直显示
	{
		TR1 = 0;
		LSA = 1;LSB = 0;LSC = 1;
		P0 = smgduan[3];
		delay(T);
	}

	else  if (k == 4)                         //4号选手抢答到并且一直显示
	{
		TR1 = 0;
		LSA = 0;LSB = 0;LSC = 1;
		P0 = smgduan[4];
		delay(T);
	}

}

void main()
{
	InitTimer0();                          //蜂鸣器
	InitTimer1();                          //10s倒计时
	while (1)
	{
		keydown();                         //按键
		caipan();                          //裁判按钮
		Display(x);                        //数码管显示倒计时
		if (c == 0)
		{
			fangui();                      //犯规
			fanguirs();                    //犯规人数
			fanguir();                     //犯规的人
		}

		if (c == 1)
		{
			xuanshou();                    //开始抢答
		}
	}
}

void Timer0Interrupt(void) interrupt 1             //蜂鸣器
{
	u8 count;
	TH0 = 0xFF;	//
	TL0 = 0xCE;
	count++;
	if (count == 10)
	{
		Beep = ~Beep;
		count = 0;
	}

}
void Timer1Interrupt(void) interrupt 3              //10s 倒计时
{
	u8 i;
	TH0 = 0xFC;
	TL0 = 0x66;
	i++;
	if (i == 100 && x > 0)
	{
		x = x - 1;
		i = 0;
	}

}


			
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-15 11:57:21  更:2021-10-15 11:57:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:36:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码