1、惠 州 学 院 数字电子技术课程设计说明书 题 目:基于单片机(89C52)四人抢答器 系 部: 电子科学系 班 级: 09级电信二班 学生姓名: 学 号: 指导老师: 12月29日智能四路抢答器 目录一、 序言2二、 方案设计21、 方案比较22、 系统总体设计方案和实现框图3三、 理论分析3四、 电路设计41、 按键部分42、 显示部分53、 总原理图6五、 软件步骤图模块7六、 结论8七、 程序9一、序言本设计要求能够在主持人按下开始键后,四个参赛者开始抢按自己按键,谁按键先按下,谁面前灯就会亮而且有对应提醒,当参赛者耗时太多时又会有对应提醒。依据设计要求,本系统采取独立式按键,经过单片
2、机不停扫描按键来控制LED灯和蜂鸣器,并用定时器T0、T1来定超时时间,其中抢答定时时间能够由主持人随意修改。当超时时候让蜂鸣器响和点亮对应LED灯(T0用于参赛者回复问题定时,T1用于参赛者抢答时间选定)。二、方案设计 1、方案比较 (1)、总体设计方案一:采取可编程I/O口扩展芯片8155 8155作为单片机扩展接口能实现很多功效,不过这个系统并不复杂,用8155会浪费很多资源,而且8155要用P0和P2端口作为地址线对它进行读写,这么不仅浪费端口还使得编程变复杂。从节省资源和简化编程角度考虑,放弃了此方案。方案二:直接采取AT89C51单片机 直接用单片机不仅编程被简化,还有效利用了各个
3、端口。8051单片机资源完全够这个系统要求。所以最终选择了此方案。 (2)、模块 方案一:采取4*4矩阵键盘 此种键盘是常见按键扫描方法,不过本系统只需要六个按键,这么就会浪费十个,而且矩阵按键扫描要送数读数,对于编程很复杂,最终放弃了此方案。 方案二:采取独立式键盘 本系统只要8个按键就能够,用独立式键盘不仅节省端口还使编程变得简单。程序只要不停读数检验就行。所以,最终选择此方案。 2、系统总体设计方案和实现框图 抢答模块、修改抢答时间模块、主持人控制模块一共采取8个独立式键盘作为按键输入,当在主持人按下开始键后有参赛者按键按下时,就会有对应于这个按键灯亮而且蜂鸣器响一声,其它按键再按也无效
4、。在要求时间以后如不清除,蜂鸣器就会一直响,超时LED会点亮,提醒已经到时间。框图图1。修改抢答时间是在按下了修改按键以后就会等候增量、减量输入以修改时间,直到再一次按下修改键以确定修改完成。独立式按键部分单片机处理显示部分按键扫描图1三、理论分析 51单片机端口上电是高电平,而且当外部没有输入时能自动弹跳到高电平,所以经过按键所接端口高低电平改变能够判定出哪个按键按下了。独立按键P1口电平改变单片机识别图2四、电路设计图31、按键扫描部分单片机不停扫描P1口电平改变,当有按键按下时,对应I/O口会跳变为低电平,单片机检测到后,经过处理将作出对应显示。电路图1.图42、显示部分 依据按键按下情
5、况LED作出对应亮灭,蜂鸣器作出对应反应。当开始键按下开启后,当S1按下时,则灯D1亮,并蜂鸣器响一声,假如超出要求时间,蜂鸣器一直响,并提醒超时LED灯被点亮。假如S1在限定时间内再次被按下,说明参赛者1已完成回复;当S2按下时,则灯D2亮,并蜂鸣器响一声,假如超出要求时间,蜂鸣器一直响,并提醒超时LED灯被点亮。假如S2在限定时间内再次被按下,说明参赛者2已完成回复;当S3按下时,则灯D3亮,并蜂鸣器响一声,假如超出要求时间,蜂鸣器一直响,并提醒超时LED灯被点亮。假如S3在限定时间内再次被按下,说明参赛者3已完成回复;当S4按下时,则灯D4亮,并蜂鸣器响一声,假如超出要求时间,蜂鸣器一直
6、响,并提醒超时LED灯被点亮。假如S4在限定时间内再次被按下,说明参赛者4已完成回复;抢答完后能够按下主持人确实定键将其初始化。总原理图图所表示:五、软件模块本系统用了定时器0和定时器1。图5六、结论此次设计根据题目要求,基于单片机,利用较适宜控制算法,成功实现了抢答器基础功效。硬件原理结构简单,降低硬件成本和繁琐电路连接;软件设计方面,设计简单,可塑造性强,便于维护。所以选择使用单片机实现四人抢答器设计含有很强效益,能任意地修改抢答时间,使此抢答器适合在很多场所使用且成本低。经过此课程设计让我真正了解到了程序设计难点所在,难并不是程序框架搭建、理论上思索此方法是否可行、代码写入、调试其结果,
7、真正难是在调试过程中,明明知道是有些问题,不过又无法锁定问题所在,造成结果是心理成就感受到抨击,反复对可能存在问题反复修改,一次又一次修改,可怕是代码越修越错,结果该不会来。折腾一段时间后,一不小心才发觉开始时候问题仅仅时很简单、愚蠢错误。从这程序设计过程中不停提醒我,必需步步为营,步步小心,耐心加细心即等于完美程序设计实现。七、程序代码:/实现功效:四人抢答器/*1、只有主持人宣告开始抢答时,选手才能进行抢答,抢答有一定时间限制,超出一定时间就会出现报警声。 2、选手回复时必需在要求时间里面回复,不然就会出现报警声 3、数码管会显示时间 4、各通道要求: 5、抢答时间是能够设置*/#incl
8、ude#include #define uint unsigned int#define uchar unsigned charsbit beep=P36;/making voice(低电平有效)sbit LED1=P27;/competitor 1(低电平有效)sbit ONE=P10;/(高电平有效)sbit LED2=P26;/competitor 2(低电平有效)sbit TWO=P11;/(高电平有效)sbit LED3=P25;/competitor 3(低电平有效)sbit THREE=P12;sbit LED4=P21;/competitor 4sbit FOUR=P13;sb
9、it LED5=P20;/host announced begingsbit HOST=P15;/低电平有效sbit OVER=P37;/overtimesbit CHANG=P14;/change the overtime(低电平有效)sbit UP=P16;/(低电平有效)sbit DOWN=P17;/低电平有效sbit LS138A = P22; /定义译码器输入端A 在 P2.2 管脚上sbit LS138B = P23; /定义译码器输入端B 在 P2.3 管脚上sbit LS138C = P24; /定义译码器输入端C 在 P2.4 管脚上static uint max1=10,n
10、um1=20;uint max,num,temp,tt=0,dd=0x00;/max用于表示选手抢答时间/uint i,LedNumVal=1 ;/uint LedOut10;unsigned char code Disp_Tab = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40;void delay(uint x);void display(uint Key_Val);void change();void press(void);void time1_max();void time0_num();/unsigned long u
11、int LedOut5,LedhdsjVal;void display(uint Key_Val) uchar i; /*以下将键值送到LED数码管显示*/ LedhdsjVal=Key_Val; /把键值送到LedhdsjVal变量中 LedOut0=Disp_TabLedhdsjVal%10000/1000; LedOut1=Disp_TabLedhdsjVal%1000/100;/|0x80; LedOut2=Disp_TabLedhdsjVal%100/10; /十位 LedOut3=Disp_TabLedhdsjVal%10; /个位 for(i=1; i0;x-) for(y=11
12、0;y0;y-); void change(void)if(CHANG=0)delay(5);if(CHANG=0)while(!CHANG);delay(5);while(!CHANG);delay(100);while(CHANG) display(max1); if(UP=0) delay(5);if(UP=0)max1+;delay(20); while(!UP); delay(5); while(!UP); if(DOWN=0)delay(10);if(DOWN=0)max1-;delay(20);while(!DOWN);delay(5);while(!DOWN);while(!C
13、HANG);delay(5);while(!CHANG);void press(void) if(ONE=0)delay(5);if(ONE=0)while(!ONE);delay(50);while(!ONE);delay(50);while(!ONE); TR1=0;LED1=0;beep=0;delay(250);beep=1; num =num1; time0_num(); while(num&ONE) temp=num; display(temp); while(!ONE); delay(5); while(!ONE); TR0=0; if(num=0) beep=0; OVER=0
14、; delay(10); while(HOST) display(num); while(!HOST);delay(10);while(!HOST);beep=1; LED1=1; LED5=1; OVER=1; void main() while(1) display(dd); change(); if(HOST=0) delay(5); if(HOST=0) max=max1; time1_max(); LED5=0; beep=0;delay(250);beep=1; while(!HOST); delay(5); while(!HOST); while(max&ONE&TWO&THRE
15、E&FOUR) display(max); press(); TR0=0; if(max=0) OVER=0; beep=0; while(HOST) display(0); LED5=1; OVER=1; beep=1; while(!HOST); delay(5); while(!HOST);/ delay(10);/ while(!HOST); /* t1 (1ms)中止 中止*/void T1zd(void) interrupt 3 /3定时器1中止号 1定时器0中止号 0外部中止1 2外部中止2 4串口中止 TH1 =(65536-50000)/256; /12.000 TL1 =(65536-50000)%256; tt+; if(tt=20) max-; tt=0; void T1zdd(void) interrupt 1 /3定时器1中止号 1定时器0中止号 0外部中止1 2外部中止2 4串口中止 TH0 =(65536-50000)/256; /12.000 TL0 =(65536-50000)%256; tt+; if(tt=20) num-; tt=0;