单片机实验8路抢答器C语言版

合集下载

八路抢答器51c语言程序

八路抢答器51c语言程序

# include <reg51.h>int status=-1; //工作状态包括:0,空闲状;1.调整;2.计时开始;3.计时临近;4.计时终止;5.误按int TimeLeft=0; //倒计时时限int TimeSet=20;int Member=-1; //相关选手号码,-1表示该数值无效unsigned short TimeCounter=0;//以10ms为单位,对定时器进行计数,以便控制数码管、蜂鸣器和抢答计时(以秒为单位)//数码管每20ms进行一次的刷新,蜂鸣器的最大响停间隔为500ms,抢答计数以1s为单位。

//计数规则:最大计数为2000,代表20s.此时计数返回0struct{int LED1,LED2,BeepMode;}OutInfo;void Init() //系统初始化,主要是中断服务程序、定时器中断和定时器相关参数设置{;//初始化过程}void /*interrupt */Timer0(){void SetBeep(int command);void SetLED(int member,int time);TimeCounter++;if(TimeCounter==TimeSet*100)TimeCounter=0; //达到了计数顶点if((TimeCounter & 0x0001)==0) //显示LEDSetLED(OutInfo.LED1,OutInfo.LED2);if(status==2 && OutInfo.BeepMode==0) //计时开始,并且方式等于间歇输出,则调用输出蜂鸣器if( ((TimeCounter%50)&0x0001) ==0)SetBeep(0);elseSetBeep(1);if(TimeCounter%100==0 && (status==2 || status==3)) //已经开始计时,则每过一秒,剩余时间的计数值减一TimeLeft--;}void SetBeep(int command){if(command==0);////关闭蜂鸣器else;////开启蜂鸣器}void SetLED(int member,int time) //当出现-1,表示不显示该数码管{void Delay1ms();;//显示人员的数码管Delay1ms();;//显示剩余时间的数码管Delay1ms();}void Delay1ms() //基数时间等于1us.{int x;for(x=1000;x;x--) ;}void main(){int getkey();void showLED();void outBeep();void changeStatus(int keycode);int keycode=0; //中间变量if(status==-1){Init();status=0;}keycode=getkey();showLED();outBeep();changeStatus(keycode);}int getkey() //对所有按键进行编码.同时修改Member的数值,以及TimeSet的值{int key=0;;////你的代码,最终取值介于1-12if(status==0 || status==2 || status==3) //需要记录用户侧的按键if(key>=5 && key<=12)Member=key-4;if(status==1) //设置状态{if(key==3)TimeSet++;if(key==4)TimeSet--;}return key;//获取按键的编码,例如把主机侧设为1、2、3、4号,把客户侧设为5-12号,把无按键或者错误按键设为-1}void showLED(){void numberLED(int x);void TimeLED(int x);switch(status){case 0: //空闲状态TimeLED(0);numberLED(-1); //如果输入Member为-1,表示有选手犯规按下break;case 1: //调整状态TimeLED(TimeSet);break;case 2: //计时开始TimeLED(TimeLeft);numberLED(Member);break;case 3: //计时临近TimeLED(TimeLeft);numberLED(Member);break;case 4: //计时终止TimeLED(TimeLeft);numberLED(Member);break;case 5: //误按状态TimeLED(0);numberLED(Member);break;default: //错误break;}}void numberLED(int x) //输入-1,表示需要禁止显示{OutInfo.LED1=x;}void TimeLED(int x){OutInfo.LED2=x;}void outBeep(){void MBeep(int mode);switch(status){case 0: //空闲状态if(Member==-1)MBeep(1);break;case 1: //调整状态MBeep(2);break;case 2: //计时开始MBeep(0);break;case 3: //计时临近MBeep(1);break;case 4: //计时终止MBeep(1);break;case 5: //误按状态MBeep(1);break;default: //错误break;}}void MBeep(int mode) //0,代表0.5s的正常计时音;1,代表连续响声;2,代表关掉声音{OutInfo.BeepMode=mode;}void changeStatus(int keycode){switch(status){case 0: //空闲状态switch(keycode){case 1:status=2;break;//开始状态case 2:break;case 3:case 4:status=1;break; //设置状态case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12: status=5;break; //误按状态}break;case 1: //调整状态,当主持人发清零命令,进入空闲状态if(keycode==2)status=0;break;case 2: //计时开始,当有效按键及时间改变时,发生切换if (keycode>=5 && keycode<=12) //用户按键status=4;elseif(TimeLeft<=5) //剩余时间status=3;break;case 3: //计时临近if (keycode>=5 && keycode<=12) //用户按键status=4;elseif(TimeLeft==0) //计时完毕status=0;break;case 4: //计时终止,只等待清零if(keycode==2)status=0;break;case 5: //误按状态,等待清零,并需要记录犯规的用户编号?? if(keycode==2)status=0;break;default: //错误break;}}/*其中,StdAfx.h的内容如下:*/#if !defined(AFX_STDAFX_H__100A4F3F_F87C_4656_BCD5_715CBC48BBB0__INCLUDED _)# define AFX_STDAFX_H__100A4F3F_F87C_4656_BCD5_715CBC48BBB0__INCLUDED_# if _MSC_VER > 1000# pragma once# endif // _MSC_VER > 1000// TODO: reference additional headers your program requires here//{{AFX_INSERT_LOCA TION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.# endif // !defined(AFX_STDAFX_H__100A4F3F_F87C_4656_BCD5_715CBC48BBB0__INCLUDED _)//结束。

基于单片机的八路智能竞赛抢答器

基于单片机的八路智能竞赛抢答器

摘要抢答器在现实生活中应用广泛,比如在各类娱乐节目中,像中央电视台的幸运52,开心辞典,因此做一个抢答器是具有现实意义的。

抢答器具有人数限制,我们选择做八路抢答器。

当某人抢答时,能够显示他的号码,限定他的答题时间,别人不能抢答,主持人要有启动和清空的权利。

八路抢答器在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。

如果在抢答中,靠视觉是很难判断出哪组先答题。

利用单片机系统来设计抢答器,使以上问题得以解决,即使两组的抢答时间相差几微秒,也可分辨出哪组优先答题。

抢答组数可以在八组以内任意使用,本系统采用AT89S52单片机作为核心,控制系统的四个模块分别为:单片机最小系统、显示模块、显示驱动模块、抢答开关模块。

关键词抢答器;单片机;数码管ABSTRACTQiangda in real life applications in a wide range, such as the various types of entertainment, such as China Central Television's lucky 52, Happy Dictionary, it is a Qiangda practical significance. Qiangda restrictions on the number of features, we choose to do Qiangda eight-way device. Qiangda when a person can show his numbers, to limit his time to answer, other people can not Qiangda, and the host must start to empty. Qiangda Qiangda in eight-way process, in order to know which group or which one's first answer, we must design a system to accomplish this task. If Qiangda, it is difficult to rely on visual determine which group to answer. The use of single-chip design Qiangda system, so that the above problems are resolved, even if the two groups Qiangda the difference in time, a few microseconds, can tell which group the priority answer. Qiangda group in a number of the eight groups within the arbitrary use of this system as a single-chipAT89S52 core of the control system of the four modules are: the smallest single-chip systems, display modules, display driver module, Qiangda switch module.Key words Single-chip computer; qiangda device; digital control目录1 功能要求及方案选择 (3)1.1 功能要求 (3)1.2 方案选择 (3)2 硬件设计 (4)2.1 设计原理 (4)2.2 抢答器原理图 (4)2.3 PCB (6)3 软件设计 (9)3.1 资源分配 (9)3.2 设计思想 (9)3.3 流程图 (9)3.4 程序清单 (12)4 使用说明及设计体会 (18)4.1 使用说明 (18)4.2 设计体会 (18)参考文献 (20)致谢 (21)1 功能要求及方案选择1.1 功能要求设计一个具有特定功能的抢答器。

八路抢答器-基于单片机C语言

八路抢答器-基于单片机C语言

#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit k1=P1^0;sbit k2=P1^1;sbit k3=P1^2;sbit k4=P1^3;sbit k5=P1^4;sbit k6=P1^5;sbit k7=P1^6;sbit k8=P1^7; //选手按键sbit beep=P3^6; //蜂鸣器uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77}; //0-9代码(共阴极)uchar shiwei,gewei,xuanshou,count,i,second;uchar score1,score2,score3,score4,score5,score6,score7,score8;//选手1~8的分数uint t,m,n,a,a1,a2,a3,a4,a5,a6,a7,a8;void Timer(){TMOD|=0x01;TH0=0xd8; //初值55536,计数10000次,每次1US,总计10msTL0=0xf0;IE=0x82; //这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时TR0=1;}void tim(void) interrupt 1 using 1 //为定时中断TR0{TH0=0xd8; //重新赋值TL0=0xf0;count++;if(count==100) //100*10ms=1秒{count=0;second--; //秒减1}}void delay(uint z) //延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);//延时1ms}void display (uchar shiwei,gewei,xuanshou) //显示函数{P2=0xfe; //打开显示时间十位的位选低电平有效1111 1110 P0=shiwei;//显示十位delay(5);P2=0xfd; //个位位选1111 1101P0=gewei;delay(5);P2=0xf7; //选手位选1111 0111P0=xuanshou;delay(5);}void dis(void)//调用显示函数{shiwei=tab[second/10];gewei=tab[second%10];xuanshou=tab[i];display (shiwei,gewei,xuanshou);}void init() //初始化函数{P2=0x04;//0000 0100P0=0x3f;//数码管共阴0011 1111显示0t=0;beep=0;//蜂鸣器i=0;second=29;score1=60;score2=60;score3=60;score4=60;score5=60;score6=60;score7=60;score8=60;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;}void main()//主函数{init();//调用初始化函数if(k==1){ m=0; if(k1==0) {delay(5);if(k1==0);while(!k1);beep=1;delay(500);beep=0;} // 违规抢答显示号码报警while(t){if(m==0) //开关,保证程序只执行一次{switch(t){case 1:{TR0=0;i=1;second=score1;beep=1;delay(500);beep=0;a1=0;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;break; //有选手抢答时显示选手号码蜂鸣器响,时间为0,t和i对应}}} }if(k2==0) {delay(5);if(k1==0);while(!k1);t=2;beep=1;delay(500);beep=0;}if(k3==0) {delay(5);if(k1==0);while(!k1);t=3;beep=1;delay(500);beep=0;}if(k4==0) {delay(5);if(k1==0);while(!k1);t=4;beep=1;delay(500);beep=0;}if(k5==0) {delay(5);if(k1==0);while(!k1);t=5;beep=1;delay(500);beep=0;}if(k6==0) {delay(5);if(k1==0);while(!k1);t=6;beep=1;delay(500);beep=0;}if(k7==0) {delay(5);if(k1==0);while(!k1);t=7;beep=1;delay(500);beep=0;}if(k8==0) {delay(5);if(k1==0);while(!k1);t=8;beep=1;delay(500);beep=0;}}if(k==0){Timer();//中断定时器打开delay(10);while(!k);while(1){dis();m=0;n=0;if (second==29){beep=1;delay(500);beep=0;}if(second==0){TR0=0;n=1;if(k1==0){delay(5);if(k1==0);while(!k1);t=1;beep=1;delay(500);beep=0;} // 违规抢答显示号码报警if(k2==0){delay(5);if(k1==0);while(!k1);t=2;beep=1;delay(500);beep=0;}if(k3==0){delay(5);if(k1==0);while(!k1);t=3;beep=1;delay(500);beep=0;}if(k4==0){delay(5);if(k1==0);while(!k1);t=4;beep=1;delay(500);beep=0;}if(k5==0){delay(5);if(k1==0);while(!k1);t=5;beep=1;delay(500);beep=0;}if(k6==0){delay(5);if(k1==0);while(!k1);t=6;beep=1;delay(500);beep=0;}if(k7==0){delay(5);if(k1==0);while(!k1);t=7;beep=1;delay(500);beep=0;}if(k8==0){delay(5);if(k1==0);while(!k1);t=8;beep=1;delay(500);beep=0;}if(k==0){beep=1;delay(500);beep=0;second=29;TR0=1;m=1;}}//如果再次按下开始按钮,蜂鸣器响0。

单片机课程八路抢答器设计(含源程序)

单片机课程八路抢答器设计(含源程序)

武汉工程大学——课程设计报告设计题目:基于单片机八路抢答器设计系(院):电气院专业:测控技术与仪器年级 (班):09级测控02班学号:***********名:******:***2012年 12月 12日目录目录 (2)摘要 (3)一、设计任务与要求......................................... 错误!未定义书签。

二、方案设计与论证......................................... 错误!未定义书签。

三、硬件电路设计 (5)3.1抢答器的电路框图 (5)3.2 单元电路设 ........................................... 错误!未定义书签。

3.3外部震荡电路.......................................... 错误!未定义书签。

3.4报警电路设计.......................................... 错误!未定义书签。

四、软件设计................................................ 错误!未定义书签。

4.1系统主程序设计 (7)4.2主程序清单 (8)五、仿真过程与仿真结果 (11)5.1用到了keil软件仿真 (11)5.2 Proteus仿真 (11)5.3用DXP连接原理 (11)5.4用DXP连接PCB图...................................... 错误!未定义书签。

六、安装与调试.............................................. 错误!未定义书签。

6.1制作PCB电路板流程......................... 错误!未定义书签。

6.2器件选型方案的详细清单 (12)6.3调试.................................................. 错误!未定义书签。

八路抢答器电子线路设计(附C语言程序)

八路抢答器电子线路设计(附C语言程序)

电子系统课程设计姓名:___________ 周康学号:___________ 24号_______________专业班级:_________ 嵌入式10指导教师:一=朱水金设计题目:八路抢答器完成时间:2013年07月01日功能(20%实训(60%设计报告(20%总评简易难度(10%控制方式(10%原理图(10%装配图(10%元器件焊接(10%自控质量(10%功能实现(10%质量评估(10%格式(5%内容(15%应用科学学院电子系统课程设计数字抢答器由主体电路与扩展电路组成。

用控制电路和主持人开关启动报警电路,以上两部分组成主体电路。

通过定时电路和译码电路将秒脉冲产生的信号在显示器上输出实现计时功能,构成扩展电路。

经过布线、焊接、调试等工作后数字抢答器成形。

单片机体积小价格低,应用方便,稳定可靠。

单片机系统的硬件结构给予了抢答系统“身躯”,而单片机的应用程序赋予了其新的“生命”,使其在传统的抢答器面前具有电路简单、成本低、运行可靠等特色。

关键字:抢答电路报警电路倒计时电路目录第一章八路抢答器的概述及制作要求 (4)1.1 数字抢答器的概述 (4)1.2 设计任务与要求 (4)第二章单片机芯片的选择及抢答器方案 (5)2.1单片机芯片的选择 (5)2.2模块性能分析 (7)第三章硬件电路设计 (8)3.1总体设计 (8)3.2外部振荡电路 (9)3.3复位电路的设计 (9)3.4显示电路的设计 (9)3.5按钮输入电路的设计 (9)3.6报警电路的设计 (9)第四章系统软件设计 (12)4.1抢答器流程图 (12)4.2抢答器程序 (12)-1 -第五章产品的样品 (25)4.1实物图 (12)4.2 PCB 版图 (12)4.1实物焊接图 (12)结束语 (25)参考文献 (28)引言:单片机的发展史单片机诞生于20世纪70年代末,经历了SCM MCU SoC三大阶段。

1.SCM即单片微型计算机(Single Chip Microcomputer )阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。

单片机实验8路抢答器C语言版

单片机实验8路抢答器C语言版

单片机综合实验报告、实验内容:以单片机为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,分别用8个按钮SO〜S7表示。

本实验有Protues软件仿真。

分别设置一个抢答控制开关S1和复位开关S2,由主持人控制。

抢答器具有锁存与显示功能。

即选手按按钮抢答时,锁存相应的编号,并且优先抢答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。

抢答器具有定时抢答功能,且一次抢答的时间由主持人设定为30秒。

当主持人启动“开始”键后,定时器进行减计时,同时绿色LED灯亮。

二、实验电路及功能说明分别设置一个抢答控制开关S1和复位开关S2,由主持人控制。

抢答器具有锁存与显示功能。

即选手按按钮抢答时,锁存相应的编号,并且优先抢答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。

参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统复位为止。

复位后参赛队员可继续抢答。

如果定时时间已到,无人抢答,本次抢答无效,系统报警红色LED灯亮,并禁止抢答,定时显示器上显示00。

三、实验程序流程图:主程序;非法抢答序;抢答时间调整程序;回答时间调整程序;倒计时程序;正常抢答处理程序;犯规处理程序;显示及发声程序。

主流程图如下图所示子程序四、实验结果分析五、心得体会六、程序清单#in elude <reg51.h>#defi ne uchar un sig ned char#defi ne uint un sig ned intsbit wela_a=P3A0;sbit wela 1=卩3人1;sbit wela2=P3A7;sbit rest=P3A5;sbit host=P3A6;sbit led 仁P3A4;〃绿灯sbit led2=P3A3;〃红灯sbit led3=P3A2;〃黄灯sbit key1=P1A0;sbit key2=P1Al;sbit key3=P1A2;sbit key4=P1A3;sbit key5=P1A4;sbit key6=P1A5;sbit key7=P1A6;sbit key8=P1A7;uchar x,q,d,s,ge,tO,t1,start,flag;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void init();/* 初始函数申明*/void display(uchar s,uchar ge,uchar a); void delay( uint z); void keysca n();void mai n(){in it();display(s,ge,a);while(1){if(host==0) // 主持人控制开关{delay(5);if(host==0){flag=1;start=1;dela y(5); 延时while(!host); 检测开关}}if(rest==0) // 复位{delay(5);if(rest==0){q=30;led2=1;led3=1;x=0;delay(5);start=1;} }void init()/* 初始化 */{ t0=0; t1=0; flag=0; q=30; d=10; wela_a=0; a=0; TMOD=0x11;TH0=(65536-50000)/256; TL0=(65536-50000)%256;TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1; ET0=1; ET1=1; TR0=0; TR1=0; }void display(uchar s,uchar ge,uchar a)/*数码管动态扫描*/ { wela1=1; P0=table[ge]; delay(5); wela2=1;delay(5);while(!rest); } }if(flag==1) { if(start==O)〃 选手按下,倒计10秒开始{led3=0; wela1=0; wela2=0; delay(1); TRO=O; TR1=1; display(s,ge,a); delay(1);} if(start==1)//主持人按下,倒计时 30秒 { led 仁0; wela1=0; wela2=0; delay(1); TR0=1; TR1=0; display(s,ge,a); delay(1); keysca n();}PO=table[s];delay(5);wela_a=O;P2=table[a];delay(5);}void keyscan()/* 按键扫描函数*/ {if(key1==O){delay(5);if(key1==0){a=1;P2=table[a];start=0;TR1=1;TR0=0;delay(5);while(!key1);}}if(key2==0){delay(5);if(key2==0){a=2;P2=table[a];delay(5); while(!key2);}}if(key3==0){delay(5);if(key3==0){a=3;P2=table[a]; start=0;delay(5); while(!key3);}}if(key4==0){delay(5);if(key4==0){a=4;P2=table[a]; start=0;delay(5); while(!key4);}}if(key5==0)delay(5);if(key5==0){a=5;P2=table[a]; start=0;delay(5); while(!key5); }start=0;}if(key6==0){delay(5);if(key6==0){a=6;P2=table[a]; start=0;delay(5); while(!key6); } }if(key7==0){delay(5);if(key7==0){a=7;P2=table[a];start=0;delay(5);while(!key7);}}if(key8==0){delay(5);if(key8==0){a=8;P2=table[a];start=0;delay(5);while(!key8);}}}void delay(uint z)/* 延时函数*/{uint i,j;for(i=z; i>0;i--)for(j=110;j>0;j--);}void time0() interrupt 1/* 定时器0*/ {TH0=(65536-50000)/256;TL0=(65536-50000)%256;s=q/10;ge=q%10;t0++;if(t0==20){to=o;q--;s=q/10;ge=q%10;if(q==0){while(1){q=0;a=0;led1=1;led2=0;wela1=0;wela2=0;delay(1);display(s,ge,a);}}}}void time1() in terrupt 3/* {TH1=(65536-50000)/256; TL1=(65536-50000)%256; s=d/10;ge=d%10;t1++;{t仁0;d--;s=d/10;ge=d%10;if(d==0){while(1){d=0;a=0;led1=1;led3=1;led2=0;wela1=0;wela2=0;delay(1);display(s,ge,a);}}}}定时器1*///最后,给朋友们一点点提示,本程序有一点点小问题,有个中断没关,当主持人复位之后,后面的选手回答问题的时间就没有10秒了(可怜啊)。

基于单片机的八路抢答器的设计(C语言版)

基于单片机的八路抢答器的设计(C语言版)

毕业论文基于单片机的8路抢答器专业院系: 信息工程系班级名称: 计算机硬件与外设****: *******: ***完成时间: 2011年12月28日湖南铁道职业技术学院信息工程系2012届毕业设计任务书专业:硬件与外设班级:硬件091 填表日期:2011年11月20日指导教师王昱煜职称讲师联系电话159****7341学生姓名周俊兵课题名称基于单片机的8路抢答器的设计课题工作内容介绍单片机的选型、引脚功能等,然后分析抢答器的设计原理,从各个硬件的总体设计到局部电路设计,分析并阐述设计思路;再进行软件的设计,从程序总体流程图到关键部分的设计思路以及中断处理,最后附上程序代码。

该论文的主要内容应包括:1、单片机芯片选择(1)单片机选择(2)模块性能分析2、硬件设计(1)总体设计(2)外部振荡电路设计(3)复位电路设计(4)显示电路设计(5)按键电路设计(6)报警电路设计3、系统软件设计(1)程序总体结构图(2)程序流程图(3)主程序(4)中断处理4、总结本论文的撰写需要先设计出产品的电路图及软件系统,然后再自己焊接组装成产品,然后根据自己的设计思路及产品焊接组装流程用文字加图片的形式在文章中展示出来。

要求指标(目标)通过毕业设计,应达到以下要求:(1)熟悉单片机的型号及各引脚功能。

(2)熟悉单片机硬件电路设计。

(3)熟练单片机C语言程序设计。

(4)用C语言实现软件系统,并在仿真环境下调试运行。

(5)熟练电子元器件的焊接。

(6)根据硬件电路图和程序代码将产品制作出来并调试。

(7)撰写符合规范的毕业设计论文,对毕业设计所做的工作表达出来。

(8)掌握团队合作开发的方法。

(9)进一步积累实际的单片机产品的开发和研究经验。

进程安排(1)第1周:落实毕业设计任务,明确工作内容,部署毕业设计各项工作。

(2)第2周:查阅与课题相关或针对性强的文献5~10篇,阅读并进行归纳、总结。

(3)第3周:根据课题要求进行资料收集、整理,并写出分析报告。

单片机课程设计 八路抢答器(C语言)

单片机课程设计 八路抢答器(C语言)

单片机课程设计8路抢答器指导老师:宋*******学号:************ 班级:12电子卓越班目录一绪论 (3)二基本设计方案 (4)三具体设计 (5)四电路板的制作 (7)五电路功能测试与调试 (7)六心得体会 (8)附录 (9)一绪论1.1单片机抢答器的背景二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。

不过,这种电脑,通常是指个人计算机,简称PC机。

它由主机、键盘、显示器等组成。

还有一类计算机,大多数人却不怎么熟悉。

这种计算机就是把智能赋予各种机械的单片机(亦称微控制器)。

顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。

因为它体积小,通常都藏在被控机械的“肚子”里。

它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。

现在,这种单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。

各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。

现在有些工厂的技术人员或其它业余电子开发者搞出来的某些产品,不是电路太复杂,就是功能太简单且极易被仿制。

究其原因,可能就卡在产品未使用单片机或其它可编程逻辑器件上。

在知识竞赛中,特别是做抢答题时,在抢答过程中,为了更确切的知道哪一组或哪一位选手先抢答到题,必须要有一个系统来完成这个任务。

若在抢答中,只靠人的视觉(或者是听觉)是很难判断出哪一组(或哪一个选手)先抢答到题的。

利用单片机编程来设计抢答器,可以使以上问题得以解决,即使两组的抢答时间相差几微秒,也能轻松的分辨出哪一组(或哪个选手)先抢答到题的。

本文主要介绍了抢答器的工作原理及设计,以及它的实际用途。

1.2设计要求:一、基本功能:1、六路抢答,抢答有效时相应的灯亮,并有音乐提示;2、每轮抢答需主持人按“开始”后,抢答才有效;3、抢答无效时,有相应的灯及音乐提示;二、扩展功能:1、扩展到8路或以上;2、抢答倒计时提示;3、各路的参赛者有得分显示;4、其他自行增加的功能;二基本设计方案2.1 单片机的选择我选择STC89C52单片机芯片的理由如下:1、在设计过程中可能会出现很多问题,89C52可重复烧程序;2、是80C51的增强型,功能与我们所学的51单片机基本相同;3、学校配套发的单片机开发板用的就是89C52,有很多相关教程,程序的测试与烧写都十分方便;4、器材室很方便就能领到。

《单片机应用技术(C语言)》实训课件—4.1 8路抢答器设计

《单片机应用技术(C语言)》实训课件—4.1 8路抢答器设计
否则显示“E”约3 s,继续保持锁定状态。
硬件电路
51单片机
4个按键由P0.0~P0.3控制; 共阳数码管由P1口静态控制; 由P3.0引脚控制的发光二极管 的亮灭模拟开锁电路的打开和 锁定。
程序设计思路
密码设定为“2”
if……else if …… else switch语句
#include <reg51.h> 器
P0=0xff;
//读引脚状态,需先置1
P1=disp[8];
//显示“”
while(1)
{
button=P0;
//第一次读按键状态
delay(1200);
//延时消抖
button=P0;
//第二次读按键状态
switch(button) //根据按键的值进行多分支跳转
{
case 0xfe: P1=disp[0];delay(10000);while(1);break; //0按下,显示0,待机
9 1 0 0 1 0 0 0 0 0x90 0 1 1 0 1 1 1 1 0x6F
三、程序设计
软件设计思路
使用数组存储显示数据
//定义数组led,依次存储包括0~7和“”的共阳极数码管显示码表 unsigned char code disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0xbf};
//从数组中取出数码管的显示字符“” P1=disp[8];
数组定义语句中,关键字“code”是为了把disp[] 数组存储在片内程序存储器ROM中。
程序设计:
系统上电时,数码管显示“”,表示开始抢答, 当记录到最先按下的按键序号后,数码管将显示该参赛 者的序号,同时无法再接受其它按键的输入;当系统按 下复位按钮S时,系统显示“”,表示可以接受新一轮 的抢答。

单片机课程设计——带时间限制及声光提示的8位抢答器

单片机课程设计——带时间限制及声光提示的8位抢答器

单片机课程设计初始状态:抢答倒计时:抢答显示:4号选手在3秒时抢到Protuse仿真元器件:下载程序,保证运行!!!下载程序,保证运行!!!程序清单:#include<at89x51.h>#define uchar unsigned char#define uint unsigned intchar s;uchar num=0;char time=20; //抢答时间char datitime=30; //答题限时时间uint tt,t1; //T0,T1定时器定一秒时bit flag,s_flag=1,b_flag,fall_flag; //标志位bit K_startcountflag,K_timecountflag; //时间调整标志位sbit K0=P3^0;sbit beep=P3^7; //蜂鸣器sbit rled=P3^1; //指示灯sbit K1=P1^0;sbit K2=P1^1;sbit K3=P1^2;sbit K4=P1^3;sbit K5=P1^4;sbit K6=P1^5;sbit K7=P1^6;sbit K8=P1^7;sbit K_Time=P3^2; //答题计时键sbit K_startcount=P3^3; //开始抢答时间调整键sbit K_timecount=P3^4; //答题计时时间调整键void delay(uchar ms){uchar y;for(;ms>0;ms--)for(y=120;y>0;y--);}uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code tablewe[]={0XFE,0XFD,0XFB,0XF7};void T0_Init(void){TMOD=0X01;TH0=(65536-2000)/256;TL0=(65536-2000)%256;TH1=(65536-2000)/256;TL1=(65536-2000)%256;ET0=1;ET1=1;EA=1;P0=0;}void Key_Scan(void) //开始键扫描{if(K0==0){delay(10);if(K0==0){while(!K0);TR0=1;s=time;tt=0;flag=1;s_flag=1;b_flag=1;num=0;beep=1;rled=1;fall_flag=0; //清除违规标志位K_startcountflag=0;K_timecountflag=0;}}}void Scan(void) //八路热键扫描(哪个键先按下,哪个优先级最高) {if(K1==0){delay(10);if(K1==0){while(!K1);num=1; //数码管显示1号"1"TR0=0; //关闭定时器0,时间停止TR1=1; //打开定时器1,使扬声器响一声s_flag=0; //关闭开始键标志位,使再按其他七个键不会响应}}if(K2==0) //下面七个键的处理同上{delay(10);if(K2==0){while(!K2);num=2;TR0=0;TR1=1;s_flag=0; //重要}}if(K3==0){delay(10);if(K3==0){while(!K3);num=3;TR0=0;TR1=1;s_flag=0;}}if(K4==0){delay(10);if(K4==0){while(!K4);num=4;TR0=0;TR1=1;s_flag=0;}}if(K5==0){delay(10);if(K5==0){while(!K5);num=5;TR0=0;TR1=1;s_flag=0;}}if(K6==0){delay(10);if(K6==0){while(!K6);num=6;TR0=0;TR1=1;s_flag=0;}}if(K7==0){delay(10);if(K7==0){while(!K7);num=7;TR0=0;TR1=1;s_flag=0;}}if(K8==0){delay(10);if(K8==0){while(!K8);num=8;TR0=0;TR1=1;s_flag=0;}}}void display(void){if(flag==1) //开始键按下,开始计时抢答{if(num!=0) //如果有人抢答,则显示相应的几号{P0=tabledu[num]; //显示几号抢到了P2=tablewe[0];delay(2);P0=0;P2=0XFF;}else //否则没人抢答,则前面不显示几号{P0=0;P2=0XFF;}P0=tabledu[s/10]; //下面为显示抢答倒计时P2=tablewe[2];delay(2);P0=0;P2=0XFF;P0=tabledu[s%10];P2=tablewe[3];delay(2);P2=0XFF;P0=0;}else //如果开始键没有按下,则显示F FF(若有违规者,则显示违规号码及FF)或时间调整{if(fall_flag==1) //违规显示{if(num!=0){P0=tabledu[num]; //显示几号违规了P2=tablewe[0];delay(2);P0=0;P2=0XFF;P0=tabledu[15]; //下面显示FF,表示违规了P2=tablewe[2];delay(2);P0=0; //消隐P2=0XFF;P0=tabledu[15];P2=tablewe[3];delay(2);P0=0;P2=0XFF;}else{P0=0;P2=0XFF;}}else //没有人违规才显示调整时间{if(K_startcountflag==1){P0=0X6D; //第一位数码管显示"5(S)"(表示抢答时间调整)P2=tablewe[0];delay(2);P0=0;P2=0XFF;P0=tabledu[time/10]; //下面显示调整的抢答时间P2=tablewe[2];delay(2);P0=0;P2=0XFF;P0=tabledu[time%10];P2=tablewe[3];delay(2);P0=0;P2=0XFF;}else if(K_timecountflag==1){P0=0X07; //第一位与第二位数码管合起来显示"T",表示答题时间调整P2=tablewe[0];delay(2);P0=0;P2=0XFF;P0=0X31;P2=tablewe[1];delay(2);P0=0;P2=0XFF;P0=tabledu[datitime/10];P2=tablewe[2];delay(2);P0=0;P2=0XFF;P0=tabledu[datitime%10];P2=tablewe[3];delay(2);P0=0;P2=0XFF;}else //否则显示F FF{P0=tabledu[15];P2=tablewe[0];delay(2);P0=0;P0=tabledu[15];P2=tablewe[2];delay(2);P0=0; //消隐P2=0XFF;P0=tabledu[15];P2=tablewe[3];delay(2);P0=0;P2=0XFF;}}}}void Time_Scan(void) //调整时间键扫描{if(K_startcount==0) //抢答时间调整{delay(10);if(K_startcount==0){while(!K_startcount);time++;if(time==50){time=20;}K_startcountflag=1; //将抢答时间标志位置1K_timecountflag=0; //同时关闭答题时间标志位}}if(K_timecount==0) //答题时间调整{delay(10);if(K_timecount==0){while(!K_timecount);datitime++;if(datitime==60){datitime=30;}K_timecountflag=1;K_startcountflag=0;}}}void main(void){T0_Init();while(1){Key_Scan(); //开始键扫描if((flag==0)&(s_flag==1)) //当开始键没按下及没有人违规时才可进行时间调整{Time_Scan();}if((flag==1)&(s_flag==0)) //当开始键按下及有人抢答才进行开始回答计时倒计时{if(K_Time==0){delay(10);if(K_Time==0){while(!K_Time);s=datitime;TR0=1;tt=0;TR1=1;}}}if((flag==0)&(s_flag==1)) //违规{Scan();if(num!=0) //开始键没有按下时,有人按下了抢答器,则置违规标志位{fall_flag=1;rled=0;}}if((flag==1)&(s_flag==1)) //如果开始键按下且抢答键没有人按下,则进行八路抢答键扫描{Scan();}display(); //显示到数码管上}}void timer0(void) interrupt 1{TH0=(65536-2000)/256; //2msTL0=(65536-2000)%256;if(b_flag) //开始(START)键按下,嘟一声(长1秒),表示开始抢答{beep=~beep;}elsebeep=1;if(s<5) //抢答时间快到报警,隔1秒响一声且红灯闪烁,响三声{if(s%2==0){b_flag=1;rled=0;}else{b_flag=0;rled=1;}}tt++;if(tt==500) //1秒{tt=0;s--;b_flag=0; //关闭开始键按下响一秒的嘟声if(s==-1){s=20;TR0=0;flag=0; //显示F FFs_flag=1;num=0;rled=1;}}}void timer1(void) interrupt 3 //定时器1处理有人按下抢答器嘟一声(长1秒) {TH1=(65536-2000)/256;TL1=(65536-2000)%256;beep=~beep;t1++;if(t1==500){t1=0;TR1=0;}}。

八路抢答器C语言程序(带音乐)完整版

八路抢答器C语言程序(带音乐)完整版

#include <reg52.h>/*-----------------------------------------------------------宏定义------------------------------------------------------------*/#define uint unsigned int#define uchar unsigned char/*-----------------------------------------------------------共阴极数码管编码表0 - f显示------------------------------------------------------------*/unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*-----------------------------------------------------------音乐程序------------------------------------------------------------*/unsigned char timer1h,timer1l,time; //世上只有妈妈好数据表code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0}; // 音阶频率表高八位code unsigned char FREQH[]={ 0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,} ;// 音阶频率表低八位code unsigned char FREQL[]={ 0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i0xEE,0x44,0x6B,0xB4,0xF4,0x2D,0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,}; /*-----------------------------------------------------------变量定义------------------------------------------------------------*/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;sbit state = P3^4;sbit beep = P3^5;sbit start_stop = P3^6;sbit reset = P3^7;bit start_stop_flag = 0;bit key1_flag = 0;bit key2_flag = 0;bit key3_flag = 0;bit key4_flag = 0;bit key5_flag = 0;bit key6_flag = 0;bit key7_flag = 0;bit key8_flag = 0;bit reset_flag = 0;bit action = 0;uchar second = 10;uchar timer0_count = 0;uchar number = 0;uchar number_display = 0;/*-----------------------------------------------------------延时函数------------------------------------------------------------*/ void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*----------------------------------------------------------- 数码管显示驱动函数------------------------------------------------------------*/ void display(uchar number,uchar second){uchar second_first,second_second;second_first = second / 10;second_second = second % 10;P2 = 0xfe;P0 = table[number];delay(2);P2 = 0xfd;P0 = 0x40;delay(2);P2 = 0xfb;P0 = table[second_first];delay(2);P2 = 0xf7;P0 = table[second_second];delay(2);}/*----------------------------------------------------------- 开始键扫描函数------------------------------------------------------------*/ void start_stop_keyscan(){if(start_stop == 0){delay(8);if((start_stop == 0)&&(!start_stop_flag)){start_stop_flag = 1;action = 1;TR0 = 1;state = 0;}}else{start_stop_flag = 0;}}/*----------------------------------------------------------- 八位抢答键扫描函数------------------------------------------------------------*/ uchar key_scan8(){if(key1 == 0){delay(8);if((key1 == 0)&&(!key1_flag)){key1_flag = 1;number = 1;beep=0;delay(400);beep=1;number_display = number;}}else{key1_flag = 0;number = 0;}if(key2 == 0){delay(8);if((key2 == 0)&&(!key2_flag)){key2_flag = 1;number = 2;beep=0;delay(400);beep=1;number_display = number;}}else{key2_flag = 0;number = 0;}if(key3 == 0){delay(8);if((key3 == 0)&&(!key3_flag)){key3_flag = 1;number = 3;beep=0;delay(400);beep=1;number_display = number;}}else{key3_flag = 0;number = 0;}if(key4 == 0){delay(8);if((key4 == 0)&&(!key4_flag)){key4_flag = 1;number = 4;beep=0;delay(400);beep=1;number_display = number;}}elsekey4_flag = 0;number = 0;}if(key5 == 0){delay(8);if((key5 == 0)&&(!key5_flag)){key5_flag = 1;number = 5;beep=0;delay(400);beep=1;number_display = number;}}else{key5_flag = 0;number = 0;}if(key6 == 0){delay(8);if((key6 == 0)&&(!key6_flag)){key6_flag = 1;number = 6;beep=0;delay(400);beep=1;number_display = number;}}else{key6_flag = 0;number = 0;}if(key7 == 0){delay(8);if((key7 == 0)&&(!key7_flag)){key7_flag = 1;number = 7;beep=0;delay(400);beep=1;number_display = number;}}else{key7_flag = 0;number = 0;}if(key8 == 0){delay(8);if((key8 == 0)&&(!key8_flag)){key8_flag = 1;number = 8;beep=0;delay(400);beep=1;number_display = number;}}else{key8_flag = 0;number = 0;}if(number_display != 0){return 1;}else{return 0;}}/*----------------------------------------------------------- 复位键扫描函数------------------------------------------------------------*/ void reset_keyscan(){if(reset == 0){delay(8);if((reset == 0)&&(!reset_flag)){reset_flag = 1;number_display = 0;state = 1;}}else{reset_flag = 0;}}void delay_fm(unsigned char t){ unsigned char t1;unsigned long t2;for(t1=0;t1<t;t1++){ for(t2=0;t2<8000;t2++){ ; }}TR1=0;}void time1() interrupt 3{TR1=0;beep=!beep;TH1=timer1h;TL1=timer1l;TR1=1;}void song(){ TH1=timer1h;TL1=timer1l;TR1=1;delay_fm(time);}/*-----------------------------------------------------------主函数------------------------------------------------------------*/void main(){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=0;while(1){start_stop_keyscan();reset_keyscan();while(action){while(!key_scan8()){unsigned char k,i;TMOD=0x11; //置CT0定时工作方式1EA=1;ET1=1;//IE=0x82 //CPU开中断,CT0开中断i=0;while(i<100){ //音乐数组长度,唱完从头再来k=sszymmh[i]+7*sszymmh[i+1]-1;timer1h=FREQH[k];timer1l=FREQL[k];time=sszymmh[i+2];i=i+3;song();second = 10;break;}}TR0 = 0;second = 10;display(number_display,second);action = 0;break;}display(number_display,second);}}/*-----------------------------------------------------------中断服务函数------------------------------------------------------------*/void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;timer0_count ++;if(timer0_count == 20){timer0_count = 0;second --;if(second == 0){TR0 = 0;number_display = 0;state = 1;action = 0;}}}。

C51单片机8路抢答器实训报告

C51单片机8路抢答器实训报告

《单片机与接口技术》课程设计报告抢答系统设计学生姓名:_ _____曾超________学号:___201358264031____________班级:___物联网____________指导老师:__刘艳军_____________日期:__2015/06/28_____________1 题目与要求 (3)1.1 问题提出 (3)1.2 本系统涉及的知识点 (3)2系统硬件设计 (3)2.1 模块图 (3)2.2 部分模块电路图 (4) (6)3系统软件设计 (6)4 总结 (20)4.1程序调试情况 (20)4.2本人在程序设计中感想 (22)(四)参考文献(左对齐,宋体粗四号) (22)1 题目与要求1.1 问题提出实现一个“抢答系统设计”。

1)制作一个8人抢答器,以开关中的某个开关的按下(闭合)作为抢答按键。

2)无人抢答时,8只数码管轮流循环显示1~8(跑马),谁先抢答,数码管停止跑马,8个数码管同时亮谁的编号,并用蜂鸣器发提示音;其后再有人按键,系统不予响应,直到复位键按下,开始下一轮抢答。

3)主持人端有一个复位键,可重新开始抢答;有一个答案正确的按键,和一个答案错误的按键,按下时有不同的提示音;要想实现8路抢答器,首先要清楚抢答器的功能。

需要设置多少个功能键?功能按键通过哪个I/O口控制?对于此系统,我们第一步应该做什么,先完成哪个部分?1.2 本系统涉及的知识点本系统涉及到的知识点有:1.按键的处理。

2.数码管的动态静态显示。

2系统硬件设计2.1 模块图2.2 部分模块电路图1. 4*3矩阵键盘,本系统中只用到3个功能键,故令P1^4=0控制列线,P1^1,P1^2,P^3分别为横线,不需要做扫描。

分别控制S1,S5,S9.2.8路独立按键,为本系统的8路抢答按键。

通过P3口输入控制。

3.蜂鸣器,接在P1^5.3系统软件设计延时函数模块代码如下:V oid mDelay(unsigned int Delay){unsigned int i;for(;Delay>0;Delay--){for(i=0;i<124;i++){;}}}主程序函数模块,代码:#include<reg51.h>sbit P14=P1^4;sbit Right=P1^1;sbit False=P1^2;sbit P13=P1^3;sbit Beep = P1^5;unsigned char table[8]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f}; unsigned char wei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; void main(){int i,t;P14=0;//ap1:P3=0xff;while(1){for(i=0;i<8;i++){P2=wei[i]; //从这里开始修改选手编号跑马效果P0=table[i];mDelay(150);if(P3!=0xff){//r8=P3;switch(P3){case 0xfe:{//for(t=0;t<2;t++)//抢答后选手编号闪烁次数//{P2=0xfe;//按下哪一个按键,则数码管位码送该位。

8位竞赛抢答器程序与仿真图

8位竞赛抢答器程序与仿真图

8位竞赛抢答器程序与仿真图设计要求以单片机为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,分别用8个按钮S0~S7表示。

设置一个系统清除和抢答控制开关S,开关由主持人控制。

抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。

当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间为0.5左右。

如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。

程序:ORG0000HLJMPMAINORG0003HLJMPSHESHORG000BHLJMPIT0PORG0100HMAIN:MOVTMOD,#01HMOVTH0,#3CHMOVTL0,#0B0HSETBEASETBET0跳沿触发。

SETBE某0SETBIT0MOVR4,#30MOVR3,#0AH//定时器T0工作于方式1//1秒的初值//开总中断,T0中断,外部中断0开启,外部中断//R4存放30,用于存放倒计时初值//=========复位部分程序======FW:JNBP3.1,FW1JMPFWFW1:LCALLDELAYJNBP3.1,FW2JMPFWFW2:MOVR3,#0BH的代码MOVA,R4MOVR0,ALCALL某IANSH1//=========开始部分程序======SAM:JNBP3.0,PKJMPSAMPK:JNBP3.0,PK1JMPSAMPK1:MOVR3,#0BHSETB TR0MOVR2,#0AHHERE:CJNER1,#01H,YY入STARJMPSTARYY:JMPHERE//=======中断程序=======IT0P:CLRTR0DECR2CJNER2,#05H,J某0clrP3.6 J某0:CJNER2,#00H,J某1etbP3.6DECR0LCALL某IANSH1MOVR2,#0AHJ 某1:LCALLSAMOJNBP3.1,QFWJMPCZQFW:MOVR1,#01HJMPRETURN//按下则返回CZ:CJNER0,#00H,CZ1//倒计时是否计时完毕clrP3.6//及时完毕无人抢答则扬声器开启LCALLDELAY5MOVR1,#01HJMPRETURNCZ1:MOVTH0,#3CHMOVTL0,#0B0HSETBTR0 RETURN:RETI//========选手键盘扫描程序========SAMO:JNBP1.0,某S1JNBP1.1,某S2JNBP1.2,某S3JNBP1.3,某S4JNBP1.4,某S5JNBP1.5,某S6JNBP1.6,某S7JNBP1.7,某S80RETURN2:RET某S80:LJMP某S8某S1:LCALLDELAYJNBP1.0,某S11JMPRETURN2某S11:MOVR1,#01HetbP3.6MOVR3,#01HLCALL某IANSH1JMPRETURN2某S2:LCALLDELAYJNBP1.1,某S22JMPRETURN2某S22:MOVR1,#01HetbP3.6MOVR3,#02HLCALL某IANSH1JMPRETURN2某S3:LCALLDELAYJNBP1.2,某S33JMPRETURN2某S33:MOVR1,#01HetbP3.6MOVR3,#03HLCALL某IANSH1JMPRETURN2某S4:LCALLDELAY//延时1秒//R1设1//中断返回//计时器初值重装//预扫描选手按键是否按下//未按下则返回//去抖动再判是否按下//按下则显示1号扬声器关闭//按下则显示2号扬声器关闭//按下则显示3号扬声器关闭JNBP1.3,某S44JMPRETURN2某S44:MOVR1,#01HetbP3.6MOVR3,#04HLCALL某IANSH1JMPRETURN2某S5:LCALLDELAYJNBP1.4,某S55JMPRETURN2某S55:MOVR1,#01HetbP3.6MOVR3,#05HLCALL某IANSH1JMPRETURN2某S6:LCALLDELAYJNBP1.5,某S66JMPRETURN2某S66:MOVR1,#01HetbP3.6MOVR3,#06HLCALL某IANSH1JMPRETURN2某S7:LCALLDELAYJNBP1.6,某S77JMPRETURN2某S77:MOVR1,#01HetbP3.6MOVR3,#07HLCALL某IANSH1JMPRETURN2某S8:LCALLDELAYJNBP1.7,某S88JMPRETURN2某S88:MOVR1,#01HetbP3.6MOVR3,#08HLCALL某IANSH1JMPRETURN2//=========显示程序======某IANSH1:MOVA,R0MOVB,#0AH位DIVABMOVR7,AMOVR6,B某IANSH2:SETBP0.4CLRP0.5CLRP0.6//按下则显示4号扬声器关闭//按下则显示5号扬声器关闭//按下则显示6号扬声器关闭//按下则显示7号扬声器关闭//按下则显示8号扬声器关闭//R0中存放的倒计时显示值除10分出十位和个//十位存入R7中//个位存入R6中//=======抢答时间设置程序======SHESH:INCR0//倒计时初值加1CJNER0,#31,BQL//倒计时初值设置超过30自动清零MOVR0,#00HBQL:MOVR3,#0BHMOVA,R0//倒计时初值存入其专用寄存器R4中,这样可以全局不变,R0会倒计时中递减而改变MOVR4,ALCALL某IANSH1RETI//====10m延时程序(去抖动)====DELAY:MOVR7,#20D1:MOVR6,#248D2:DJNZR6,D2DJNZR7,D1RET //1延时程序(无人抢答报警)====DELAY5:MOVR7,#40DL1:MOVR6,#50DL2:MOVR5,#248DL3:DJNZR5,DL3DJN ZR6,DL2DJNZR7,DL1RET//======数码管显示调用代码======SEGTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,8EH,0F FH//0,1,2,3,4,5,6,7,8,9,F,灭END说明:仿真开始显示FFF;按下复位键显示倒计时初值,起初设的是30秒;再按下设时键,按一下计数初值加1,到30自动清零;按下开始键开始倒计时,每减一,有0.5秒的声响;说明:仿真开始显示FFF;按下复位键显示倒计时初值,起初设的是30秒;再按下设时键,按一下计数初值加1,到30自动清零;按下开始键开始倒计时,每减一,有0.5秒的声响;。

八路抢答器实验报告

八路抢答器实验报告

八路抢答器的实验报告一、设计题目八路抢答器设计二、设计要求1.设计一个竞赛抢答器, 可同时供8名选手或者8个代表队参加比赛, 他们的编号分别是 1.2.3.4.5.6.7、8, 各用一个抢答器的按钮, 按钮的编号与选手的编号相对应。

2.给节目主持人设计一个控制开关, 用来控制系统的清零和抢答开始。

3.抢答器具有数据锁存、显示的功能和声音提示功能。

抢答开始后, 若有选手按动按钮, 编号立即锁存, 在数码管上显示选手的编号, 并有声音提示。

此外, 要封锁其他选手抢答。

优先抢答的选手的编号一致保持到主持人将系统清零为止。

三、设计思路工作原理为:接通电源前, 抢答按钮与清零按钮都未按下。

接通电源后, 主持人清除开关处于工作状态, 抢答器处于工作状态, 编号显示器显示为0, 蜂鸣器未鸣响(为方便控制, 电路设计为清除开关按下时是清零状态, 未按下时为工作状态)。

等一轮抢答完成后(七段数码管显示出优先抢答队员编号, 并蜂鸣器鸣响), 主持人将清零开关按下数码管清为零, 蜂鸣器停止鸣响。

然后先后把各队员抢答按钮与主持人清零按钮复位。

即可进入下一轮抢答。

原理为:电路中清零按钮控制D触发器集成块74LS175清零端低电平输入, 按下时清零端输入为低电平(清零端低电平有效), 未按下时输入高电平。

清零后D 触发器集成块74LS175 Q`端输出全变为高电平, 使编码器74HC147(有效输入电平为低电平)无有效低电平输入, 七段数码管上显示为0。

抢答时, 队员按下抢答按钮的时间有先后次序, 电路中每个抢答按钮连接一个D触发器, 当一抢答按钮按下后其对应的触发器锁存住信号, Q`端输出有效低电平, 同时通过反馈电路使D触发器集成块得脉冲信号终止输入, 从而使其他D触发器停止工作, 抢答后也无法锁存。

达到有先输入有先锁存功能。

原理为:根据与门功能特点:只要有一低电平输入输出即为低电平。

当D触发器集成块74LS175输出端输出一有效低电平后, 电路中第7个与门U15A输出即为低电平, 而U15A输出信号又与555触发器构成的多谐振荡器输出信号相与, 因此只要U15A输出低电平, 多谐振荡器产生的脉冲就无法输入, 只有当D触发器集成块74LS175输出端输出全为高电平时脉冲才正常输入, 各D触发器正常工作。

基于单片机的八路抢答器程序设计

基于单片机的八路抢答器程序设计

基于单片机的八路抢答器程序设计(C语言)#include <reg51.h>#define uchar unsigned char#define GPIO_KEY P1sbit key1_zhuchi=P3^1; //主持人按键sbit key2_addt=P3^0; //加时按键sbit key3_mint=P3^2; //减时按键sbit beep=P1^5; //蜂鸣器报警sbit LED=P2^0; //LED指示灯sbit LSA=P2^2; //数码管位选sbit LSB=P2^3;sbit LSC=P2^4;//8段共阴数码管0~9段选uchar time,KeyValue,flag,count,m,a,tsbz;//倒计时时间,检测到的选手号,允许抢答标志,主持人按键检测次数,溢出标志,加时判断,时间调整标志uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void keyscan(); //键盘扫描函数void display(); //数码管显示函数void delay(uchar i); //延时函数void Key_down(); //选手按键按键扫描函数void main() //主函数{time=10; //初设抢答时间为10sKeyValue=0; //设置抢答没开始时选手号为0tsbz=1; //调时间标志flag=0; //答题允许标志m=0; //产生1S的溢出标志TMOD=0x01; //定时器0工作与方式1EA=1;ET0=1;while(1){keyscan();display();}}void keyscan() //键盘扫描{if(key2_addt==0&&tsbz==1) //为抢答或答题加时间{delay(8); //消抖if(key2_addt==0&&tsbz==1){while(!key2_addt);a++;if(a==1){TR0=0;time++;flag=0;}if(a==2){TR0=0;a=0;time++;flag=0;}}}if(key3_mint==0&&tsbz==1)//为抢答或答题减时间{delay(8);if(key3_mint==0&&tsbz==1){while(!key3_mint);a++;if(a==1){TR0=0;time--;flag=0;}if(a==2){TR0=0;a=0;time--;flag=0;}}}if(key1_zhuchi==0)//主持人按键按下{delay(8); //延时消抖if(key1_zhuchi==0){while(!key1_zhuchi); //按下count++;if(count==1) //主持人按键按下一次,开始抢答倒计时{tsbz=0; //不允许调时flag=1; //允许抢答TH0=0x3c;TL0=0xb0;TR0=1; //开启计时器}if(count==2) //主持人按键按下两次,切换到30s答题倒计时界面,可进行答题时间调整{LED=1;tsbz=1; //允许调整时间time=30;TR0=0; //停止计时flag=0; //不允许抢答}if(count==3) //主持人按键按下三次,答题时间开始倒计时{tsbz=0; //不允许调时TH0=0x3c;TL0=0xb0;TR0=1; //开启计时器flag=0; //不允许抢答}if(count==4) //主持人按键按下四次,全部清零{tsbz=1;TR0=0;time=10;flag=0;count=0;KeyValue=0;LED=1;}}}if(flag==1) //允许抢答后进行选手按键扫描{Key_down();}}void display() //显示函数{LSA = 1;LSB = 1;LSC = 1;P0=table[KeyValue]; //选手号码显示delay(100);P0=0x00; //消隐LSA = 0;LSB = 1;LSC =1;P0=0x40; //用来隔开时间显示和号码显示delay(100);P0=0x00; //消隐LSA = 1;LSB = 0;LSC =1;P0=table[time/10]; //计时十位显示delay(100);P0=0x00; //消隐LSA = 0;LSB = 0;LSC =1;P0=table[time%10]; //计时个位显示delay(100);P0=0x00; //消隐}void INT_0() interrupt 1 //中断函数{TH0=0x3c; //50ms定时初值TL0=0xb0;m++;if(m==20) //产生1S的时间{m=0;time--; //倒计时if(time<=5&&time>=0){uchar b=100;while(b--) //蜂鸣器报警{beep=~beep;delay(100);LED=~LED; //LED闪烁报警delay(50000);}}}if(time==0) //没选手抢答或答题时间结束{LED=0;TR0=0; //关闭定时器flag=0;//不允许抢答}}void delay(uchar i) //延时{while(i--);}void Key_down() //扫描选手按键{uchar c=100;uchar n=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)//读取按键是否按下delay(8);//延时10ms进行消抖if(GPIO_KEY!=0x0f)//再次检测键盘是否按下{GPIO_KEY=0X0F;//测试列switch(GPIO_KEY){case(0X07): KeyValue=1;break;case(0X0b): KeyValue=2;break;case(0X0d): KeyValue=3;break;case(0X0e): KeyValue=4;break;}GPIO_KEY=0XF0;//测试行switch(GPIO_KEY){case(0X70): KeyValue=KeyValue;break;case(0Xb0): KeyValue=KeyValue+4;break;case(0Xd0): KeyValue=KeyValue+9;break;case(0Xe0): KeyValue=KeyValue+9;break;}}}while((n<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测{delay(8);n++;}switch(KeyValue) //读取选手按键{case 1: //一号选手抢答成功delay(8);if(KeyValue==1){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 2: //二号选手抢答成功delay(8);if(KeyValue==2){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 3: //三号选手抢答成功delay(8);if(KeyValue==3){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 4: //四号选手抢答成功delay(8);if(KeyValue==4){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 5: //五号选手抢答成功delay(8);if(KeyValue==5){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 6: //六号选手抢答成功delay(8);if(KeyValue==6){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 7: //七号选手抢答成功delay(8);if(KeyValue==7){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 8: //八号选手抢答成功delay(8);if(KeyValue==8){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;}}。

8位抢答器(原理图+汇编程序)

8位抢答器(原理图+汇编程序)

ORG 000JMP BEGINTABLE: ; 共阴极数码管显示代码表DB 3FH,06H,5BH,4FH,66H ; 01234DB 6DH,7DH,07H,7FH ; 46789DELAY: MOV R5, #20 ; 延时20×20ms子程序LOOP4: MOV R6, #50LOOP5: MOV R7, #100DJNZ R7, $DJNZ 6, LOOP5DJNZ R5, LOOP4RETBEGIN: MOV P2, #0FFH ;P2口置高电平,准备接收信号 MOV R4, #0 ; "R4"的位标志值清零。

MOV A, R4 ; "R4"位标志值送A寄存AGAIN: MOV DPTR, #TABLE ;共阴极数码管代码表首址送 MOVC A, @A+DPTR ;取出显示"0"的代码送P口显示 MOV P1, ALOOP1: MOV A, P3 ;接收P3口的抢答信号。

CPL A ;抢答信号求反JZ LOOP1 ;如果没有抢答信号再返回LOOP1LOOP2: RRC A ;有抢答信号则逐次移动判断是那一位抢答INC R4 ;每移一次位,R4位标志值加1JNC LOOP2 ;如果没有遇到抢答信号返回LOOP1继续移位MOV A, R4 ;遇到抢答信号把R4位标志的只送A MOVC A, @A+DPTR ;找到相应位的显示代码MOV P1, A ;送P1口显示LOOP3: JNB P2.2, BEGIN ;若主持人按了复位信号健则转向程序复位CPL P2.0 ;若没按复位信号键,则通过P2.2给出高低信号驱动蜂鸣器LCALL DELAY ;调用延时程序SJMP LOOP3 ;P2.2口反复间隔0.4秒变化,驱动蜂鸣器 END。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机综合实验报告题目: 8路抢答器实验班级:姓名:学号:指导老师:时间:一、实验内容:以单片机为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,分别用8个按钮S0~S7表示。

本实验有Protues软件仿真。

分别设置一个抢答控制开关S1和复位开关S2,由主持人控制。

抢答器具有锁存与显示功能。

即选手按按钮抢答时,锁存相应的编号,并且优先抢答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。

抢答器具有定时抢答功能,且一次抢答的时间由主持人设定为30秒。

当主持人启动“开始”键后,定时器进行减计时,同时绿色LED灯亮。

二、实验电路及功能说明分别设置一个抢答控制开关S1和复位开关S2,由主持人控制。

抢答器具有锁存与显示功能。

即选手按按钮抢答时,锁存相应的编号,并且优先抢答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。

参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统复位为止。

复位后参赛队员可继续抢答。

如果定时时间已到,无人抢答,本次抢答无效,系统报警红色LED灯亮,并禁止抢答,定时显示器上显示00。

三、实验程序流程图:主程序;非法抢答序;抢答时间调整程序;回答时间调整程序;倒计时程序;正常抢答处理程序;犯规处理程序;显示及发声程序。

主流程图如下图所示子程序四、实验结果分析五、心得体会.六、程序清单#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit wela_a=P3^0;sbit wela1=P3^1;sbit wela2=P3^7;sbit rest=P3^5;sbit host=P3^6;sbit led1=P3^4;//绿灯sbit led2=P3^3;//红灯sbit led3=P3^2;//黄灯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;uchar x,q,d,s,ge,t0,t1,start,flag; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void init();/*初始函数申明*/void display(uchar s,uchar ge,uchar a); void delay(uint z); void keyscan();void main(){init();display(s,ge,a);while(1){if(host==0) //主持人控制开关{delay(5);if(host==0){flag=1;start=1;delay(5); 延时while(!host); 检测开关}}if(rest==0) //复位{delay(5);if(rest==0){q=30;led2=1;led3=1;x=0;delay(5);.start=1;delay(5);while(!rest);}}if(flag==1){if(start==0)//选手按下,倒计10秒开始 {led3=0;wela1=0;wela2=0;delay(1);TR0=0;TR1=1;display(s,ge,a);delay(1);}if(start==1)//主持人按下,倒计时30秒{led1=0;wela1=0;wela2=0;delay(1);TR0=1;TR1=0;display(s,ge,a);delay(1);keyscan();}}}}void init()/*初始化*/{t0=0;t1=0;flag=0;q=30;d=10;wela_a=0;a=0;TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET0=1;ET1=1;TR0=0;TR1=0;}void display(uchar s,uchar ge,uchar a)/*数码管动态扫描*/{wela1=1;P0=table[ge];delay(5);wela2=1;.P0=table[s];delay(5);wela_a=0;P2=table[a];delay(5);}void keyscan()/*按键扫描函数*/ {if(key1==0){delay(5);if(key1==0){a=1;P2=table[a];start=0;TR1=1;TR0=0;delay(5);while(!key1);}}if(key2==0){delay(5);if(key2==0){a=2;P2=table[a];start=0;delay(5);while(!key2);}}if(key3==0){delay(5);if(key3==0){a=3;P2=table[a]; start=0;delay(5);while(!key3);}}if(key4==0){delay(5);if(key4==0){a=4;P2=table[a]; start=0;delay(5);while(!key4);}}if(key5==0){.delay(5);if(key5==0){a=5;P2=table[a]; start=0;delay(5);while(!key5);}}if(key6==0){delay(5);if(key6==0){a=6;P2=table[a]; start=0;delay(5);while(!key6);}}if(key7==0){delay(5);if(key7==0){a=7;P2=table[a]; start=0;delay(5);while(!key7);}}if(key8==0){delay(5);if(key8==0){a=8;P2=table[a];start=0;delay(5);while(!key8);}}}void delay(uint z)/*延时函数*/{uint i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}void time0() interrupt 1/*定时器0*/ {TH0=(65536-50000)/256;TL0=(65536-50000)%256;s=q/10;ge=q%10;t0++;.if(t0==20){t0=0;q--;s=q/10;ge=q%10;if(q==0){while(1){q=0;a=0;led1=1;led2=0;wela1=0;wela2=0;delay(1);display(s,ge,a);}}}}void time1() interrupt 3/*定时器1*/ {TH1=(65536-50000)/256;TL1=(65536-50000)%256;s=d/10;ge=d%10;t1++;if(t1==20){t1=0;d--;s=d/10;ge=d%10;if(d==0){while(1){d=0;a=0;led1=1;led3=1;led2=0;wela1=0;wela2=0;delay(1);display(s,ge,a);}}}}//最后,给朋友们一点点提示,本程序有一点点小问题,有个中断没关,当主持人复位之后,后面的选手回答问题的时间就没有10秒了(可怜啊)。

但还是可以运行的,要求不高的朋友可借鉴一哈。

相关文档
最新文档