AVR学习笔记二十基于模数转换的AD键盘实验_第1页
AVR学习笔记二十基于模数转换的AD键盘实验_第2页
AVR学习笔记二十基于模数转换的AD键盘实验_第3页
AVR学习笔记二十基于模数转换的AD键盘实验_第4页
AVR学习笔记二十基于模数转换的AD键盘实验_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、AVR学习笔记二十、基于模数转换的AD键盘实验20.1 实例功能在前面的实例中我们已经学习了在单片机系统中检测矩阵按键的接口电路和程序设计。但是矩阵式键盘仍然要占用不少I/O资源,4X4键盘就占用了8根I/O线,那么有没有更简单的办法,使用更少的I/O口资源检测更多的按键呢?通过前面的学习,我们知道按键检测实际上是检测连接按键的端口的高低电平值,而我们在前面的实例中只是简单的判断连接按键的端口的电平是高电平(+5V)还是低电平(0V)。那么是否可以通过电平的微小变化来检测按键是否被按下呢?在这个实验中,我们采用模数转换(AD)的方法来实现1个I/O口识别16个按键的实验,本实例分为三个功能模块

2、,分别描述如下: 单片机系统:利用ATmega16单片机与AD键盘电路实现1个I/O的多按键识别。 外围电路:AD键盘电路、串口电平转换电路。 软件程序:编写软件,实现AD键盘识别16个按键的程序。通过本实例的学习,掌握以下内容: AD键盘的电路设计和程序实现。20.2 器件和原理20.2.1 AD键盘的工作原理我们知道AVR单片机自带有内部模数转换(AD)电路,那么我们就利用AVR的这一特性来实现利用一个I/O口检测16个按键的实验。图1为一个A/D键盘的原理图,从图中可以看出,当不同的按键被按下时,ADC端点处的电压不同,通过判断不同的电压值就可以判断出是那个按键被按下。AVR单片机的A/

3、D转换位数为10位,实际应用中我们只取高8位的值就可以分辨出16个按键。我们设定AD转换的参考电压为VCC这样A/D键盘识别准确度最高,并且能够识别更多的按键。图1A/D键盘电路20.2.2 A/D键盘的缺陷在实际应用中,我们是不可能得到准确的A/D转换值的,这是因为存在以下几种误差:1)、对于同一点处的电压值,A/D多次采样的结果不可能完全相同。2)、电阻的误差。电阻值由于电阻的精度和环境温度的原因,误差较大,所以A/D键盘各个按键点的分压不准确。3)、为尽量减少误差,可以采取增加电阻精度、增加温度补偿等方法,另外在软件处理时候要注意消除按键抖动等因素,还要对实际转换值和标准值给出误差补偿。

4、4) 、如果按键按下,经过A/D转换,若实际转换值在允许误差范围之内(需要实际测量各点电压,并计算各点电压平均值),则认为按键按下,否则程序不响应。5) 、实际试验过程中,还要考虑电阻的累积误差,选用精度越高的电阻,可分辨的按键数目越多。20.3 电路和连接本实验主要有两部分电路模块组成:串口电平转换电路,A/D键盘电路。串口电平转换电路在前面的实例中我们已经做过介绍,在此不再重复。这里我们重点介绍一下A/D键盘电路。实际试验中我们将图1中的ADC接点连接到单片机的PA1口,也就是A/D转换的AD1通道。20.4 程序设计1、程序功能在本实例中,我们利用串口将A/D键盘中按下的按键的键码值发送

5、到计算机,通过串口助手观察实验结果。2、函数说明本实例主要有串口数据发送程序和A/D键盘识别程序,串口数据发送程序我们前面例子中已经介绍过,本实例的程序中不再详细说明。3、编程说明使用WINAVR开发环境,使用的是外部12M的晶振,所以需要将makefile文件中的时钟频率修改为12M。另外在程序烧录到单片机的时候,熔丝位也要选择为外部12M晶振(注意是晶振,不是外部振荡器,一定不要选择错了,否则会导致单片机不能再烧写程序)。4、程序代码/*AVRA/D键盘范例* *MCU:ATmega16* *作者:maweili* *编译器:WINAVR*2009.4.3*/中断函数头文件波特率设置值转换

6、获得的数据端口初始化配置寄存器设置初始化*#include<avr/io.h>#include<util/delay.h>#include<avr/interrupt.h>/常量声明#defineBAUD9600/全局变量声明unsignedintADData;/AD/函数声明voidPort_Init(void);/voidUsart_Init(void);/USARTvoidAD_Init(void);/ADvoidUsart_PutChar(unsignedcharcTXData);/字节发送函数voidUsart_PutString(unsigned

7、char*pcString);/字符串发送数据unsignedintAD_GetData(void);/AD转换函数voidGetKey(void);/显示按键值intmain(void)unsignedcharDelay3s;Port_Init();Usart_Init();AD_Init();Usart_PutString("AD键盘测试程序");/Usart_PutString("你按下的按键序号为:");sei();/使能全局中断while(1)ADData=AD_GetData();/获得的AD直if(ADData>5)/判断是否有按键按

8、下_delay_ms(50);/按键消抖if(ADData>5)GetKey();_delay_ms(200);/获取按键值for(Delay3s=0;Delay3s<10;Delay3s+)/_delay_ms(90);延时3S/端口状态初始化设置函数voidPort_Init()PORTA=0X00;DDRA=0x00;/ADC通道设置为输入口,高阻态/USART寄存器配置函数voidUsart_Init()UCSRA=0X00;UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);/异步,数据格式8,N,1/UCS

9、RC寄存器与UBRR博存器共用相同的I/O地址,写UCSRC时,URSEL应设置为1。UBRRL=(F_CPU/BAUD/16-1)%256;/波特率设置UBRRH=(F_CPU/BAUD/16-1)/256;UCSRB|=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);/发送使能/字节发送函数voidUsart_PutChar(unsignedcharcTXData)while(!(UCSRA&(1<<UDRE);/只有数据寄存器为空时才能发送数据UDR=cTXData;/发送数据送USARTI/O数据寄存器UDR/接收中

10、断函数ISR(USART_RXC_vect)unsignedcharRev;Rev=UDR;/从USARTI/O数据寄存器UD仲读出数据Usart_PutChar(Rev);/将接收到的数据发送voidUsart_PutString(unsignedchar*pcString)while(*pcString)Usart_PutChar(*pcString+);Usart_PutChar(0x0D);Usart_PutChar(0x0A);/结尾发送回车换行/AD转换初始化函数voidAD_Init()ADMUX|=(1<<REFS0)|(1<<MUX0)|(1<&

11、lt;ADLAR);/ADC参考电压为AVcc,ADC吉果左对齐,选择通道ADC1ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1);/使能AD专换,ADC寸钟64分频/AD转换函数unsignedintAD_GetData()ADCSRA尸(1<<ADSC);/开始AD专换while(!(ADCSRA&(1<<ADIF);/等待转换完成ADCSRA|=(1<<ADIF);/清零ADC断标志位returnADCH;/返回ADC值,只取高8位voidGetKey(void)if(ADDat

12、a>226)&&(ADData<234)Usart_PutString("你按下的按键序号为:");Usart_PutChar(0x31);Usart_PutChar(0x0d);/Usart_PutChar(0x0a);/AD值发送结束,回车换行_delay_ms(200);elseif(ADData>186)&&(ADData<194)Usart_PutString("你按下的按键序号为:");Usart_PutChar(0x32);Usart_PutChar(0x0d);/Usart_PutC

13、har(0x0a);/AD值发送结束,回车换行_delay_ms(200);elseif(ADData>157)&&(ADData<165)Usart_PutString("你按下的按键序号为:");Usart_PutChar(0x33);Usart_PutChar(0x0d);/Usart_PutChar(0x0a);/AD值发送结束,回车换行_delay_ms(200);elseif(ADData>135)&&(ADData<143)Usart_PutString("你按下的按键序号为:");U

14、sart_PutChar(0x34);Usart_PutChar(0x0d);/Usart_PutChar(0x0a);/AD值发送结束,回车换行_delay_ms(200);elseif(ADData>117)&&(ADData<125)Usart_PutString("你按下的按键序号为:");Usart_PutChar(0x35);Usart_PutChar(0x0d);/Usart_PutChar(0x0a);/AD值发送结束,回车换行_delay_ms(200);elseif(ADData>101)&&(ADDat

15、a<109)Usart_PutString("你按下的按键序号为:");Usart_PutChar(0x36);Usart_PutChar(0x0d);/Usart_PutChar(0x0a);/AD值发送结束,回车换行_delay_ms(200);elseif(ADData>90)&&(ADData<98)Usart_PutString("你按下的按键序号为:");Usart_PutChar(0x37);Usart_PutChar(0x0d);/Usart_PutChar(0x0a);/AD值发送结束,回车换行_del

16、ay_ms(200);elseif(ADData>78)&&(ADData<86)Usart_PutString("你按下的按键序号为:");Usart_PutChar(0x38);Usart_PutChar(0x0d);/Usart_PutChar(0x0a);/AD值发送结束,回车换行_delay_ms(200);elseif(ADData>69)&&(ADData<77)Usart_PutString("你按下的按键序号为:");Usart_PutChar(0x39);Usart_PutCha

17、r(0x0d);/Usart_PutChar(0x0a);/AD值发送结束,回车换行_delay_ms(200);elseif(ADData>60)&&(ADData<68)Usart_PutString("你按下的按键序号为:");Usart_PutChar(0x40);Usart_PutChar(0x0d);/Usart_PutChar(0x0a);/AD值发送结束,回车换行_delay_ms(200);elseif(ADData>52)&&(ADData<60)Usart_PutString("你按下的

18、按键序号为:");Usart_PutChar(0x41);Usart_PutChar(0x0d);/Usart_PutChar(0x0a);/AD值发送结束,回车换行_delay_ms(200);elseif(ADData>44)&&(ADData<52)Usart_PutString("你按下的按键序号为:");Usart_PutChar(0x42);Usart_PutChar(0x0d);/Usart_PutChar(0x0a);/AD值发送结束,回车换行_delay_ms(200);elseif(ADData>37)&&(ADData<45)Usart_PutString("你按下的按键序号为:");Usart_PutChar(0x43);Usart_PutChar(0x0d);/Usart_PutChar(0x0a);/AD值发送结束,回车换行_delay_ms(200);elseif(ADDa

温馨提示

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

评论

0/150

提交评论