基于ATmega16L 单片机的抢答器设计.doc

上传人:啊飒飒 文档编号:10582086 上传时间:2021-05-24 格式:DOC 页数:21 大小:836KB
返回 下载 相关 举报
基于ATmega16L 单片机的抢答器设计.doc_第1页
第1页 / 共21页
基于ATmega16L 单片机的抢答器设计.doc_第2页
第2页 / 共21页
基于ATmega16L 单片机的抢答器设计.doc_第3页
第3页 / 共21页
基于ATmega16L 单片机的抢答器设计.doc_第4页
第4页 / 共21页
基于ATmega16L 单片机的抢答器设计.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《基于ATmega16L 单片机的抢答器设计.doc》由会员分享,可在线阅读,更多相关《基于ATmega16L 单片机的抢答器设计.doc(21页珍藏版)》请在三一文库上搜索。

1、华南理工大学 本科课程(设计) 题 目:基于ATmega16L 单片机的抢答器设计 学院(系): 物理与电子工程学院 专 业 : 电子信息工程2班 年级班级 : 2008级 学 号 : xxxxxxxxx0319 学生姓名 : 邱xxx 指导教师 : 李xx 职称 讲师 起止日期 :2012年2月2日至2012年3月20日 引言32抢答器系统的功能33 抢答器的硬件系统34 抢答器的软件系统45源程序46结束语4参考文献4基于ATmega16L 单片机的六路抢答器设计摘要:介绍了一种以ATmega16L 单片机为核心的八路数字抢答器系统,分别从硬件和软件两方面阐述了该控制系统的设计方法,并经过

2、调试和运行使该系统达到预期目标,具有反应快、功能齐全、实用性强的特点。关键词:抢答器;单片机; ATmega16LEight Routes Call ing Implement Based on ATmega16L Single Chip ControllerAbstract : A kind of eight routes digital calling implement is int roduced in the thesis , and the ATmega16L Singlechip cont roller is it s hard core1 Also , the design m

3、ethod of the cont rol system was expounded from aspect s of thesoftware and the hardware1 And after debugging and running , the system reached the expected target , which have many advantages such as fast reaction , all ready function and good practicability1。Key words : calling implement ; single c

4、hip cont roller ;ATmega引言抢答器是一种广泛应用于企事业单位和商业部门,为各种知识竞赛、文娱活动提供公正客观快速裁决的一种常用电子设备,也是一种逐渐成型的电子产品,但市面上所售抢答器价格一般较贵且多为小规模集成电路构成,其性能单一,工作起来不够理想。因此,提高抢答器的性能,使其具有更强的功能,使用可靠方便已为抢答器发展的一个方向。随着集成技术和计算机技术的发展,单片机作为其一个分支亦于20 世纪80 年代以来获得了飞速发展,各种新品不涌现,使单片机的应用更加深入,灵活性也大大增强。本文介绍一种以ATmega 单片机为核心的八路抢答器系统,它充分利用了单片机系统的优点,具有

5、结构简单、功能强大、可靠性好、实用性强的特点。2抢答器系统的功能本抢答系统可实现以下功能:(1) 抢答功能:通过六路按键配合程序来实现抢答功能。当主持人按下抢答键开始抢答后,此时任一路按下按钮均闭锁其它各路,由程序对键盘译码并显示最先按下抢答键的路数及其当前时间。(2) 抢答限时:主持人按下抢答键后,设置5 秒为抢答时间(此时间可在199 秒之间修改) 。若5秒内无人抢答,倒计时为0 时发出报警,说明该抢答题目作废。此时闭锁所有抢答按键,只有当主持人再次按下抢答键开始下一次抢答方可抢答。(3) 答题限时:当主持人按下开始答题按钮时,启动倒计时(此倒计时时间可在199 秒之间修改) ,若答题时间

6、过长,倒计时为0 时发出报警,说明答题时间到,显示返回当前台数及其分数为下一步计分作出准备。(4) 设定功能:按下设定键后,可按顺序设置抢答限时时间,答题限时时间和默认计分分值。(5) 其它可附加功能:如果采用蜂鸣器可实现声音报警。3 抢答器的硬件系统本抢答器的硬件系统包括以下几个部分:(1) 抢答按钮和各功能键: 07 八个按键(在抢答时27 为抢答键,0 和1 一个开始抢答键、一个开始答题键。各键分布电路图如图1 所示。图1抢答器的硬件系统(2) 显示电路:显示电路可由L ED 或LCD 来实现。此处选用LCD 方式,由LCD显示器来实现,其亮度好,节能,使用简单方便。(3) 声光电路:这

7、里的声音电路是指实现报警的电路,发光电路由发光二极管来实现。(4) 电源电路: 电源采用市电经整流稳压来获得,其具体电路如图2 所示。图2电源电路4 抢答器的软件系统本抢答器的软件系统主要包括以下几个部分:(1) 主程序:主程序的功能主要是完成内部各寄存单元的初始化,对LCD 接口电路的初始化,内部定时器的初始化,中断的初始化及调用显示程序对初始状态的显示以及对外部信号的等待处理,也就是说完成前期的准备工作等待随时对外部信号进行响应。(2) 对开始抢答信号的处理:当主持人按下开始抢答键后开始抢答,程序时间部分采用定时中断方式进行处理。在中断处理程序中完成相应操作,修改计时单元的数据并使红色指示

8、灯亮。(3) 键盘扫描子程序:在程序中采用读端口对键盘进行扫描。键盘扫描程序在确定键值后保存等待后续处理。/按键扫描函数uchar get_key(void) uchar key,a=0; if(readkey!=0) /如果读按键不为0,有键按下 key=readkey; /先保存按键值 /delay_nms(1); /延时消抖 if(readkey=key) /如果键值相等:有效按键 a=key; return(a); (4) 键值处理子程序:此子程序根据键盘扫描所取得的键值作出相应处理。在抢答时,只有数字键(代表相应抢答分组) K1K7 按下有效,其它键按下无效并且一旦抢答成功,只有按开

9、始答题键有效,其它键均无效。开始答题键按下给出相应信号指示。在抢答前按下“MAINKEY”键1S后可进行抢答限时时间、答题限时时间值的设置。(5) 显示子程序:此程序完成所有数据的动态显示。*Lcd.h v1.0 /lcd1602显示驱动*#define LCD_EN_PORT PORTB /以下2个要设为同一个口#define LCD_EN_DDR DDRB#define LCD_RS_PORT PORTB /以下2个要设为同一个口#define LCD_RS_DDR DDRB#define LCD_DATA_PORT PORTB /以下3个要设为同一个口#define LCD_DATA_D

10、DR DDRB /一定要用高4位#define LCD_DATA_PIN PINB#define LCD_RS (1PB7) /0x80 portB7 out #define LCD_EN (1PB6) /0x60 portB6 out #define LCD_DATA (1PB5)|(1PB4)|(1PB3)|(17)|(command&0b01000000)5)|(command&0b00100000)3)|(command&0b00010000)1)|(command&0b00001000)1)|(command&0b00000100)3)|(command&0b00000010)5)|

11、(command&0b00000001)7); delay_nus(16); temp=command2; /低四位移到高四位 LCD_DATA_PORT&=0b11000011; /清高四位 LCD_DATA_PORT|=command&0b00111100; /写低四位 LCD_en_write(); void LCD_write_data(unsigned char data) /写数据 unsigned char temp; data=(data&0b10000000)7)|(data&0b01000000)5)|(data&0b00100000)3)|(data&0b00010000

12、)1)|(data&0b00001000)1)|(data&0b00000100)3)|(data&0b00000010)5)|(data&0b00000001)7); delay_nus(16); temp=data2; /低四位移到高四位 LCD_DATA_PORT&=0b11000011; /清高四位 LCD_DATA_PORT|=data&0b00111100; /写低四位 LCD_en_write(); void LCD_set_xy( unsigned char x, unsigned char y ) /写地址函数 unsigned char address; if (y = 0

13、) address = 0x80 + x; else address = 0xc0 + x; LCD_write_command( address); void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) /列x=015,行y=0,1 LCD_set_xy( X, Y ); /写地址 while (*s) / 写显示字符 LCD_write_data( *s ); s +; void LCD_write_char(unsigned char X,unsigned char Y,unsigned char

14、data) /列x=015,行y=0,1 LCD_set_xy( X, Y ); /写地址 LCD_write_data( data);void delay_1us(void) /1us延时函数 asm(nop); void delay_nus(unsigned int n) /N us延时函数 unsigned int i=0; for (i=0;in;i+) delay_1us(); void delay_1ms(void) /1ms延时函数 unsigned int i; for (i=0;i1140;i+); void delay_nms(unsigned int n) /N ms延时

15、函数 unsigned int i=0; for (i=0;in;i+) delay_1ms(); unsigned char *Format(unsigned char data,unsigned char *str) str0=tab(data/10)%10; str1=tabdata%10; return str; 部分程序的流程图如图3 所示开始系统初始化LCD显示状态测试选手按键显示测试选手号数主持键按下调用键盘扫描处理函数抢答开始显示选手序号求出选手序号答题答题时间到声音提醒结束倒计时启动显示违规者序号 声音报警有违规者YNYNYYNN等待抢答开始调整倒计时值写EEPOM启动15S

16、抢题时间选手抢答N声音提醒此题作废15s到了YY5源程序/包含所需头文件#include #include #include lcd.h#define LED PORTC /定义LED显示端口#define readkey (PINA|0x80) /定义按键端口#define on_beep PORTD&=(15) /定义蜂鸣器开#define off_beep PORTD|=12) LCD_write_string(9,1,Format(Dmiao,00); else TCCR1B = 0x00;/停止定时器 LCD_write_string(9,1,over); sound1(60,4);

17、 /计时到:响4长声 /定时器T2初始化void timer2_init(void) TCCR2 = 0x00;/停止定时器 ASSR = 0x00;/异步时钟模式 TCNT2 = 0x0C;/初始值 OCR2 = 0x0B;/匹配值 TIMSK |= 0x40;/中断允许 /T2溢出中断服务程序#pragma interrupt_handler timer2_ovf_isr:5void timer2_ovf_isr(void) TCNT2 = 0x0C; LED = (1LM); /LED流动闪亮 Tcount-; if(Tcount=0) show_key(key); Tcount=4;

18、Nmiao-; LCD_write_string(12,0,Format(Nmiao,00); if(Nmiao=0) start_flag=0; /清启动标志 Nmiao=15; TCCR2 = 0x00;/停止定时器 LED=0x00; LCD_write_string(12,0,lost); i=0; sound1(60,4); /计时到:响4长声 if(flag=0) /正向流动 LM+; if(LM=5)flag=1; else /反向流动 LM-; if(LM=0)flag=0; sound1(5,1); /响一短声 /按键扫描函数uchar get_key(void) uchar

19、 key,a=0; if(readkey!=0) /如果读按键不为0,有键按下 key=readkey; /先保存按键值 /delay_nms(1); /延时消抖 if(readkey=key) /如果键值相等:有效按键 a=key; return(a); void show_key(unsigned char i)/显示键值 i=key; switch (i) case 0x00: LCD_write_char(2,1,?); break;case 0x01: LCD_write_char(2,1,1); break;case 0x02:LCD_write_char(2,1,2); brea

20、k;case 0x04:LCD_write_char(2,1,3); break;case 0x08:LCD_write_char(2,1,4); break;case 0x10:LCD_write_char(2,1,5); break;case 0x20:LCD_write_char(2,1,6); break;/default : LCD_write_string(2,1,H);/ break;void show_err(unsigned char i) i=key;switch (i)case 0x01: LCD_write_string(0,1,1ERROR); break;case

21、0x02:LCD_write_string(0,1,2ERROR); break;case 0x04:LCD_write_string(0,1,3ERROR); break;case 0x08:LCD_write_string(0,1,4ERROR); break;case 0x10:LCD_write_string(0,1,5ERROR); break;case 0x20:LCD_write_string(0,1,6ERROR); break; void init_devices(void) CLI(); /禁止所有中断 MCUCR = 0x00; MCUCSR = 0x80;/禁止JTAG

22、 GICR = 0x00; port_init(); timer1_init(); timer2_init(); LCD_init(); SEI();/开全局中断/主函数void main(void) uchar a; init_devices(); /在这继续添加你的代码 LCD_write_string(0,0,qiujiefu zhizuo); sound1(50,1); /响 /delay_ms(50); LCD_write_string(0,1,xuehao:05D2 319); delay_nms(500); LCD_write_command(0x01); /清屏 delay_n

23、ms(100); LCD_write_string(0,1,Bress k1k6 key); delay_nms(200); LCD_write_command(0x01); /清屏 delay_nms(100); LCD_write_string(0,0,Test key); delay_nms(100); do LED=LED; delay_ms(50); key=get_key(); if(key!=0)show_key(key);sound1(5,1); /响一短声 while(!UPKEY);LCD_write_string(0,0,Test over);delay_nms(100)

24、;LCD_write_command(0x01); /清屏 delay_nms(100); LCD_write_string(0,0,waiting); while(1) key=get_key(); /读按键 if(MAINKEY)/按下开始抢答 delay_ms(10); if(MAINKEY) / LCD_write_command(0x01); /清屏 MAIN_KEY=1; start_flag=1; /启动标志置1 delay_ms(50); LCD_write_string(0,0,ready?); do key=get_key(); /读按键 if(key!=0) /有键按下

25、LED=(LED|0x7F)&(key); show_err(key); sound1(10,2); /违规按键:响2短声 dowhile(!MAINKEY); /等待裁判键按下退出 delay_ms(30); if(MAINKEY)/长按1秒调整倒计时 delay_ms(1000); if(MAINKEY) Emiao=Emiao-5; if(Emiao=0)Emiao=95; EEPROMwrite(0x22,Emiao);/写到EEPROM LCD_write_string(9,1,Format(Emiao,00); Emiao=EEPROMread(0x22);/读EEPROM倒计时

26、if(Emiao=0xff) Emiao=30; Nmiao=15; Dmiao=Emiao;while(!UPKEY); /等待裁判键按下退出 LCD_write_command(0x01); /清屏 sound1(30,1); LCD_write_string(0,0,time on); TCCR2 = 0x07;/启动定时器2 等待 答 TCCR1B = 0x00;/停止定时器 key=get_key(); /读按键 if(key!=0) /有键按下 if(start_flag=1) /已经启动抢答 /TCCR1B = 0x00;/停止定时器 TCCR2 = 0x00; /停止LED流动 LED=key; /第一个按下键对应的LED亮show_key(key); sound1(40,1); /正常抢答:响一长声TCCR1B = 0x05;/启动定时器 dowhile(!UPKEY); /等待裁判键按下退出 TCCR1B = 0x00;/停止定时器 else /未启动抢答LED=(LED|0x7F)&(key); show_err(key); sound1(10,2); /违规按键:响2短声 do while(!UPKEY); /等待裁判键按下退出 6结束语经对实验样机的多次检验,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1