/****************************************************************************
* 文件名:AD.C
* 功能:使用ADC模块的通道3进行电压的测量,然后将转换结果从串口输出
* 说明:通讯格式为8位数据位,1位停止位,无奇偶校验,波特率为115200。
****************************************************************************/
#include "config.h"
#include <stdio.h>
uint8 time=0;
/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<50000; i++);
}
#define UART_BPS 115200 /* 定义通讯波特率 */
/****************************************************************************
* 名称:UART0_Init()
* 功能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
* 入口参数:无
* 出口参数:无
****************************************************************************/
void UART0_Init(void)
{
uint16 Fdiv;
U0LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
}
/****************************************************************************
* 名称:UART0_SendByte()
* 功能:向串口发送字节数据,并等待发送完毕。
* 入口参数:data 要发送的数据
* 出口参数:无
****************************************************************************/
void UART0_SendByte(uint8 data)
{
U0THR = data; // 发送数据
while( (U0LSR&0x40)==0 ); // 等待数据发送完毕
}
/****************************************************************************
* 名称:UART0_SendStr()
* 功能:向串口发送字符串。
* 入口参数:str 要发送的数据
* 出口参数:无
****************************************************************************/
void UART0_SendStr(uint8 const * str)
{
while(1)
{
if( * str == '\0') break;
UART0_SendByte( * str++);
}
}
/****************************************************************************
* 名称:ADC_Init()
* 功能:AD通道初始化
* 入口参数:无
* 出口参数:无
****************************************************************************/
uint32 ADC_Init(void)
{
uint32 ADC_Data;
/* 进行ADC模块设置,其中x<<n表示第n位设置为x(若x超过一位,则向高位顺延) */
ADCR =(1 << 3) | // SEL = 8 ,选择通道3
((Fpclk / 1000000 - 1) << 8) | // CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟为1MHz
(0 << 16) | // BURST = 0 ,软件控制转换操作
(0 << 17) | // CLKS = 0 ,使用11clock转换
(1 << 21) | // PDN = 1 , 正常工作模式(非掉电转换模式)
(0 << 22) | // TEST1:0 = 00 ,正常工作模式(非测试模式)
(1 << 24) | // START = 1 ,直接启动ADC转换
(0 << 27); // EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换)
DelayNS(10);
ADC_Data = ADDR; // 读取ADC结果,并清除DONE标志位
return ADC_Data;
}
/****************************************************************************
* 名称:IRQ_Time0()
* 功能:定时器0中断服务程序,用于AD按键扫描。
* 入口参数:无
* 出口参数:无
****************************************************************************/
//void __irq IRQ_Time0(void)
//{
// time++;
// T0TCR = 0x00; //关闭定时器
// T0IR = 0x01; // 清除中断标志
// VICVectAddr = 0x00; // 通知VIC中断处理结束
//}
/****************************************************************************
* 名称:Time0Init()
* 功能:初始化定时器0,定时时间0.5S。
* 入口参数:无
* 出口参数:无
****************************************************************************/
//void Time0_Init(void)
//{
// T0PR = 0; // 设置定时器0不分频
// T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC
// T0MR0 = Fpclk / 5; // 比较值(0.2S定时值)
// T0EMR = 0x30; // 设置定时器0的T0MR0匹配输出,输出方式为翻转
// T0TCR = 0x03; // 启动并复位T0TC
// T0TCR = 0X01;
// /* 设置定时器0中断IRQ */
// VICIntSelect = 0x00; // 所有中断通道设置为IRQ中断
// VICVectCntl0 = 0x24; // 定时器0中断通道分配最高优先级(向量控制器0)
// VICVectAddr0 = (uint32)IRQ_Time0; // 设置中断服务程序地址向量
// VICIntEnable = 0x00000010;
//}
/****************************************************************************
* 名称:KEY_scan()
* 功能:按键扫描。
* 说明: 实际上是将消抖的延时转为计数,提高运行效率
****************************************************************************/
//void KEY_scan()
//{
// ADCR = (ADCR&0xFFFFFF00)|0x08|(1 << 24); // 切换通道并进行第一次转换
// while( (ADDR&0x80000000)==0 ); // 等待转换结束
// ADCR = ADCR | (1 << 24); // 再次启运转换
// while( (ADDR&0x80000000)==0 );
// ADC_Data = ADDR; // 读取ADC结果
// ADC_Data = (ADC_Data>>6) & 0x3FF;
// ADC_Data = ADC_Data * 3240; //满额电压 根据实际电压来赋值
// ADC_Data = ADC_Data / 1024; //转换精度 10位
//
// //检测到有按键按下
// if(ADC_Data<3150)
// {
// Long_KEY++;
// Short_KEY++;
//
// if(Short_KEY==1000) //单按
// {
// if(ADC_Data>3110 && ADC_Data<3150) { UART0_SendStr(" V- is down \n");}
// if(ADC_Data>3000 && ADC_Data<3080) { UART0_SendStr(" V+ is down \n");}
// if(ADC_Data>2750 && ADC_Data<2900) { UART0_SendStr(" S- is down \n");}
// if(ADC_Data<500) { UART0_SendStr(" S+ is down \n");}
// Long_KEY=0;
// }
// if(Long_KEY>25000) //长按
// {
// if(time>=3)
// {
// if(ADC_Data>3110 && ADC_Data<3150) { UART0_SendStr(" V- is down \n");}
// if(ADC_Data>3000 && ADC_Data<3080) { UART0_SendStr(" V+ is down \n");}
// if(ADC_Data>2750 && ADC_Data<2900) { UART0_SendStr(" S- is down \n");}
// if(ADC_Data<500) { UART0_SendStr(" S+ is down \n");}
// Long_KEY=0;
// }
// }
// }
//
// if(ADC_Data>3150) { Long_KEY=0;Short_KEY=0;}
//
//}
/****************************************************************************
* 名称:main()
* 功能:进行通道3电压ADC转换,并把结果转换成电压值,然后发送到串口。
* 说明:在CONFIG.H文件中包含stdio.h。
****************************************************************************/
int main(void)
{
uint32 Short_KEY=0,Long_KEY=0;
uint32 ADC_Data;
PINSEL0 =( PINSEL0 & (~0x0f) ) | 0x00000005; // 设置P0.0、P0.1连接到UART0的TXD、RXD
PINSEL1 =( PINSEL1 & (0xdfffffff) ) | 0x10000000; // 设置P0.30连接到AIN3
UART0_Init(); // UART0初始化
TargetResetInit();//开发板初始化
ADC_Data=ADC_Init();//ADC初始化
// Time0_Init();// 定时器0初始化
while(1)
{
// KEY_scan();
ADCR = (ADCR&0xFFFFFF00)|0x08|(1 << 24); // 切换通道并进行第一次转换
while( (ADDR&0x80000000)==0 ); // 等待转换结束
ADCR = ADCR | (1 << 24); // 再次启运转换
while( (ADDR&0x80000000)==0 );
ADC_Data = ADDR; // 读取ADC结果
ADC_Data = (ADC_Data>>6) & 0x3FF;
ADC_Data = ADC_Data * 3240; //满额电压 根据实际电压来赋值
ADC_Data = ADC_Data / 1024; //转换精度 10位
//检测到有按键按下
if(ADC_Data<3150)
{
Long_KEY++;
Short_KEY++; //以计数代替消抖延时
if(Short_KEY==2200)//单按
{
if(ADC_Data>3110 && ADC_Data<3150) { UART0_SendStr(" V- is down \n");}
if(ADC_Data>3000 && ADC_Data<3080) { UART0_SendStr(" V+ is down \n");}
if(ADC_Data>2750 && ADC_Data<2900) { UART0_SendStr(" S- is down \n");}
if(ADC_Data<500) { UART0_SendStr(" S+ is down \n");}
Long_KEY=0;
}
if(Long_KEY>25000)//长按,可自行设置
{
if(ADC_Data>3110 && ADC_Data
没有合适的资源?快使用搜索试试~ 我知道了~
AD_KEY.zip_源码
共33个文件
h:3个
o:3个
d:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 49 浏览量
2022-09-23
13:30:24
上传
评论
收藏 91KB ZIP 举报
温馨提示
LPC2109单片机的AD功能 按键扫描
资源推荐
资源详情
资源评论
收起资源包目录
AD_KEY.zip (33个子文件)
AD_KEY——终极版
Output
AD.htm 19KB
AD.plg 202B
target.o 24KB
AD.tra 1KB
main.crf 14KB
target.crf 9KB
Startup.d 32B
Startup.o 3KB
main.__i 234B
AD.map 47KB
AD.lnp 297B
AD.hex 5KB
main.d 195B
target.d 153B
AD.sct 479B
Startup.lst 44KB
AD.axf 17KB
main.o 29KB
Code
config.h 3KB
main.c 8KB
LPC21xx.h 22KB
target.c 6KB
Target.h 3KB
Project
AD.plg 4KB
AD.uvproj 15KB
AD.uvopt 6KB
AD.uvgui_wyh.bak 162KB
AD_uvproj.bak 15KB
AD_uvopt.bak 6KB
AD_AD.dep 1KB
AD.uvgui.wyh 69KB
Startup.s 15KB
AD_Target 1.dep 290B
共 33 条
- 1
资源评论
JonSco
- 粉丝: 77
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功