51单片机四路抢答器(LED灯,数码管显示,蜂鸣器提示音)C语言源程序.
51单片机 4路抢答器
先说下我这个4路抢答器的功能:5个按键,第五个是复位。
第一个按键到第四个按键分别对应4个led 灯,只要1到4的其中任何一个按键按下,其对应的led灯就会亮,再按其他按键,不会有其他led灯亮。
第五个按键进行复位,开始下一轮抢答。
不多说直接上程序和protues仿真图如下:注意:我试了下,程序有点小问题,(编译是完全通过的)我也没改出来,毕竟小弟我也才学,有大神知道的话可以给我说说,,谢谢。
#include<reg51.h>//51头文件sbit key0 = P3^0;//定义key0,为P3^0引脚sbit key1 = P3^1;//定义key1,为P3^1引脚sbit key2 = P3^2;//定义key2,为P3^2引脚sbit key3 = P3^3;//定义key3,为P3^3引脚sbit key4 = P3^4;//定义key4,为P3^4引脚void main()//主函数{while(1)死循环{if(key0==0) {P1 = 0xfe;P3 = 0xf0;}//如果key0等于0,即闭合,led1亮,将其他三个按钮锁定为低电平else if(key1==0) {P1 = 0xfd;P3 = 0xf0;}//如果key0等于1,即闭合,led2亮,将其他三个按钮锁定为低电平else if(key2==0) {P1 = 0xfb;P3 = 0xf0;}//如果key0等于2,即闭合,led3亮,将其他三个按钮锁定为低电平else if(key3==0) {P1 = 0xf7;P3 = 0xf0;}//如果key0等于3,即闭合,led4亮,将其他三个按钮锁定为低电平if(key4==0) //复位按钮按下闭合,则复位{P1 = 0xff;P3 = 0xff;}}}。
单片机C语言实现抢答器程序
// }
}
void main()
{
unsigned int n; //用于控制等待时LED显示的形状
SECBOOL=15; //设置定时15s
P1=0xff; //p0口拉高
if(TIME_SWICH15==0){ //如果 15秒 按钮被按下 并且之前没有人举过手 )&&(TEAM_a==0&&TEAM_b==0)
Speed(0); //去抖
if(TIME_SWICH15==0){
D1=LED[3]; //显示1
S1=1; //用2号数码管
BELL=0; //响铃
Speed(3); //延时
BELL=1; //响铃
while(1){
if(wrong==0){ //允许答题按钮被按下
void Speed(unsigned char n){ //延时函数
unsigned char i,j,k;
for(k=0;k<n;k++)
for(i=0;i<255;i++)
for(j=0;j<255;j++);
}
void Speed1(){ //延时函数2
Speed(0); //去抖动
if(wrong==0){
KG=1; //开关被按下
break;
}
}
else
continue;
break;
}
TEAM_3=1;
BOOL=0; //
sbit TIME_SWICH30=P2^2; //连接(30秒 切换)按钮 (主持人控制)
四路抢答器的设计(C51)
case 0xf7: //键 4 按下:一号选手抢答处理 if(start_flag==0) //犯规操作处理 {
//
j[0]=1; display(); P3=0xf9; delay(200); P3=0xfb; break; } if(chaos_flag==1||qiang_flag==1) break; else { P3=0xef; sec=8; TR0=1; j[0]=1; buffer_zone(); display(); qiang_flag=1; } break;
/********显示函数***********/ void display() { temp=0xfe; for(k=0;k<8;k++) { P2=temp; P0=i[j[k]]; delay(2); temp=_crol_(temp,1); } } /*********函数初始化*********/ void inti0() { TMOD=0x01; TH0=(65535-50000)/256; TL0=(65525-50000)%256; EA=1; ET0=1; TR0=0; } /********中断函数**********/ void zd() interrupt 1 { TH0=(65535-50000)/256; TL0=(65525-50000)%256; m++; if(m==20) { m=0; sec--; buffer_zone(); if(sec<=0) { P3=0xf5; delay(400); P3=0xf7; TR0=0; j[0]=11; j[6]=11; j[7]=11; while(1); }
case 0xdf: //键 6 按下:三号选手抢答处理 if(start_flag==0) //犯规操作处理 { j[0]=3; display(); P3=0xf9; delay(200); P3=0xfb; break; } if(chaos_flag==1||qiang_flag==1) //超时或已有选手抢答处理 break; else { TR0=1; P3=0xbf; j[0]=3; display(); sec=8; // buffer_zone(); qiang_flag=1; } break; case 0xbf: //键 7 按下:四号选手抢答处理 if(start_flag==0) //犯规操作处理 { j[0]=4; display(); P3=0xf9; delay(110); P3=0xfb; break; } if(chaos_flag==1||qiang_flag==1) //超时或已有选手抢答处理 break; else { TR0=1; P3=0x7f; j[0]=4; display(); sec=8;
用51单片机制作4路抢答器
用51单片机制作4路抢答器此抢答器具有限时抢答,超时无效的特点,并可以对主持人未喊开始而提前抢答的犯规情况作出判断。
由于用了单片机,所以电路很简单。
懒得写译码程序,也不想做驱动电路。
干脆直接用了一片74LS48译码驱动器来驱动数码管。
呵呵,面包板上插一下,由于之前在Proteus中仿真过,所以直接就正常运行了~上一张实物图 左边的是STC89C52的最小系统版,P1口上接了8个LED,当时做流水灯的。
直接拿来用了。
P2口是显示输出,P3口接受按键。
那个小的芯片就是74LS48啦~下方的是编程器+电源,STC的芯片就是编程方便,支持在线烧写,这么小巧的编程器~ 当然最重要的是程序,附上代码清单。
写的比较烂,竟然上了100行,希望不要被大虾们骂得太惨>_#include#defineuintunsignedchar //计时变量uints= 0,ms= 0; //枚举类型:记录抢答器工作状态enumStat{ Idle= 0,//空闲状态,比如正在读题Ready= 1,//就绪状态,可以抢答Respond= 2,//响应状态,有人抢到了}stat; //时钟中断服务程序voidTimer()interrupt1using1{ TH0=0x3C; TL0=0xBD; ms++; s+=ms/20; ms%= 20; s%= 60;} //重置时钟voidResetTimer(){ EA= 1;//允许CPU中断ET0= 1;//定时器中断打开TMOD= 1;//设定时器为方式TR0= 0;//关定时器ms= 0; s= 0;} //优先编码(反向输入)uintEncode(uintc){ uinti,mask= 1; if(c== 0)return0; for(i= 0;ivoidmain(){ uintled= 0xff;//对应P1口,指示灯uintdisp= 15;//对应P2口,数。
51单片机四路抢答器PROTEUS仿真报告(含C语言程序)
HEFEI UNIVERSITY四路抢答器仿真设计题目四路抢答器仿真设计班级自动化(1)班成员 YCT 11050310**PT 11050310**WW 11050310**时间 2014.5.19四路抢答器仿真设计目录一、前言 (1)二、方案设计 (1)三、理论分析 (2)四、电路设计 (2)1、晶体振荡器电路 (2)2、复位电路 (3)3、按键扫描部分 (3)4、显示部分 (4)五、软件模块 (6)六、系统组装调试 (8)七、总结 (8)参考文献 (9)附录 (10)四路抢答器仿真设计一、前言本设计要求能够在主持人按下开始键后,四个参赛者开始抢按自己的按键,谁的按键先按下,谁面前的灯就会亮并且有相应的提示,当参赛者耗时太多时又会有相应的提示。
根据设计的要求,本系统采用独立式按键,通过单片机不停的扫描按键来控制LED灯和蜂鸣器,并用定时器T0来定超时的时间,当超时的时候让蜂鸣器响。
二、方案设计(1)、总体设计方案一:采用可编程I/O口扩展芯片82558255作为单片机的扩展接口能实现很多功能,但是这个系统并不复杂,用8155会浪费很多的资源,而且8255要用P0和P2端口作为地址线对它进行读写,这样不仅浪费端口还使得编程变的复杂。
从节省资源和简化编程的角度考虑,放弃了此方案。
方案二:直接采用AT89C52单片机直接用单片机不仅编程被简化,还有效的利用了各个端口。
8051单片机的资源完全够这个系统的要求。
所以最终选择了此方案。
(2)、模块方案一:采用4*4矩阵键盘此种键盘是常用的按键扫描方法,但是本系统只需要六个按键,这样就会浪费十个,而且矩阵按键扫描要送数读数,对于编程很复杂,最终放弃了此方案。
方案二:采用独立式键盘本系统只要六个按键就可以,用独立式键盘不仅节省端口还使编程变得简单。
程序只要不停的读数检查就行。
所以,最终选择此方案。
2、系统总体设计方案与实现框图采用六个独立式的键盘作为按键输入,当在开始后有按键按下时,就会有对应于这个按键的灯亮并且蜂鸣器响一声,其它按键再按也无效。
51单片机的四路电子抢答器设计
目录1设计要求与功能 (4)1.1设计基本要求 (4)2 硬件设计 (4)2.1控制系统及所需元件 (4)2.2抢答器显示模块 (5)2.3 电源方案的选择 (6)2.4 抢答器键盘的选择 (6)2.5蜂鸣器模块 (7)2.6外部振荡电路 (7)3 程序设计 (7)3.1程序流程图 (7)3.2系统的调试............................................... (9)3.3 焊接的问题及解决 (10)4总结 (10)附录C程序 (11)Word 资料一设计要求与功能1.1设计基本要求(1)抢答器同时供4名选手或4个代表队比赛使用,分别用4个按钮K1~K4表示。
(2)设置裁判开关k5和清零开关k6,该开关由主持人控制,当主持人按下k6,系统复位,预备抢答,当主持人按下总控制控制开关k5,开始抢答;(3)抢答器具有定时抢答功能,抢答时间为倒计时15秒。
当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂的提示声响,声响持续的时间0.5秒左右,当计时小于5秒后,每减少一秒,便报警一次以提示选手。
(4)抢答器具有锁存功能,参赛选手在设定的时间内进行抢答,抢答有效,蜂鸣器发声,计时停止,数码管上显示选手的编号和时间,选手相应的信号灯被点亮,其他选手再抢答时无效。
(5)如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答。
等待下一轮抢答。
二硬件设计2.1控制系统及所需元件控制系统主要由单片机应用电路、存储器接口电路、显示接口电路组成。
其中单片机STC89C52是系统工作的核心,它主要负责控制各个部分协调工作。
所需元件:该系统的核心器件是STC89C52。
各口功能:P0.0-P0.3 是数码管的位选口;P2.0-P2.7是数码管的段选口,为其传送段选信号;P1.0-P1.3是4组抢答信号的输入口;P1.4、P1.5由裁判控制,分别是抢答开始\复位功能键;P1.6为蜂鸣器的控制口;P3.4-P3.7为选手信号灯输出口;在其外围接上电复位电路、数码管电路、LED发光二极管、按键电路及扬声器电路。
抢答器~C51~带程序
前言在电视和学校中我们会经常看到一些智力抢答的节目,如果要是让抢答者用举手等方法,主持人很容易误判,会造成抢答的不公平,比赛中为了准确、公正、直观地判断出第一抢答者,所设计的抢答器通常由数码显示、灯光、音响等多种手段指示出第一抢答者。
为了使这种不公平不发生,只有靠电子产品的高准确性来保障抢答的公平性。
功能分为基本功能和扩展功能,基本功能是能够实现抢答器的功能,扩展功能进一步丰富了抢答器的功能,更佳人性化。
基本功能可以有同时供8名选手比赛,分别用8个按钮S0 ~ S7表示;设置一个系统复位按钮和抢答控制按钮,这组开关由主持人控制;抢答器具有锁存与显示功能。
即选手按动按钮,扬声器发出声响提示,锁存相应的选手号码并且通过数码管显示。
选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。
扩展功能有抢答器具有定时抢答功能,且抢答的时间由主持人设定(如30秒)。
当主持人按下启动键后,定时器进行倒计时;参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。
如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。
此设计可以用三种方法实现:数字电路,单片机,PLC。
其中PLC方案与单片机方案原理相似,但成本太高,故不采用此方案,在此不另作比较。
主要在数字电路和单片机两个方案中选择。
AT89C52 是美国ATMEL 公司生产的低电压,高性能CMOS 8 位单片机,片内含8k bytes 的可反复擦写的Flash 只读程序存储器和256 bytes 的随机存取数据存储器(RAM),器件采用ATMEL 公司的高密度、非易失性存储技术生产,与标准MCS-51 指令系统及8052产品引脚兼容,片内置通用8 位中央处理器(CPU)和Flash 存储单元,功能强大AT89C52 单片机适合于许多较为复杂控制应用场合。
51单片机四路抢答器(LED灯,数码管显示,蜂鸣器提示音)C语言源程序
51单片机四路抢答器(LED灯,数码管显示,蜂鸣器提示音)C语言源程序2009-10-31 10:53其实就是在原有的基础上,加入数码管显示及蜂鸣器,当然根据自己的要求,适当使用单片机I/O口接线为:P0 P2 来控制数码管显示,其中P0为数码管显字控制,P2用来选择位(第几个数码管)P1用来控制8个LED灯P3,独立按键(可以根据需要修改)P3^5(找了一个没有用到的I/O口,当然,可以用键盘扫描的方式来实现,这样的话,可以实现4*4=16路的抢答器,了解原理,做相应修改即可。
#include <reg52.h>sbit key1=P3^0; //这里采用独立按键(4路)sbit key2=P3^1;sbit key3=P3^2;sbit key4=P3^3;sbit SPK=P3^5; //蜂鸣器,最好在ISP编程时先不接入,(我用的是杜邦线,可以设置跳线控制)void delay(unsigned int cnt){while(--cnt);}void speak(unsigned int j){unsigned int i;for(i=0;i<j;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短{delay(180);//参数决定发声的频率,估算值,自行修改到不刺耳的声调SPK=!SPK;}SPK=1; //喇叭蜂鸣器停止工作,叫一声即可。
}void main(){bit Flag;while(!Flag){if(!key1){P1=0xFE;Flag=1;speak(300);P2=0;P0=0x06;} //LED1,数码管1显示1,蜂鸣器叫else if(!key2){P1=0xFD;Flag=1;speak(300);P2=1;P0=0x5b;}//LED2,数码管2显示2,蜂鸣器叫else if(!key3){P1=0xFB;Flag=1;speak(300);P2=2;P0=0x4f;}//LED3,数码管3显示3,蜂鸣器叫else if(!key4){P1=0xF7;Flag=1;speak(300);P2=3;P0=0x66;}LED4,数码管4显示4,蜂鸣器叫}while(Flag);}测试完,手动复位即可,当然可设置相应的按键来控制标志:Flag,进行继续抢答。
创新性实验报告-基于51单片机的四路抢答器设计
山东科技大学电工电子实验教学中心
创新性实验结题报告
实验项目名称_基于51单片机的四路抢答器设计
__________
组长姓名学号_
手机 Email_
成员姓名_学号__
成员姓名__学号__
专业___班级__
指导教师及职称________
开课学期至_学年_学期
提交时间年月日
一、实验摘要
二、实验目的
三、实验场地及仪器、设备和材料:
四、实验内容
图1 四路抢答器实验原理图
开始按键接到单片机的P1.1口,复位按键接到单片机的P1.0口,四个抢答按键分别接
五、实验结果与分析
选手3抢答键按下发光二极管D4点亮,蜂鸣器报警,同时数码管显示3。
2、对实验现象、数据及观察结果的分析与讨论:
六、指导老师评语及得分:
七、中心意见:。
基于MCS51单片机的四路抢答器课件
程序流程图如下
电路原理图及PCB制版图
四路智力抢答器电路原理图
四路智力抢答器PCB模块
程序设计
▪ 抢答器工作过程如下
▪ · 首先主持人选定倒计时时间,单片机扫描U3以 获取此信息。如果没有人为设置,默认为10s。
▪ · 在按下抢答按键之前,3个数码管全部显示“0”。
▪ · 按下抢答按键之后,蜂鸣器响一声,单片机开 始倒计时,数码管U6和U7显示倒计时时间,数 码管U8显示“0”。
▪ void send_data(uchar);
▪ uchar set_time(void); 时时间
▪ bit control_key(void); 是否按键
▪ uchar get_key_num(void); 个参赛者按键
▪ void display_time(void); 时剩余时间
//初始化MAX7219 //向控制寄存器写数
▪ 完成上述功能的电路包括时间设定开关、声光显 示、按键控制以及按键锁存等部分
各模块功能
▪ 单片机部分 ▪ 时间设定模块 ▪ 按键模块 ▪ 数码管显示模块 ▪ 蜂鸣器模块
单片机部分
▪ 通过读取P3.7~P3.3 的状态决定倒计时时 间;通过读取P1.3~ P1.0的状态读取按键 情况;通过P2.4~ P2.2控制显示模块以 显示按键者的号码和 倒计时所剩时间;通 过P0.1控制蜂鸣器
key_flg=1;
//设置有人按键答题标志
TR0=0;
//停止T0运行
}
else
//否则循环检测
{
display_time();
//并显示剩余时间
continue;
}
}
if(key_flg==1)
51单片机4X4抢答器源程序
/**********************************************程序名: 4X4抢答器.h作者: 风雪子郁时间: 2012/8/22邮箱:fxziyu@地址:四川信息职业技术学院(雪峰校区)**********************************************/#include <reg51.h>#define unchar unsigned char/*******位申明*******///P0口:数码管段输出//P2口:P2_0 - P2_4 数码管位输出//P3口:4x4矩阵键盘sbit k1=P1^0; //按钮:时间加sbit k2=P1^1; //按钮:时间减sbit k3=P1^2; //按钮:开始sbit k4=P1^3; //按钮:复位sbit sp=P1^4; //蜂鸣器sbit led1=P1^5; //LED:倒计时提醒sbit led2=P1^6; //LED:选手抢答/*****变量声明*******/unchar code table[]={ 0x3f,0x06,0x5b,0x4f, //0~f显示表0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unchar code table0[]={0xfe,0xfd,0xfb,0xf7}; //P2口位选unchar display[]={0,0,0,0}; //显示位存储char num,num1; //num1时间unchar num2,start; //num2选手号,start =0未开始,=1抢答开始=2抢答结束/********延时函数********/void delay(unchar z) //延时1ms子函数{unchar x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*******蜂鸣函数********/void soud(unchar i,j){for(;j>0;j--){sp=~sp;delay(i);}}/********初始化函数*******/void init(){EA=1; //定时器T0初始化ET0=1;TMOD=0x01; //定时器T0工作方式设定TH0=(65536-50000)/256; //装初值TL0=(65536-50000)%256;TR0=0; //定时器关闭led1=led2=1; //关闭led指示灯start=0; //开始标记置零sp=0; //初始化蜂鸣器num1=30; //赋时间初值num2=0; //选手号置零}/******按键检测函数******/void key1() //功能按键检测子函数{if(k1==0) //判断时间加K1是否按下{delay(5); //延时躲过抖动if(k1==0) //再次确认是否按下K1{num1++; //时间自加1if(num1==99) num1=0; //如果时间num=99,清零numwhile(k1==0); //等待K1松手}}if(k2==0) //判断时间减K2是否按下{delay(5); //延时躲过抖动if(k2==0) //再次确认是否按下K2{num1--; //时间自减1if(num1==-1) num1=99; //如果时间num=-1,赋值num=99 while(k2==0); //等待K2松手}}if(k3==0) //判断开始按钮K3是否按下{delay(5); //延时躲过抖动if(k3==0) //再次确认是否按下K3{if(!start) soud(1,100); //蜂鸣器短鸣,if句为防止再按k3时反复鸣响start=1; //开始标致置1TR0=1;}}}void key2() //矩阵键盘检测子函数{unchar a,b,temp;P3=0xff; //读引脚前需写入高电平b=0x10;for(a=0;a<4;a++) //P3_4 - P3_7 行线端依次送入低电平{P3=~b; //置第a行线为低b<<=1;temp=P3; //P3口信息送入temp中temp=temp&0x0f; //屏蔽高四位,保留低四位if (temp!=0x0f) //判断:假如列线有不为高的时候,执行if循环体{delay(5); //延时躲过抖动temp=P3;temp=temp&0x0f;if (temp!=0x0f){switch(temp) //判断是哪个键按下{case 0x0e:num2=a*4+4;break; //第a行第四个按下case 0x0d:num2=a*4+3;break; //第a行第三个按下case 0x0b:num2=a*4+2;break; //第a行第二个按下case 0x07:num2=a*4+1;break; //第a行第一个按下}// TR0=0; //关中断,若要开启选手答题时间倒计时,注释掉本句开启下一句即可num1=60; //选手答题时间,默认60S,若要关闭选手答题时间倒计时,开启本句注释掉上一句即可start=2; //抢答结束led2=0; //抢答指示灯亮soud(1,100); //蜂鸣器短鸣delay(5);}}}}/******显示函数*******/void xianshi(){unchar a;for(a=0;a<4;a++) //位选{delay(5);P2=~table0[a];P0=~table[display[a]];}display[0]=num1/10; //倒计时显示display[1]=num1%10;display[2]=num2/10; //显示抢答者号display[3]=num2%10;}/*******主函数*******/void main(){init();while(1){if(start==0) key1(); //当未启动启动抢答时才检测功能按钮if(start==1) key2(); //当启动抢答时才能检测选手按钮if(k4==0) //判断复位键K4是否按下{delay(5); //延时躲过抖动if(k4==0) //再次确认是否按下K4{init();}}xianshi();}}/********中断*********/void time0() interrupt 1 //定时器T0中断{TF0=0;TMOD=0x01; //T0,方式1,12MHz晶振TH0=(65536-50000)/256;TL0=(65536-50000)%256;num++;if(num==20) //是否满1S{num=0;num1--;if(num1<6) soud(1,100);if(num1==0) {TR0=0;soud(5,100);start=2;led1=0;} }}。
基于51单片机蜂鸣器发声的-C语言程序
本例使用延时函数实精品文档按键发音/* 名称:按键发音说明:按下不同的按键会是SOUNDE 发出不同频率的声音。
现不同频率的声音输出,以后也可使用定时器*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit BEEP=P3A 7;sbit K 仁 P1A4;sbit K2=P1A5;sbit K3=P1A6;sbit K4=P1A7;// 延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}// 按周期 t 发音void Play(uchar t){uchar i;for(i=0;i<100;i++){BEEP=~BEEP;DelayMS(t);}BEEP=0;}void main(){P1=0xff;BEEP=0;while(1){if(K1==0) Play(1);if(K2==0) Play(2);if(K3==0) Play(3);if(K4==0) Play(4);}}精品文档播放音乐/* 名称:播放音乐说明:程序运行时播放生日快乐歌, 未使用定时器中断,所有频率完全用延时 实现*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit BEEP=P3A7;// 生日快乐歌的音符频率表,不同频率由不同的延时来决定uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159, 169,190,119,119,126,159,142,159,0};// 生日快乐歌节拍表,节拍决定每个音符的演奏长短uchar code SONG_LONG[]= {9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0};// 延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}// 播放函数void PlayMusic(){ uint i=0,j,k; while(SONG_LONG[i]!=0||SONG_TONE[i]!=0){ //播放各个音符,SONG_LON为拍子长度for(j=0;j<SONG_LONG[i]*20;j++){BEEP=~BEEP;〃SONG_TON延时表决定了每个音符的频率for(k=0;k<SONG_TONE[i]/3;k++);} DelayMS(10);i++;}}void main(){BEEP=0;while(1){PlayMusic(); // 播放生日快乐DelayMS(500); // 播放完后暂停一段时间}精品文档。
单片机驱动蜂鸣器C51程序
*******************************************************/
main()
{
while(1)
{
if(k1==0)
{
key_time();
}
}
}
按键延时程序
*********************************************************/
key_time()
{
uchar k;
for(k=0;k<15;k++)
BEEP();
}
/*******************************************************
*********************************************************/
void Delay(uint num)//延时函数
{
while( --num );
}
/*********************************************************
#define uint unsigned int
sБайду номын сангаасit k1=P1^4; //按钮1
sbit k2=P1^5; //按钮2
sbit beep=P3^7; //接蜂鸣器
/*********************************************************
本程序出自会员uiesers的辛勤劳动,作用是驱动蜂鸣器发出声音,蜂鸣器接在单片机的p1.5口,由两个按钮控制.p1.4开,p1.5 关闭声音。
4路at89c51抢答器的设计c语言
4路AT89C51抢答器的设计(C语言)概述在各种答题活动中,抢答器是作为重要装备之一,用于检测谁首先按下按钮进行答题。
本文将介绍如何使用AT89C51单片机设计一款4路抢答器,并使用C语言进行编程。
设计原理抢答器的设计原理主要基于按键输入和信号处理。
当有参与者按下按钮进行抢答时,单片机将检测到该按钮按下的信号,并进行相应的处理,包括显示抢答者编号和记录答题结果等。
硬件连接以下是4路抢答器的硬件连接示意图:+-----------------+| || AT89C51 || |+-----+-----+-----+| |+----+--+ || Button1 +--++----+--+|+----+--+| Button2 |+----+--+|+----+--+| Button3 |+----+--+|+----+--+| Button4 |+----+--+程序设计初始化引脚和变量首先,需要初始化所使用的引脚和变量。
AT89C51的IO口用于连接按钮,需要将其配置为输入模式。
同时,定义一个变量用于记录当前的抢答者编号。
主循环主循环会不断扫描每个按钮的状态,当检测到有按钮按下时,记录抢答者编号并进行相应的处理。
按钮扫描函数按钮扫描函数用于检测按钮的状态。
当检测到按钮按下时,返回对应的编号。
在编写按钮扫描函数时,可以使用延时函数来确保稳定的检测结果。
显示抢答者编号函数显示抢答者编号函数用于将抢答者编号显示在LED灯或LCD屏幕上。
抢答者编号可以根据具体需求进行显示方式的设计,比如使用不同颜色的LED灯表示不同编号的抢答者。
记录答题结果函数记录答题结果函数用于记录每个抢答者的答题结果。
可以使用数组来存储每个抢答者的成绩或者答题情况。
中断处理在抢答器设计中,中断处理函数起着重要作用。
当检测到有按钮按下时,通过中断处理函数及时响应,并进行相应的处理。
总结本文介绍了使用AT89C51单片机设计4路抢答器的方法,并使用C语言进行编程。
基于51单片机的4路抢答器
电路图:/************************************************************** 4路抢答器,由主持人按下复位键开启抢答,对应选手最先按下按键后由数码管显示选手号码,点亮对应LED,蜂鸣器响,其他选手按键无效**************************************************************/ #include<reg52.h>#define uchar unsigned char#define uint unsigned intunsigned char code LED_DATE [] = //定义数码管段数组{0XC0, // 00XF9, // 10XA4, // 20XB0, // 30X99, // 40X92, // 50X82, // 60XF8, // 70X80, // 80X90, // 9unsigned char code LED_W [] = //定义数码管位数组{0X80, //第一个数码管位0X40, //第二个数码管位0X20, //第三个数码管位0X10, //第四个数码管位0X08, //第五个数码管位0X04, //第六个数码管位0X02, //第七个数码管位0X01 //第八个数码管位};sbit DS_HC595 =P1^5; //定义74HC595 I/O口sbit SHCP_HC595 =P1^6;sbit STCP_HC595 =P1^7;sbit K1=P3^2; //定义按键I/O口sbit K2=P3^3;sbit K3=P3^4;sbit K4=P1^2;sbit LED1=P2^4; //定义LED I/O口sbit LED2=P2^5;sbit LED3=P2^6;sbit LED4=P2^7;sbit BUZZ=P1^1; //定义蜂鸣器I/O 口void KEY();void Display();void Delay(uchar xms);void HC595(uchar V alue);uchar num=0;void main(){while(1){KEY();Display(); //数码管显示0}void KEY(){if(K1==0){Delay(10); //延时消抖if(K1==0) //再次判断{while(!K1); //按键松开检测while(1) //使用死循环,使其他选手按下按键后无效(下同){LED1=0; //使1号灯亮(下同)BUZZ=~BUZZ; //蜂鸣器响num=1; //显示1号Display();Delay(10);}}}if(K2==0){Delay(10);if(K2==0){while(!K2); //按键松开检测while(1){LED2=0;BUZZ=~BUZZ;num=2;Display();Delay(10);}}}if(K3==0){Delay(10);if(K3==0){while(!K3); //按键松开检测while(1){LED3=0;BUZZ=~BUZZ;num=3;Display();Delay(10);}}}if(K4==0){Delay(10);if(K4==0){while(!K4); //按键松开检测while(1){LED4=0;BUZZ=~BUZZ;num=4;Display();Delay(10);}}}}void Display() //显示函数,静态扫描{P0=LED_DATE[num]; //送段码HC595(LED_W[7]); //送位码}void HC595(uchar V alue) //74HC595驱动函数{uchar i=0;for(i=0;i<8;i++){DS_HC595=Value&0X01;SHCP_HC595=0;SHCP_HC595=1;Value>>=1;}STCP_HC595=0;STCP_HC595=1;}void Delay(uchar xms) //延时函数{uchar i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}。
C51单片机四路抢答器
目录一、摘要 (3)二、方案设计 (4)2.1、设计要求 (4)2.2、总体法案设计 (4)三、硬件电路设计 (5)3.1、元器件简介 (5)3.2、独立式按键电路 (7)3.3、时钟电路设计 (6)3.4、指示灯电路设计 (7)四、制作以调试 (8)4.1系统程序设计 (8)4.2主程序流程图主程序流程图 (8)4.3程序清单 (9)五、心得与体会 (11)六、参考文献 (12)一、摘要单片机作为一种工具,现在已经广泛的应用于智力和只是竞赛场合。
本次设计是基于单片机51系列的理论知识综合运用AT89C52单片机设计的简易四路抢答器。
利用AT89C52单片机的外围接口来实现抢答系统,利用单片机的定时器/计数器计数和定时的原理,将软、硬件有机的结合起来,使得系统能正确的记时,发光二极管能正常的闪烁。
同时系统能够实现:在抢答过程中只有在主持人按下开始抢答键开始之后抢答才有效,如果在开始抢答之前抢答视为无效。
在抢答成功之后发光二极管会变成闪烁状态与提示选手开始回答问题。
同时还有主持人控制的系统复位键,以实现系统的复位。
还有按键锁定,在一个选手抢答成功或者法规状态下其他按键无效。
通过这次的设计,对51系列的单片机的运用有了更深一层次的了解,也提高了我们的动手能力,加深我们对单片机的映像,为我们以后的学习打下一定的基础。
二、方案设计2.1、设计要求(1)、总共4个按键,四个供四个选手用作“抢答”操作。
(2)、用1个发光二极管用作开始抢答的指示灯,用4个发光二极管分别显示4个选手的抢答状态。
(3)、开始抢答后,哪个选手抢答键最先按下,该选手的抢答指示灯点亮,表示抢答成功,此时其他选手再按键为无效,抢答成功后开始3秒计时,到时指示灯变为闪烁,以提示选手选手抢答后必须3秒内回答问题。
2.2、总体法案设计方案:依据课题要求,基于AT89C52单片机制作的抢答器,其最大的好处就是处理快,准确性高、可靠性好、控制功能强。
单片机四位连体共阴数码管与蜂鸣器程序
单片机四位连体共阴数码管与蜂鸣器程序以下是单片机四位连体共阴数码管与蜂鸣器的程序示例(以51单片机为例):```C#include <reg51.h>unsigned char code displacement[10]= //码盘;0-9对应的码值{0xc0, //00xf9, //10xa4, //20xb0, //30x99, //40x92, //50x82, //60xf8, //70x80, //80x90 //9};void delay_ms(unsigned int msec) //延时函数{unsigned int i,j;for(i=0;i<msec;i++)for(j=0;j<1275;j++);}void main(){unsigned int count=1111; //计数器的初始值为1111unsigned char i,j,k;while(1){k=count%10;//个位i=count/10%10;//十位j=count/100%10;//百位P0=displacement[k];//显示个位P2=0x0c;//使能个位显示器delay_ms(5);//延时5ms,即刷新频率为20HzP0=displacement[i];//显示十位P2=0x14;//使能十位显示器delay_ms(5);P0=displacement[j];//显示百位P2=0x24;//使能百位显示器delay_ms(5);P0=0xff;//关闭所有数码管P2=0x34;//关闭所有数码管delay_ms(5);count++; //计数器加1if(count==10000) //计数到9999后从头开始count=0;if(count<=9999 && count>=999) //计数到999时蜂鸣器发出声音{P1=0x01;//控制蜂鸣器开启delay_ms(10);P1=0x00;//控制蜂鸣器关闭delay_ms(10);}}}```在这个示例程序中,使用了一个计数器来循环计数,同时将计数器的个位、十位、百位分别显示在三个共阴数码管中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机四路抢答器(LED灯,数码管显示,蜂鸣器提示音)C语言源程序2009-10-31 10:53
其实就是在原有的基础上,加入数码管显示及蜂鸣器,当然根据自己的要求,适当使用单片机I/O口
接线为:
P0 P2 来控制数码管显示,其中P0为数码管显字控制,P2用来选择位(第几个数码管)
P1用来控制8个LED灯
P3,独立按键(可以根据需要修改)
P3^5(找了一个没有用到的I/O口,当然,可以用键盘扫描的方式来实现,这样的话,可以实现4*4=16路的抢答器,了解原理,做相应修改即可。
#include <reg52.h>
sbit key1=P3^0; //这里采用独立按键(4路)
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
sbit SPK=P3^5; //蜂鸣器,最好在ISP编程时先不接入,(我用的是杜邦线,可以设置跳线控制)
void delay(unsigned int cnt)
{
while(--cnt);
}
void speak(unsigned int j)
{
unsigned int i;
for(i=0;i<j;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短
{
delay(180);//参数决定发声的频率,估算值,自行修改到不刺耳的声调
SPK=!SPK;
}
SPK=1; //喇叭蜂鸣器停止工作,叫一声即
可。
}
void main()
{
bit Flag;
while(!Flag)
{
if(!key1){P1=0xFE;Flag=1;speak(300);P2=0;P0=0x06;} // LED1,数码管1显示1,蜂鸣器叫
else if(!key2){P1=0xFD;Flag=1;speak(300);P2=1;P0=0x5b;}//LED2,数码管2显示2,蜂鸣器叫
else if(!key3){P1=0xFB;Flag=1;speak(300);P2=2;P0=0x4f;}//LED3,数码管3显示3,蜂鸣器叫
else if(!key4){P1=0xF7;Flag=1;speak(300);P2=3;P0=0x66;}LED4,数码管4显示4,蜂鸣器叫
}
while(Flag);
}
测试完,手动复位即可,当然可设置相应的按键来控制标志:Flag,进行继续抢答。