AVR学习笔记二十基于模数转换的AD键盘实验Word文档格式.docx
- 文档编号:13333953
- 上传时间:2022-10-09
- 格式:DOCX
- 页数:13
- 大小:152.02KB
AVR学习笔记二十基于模数转换的AD键盘实验Word文档格式.docx
《AVR学习笔记二十基于模数转换的AD键盘实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《AVR学习笔记二十基于模数转换的AD键盘实验Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
我们设定AD转换的参考电压为VCC,这样A/D键盘识别准确度最高,并且能够识别更多的按键。
图1A/D键盘电路
20.2.2A/D键盘的缺陷
在实际应用中,我们是不可能得到准确的A/D转换值的,这是因为存在以下几种误差:
1)、对于同一点处的电压值,A/D多次采样的结果不可能完全相同。
2)、电阻的误差。
电阻值由于电阻的精度和环境温度的原因,误差较大,所以A/D键盘各个按键点的分压不准确。
3)、为尽量减少误差,可以采取增加电阻精度、增加温度补偿等方法,另外在软件处理时候要注意消除按键抖动等因素,还要对实际转换值和标准值给出误差补偿。
4)、如果按键按下,经过A/D转换,若实际转换值在允许误差范围之内(需要实际测量各点电压,并计算各点电压平均值),则认为按键按下,否则程序不响应。
5)、实际试验过程中,还要考虑电阻的累积误差,选用精度越高的电阻,可分辨的按键数目越多。
20.3电路和连接
本实验主要有两部分电路模块组成:
串口电平转换电路,A/D键盘电路。
串口电平转换电路在前面的实例中我们已经做过介绍,在此不再重复。
这里我们重点介绍一下A/D键盘电路。
实际试验中我们将图1中的ADC接点连接到单片机的PA1口,也就是A/D转换的AD1通道。
20.4程序设计
1、程序功能
在本实例中,我们利用串口将A/D键盘中按下的按键的键码值发送到计算机,通过串口助手观察实验结果。
2、函数说明
本实例主要有串口数据发送程序和A/D键盘识别程序,串口数据发送程序我们前面例子中已经介绍过,本实例的程序中不再详细说明。
3、编程说明
使用WINAVR开发环境,使用的是外部12M的晶振,所以需要将makefile文件中的时钟频率修改为12M。
另外在程序烧录到单片机的时候,熔丝位也要选择为外部12M晶振(注意是晶振,不是外部振荡器,一定不要选择错了,否则会导致单片机不能再烧写程序)。
4、程序代码
/***********************************************
****AVRA/D键盘范例***
****MCU:
ATmega16***
****作者:
maweili***
****编译器:
WINAVR***
*******
****2009.4.3***
***********************************************/
#include<
avr/io.h>
util/delay.h>
avr/interrupt.h>
//中断函数头文件
//常量声明
#defineBAUD9600//波特率设置值
//全局变量声明
unsignedintADData;
//AD转换获得的数据
//函数声明
voidPort_Init(void);
//端口初始化配置
voidUsart_Init(void);
//USART寄存器设置
voidAD_Init(void);
//AD初始化
voidUsart_PutChar(unsignedcharcTXData);
//字节发送函数
voidUsart_PutString(unsignedchar*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)//判断是否有按键按下
{
_delay_ms(50);
//按键消抖
if(ADData>
5)
{
GetKey();
//获取按键值
}
_delay_ms(200);
}
for(Delay3s=0;
Delay3s<
10;
Delay3s++)//延时3S
_delay_ms(90);
}
}
//端口状态初始化设置函数
voidPort_Init()
PORTA=0X00;
DDRA=0x00;
//ADC通道设置为输入口,高阻态
//USART寄存器配置函数
voidUsart_Init()
UCSRA=0X00;
UCSRC|=(1<
<
URSEL)|(1<
UCSZ1)|(1<
UCSZ0);
//异步,数据格式8,N,1
//UCSRC寄存器与UBRRH寄存器共用相同的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
//接收中断函数
ISR(USART_RXC_vect)
unsignedcharRev;
Rev=UDR;
//从USARTI/O数据寄存器-UDR中读出数据
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<
ADLAR);
//ADC参考电压为AVcc,ADC结果左对齐,选择通道ADC1
ADCSRA|=(1<
ADEN)|(1<
ADPS2)|(1<
ADPS1);
//使能AD转换,ADC时钟64分频
//AD转换函数
unsignedintAD_GetData()
ADSC);
//开始AD转换
while(!
(ADCSRA&
ADIF)));
//等待转换完成
ADIF);
//清零ADC中断标志位
returnADCH;
//返回ADCH值,只取高8位
voidGetKey(void)
if((ADData>
226)&
&
(ADData<
234))
Usart_PutString("
Usart_PutChar(0x31);
Usart_PutChar(0x0d);
//
Usart_PutChar(0x0a);
//AD值发送结束,回车换行
elseif((ADData>
186)&
194))
Usart_PutChar(0x32);
//AD值发送结束,回车换行
157)&
165))
Usart_PutChar(0x33);
135)&
143))
Usart_PutChar(0x34);
117)&
125))
Usart_PutChar(0x35);
Usart_Put
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AVR 学习 笔记 基于 转换 AD 键盘 实验