《基于AT89C52的简易8路抢答器》由会员分享,可在线阅读,更多相关《基于AT89C52的简易8路抢答器(9页珍藏版)》请在金锄头文库上搜索。
1、基于基于 AT89C52 的简易八路抢答器的简易八路抢答器一、一、题目题目 基于 AT89C52 的简易八路抢答器 二、二、设计要求设计要求 1、能实现 8 位选手抢答; 2、主持人控制抢答的开始和清零; 3、一位选手抢答后另外的选手抢答无效; 4、主持人或选手按键时伴随着蜂鸣器的响声; 5、主持人按下抢答开始按钮后有15 秒倒计时抢答限制时间,倒计时结束后不能再抢答 ;6、15 秒抢答倒计时结束后仍无人回答时,蜂鸣器持续响 2 秒; 7、选手抢答后有 30 秒回答限制时间。 三、三、系统组成系统组成四、四、电路设计电路设计 1. 主控芯片主控芯片 本设计使用 AT89C52 作为主控芯片,A
2、T89C52 是美国 Atmel 公司生产的低电压、高性能 CMOS 8 位单片机,片内含 8KB 的可反复檫写的程序存储器和 12B 的随机存取数据存储器(RAM) ,器件采用 Atmel 公司的高密度、非易失性存储技术生产,兼容标准 MCS-51 指令系统,片内配置通用 8 位中央处理器(CPU)和 Flash 存储单元。其有以下主要工作特性:1)片内程序存储器内含 8KB 的 Flash 程序存储器,可擦写寿命为 1000 次;2)片内数据存储器内含 256 字节的 RAM;3)具有 32 根可编程 I/O 口线;AT89C52复位电路复位电路振荡电路振荡电路4 4 位位 LEDLED
3、显示电路显示电路抢答按键电路抢答按键电路主持人控制电路主持人控制电路蜂鸣器电路蜂鸣器电路4)具有 3 个可编程定时器;5)中断系统是具有 8 个中断源、6 个中断矢量、2 个级优先权的中断结构;6)串行口是具有一个全双工的可编程串行通信口;7)具有一个数据指针 DPTR;8)低功耗工作模式有空闲模式和掉电模式;9)具有可编程的 3 级程序锁定位;10) AT89C52 工作电源电压为 5(1+0.2)V,且典型值为 5V;11) AT89C52 最高工作频率为 24MHz。在本设计中,AT89C52 引脚的 P0 端口接 4 位 LED 数码管段选端,P2.0P2.3接 4 位 LED 数码管
4、位选端,P1 端口接 8 个抢答按键,P3.0 端口接抢答开始按键,P3.1 端口接清零按键,P3.7 接蜂鸣器驱动电路。 2. 时钟与复位电路时钟与复位电路 启动复位使 CPU 及系统各部件处于确定的初始状态,并从初态开始工作。另外,当由于程序运行出错或操作错误使系统处于死锁状态时,也可以用复位使系统恢复正常。RST 引脚是复位信号的输入端,复位信号高电平有效,其有效时间应持续 2 个机器周期,才能完成复位操作。时钟电路用于产生 51 单片机工作所需的时钟信号。常用的时钟电路有内部时钟和外部时钟。本设计所用的是内部时钟。单片机片内由一个反向放大器构成振荡器,可以由它产生时钟。该反相放大器的输
5、入端为引脚 XTAL1,输出端为引脚 XTAL2。这两个引脚外接石英晶体振荡器作为定时元件,内部反向放大器自激振荡,产生时钟。C3,C4 对频率有微调作用。C3 和 C4 的典型值为 30PF。 3. 显示电路显示电路 本设计中使用 4 位 LED 共阳极数码管做显示器件,在用来显示选手号码和倒计时时间。数码管 1 号为显示选手号码,3、4 号位显示倒计时时间。单片机 P0 端口接 4 位 LED 数码管段选端,低电平有效。通过段选端口输出的高低电平的不同组合,使数码管显示不同的数字。P2.0P2.3 接 4 位 LED数码管位选端,高电平有效。4. 主持人控制按键与蜂鸣器主持人控制按键与蜂鸣
6、器 HOST 按键接单片机P3.0 口,负责控制抢答的开始,RESET 为清零按键,负责重新对系统进行初始化,为新一轮抢答做准备。蜂鸣器在主持人按HOST 按键,选手抢答,倒计时结束时进行声音提醒。由于单片机无法直接驱动蜂鸣器,需要通过三极管外接电源进行驱动。 5. 抢答按键抢答按键 本设计采用独立键盘作为抢答键盘,8 个抢答按键直接与 P1 口对应的端口连接,按下时接通电路,通知单片机有选手抢答。五、五、程序流程程序流程开始初始化主持人按 开始键是否启动中断 1,显示 15 秒倒计时有选手 抢答启动中断 3,显示选手编号和 30 秒倒计时开始是否六、六、电路图电路图七、七、程序清单程序清单
7、程序流程:开始,进行初始化,对 AT89C52、数码管等元件进行初始化设置,主持人按 下抢答开关后,开始 15 秒倒计时,同时等待抢答,直至倒计时结束;有选手抢答时,15 秒倒计时终止,开始 30 秒回答倒计时,期间,其他选手不能抢答,30 秒倒计时结束后, 一轮抢答结束,需要清零后重新开始。 程序编译结果如下图:#include #define uchar unsigned char #define uint unsigned intuint x,y,m,n,shi,ge,host,haoma,f1,f3,ready;/共阳数码管 0-9 编码 uchar code table=0xc0,0
8、xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90,0xff;/*sbit key1=P10; sbit key2=P11; sbit key3=P12; sbit key4=P13; sbit key5=P14; sbit key6=P15; sbit key7=P16; sbit key8=P17;*/sbit keyzhu=P30; sbit clean=P31;sbit keyf=P37; /蜂鸣器蜂鸣器 sbit wei1=P20;/位选端口位选端口 sbit wei3=P22; sbit wei4=P23;/延时函数 void delay(ui
9、nt xms) uint i,j; for(i=xms;i0;i-) for(j=120;j0;j-) /初始化函数 void init() TMOD=0x11; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1;/开中断 ET0=1;/定时/计数器 T0 中断允许 TR0=0;/T0 不工作 ET1=1;/定时/计数器 T1 中断允许 TR1=0; /T1 不工作 x=15; y=0; m=30;n=0; shi=0; ge=0; haoma=0;
10、host=0; f1=0; f3=0; keyf=0; /显示函数 void display(uint shi,uint ge,uint haoma) wei3=0; P0=tableshi; delay(5); wei3=1; wei4=0; P0=tablege; delay(5); wei4=1; wei1=0; P0=tablehaoma; delay(5); wei1=1; /扫描键盘 void keyscan() if(ready=1) if(host=0) switch(P1) case 0xfe: delay(10); if(P1=0xfe) TR0=0; host=1; ha
11、oma=1; TR1=1; keyf=1;delay(300); keyf=0; break; case 0xfd: delay(10); if(P1=0xfd) TR0=0; host=1; haoma=2; TR1=1; keyf=1; delay(300); keyf=0; break; case 0xfb: delay(10); if(P1=0xfb) TR0=0; host=1; haoma=3; TR1=1; keyf=1; delay(300); keyf=0; break; case 0xf7: delay(10); if(P1=0xf7) TR0=0; host=1; hao
12、ma=4; TR1=1; keyf=1; delay(300); keyf=0; break; case 0xef:delay(10); if(P1=0xef) TR0=0; host=1; haoma=5; TR1=1; keyf=1; delay(300); keyf=0; break; case 0xdf: delay(10); if(P1=0xdf) TR0=0; host=1; haoma=6; TR1=1; keyf=1; delay(300); keyf=0; break; case 0xbf: delay(10); if(P1=0xbf) TR0=0; host=1; haom
13、a=7; TR1=1; keyf=1; delay(300); keyf=0; break; case 0x7f: delay(10); if(P1=0x7f) TR0=0; host=1;haoma=8; TR1=1; keyf=1; delay(300); keyf=0; break; if(keyzhu=0) delay(10); if(keyzhu=0) ready=1; TR0=1; keyf=1; delay(200); keyf=0; if(clean=0) delay(10); if(clean=0) init(); keyf=1; delay(300); keyf=0; vo
14、id main() init(); while(1) keyscan(); display(shi,ge,haoma); /定时/计数器 0 中断函数 void T0_time() interrupt 1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; y+; f1+; if(y=20) y=0; shi=x/10; ge=x%10; if(x=0) TR0=0; x=0; host=1; keyf=1; delay(2000); keyf=0; x-; /定时/计数器 1 中断函数 void T1_time() interrupt 3 TH1=(65536-50000)/256; TL1=(65536-50000)%256; n+; f3+; if(n=20) n=0; shi=m/10; ge=m%10; if(m=0) TR1=0; m=0; keyf=1; delay(2000); keyf=0; m-;八、八、调试截图调试截图