标题:
51单片机设计的8路抢答器(Proteus仿真+代码注释详解)
[打印本页]
作者:
18312284784
时间:
2019-5-2 21:07
标题:
51单片机设计的8路抢答器(Proteus仿真+代码注释详解)
设计要求:1.利用数码管进行显示抢答时间和答题时间倒计时;利用中断定时器进行定时/计数
2.实现按键自锁功能,只有当主持人按键有效后抢答者按键才有效,当任一抢答者按键后,其他抢答者按键无效
3.对优先抢答者进行LED发亮与数码管显示抢答者序号提示是对应抢答者进行抢答
设计者百度贴吧号:wife101,耐性解答
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(16.17 KB, 下载次数: 86)
下载附件
2019-5-5 22:05 上传
单片机源程序如下:
/*-----------------------------------------------
名称:七路抢答器
名称:单个独立按键控制
编写:吴柱俊 百度账号:wife101 桂林电子科技大学 电子工程与自动化学院
内容: 1、试验目的:了解按键的扫描原理
2、实现现象:同时按键抢答,先按的键有效,其他按键锁死 主持人按开始后后重新开始抢答
3、硬件要求:按键 LED灯 ,数码管显示原理
原理:当主持人按键开始后方可按键显示,否则其他应答者按键无效
当主持人按键开始后开始等待应答者按键,给予抢答者时间为10秒,抢答者要在这10S内做出抢答反应
当有抢答者抢答后显示第几个抢答者为p0口数码管显示
P2数码管显示为抢答时间
当有抢答者抢答按键后时间暂停
关注我贴吧下一个抢答后给予应答着10S时间应答而不是暂停出应答时间
------------------------------------------------*/
#include<reg51.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define uint unsigned int
#define uchar unsigned char
uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共地数码管段码0到9
uchar i=1,count=9,scount=0;
uchar Flag=0;
void int0();//定时/计数中断初始化
sbit key1=P1^0;//定义按键位置 独立按键模式
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit key5=P1^4;//定义按键位置 独立按键模式
sbit key6=P1^5;
sbit key7=P1^6;
sbit key8=P1^7;
/*-----------------------------------------------
主函数
------------------------------------------------*/
main()
{
int0();//定时/计数中断初始化
P0=0x3f;//刚开始显示0
P2=0X3F;//刚开始显示0
while(1)
{
P0=DSY_CODE[scount];
while(Flag)//执行一次就停止了 先检测到的相应 复位后有效
{
if (!key1) {scount=1;P3=0xFE;Flag=0;EA=0;ET0=0;TR0=0;P0=DSY_CODE[scount]; }// 第一路灯亮,令falg=0,退出循环,使其他路应答无效,停止中断
else if(!key2){scount=2;P3=0xFD;Flag=0;EA=0;ET0=0;TR0=0;P0=DSY_CODE[scount];}// 第一路灯亮,令falg=0,退出循环,使其他路应答无效,停止中断
else if(!key3){scount=3;P3=0xFB;Flag=0;EA=0;ET0=0;TR0=0;P0=DSY_CODE[scount];}// 第一路灯亮,令falg=0,退出循环,使其他路应答无效,停止中断
else if(!key4){scount=4;P3=0xF7;Flag=0;EA=0;ET0=0;TR0=0;P0=DSY_CODE[scount];}// 第一路灯亮,令falg=0,退出循环,使其他路应答无效,停止中断
else if(!key5){scount=5;P3=0xEF;Flag=0;EA=0;ET0=0;TR0=0;P0=DSY_CODE[scount];}// 第一路灯亮,令falg=0,退出循环,使其他路应答无效,停止中断
else if(!key6){scount=6;P3=0xDF;Flag=0;EA=0;ET0=0;TR0=0;P0=DSY_CODE[scount];}// 第一路灯亮,令falg=0,退出循环,使其他路应答无效,停止中断
else if(!key7){scount=7;P3=0xBF;Flag=0;EA=0;ET0=0;TR0=0;P0=DSY_CODE[scount];}// 第一路灯亮,令falg=0,退出循环,使其他路应答无效,停止中断
if(key8==0) //主持人按键重新开始
{
P3=0XFF; // 令所有灯灭
EA=1; //开中断计数
ET0=1;
TR0=1;
Flag=1; //另flag=1使指向while(flag)进入抢答环节
count=9;
scount=0;
}
}
if(key8==0) //主持人按键重新开始
{
P3=0XFF; // 令所有灯灭
EA=1; //开中断计数
ET0=1;
TR0=1;
Flag=1; //另flag=1使指向while(flag)进入抢答环节
count=9;
scount=0;
}
}
}
void int0()//定时/计数中断初始化
{
TMOD=0X01;//方式选择
//方式0 13位 8192,最大定时8.192ms;方式1 16位,65536,最大定时65.536ms
TH0=(65536-50000)/256; //整除得高位 如12/10=1 定时50ms
TL0=(65535-50000)%256 ; //取余得低位 如12%10=2 定时50ms
//EA=1;
//ET0=1;
//TR0=1;
}
void int0_interrupt() interrupt 1
{
TH0=(65536-50000)/256; //恢复定时器0初值
TL0=(65536-50000)%256;
i++; //每来一次中断对i进行自加1
if(i==20)//定时1s,50ms*20=1秒,定时器中断20次
{
i=0;
count--; //当定时够1S,count赋值为1
}
P2=DSY_CODE[count%10]; //取低位
if(count==0) //当count=60秒进行自动清零复位
{
EA=0;ET0=0;TR0=0;
}
}
复制代码
所有资料51hei提供下载:
单片机控制的多路抢答器程序 仿真.rar
(75.61 KB, 下载次数: 109)
2019-5-2 21:06 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
51hei团团
时间:
2019-5-5 22:10
好资料,51黑有你更精彩!!!
作者:
yfpc2006
时间:
2019-5-6 02:48
不错不错!多学习~!
作者:
hualuoshuijia
时间:
2020-12-26 16:02
好资料,谢谢楼主分享,学到了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1