基于ATmega16L_单片机的六路抢答器设计(已处理)_第1页
基于ATmega16L_单片机的六路抢答器设计(已处理)_第2页
基于ATmega16L_单片机的六路抢答器设计(已处理)_第3页
基于ATmega16L_单片机的六路抢答器设计(已处理)_第4页
基于ATmega16L_单片机的六路抢答器设计(已处理)_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于ATmega16L_单片机的六路抢答器设计 题 目:基于ATmega16L 单片机的抢答器设计 1引言32抢答器系统的功能33 抢答器的硬件系统34 抢答器的软件系统45源程序116结束语19参考文献20 基于ATmega16L 单片机的六路抢答器设计 摘 要:介绍了一种以ATmega16L 单片机为核心的八路数字抢答器系统,分别从硬件和软件两方面阐述了该控制系统的设计方法,并经过调试和运行使该系统达到预期目标,具有反应快、功能齐全、实用性强的特点。 关键词:抢答器;单片机; ATmega16LEight Routes Call ing Implement Based on ATmega1

2、6L Single Chip Controller Abstract : A kind of eight routes digital calling implement is int roduced in the thesis , and the ATmega16L Single chip cont roller is it s hard core1 Also , the design method of the cont rol system was expounded from aspect s of the software and the hardware1 And after de

3、bugging 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 chip cont roller ;ATmega161引言 抢答器是一种广泛应用于企事业单位和商业部门,为各种知识竞赛、文娱活动提供公正客观快速裁决的一种常用电子设备,也是一种逐渐成型的电子产品,但市面上所

4、售抢答器价格一般较贵且多为小规模集成电路构成,其性能单一,工作起来不够理想。因此,提高抢答器的性能,使其具有更强的功能,使用可靠方便已为抢答器发展的一个方向。随着集成技术和计算机技术的发展,单片机作为其一个分支亦于20 世纪80 年代以来获得了飞速发展,各种新品不涌现,使单片机的应用更加深入,灵活性也大大增强。本文介绍一种以ATmega16 单片机为核心的八路抢答器系统,它充分利用了单片机系统的优点,具有结构简单、功能强大、可靠性好、实用性强的特点。2抢答器系统的功能本抢答系统可实现以下功能:1 抢答功能:通过六路按键配合程序来实现抢答功能。当主持人按下抢答键开始抢答后,此时任一路按下按钮均闭

5、锁其它各路,由程序对键盘译码并显示最先按下抢答键的路数及其当前时间。2 抢答限时:主持人按下抢答键后,设置5 秒为抢答时间此时间可在199 秒之间修改 。若5秒内无人抢答,倒计时为0 时发出报警,说明该抢答题目作废。此时闭锁所有抢答按键,只有当主持人再次按下抢答键开始下一次抢答方可抢答。3 答题限时:当主持人按下开始答题按钮时,启动倒计时此倒计时时间可在199 秒之间修改 ,若答题时间过长,倒计时为0 时发出报警,说明答题时间到,显示返回当前台数及其分数为下一步计分作出准备。4 设定功能:按下设定键后,可按顺序设置抢答限时时间,答题限时时间和默认计分分值。5 其它可附加功能:如果采用蜂鸣器可实

6、现声音报警。3 抢答器的硬件系统本抢答器的硬件系统包括以下几个部分:1 抢答按钮和各功能键: 07 八个按键在抢答时27 为抢答键,0 和1 一个开始抢答键、一个开始答题键。各键分布电路图如图1 所示。图1抢答器的硬件系统 2 显示电路:显示电路可由L ED 或LCD 来实现。此处选用LCD 方式,由LCD显示器来实现,其亮度好,节能,使用简单方便。 3 声光电路:这里的声音电路是指实现报警的电路,发光电路由发光二极管来实现。 4 电源电路: 电源采用市电经整流稳压来获得,其具体电路如图2 所示。 图2电源电路4 抢答器的软件系统本抢答器的软件系统主要包括以下几个部分: 1 主程序:主程序的功

7、能主要是完成内部各寄存单元的初始化,对LCD 接口电路的初始化,内部定时器的初始化,中断的初始化及调用显示程序对初始状态的显示以及对外部信号的等待处理,也就是说完成前期的准备工作等待随时对外部信号进行响应。 2 对开始抢答信号的处理:当主持人按下开始抢答键后开始抢答,程序时间部分采用定时中断方式进行处理。在中断处理程序中完成相应操作,修改计时单元的数据并使红色指示灯亮。 3 键盘扫描子程序:在程序中采用读端口对键盘进行扫描。键盘扫描程序在确定键值后保存等待后续处理。 /按键扫描函数 uchar get_keyvoid uchar key,a0; ifreadkey!0/如果读按键不为0,有键按

8、下 keyreadkey;/先保存按键值 /delay_nms1; /延时消抖 ifreadkeykey /如果键值相等:有效按键 akey; returna; 4 键值处理子程序:此子程序根据键盘扫描所取得的键值作出相应处理。 在抢答时,只有数字键代表相应抢答分组 K1K7 按下有效,其它键按下无效并且一旦抢答成功,只有按开始答题键有效,其它键均无效。 开始答题键按下给出相应信号指示。 在抢答前按下“MAINKEY”键1S后可进行抢答限时时间、答题限时时间值的设置。 5 显示子程序:此程序完成所有数据的动态显示。 * * #define LCD_EN_PORT PORTB/以下2个要设为同一

9、个口 #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_DDRDDRB/一定要用高4位 #define LCD_DATA_PINPINB #define LCD_RS1PB7 /0x80portB7 out #define LCD_EN1PB6 /0x60portB6 out #define LCD_DATA 1PB5|1PB4|1PB3|1PB2 unsig

10、ned char tab'0','1','2','3','4','5','6','7','8','9' /* 函数声明 void LCD_initvoid; void LCD_en_writevoid; void LCD_write_commandunsigned char command ; void LCD_write_dataunsigned char data; void LCD_set_xy unsigned char x,

11、unsigned char y; void LCD_write_stringunsigned char X,unsigned char Y,unsigned char *s; void LCD_write_charunsigned char X,unsigned char Y,unsigned char data; /*补充*/ void LCD_write_shuunsigned int x,unsigned int t,unsigned int n; /*补充*/ void delay_nusunsigned int n; void delay_nmsunsigned int n; voi

12、d LCD_initvoid/液晶初始化 LCD_DATA_DDR|LCD_DATA;/数据口方向为输出 LCD_EN_DDR|LCD_EN; /设置EN方向为输出 LCD_RS_DDR|LCD_RS; /设置RS方向为输出 LCD_write_command0x28; LCD_en_write; delay_nus40; LCD_write_command0x28; /4位显示 LCD_write_command0x0c; /显示开 LCD_write_command0x01; /清屏 delay_nms2; void LCD_en_writevoid /液晶使能 LCD_EN_PORT|L

13、CD_EN; delay_nus1; LCD_EN_PORT&LCD_EN; void LCD_write_commandunsigned char command /写指令 unsigned char temp; commandcommand&0b100000007|command&0b010000005|command&0b001000003|command&0b000100001|command&0b000010001|command&0b000001003|command&0b000000105|command&0

14、b000000017; delay_nus16; tempcommand2; LCD_RS_PORT&LCD_RS; /RS0 LCD_DATA_PORT&0b11000011;/清高四位 LCD_DATA_PORT|temp&0b00111100; /写高四位 LCD_en_write; commandcommand2; /低四位移到高四位 LCD_DATA_PORT&0b11000011;/清高四位 LCD_DATA_PORT|command&0b00111100; /写低四位 LCD_en_write; void LCD_write_datauns

15、igned char data /写数据 unsigned char temp; datadata&0b100000007|data&0b010000005|data&0b001000003|data&0b000100001|data&0b000010001|data&0b000001003|data&0b000000105|data&0b000000017; delay_nus16; tempdata2; LCD_RS_PORT|LCD_RS; /RS1 LCD_DATA_PORT&0b11000011; /清高四位 L

16、CD_DATA_PORT|temp&0b00111100; /写高四位 LCD_en_write; datadata2;/低四位移到高四位 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 address 0x80 + x; elseaddress 0xc0 + x; LCD_write_

17、command address; void LCD_write_stringunsigned char X,unsigned char Y,unsigned char *s /列x015,行y0,1 LCD_set_xy X, Y ; /写地址 while *s / 写显示字符 LCD_write_data *s ; s +; void LCD_write_charunsigned char X,unsigned char Y,unsigned char data /列x015,行y0,1 LCD_set_xy X, Y ; /写地址 LCD_write_data data; void del

18、ay_1usvoid /1us延时函数 asm"nop" void delay_nusunsigned int n /N us延时函数 unsigned int i0; for i0;in;i+ delay_1us; void delay_1msvoid /1ms延时函数 unsigned int i; for i0;i1140;i+; void delay_nmsunsigned int n /N ms延时函数 unsigned int i0; for i0;in;i+ delay_1ms; unsigned char *Formatunsigned char data,

19、unsigned char *str str0tabdata/10%10; str1tabdata%10; return str; 部分程序的流程图如图3 所示5源程序/包含所需头文件#include #include #include "lcd.h"#define LED PORTC /定义LED显示端口#define readkey PINA|0x80 /定义按键端口#define on_beep PORTD&15 /定义蜂鸣器开#define off_beep PORTD|15 /定义蜂鸣器关#define MAINKEY PIND&0x010x00

20、/ #define UPKEY PIND&0x020x00/*-宏定义-*/#define ucharunsigned char#define uintunsigned int/全局变量定义unsigned char key;uchar Nmiao15;uchar Dmiao,Emiao30; uint Tcount4;uchar stop_flag0;/定义时间到标志uchar start_flag;/定义启动计时标志uchar MAIN_KEY;/开始抢答标志uchar LM0;/定义LED移动位uchar flag0; /定义LED移动方向标志uchar i0; /定义30秒计时

21、数值/* 延时函数1:入口i,单位mS,最大65536mS */void delay_msuint i uchar a; for;i;i-fora141;a;a-/针对时钟频率为1M ; /* 延时函数2:入口i,单位uS,最大65536uS */void delay_usuint i ii/2; for;i;i-; /响声函数:入口i:响声长度i*10ms,n:响声次数void sound1uchar i,uchar n for;n;n-uint ai*10;for;a;a- on_beep;/开蜂鸣器 delay_us100; off_beep; /关蜂鸣器 delay_us100; de

22、lay_ms200;/端口初始化void port_initvoidPORTA 0xff;DDRA 0xff;PORTB 0x00;DDRB 0x00;PORTC 0xFF;DDRC 0xFF;DDRD0xF0;PORTD0xFF;/定时T1初始化void timer1_initvoidTCCR1B 0x00;/停止定时器TIMSK | 0x04;/中断允许TCNT1H 0xFC;TCNT1L 0x2F;/初始值OCR1AH 0xFB;OCR1AL 0xFF;/匹配A值OCR1BH 0xFB;OCR1BL 0xFF;/匹配B值ICR1H 0xFF;ICR1L 0xFF;/输入捕捉匹配值TCCR

23、1A 0x00;/TCCR1B 0x05;/启动定时器/定时器T1溢出中断服务程序#pragma interrupt_handler timer1_ovf_isr:9void timer1_ovf_isrvoidTCNT1H 0xFC; /重装值高位TCNT1L 0x2F; /重装值低位Dmiao-;ifDmiao2 LCD_write_string9,1,FormatDmiao,"00"else TCCR1B 0x00;/停止定时器 LCD_write_string9,1,"over" sound160,4;/计时到:响4长声 /定时器T2初始化voi

24、d timer2_initvoidTCCR2 0x00;/停止定时器ASSR 0x00;/异步时钟模式TCNT2 0x0C;/初始值OCR2 0x0B;/匹配值TIMSK | 0x40;/中断允许/T2溢出中断服务程序#pragma interrupt_handler timer2_ovf_isr:5void timer2_ovf_isrvoidTCNT2 0x0C;LED 1LM; /LED流动闪亮 Tcount-; ifTcount0 show_keykey;Tcount4;Nmiao-;LCD_write_string12,0,FormatNmiao,"00"ifNm

25、iao0 start_flag0; /清启动标志 Nmiao15; TCCR2 0x00;/停止定时器LED0x00;LCD_write_string12,0,"lost" i0;sound160,4;/计时到:响4长声 ifflag0 /正向流动 LM+;ifLM5flag1; else/反向流动 LM-; ifLM0flag0; sound15,1;/响一短声/按键扫描函数uchar get_keyvoid uchar key,a0;ifreadkey!0/如果读按键不为0,有键按下keyreadkey;/先保存按键值/delay_nms1; /延时消抖ifreadke

26、ykey /如果键值相等:有效按键 akey;returna;void show_keyunsigned char i/显示键值 ikey; switch icase 0x00: LCD_write_char2,1,'?'break;case 0x01: LCD_write_char2,1,'1'break;case 0x02:LCD_write_char2,1,'2'break;case 0x04:LCD_write_char2,1,'3' break;case 0x08:LCD_write_char2,1,'4'

27、; break;case 0x10:LCD_write_char2,1,'5'break;case 0x20:LCD_write_char2,1,'6'break;/default : LCD_write_string2,1,"H"/ break;void show_errunsigned char i ikey;switch icase 0x01: LCD_write_string0,1,"1ERROR"break;case 0x02:LCD_write_string0,1,"2ERROR"break

28、;case 0x04:LCD_write_string0,1,"3ERROR" break;case 0x08:LCD_write_string0,1,"4ERROR" break;case 0x10:LCD_write_string0,1,"5ERROR"break;case 0x20:LCD_write_string0,1,"6ERROR"break; void init_devicesvoidCLI; /禁止所有中断MCUCR 0x00;MCUCSR 0x80;/禁止JTAGGICR 0x00;port_in

29、it;timer1_init;timer2_init;LCD_init;SEI;/开全局中断/主函数void mainvoiduchar a;init_devices;/在这继续添加你的代码LCD_write_string0,0,"qiujiefu zhizuo"sound150,1;/响/delay_ms50;LCD_write_string0,1,"xuehao:05D2 319"delay_nms500;LCD_write_command0x01; /清屏delay_nms100;LCD_write_string0,1,"Bress k1

30、k6 key"delay_nms200;LCD_write_command0x01; /清屏delay_nms100;LCD_write_string0,0,"Test key"delay_nms100;do LEDLED; delay_ms50; keyget_key;ifkey!0show_keykey;sound15,1;/响一短声 while!UPKEY;LCD_write_string0,0,"Test over"delay_nms100;LCD_write_command0x01; /清屏delay_nms100;LCD_write_string0,0,"waiting"while1 keyget_key;/读按键ifMAINKEY/按下开始抢答 delay_ms10; ifMAINKEY /LCD_write_command0x01; /清屏MAIN_KEY1;start_flag1; /启动标志置1 delay_ms50; LCD_write_string0,0,"ready?" dokeyget_key;/读按键 ifkey!0 /有键按下 LEDLED|0x7

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论