管理信息化学习笔记二十基于模数转换的键盘实验.

上传人:精****库 文档编号:137821522 上传时间:2020-07-12 格式:DOC 页数:9 大小:153.72KB
返回 下载 相关 举报
管理信息化学习笔记二十基于模数转换的键盘实验._第1页
第1页 / 共9页
管理信息化学习笔记二十基于模数转换的键盘实验._第2页
第2页 / 共9页
管理信息化学习笔记二十基于模数转换的键盘实验._第3页
第3页 / 共9页
管理信息化学习笔记二十基于模数转换的键盘实验._第4页
第4页 / 共9页
管理信息化学习笔记二十基于模数转换的键盘实验._第5页
第5页 / 共9页
点击查看更多>>
资源描述

《管理信息化学习笔记二十基于模数转换的键盘实验.》由会员分享,可在线阅读,更多相关《管理信息化学习笔记二十基于模数转换的键盘实验.(9页珍藏版)》请在金锄头文库上搜索。

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端点处的电压不同,通过判断不同的电压值就可以判断出是那个按键被按下。AV

3、R单片机的A/D转换位数为10位,实际应用中我们只取高8位的值就可以分辨出16个按键。我们设定AD转换的参考电压为VCC,这样A/D键盘识别准确度最高,并且能够识别更多的按键。 图1 A/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、程序代码/* AVR A/D键盘范例 * MCU: ATmega16 * 作者: maweili * 编译器:WINAVR * *

6、 2009.4.3 */#include #include #include /中断函数头文件/常量声明#define BAUD 9600 /波特率设置值/全局变量声明unsigned int ADData; /AD转换获得的数据/函数声明void Port_Init(void); /端口初始化配置void Usart_Init(void); /USART寄存器设置void AD_Init(void); /AD初始化void Usart_PutChar(unsigned char cTXData); /字节发送函数void Usart_PutString(unsigned char *pcSt

7、ring); / 字符串发送数据unsigned int AD_GetData(void); /AD转换函数void GetKey(void); /显示按键值int main(void) unsigned char Delay3s;Port_Init();Usart_Init();AD_Init();Usart_PutString(AD键盘测试程序);/Usart_PutString(你按下的按键序号为:);sei(); /使能全局中断 while(1)ADData = AD_GetData();/获得的AD值 if(ADData 5) /判断是否有按键按下_delay_ms(50); /按键

8、消抖if(ADData 5)GetKey(); /获取按键值_delay_ms(200);for(Delay3s = 0;Delay3s 10;Delay3s+) /延时3S_delay_ms(90);/端口状态初始化设置函数void Port_Init()PORTA = 0X00; DDRA = 0x00; /ADC通道设置为输入口,高阻态/USART寄存器配置函数void Usart_Init()UCSRA = 0X00;UCSRC |= (1URSEL) | (1 UCSZ1) | (1 UCSZ0); /异步,数据格式8,N,1 /UCSRC寄存器与UBRRH寄存器共用相同的I/O地址

9、,写 UCSRC 时, URSEL 应设置为 1。UBRRL = (F_CPU / BAUD / 16 - 1) % 256; /波特率设置UBRRH = (F_CPU / BAUD / 16 - 1) / 256;UCSRB |= (1 RXCIE) | (1 RXEN) | (1 TXEN); /发送使能/字节发送函数void Usart_PutChar(unsigned char cTXData)while( !(UCSRA & (1 UDRE) ); /只有数据寄存器为空时才能发送数据UDR = cTXData; /发送数据送USART I/O数据寄存器UDR/接收中断函数ISR(US

10、ART_RXC_vect )unsigned char Rev;Rev = UDR; /从USART I/O数据寄存器UDR中读出数据Usart_PutChar(Rev); /将接收到的数据发送void Usart_PutString(unsigned char *pcString)while (*pcString)Usart_PutChar(*pcString+); Usart_PutChar(0x0D);Usart_PutChar(0x0A); /结尾发送回车换行/AD转换初始化函数void AD_Init()ADMUX |= (1 REFS0) | (1 MUX0) | (1 ADLAR); /ADC参考电压为AVcc,ADC结果左对齐,选择通道ADC1ADCSRA |= (1 ADEN) | (1 ADPS2) | (1 ADPS1); /使能AD转换,ADC时钟64分频/AD转换函数unsigned int AD_GetData()ADCSRA |= (1 ADSC); /开始AD转换while(!(ADCSRA & (1 ADIF); /等待转换完成ADCSRA |= (1 226) & (ADData 186) & (ADData 157) & (ADData 165)Usart_PutString(你按下的按键序号为:);Usart_Pu

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 企业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号