1、 目录一、 设计题目2二、 功能说明2三、 系统设计2四、 相关知识2五、 元器件清单2六、 硬件设计和软件设计3七、 总电路图与程序7八、 设计心得16一、 设计题目抢答器的设计二、 功能说明(1) 抢答器可同时供8名选手或8个代表队比赛,每名选手或代表队使用一个按钮,8个按钮分别用1-8号表示。(2) 设置系统复位和抢答开始控制开关,该开关由主持人控制。(3) 抢答器具有定时抢答功能,且一次抢答的时间有主持人设定(如30s)。当主持人启动“开始”键后,显示器显示抢答时间倒计时,同时扬声器发出短暂的提示声响,声响持续的时间为0.5s左右。(4) 参赛选手在设定的时间内进行抢答,抢答有效,显示
2、器上显示选手的编号和限答的时间倒计时,并保持到主持人将系统复位为止。(5) 可以通过按键操作修改答题限制时间和抢答限制时间。(6) 如果抢答时间已到,无人抢答,本次抢答无效,系统复位。三、 系统设计本系统采用80C51单片机作为控制器,主要由电源电路、时钟电路、复位电路、选手按键电路、数码显示电路、声音提示电路组成。四、 相关知识(1)80C51单片机工作原理(2)复位电路工作原理及电路设计(3)时钟电路工作原理及电路设计(4)按键电路的设计(5)蜂鸣器驱动电路的设计(6)数码显示的原理及应用(7)优先锁存程序的设计及调试方法五、 元器件清单控制器单片机80C51时钟电路晶体振荡器12MHz,
3、电容30pF复位电路电解电容22Uf/10V,电阻1k欧声音提示电路晶体管2N5088,喇叭0.5W/8欧,电阻100欧,电阻3.3欧选手按键按键SW-PB主持人按键按键SW-PB数码显示LED数码管,四联共阴,排阻8千欧*8六、 硬件设计和软件设计(1) 复位模块图1.复位模块电路图while(!Key_stop);while(1) /在显示选手回答倒计时时只有在stop按键按下时,才可按复位键display(num,Answer_time);/显示选手编号和回答倒计时if(Key_restart=0)delay(10);if(Key_restart=0)/热复位键,从头开始下一轮beep(
4、);goto Top;(2) 时钟模块图2.时钟模块电路图void init()/初始化函数EA=1;/开总中断;TMOD=0x11;/定时器工作方式1,16位定时计数器TH0=(65536-50000)/256;/50usTL0=(65536-50000)%256;ET0=1;/开定时器0中断(暂时不启动定时器)TH1=(65536-50000)/256;/50usTL1=(65536-50000)%256;ET1=1;/开定时器0中断(暂时不启动定时器)EX0=1;/启动外中断0EX1=1;/启动外中断1P1=0x00;/读P1口的数据要先置1准备count_0=0;/定时器中的计数清零c
5、ount_1=0;(3) 声音提示模块图3.声音提示模块电路图void beep() laba=1; delay(100); laba=0;void beep_last() laba=1; delay(500); laba=0; (4) 数码显示模块图4.显示模块电路图void displaySet(uchar Settime) Settime-;P2=0xfd;/1011 1111P0=tableSettime%10;/时间的个位delay(10);P2=0xfd;/1011 1111P0=0x00;/消余辉delay(10);P2=0xfe;/ 0111 1111P0=tableSetti
6、me/10;/时间的十位delay(10);P2=0xfe;/0111 1111P0=0x00;/消余辉delay(10);void display(uchar num,uchar time)/显示数字的函数 P2=0xfe;P0=tablenum;delay(10);P2=0xfe;/0111 1111P0=0x00;/消余辉delay(10); time-;P2=0xf7;/1110 1111P0=tabletime%10;/时间的个位delay(10);P2=0xf7;/1110 1111P0=0x00;/消余辉delay(10);P2=0xfb;/ 1101 1111P0=tablet
7、ime/10;/时间的十位delay(10);P2=0xfb;/1101 1111P0=0x00;/消余辉delay(10);(5) 按键模块图5.按键模块电路图if(Key_start=0) Button=P1; if(Key_start=0)/主持人按下抢答键,抢答正式开始!Race_time=Race_time_temp;Answer_time=Answer_time_temp;beep();TR1=1;/抢答时间开始倒计时 while(1) /查询是否有按键按下,进入抢答循环display(12,Race_time);/显示抢答倒计时if(Race_time=0)beep();TR1=
8、0;/关闭定时器1break;Data=P1;/把P1口的数据送给变量if(Data!=0xff)/有按键按下delay(10);if(Data!=0x00)/确定有按键按下 Button=Data;/传递数据扫描值 TR0=1;/启动定时器0 TR1=0;/关闭定时器1 break;/不再进行查询是否有按键按下了 switch(Button) case 0x01:num=1;beep();break;/1号选手 case 0x02:num=2;beep();break;/2号选手 case 0x04:num=3;beep();break;/3号选手 case 0x08: num=4;beep
9、();break;/4号选手 case 0x10:num=5;beep();break;/5号选手 case 0x20:num=6;beep();break;/6号选手 case 0x40: num=7;beep();break;/7号选手 case 0x80:num=8;beep();break;/8号选手 七、 总电路图与程序图6.八路抢答器总电路图总程序:#include#define uchar unsigned char#define uint unsigned intsbit Key_add=P34;/时间+sbit Key_subtract=P35;/时间-sbit Key_st
10、art=P30;/开始键,sbit Key_stop=P31;/停止键sbit Key_set_R=P32;/抢答时间设置键sbit Key_set_A=P33;/回答时间设置键sbit Key_restart=P31;/复位键sbit laba=P36;/蜂鸣器void displaySet(uchar Settime);uchar code table = 0xc0 ,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6,0xf0,0xb6;/段码表void delay(uint z);/延时函数声明void display
11、(uchar num,uchar time);/显示数字函数声明void beep();/蜂鸣器函数void beep_last();void init();uchar Race_time,Answer_time,Race_time_temp=20,Answer_time_temp=30;/抢答时间、回答时间变量uchar count_0,count_1;/定时中计数uchar Button,Data,num;void main() init();Top: if(Key_start=0) Button=P1; if(Key_start=0)/主持人按下抢答键,抢答正式开始!Race_time=
12、Race_time_temp;Answer_time=Answer_time_temp;beep();TR1=1;/抢答时间开始倒计时 while(1) /查询是否有按键按下,进入抢答循环display(12,Race_time);/显示抢答倒计时if(Race_time=0)beep();TR1=0;/关闭定时器1break;Data=P1;/把P1口的数据送给变量if(Data!=0xff)/有按键按下delay(10);if(Data!=0x00)/确定有按键按下 Button=Data;/传递数据扫描值 TR0=1;/启动定时器0 TR1=0;/关闭定时器1 break;/不再进行查询
13、是否有按键按下了 switch(Button) case 0x01:num=1;beep();break;/1号选手 case 0x02:num=2;beep();break;/2号选手 case 0x04:num=3;beep();break;/3号选手 case 0x08: num=4;beep();break;/4号选手 case 0x10:num=5;beep();break;/5号选手 case 0x20:num=6;beep();break;/6号选手 case 0x40: num=7;beep();break;/7号选手 case 0x80:num=8;beep();break;
14、/8号选手 TR0=1;/启动定时器0(在这里启动比在前面好)while(1) display(num,Answer_time);/显示选手编号和回答倒计时if(Answer_time=0)TR0=0;/关闭定时器0if(Key_stop=0)delay(30);if(Key_stop=0)/停止键按下beep();TR0=0;/关闭定时器0,选手开始回答while(!Key_stop);while(1) /在显示选手回答倒计时时只有在stop按键按下时,才可按复位键display(num,Answer_time);/显示选手编号和回答倒计时if(Key_restart=0)delay(10)
15、;if(Key_restart=0)/热复位键,从头开始下一轮beep();goto Top; void beep() laba=1; delay(100); laba=0;void beep_last() laba=1; delay(500); laba=0; void displaySet(uchar Settime) Settime-;P2=0xfd;/1011 1111P0=tableSettime%10;/时间的个位delay(10);P2=0xfd;/1011 1111P0=0x00;/消余辉delay(10);P2=0xfe;/ 0111 1111P0=tableSettime/
16、10;/时间的十位delay(10);P2=0xfe;/0111 1111P0=0x00;/消余辉delay(10);void display(uchar num,uchar time)/显示数字的函数 P2=0xfe;P0=tablenum;delay(10);P2=0xfe;/0111 1111P0=0x00;/消余辉delay(10); time-;P2=0xf7;/1110 1111P0=tabletime%10;/时间的个位delay(10);P2=0xf7;/1110 1111P0=0x00;/消余辉delay(10);P2=0xfb;/ 1101 1111P0=tabletime
17、/10;/时间的十位delay(10);P2=0xfb;/1101 1111P0=0x00;/消余辉delay(10);void init()/初始化函数EA=1;/开总中断;TMOD=0x11;/定时器工作方式1,16位定时计数器TH0=(65536-50000)/256;/50usTL0=(65536-50000)%256;ET0=1;/开定时器0中断(暂时不启动定时器)TH1=(65536-50000)/256;/50usTL1=(65536-50000)%256;ET1=1;/开定时器0中断(暂时不启动定时器)EX0=1;/启动外中断0EX1=1;/启动外中断1P1=0x00;/读P1
18、口的数据要先置1准备count_0=0;/定时器中的计数清零count_1=0;void T0_time() interrupt 1/定时器0中断函数_回答时间TH0=(65536-50000)/256;/50msTL0=(65536-50000)%256;/马上重装初值,以免有误差if(count_0=20)count_0=0;Answer_time-;if(Answer_time=5)if(Answer_time=0)beep_last();/最后一声特殊警告beep();count_0+;void T1_time() interrupt 3/定时器1中断函数_抢答时间TH1=(65536
19、-50000)/256;/50usTL1=(65536-50000)%256;/马上重装初值,这样在后面调用beep()函数时就不会影响定时器的准确计时了if(count_1=20)count_1=0;Race_time-; if(Race_time0;x-)for(y=110;y0;y-); void EX0_set_Race_time()interrupt 0 /外中断0,设置抢答时间delay(10);/消抖一下if(Key_set_R=0)beep();while(1)display(11,Race_time_temp);delay(100);/闪动效果if(Key_add=0)/时间
20、+1键 delay(10); if(Key_add=0) Race_time_temp+;if(Race_time_temp=100)Race_time_temp=1; while(!Key_add);/等待按键释放elseif(Key_subtract=0)/时间-1键 delay(10); if(Key_subtract=0) Race_time_temp-;if(Race_time_temp=0)Race_time_temp=99; Race_time=Race_time_temp;while(!Key_subtract);/等待按键释放elseif(Key_restart=0)if(K
21、ey_restart=0)beep();break;if(Key_restart=0)if(Key_restart=0)beep();break;void EX1_set_Answer_time()interrupt 2 /外中断1,设置回答时间delay(10);/消抖一下if(Key_set_A=0)beep();while(1)display(11,Answer_time_temp);delay(100);/闪动效果if(Key_add=0)/时间+1键 delay(10); if(Key_add=0) Answer_time_temp+;if(Answer_time_temp=100)
22、Answer_time_temp=1; while(!Key_add);/等待按键释放elseif(Key_subtract=0)/时间-1键 delay(10); if(Key_subtract=0) Answer_time_temp-;if(Answer_time_temp=0)Answer_time_temp=99; Answer_time=Answer_time_temp;while(!Key_subtract);/等待按键释放else if(Key_restart=0)if(Key_restart=0)beep();break;八、 设计心得经过近一个星期的努力,在老师和同学的讨论和
23、帮助下,我成功地完成了八路抢答器的设计,通过此次课程设计,我重新认识到了对书本上的知识要独立运用的道理。在抢答器设计过程中,发现了很多细节性的问题,也出现了很多错误,例如:在复位电路的设计中,由于一根连线连接不到位,导致复位按键不起作用,在仿真过程中,一直卡住,后来经过和同学们研究、商讨最后都解决,感觉团队协作能力是非常有必要的!通过此次的抢答器的设计,让我重新拾起了以前所学习的电子知识和C语言的编程,也使我加深了对单片机及接口技术的理解和应用,由于知识水平的局限,设中可能会存在着一些不足,如:时间的设置上,只能实现调整的功能,重新复位开始后,还是按照原来的时间进行,另外存在的其他一些问题,希望老师和同学能够提出并指正。15