您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 单片机实验8路抢答器C语言版
单片机综合实验报告题目:8路抢答器实验班级:姓名:学号:指导老师:时间:一、实验内容:以单片机为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,分别用8个按钮S0~S7表示。本实验有Protues软件仿真。分别设置一个抢答控制开关S1和复位开关S2,由主持人控制。抢答器具有锁存与显示功能。即选手按按钮抢答时,锁存相应的编号,并且优先抢答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。抢答器具有定时抢答功能,且一次抢答的时间由主持人设定为30秒。当主持人启动“开始”键后,定时器进行减计时,同时绿色LED灯亮。二、实验电路及功能说明分别设置一个抢答控制开关S1和复位开关S2,由主持人控制。抢答器具有锁存与显示功能。即选手按按钮抢答时,锁存相应的编号,并且优先抢答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统复位为止。复位后参赛队员可继续抢答。如果定时时间已到,无人抢答,本次抢答无效,系统报警红色LED灯亮,并禁止抢答,定时显示器上显示00。三、实验程序流程图:主程序;非法抢答序;抢答时间调整程序;回答时间调整程序;倒计时程序;正常抢答处理程序;犯规处理程序;显示及发声程序。主流程图如下图所示子程序四、实验结果分析五、心得体会六、程序清单#includereg51.h#defineucharunsignedchar#defineuintunsignedintsbitwela_a=P3^0;sbitwela1=P3^1;sbitwela2=P3^7;sbitrest=P3^5;sbithost=P3^6;sbitled1=P3^4;//绿灯sbitled2=P3^3;//红灯sbitled3=P3^2;//黄灯sbitkey1=P1^0;sbitkey2=P1^1;sbitkey3=P1^2;sbitkey4=P1^3;sbitkey5=P1^4;sbitkey6=P1^5;sbitkey7=P1^6;sbitkey8=P1^7;ucharx,q,d,s,ge,t0,t1,start,flag;ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voidinit();/*初始函数申明*/voiddisplay(uchars,ucharge,uchara);voiddelay(uintz);voidkeyscan();voidmain(){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();}}}}voidinit()/*初始化*/{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;}voiddisplay(uchars,ucharge,uchara)/*数码管动态扫描*/{wela1=1;P0=table[ge];delay(5);wela2=1;P0=table[s];delay(5);wela_a=0;P2=table[a];delay(5);}voidkeyscan()/*按键扫描函数*/{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);}}}voiddelay(uintz)/*延时函数*/{uinti,j;for(i=z;i0;i--)for(j=110;j0;j--);}voidtime0()interrupt1/*定时器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);}}}}voidtime1()interrupt3/*定时器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秒了(可怜啊)。但还是可以运行的,要求不高的朋友可借鉴一哈。
本文标题:单片机实验8路抢答器C语言版
链接地址:https://www.777doc.com/doc-7945952 .html