单片机编程用什么语言ADC怎么编程

自学单片机之ADC 模数转换_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
自学单片机之ADC 模数转换
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢基于51单片机,ADC0832,编程一直失败,大家帮忙看看_单片机吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:145,658贴子:
基于51单片机,ADC0832,编程一直失败,大家帮忙看看收藏
我们做了一个传感器,然后发给ADC采样,发给单片机输出一个IO口一个高电压。听起来是很简单,但是我们初学者,不知道keil的时候为什么一直是error。请吧友们,看看我们是哪里不对。谢谢#include&reg51.h&#include"abc0832.h"sbit ADC_CS=P2^0;sbit ADC_Clk=P2^1;sbit ADC_DO=P2^2;sbit ADC_DI=P2^3;unsigned char adval=ox00;unsigned char ReadADC(void){unsigned char i,ch,bb,cc,ch=0;ADC_CS=0;ADC_DO=0;//片选,DO为高阻态for(i=0;i&10;i++){;}ADC_CLK=0;delay(2);ADC_DI=1;ADC_CLK=1;delay(2);//第一个脉冲,起始位???ADC_CLK=0;delay(2);ADC_DI=1;ADC_CLK=1;delay(2);//第二个脉冲,DI=1表示双通道单极性输入???ADC_CLK=0;delay(2);ADC_DI=1;ADC_CLK=1;delay(2);//第三个脉冲,DI=1表示选择通道1(CH2)????ADC_DI=0;ADC_DO=1;//DI转为高阻态,DO脱离高阻态为输出数据作准备??ADC_CLK=1;delay(2);ADC_CLK=0;delay(2);//经实验,这里加一个脉冲AD便能正确读出数据,????????//不加的话读出的数据少一位(最低位d0读不出??
for(i=0;i&8;i++){ADC_CLK=1;delay(2);ADC_CLK=0;delay(2);ch=(ch&&1)|ADC_DO;//在每个脉冲的下降沿DO输出一位数据,最终ch为8位二进制数???}ADC_CS=1;//取消片选,一个转换周期结束??adval=}int main(){while(1){char ReadADC();if(adval!=ox00){P1^1 ==1;elseP1^1 ==0;}}}
单片机,到技成培训,PLC,变频器,电工应有尽有,一年学费仅1298,免费注册即可试学1298元包年学习,含答疑辅导课,性价比超高,自动化远程培训第—品牌,深圳技成
把ADC_DI=P2^2
登录百度帐号推荐应用STC12C2052AD单片机内部ADC的操作方法|我爱单片机 - 数码之家
查看完整版本: [--
赞助商链接
STC12C2052AD单片机内部ADC的操作方法P3口接LED验证通过可以实现对P3口0X00~0XFF也就是实现0~255的变化研究内部ADC好久终于学会了感慨万千发帖庆贺程序名:    8位ADC转换实验程序硬件支持:  STC12C2052AD 使用ADC功能 外部晶体12MHz   #include &reg51.h&#include &intrins.h& //51基本运算(包括_nop_空函数)#define u8 unsigned char#define u16 unsigned int /*Declare SFR associated with the ADC */sfr ADC_CONTR   =   0xC5;           //ADC 控制寄存器地址sfr ADC_DATA    =   0xC6;           //ADC的8位结果寄存器sfr ADC_LOW2    =   0xBE;           //ADC low 2-bit result registersfr P1M0        =   0x91;           //P1 mode control register0sfr P1M1        =   0x92;           //P1 模式  控制    寄存器 1/*Define ADC operation const for ADC_CONTR*/#define ADC_POWER   0x80            //ADC 电源控制位#define ADC_FLAG    0x10            //ADC 转换结束标志位 flag#define ADC_START   0x08            //ADC 开始转换控制位#define ADC_SPEEDLL 0x00            //420 个时钟周期转换一次#define ADC_SPEEDL  0x20            //280 个时钟周期转换一次#define ADC_SPEEDH  0x40            //140 个时钟周期转换一次#define ADC_SPEEDHH 0x60            //70 个时钟周期转换一次void InitADC();u16 ADC(u8 ch);void Delay(u16 n);void main(){        InitADC();                      //Init ADC sfr    while (1)    {/*这里要读取那个通道就调用ADC()在括号里写入通道号就可以*//*为了简单观察变化我直接把ADC的值赋值给了P3口观察led变化验证是否实现0X00~0XFF产生255个变化*//*注意硬件P3口没有p3.6*/       P3=ADC(0);              //显示 通道0        Delay(100);        P3=ADC(1);              //显示 通道1        Delay(100);        P3=ADC(2);              //显示 通道2        Delay(100);        P3=ADC(3);              //显示 通道3        Delay(100);        P3=ADC(4);              //显示 通道4        Delay(100);        P3=ADC(5);              //显示 通道5        Delay(100);        P3=ADC(6);              //显示 通道6        Delay(100);             P3=ADC(7);              //显示 通道7        Delay(100);    }}/*----------------------------得到 ADC 返回值----------------------------*/u16 ADC(u8 ch){    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;    _nop_();                        //必须 等待 4个时钟周期    _nop_();    _nop_();    _nop_();    while (!(ADC_CONTR & ADC_FLAG));//等待FLAG为1    ADC_CONTR &= ~ADC_FLAG;         //清FLAG为0    return ADC_DATA;                //返回 ADC结果}/*----------------------------Initial ADC sfr----------------------------*/void InitADC(){    P1 = P1M0 = P1M1 = 0        //Set all P1 as Open-Drain mode    ADC_DATA = 0;                   //对ADC结果寄存器ADC_DATA清    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//启动A/D电源    Delay(2);                       //使输入电压达到稳定(1ms即可)}/*----------------------------Software delay function----------------------------*/void Delay(u16 n){  u16    while (n--)    {        x = 5000;        while (x--);    }}
赞助商链接
我想说,老姚把这些已经写的很清楚了。
赞助商链接
这是 PWM 调光么?
菜鸟路过帮顶
这就是单片机的麻烦,没人可问时,小小例程都觉得难。一旦翻过又觉得简单,不值一提。
:我想说,老姚把这些已经写的很清楚了。 学渣表示当初没学C语言直接玩的51走了些弯路 不懂有参数有返回值函数是啥子概念老妖给出的串口发送ADC结果又对我来说真正要投入使用我搞不明白怎么直接调用各个通道采集结果经过“烦”数据手册简单修改官方给的实例代码现在终于能得到自己想要的结果让老鸟见笑了
:这是 PWM 调光么? ( 06:45) 不是可以理解为一个简单的STC内部8位ADC操作实例
:菜鸟路过帮顶 ( 09:28) 新人共勉 谢谢帮顶
我只要当1脚电压高于某值,2脚输出高电平。用ad。怎么写程序?谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢
:这就是单片机的麻烦,没人可问时,小小例程都觉得难。一旦翻过又觉得简单,不值一提。 ( 09:56) 我只要当1脚电压高于某值,2脚输出高电平。用ad。怎么写程序?谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢
:我只要当1脚电压高于某值,2脚输出高电平。用ad。怎么写程序?谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢 你把主程序修改为以下代码应该可以实现&&&&&&&&&& 锂电池的话可以修改为&&&&&&&&&& if(a&214)&&&&/*意思就是判断电压是否大于4.1944V&&*/void main(){&&&&&&&&&&u16&&&& a,&&&&&&&&&& InitADC();/*初始ADC*/&&&&&&&&&& &&&&&&&&&&&&while(1)&&{&&&&&&&&&&&&&&&&value=ADC(0);&&&&&&&&&&&&&&&&a=(value*0.2549);/*等于(255*0.v&&&&*/&&&&&&&&&&&&&&&&&&&& if(a&255)&&&&/*意思就是判断电压是否大于4.998V&&*/&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&& LED=1;/*sbit LED=P2^0 ;*/&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&& LED=0;&&}
把软滤波弄进去就更好了
:把软滤波弄进去就更好了 ( 13:55) 我到是想但我不知道怎么写还望兄台赐教
:学渣表示当初没学C语言直接玩的51走了些弯路 ....... ( 10:02) 扎实的C基础还是很重要的.否则写出来的程序就像面条一样,全局变量,局部变量,宏定义.结构体,联合.函数.指针.参数传递.这些都是常用的,
收藏学习学习,学好c语言!
用汇编写 代码利用率不是一般的高&&&&
菜鸟路过,虽然不懂不过帮顶,恭喜恭喜
查看完整版本: [--
Powered by
Time 0.180985 second(s),query:5 Gzip enabled> 手把手教你学51单片机与Proteus第十四讲模数转换器ADC0804的工作原理与编程上
手把手教你学51单片机与Proteus第十四讲模数转换器ADC0804的工作原理与编程上
手把手教你学51单片机与Proteus
播放:4086
播放:2747
播放:2656
播放:2959
播放:1217
播放:5218
播放:1655
播放:1311
播放:1319
播放:1711
播放:1235
播放:2768
播放:1234
播放:1010
播放:1000
播放:1004
播放:1337
播放:1340
播放:3029
播放:1529
播放:1117
播放:1377
播放:1157
播放:1268
播放:1176
播放:1041
播放:1565
播放:1417
播放:1218
播放:1321
播放:1534
验 证 码:
《电子产品世界》杂志社 版权所有 北京东晓国际技术信息咨询有限公司
Copyright & ELECTRONIC ENGINEERING & PRODUCT WORLD. All rights reserved.
京ICP060382号
北京市公安局备案:Arm学习笔记--ADC编程
11:55:01来源: eefocus
&A/D转换器的功能是将模拟输入信号采样得到可以提供计算机进行处理的数字信号。开发板的A/D输入模块电路图如下&
这是一个测量电压值的电路。
LPC1788的ADC是一个12位的逐次逼近型模数转换器,有8个复用的输入管脚,它的时钟使用PCLK分频得到。&从这段描述中我们可以分析出一下的内容:
1、编程的时候需要首先打开这个功能,所以需要配置寄存器PCONP
2、既然ADC有8个引脚,所以就有一个选择的寄存器,这个就是控制寄存器,因为时钟需要切换,控制寄存器也包含这个功能
3、ADC需要有数据寄存器来保存读取到的数据,那么每个输入管脚就对应一个寄存器用来存储对应引脚的数据,这就是数据寄存器
4、ADC当前状态的检测需要一个状态寄存器
5、从ADC的块图上我们可以看出有中断接口,所以肯定有一个中断使能寄存器表明是那个引脚引起的中断
6、从块图上看到有一个触发源,这里也是一个寄存器控制
从块图和ADC的原理上我们基本上能理出这些内容,下面我们就来看一个ADC的例程,从例程中分析LPC1788 ADC的编程思路。
这是关于LPC1788的ADC寄存器定义,跟我们的分析差不多
typedef struct
__IO uint32_t CR; /*!< Offset: 0x000 A/D Control Register (R/W) */
__IO uint32_t GDR; /*!< Offset: 0x004 A/D Global Data Register (R/W) */
uint32_t RESERVED0;
__IO uint32_t INTEN; /*!< Offset: 0x00C A/D Interrupt Enable Register (R/W) */
__IO uint32_t DR[8]; /*!< Offset: 0x010-0x02C A/D Channel 0..7 Data Register (R/W) */
__I uint32_t STAT; /*!< Offset: 0x030 A/D Status Register (R/ ) */
__IO uint32_t ADTRM;
} LPC_ADC_TypeD
ADC的初始化代码,主要设置了时钟频率,满足ADC操作的需求
void ADC_Init(LPC_ADC_TypeDef *ADCx, uint32_t rate)
uint32_t temp,
// Turn on power and clock
CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCADC, ENABLE); //开启ADC功能
ADCx->CR = 0; //控制寄存器初始化
//Enable PDN bit
tmp = ADC_CR_PDN;
// Set clock frency
temp = CLKPWR_GetCLK(CLKPWR_CLKTYPE_PER); //设置时钟频率
/* The APB clock (PCLK_ADC0) is divided by (CLKDIV+1) to produce the clock for
* A/D converter, which should be less than or equal to 12.4MHz.
* A fully conversion requires 31 of these clocks.
* ADC clock = PCLK_ADC0 / (CLKDIV + 1);
* ADC rate = ADC clock / 31;
temp = (temp /(rate * 31)) - 1;
tmp |= ADC_CR_CLKDIV(temp);
ADCx->CR = //配置了时钟频率
/*********************************************************************//**
* @brief ADC
configuration
* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC
* @param[in] IntType: type of interrupt, should be:
* - ADC_ADINTEN0: Interrupt channel 0
* - ADC_ADINTEN1: Interrupt channel 1
* - ADC_ADINTEN7: Interrupt channel 7
* - ADC_ADGINTEN: Individual channel/global flag done generate an interrupt
* @param[in] NewState:
* - SET : enable ADC interrupt
* - RESET: disable ADC interrupt
* @return None
**********************************************************************/
void ADC_IntConfig (LPC_ADC_TypeDef *ADCx, ADC_TYPE_INT_OPT IntType, FunctionalState NewState)
ADCx->INTEN &= ~ADC_INTEN_CH(IntType);
if (NewState){
ADCx->INTEN |= ADC_INTEN_CH(IntType);
void ADC_ChannelCmd (LPC_ADC_TypeDef *ADCx, uint8_t Channel, FunctionalState NewState)
if (NewState == ENABLE) {
ADCx->CR |= ADC_CR_CH_SEL(Channel);
ADCx->CR &= ~ADC_CR_CH_SEL(Channel);
void ADC_IRQHandler(void)
_value = 0;
if (ADC_ChannelGetStatus(LPC_ADC, TENGHUA_ADC_PREPARED_CHANNEL, ADC_DATA_DONE))
adc_value = ADC_ChannelGetData(LPC_ADC, TENGHUA_ADC_PREPARED_CHANNEL);
NVIC_DisableIRQ(ADC_IRQn);
其实ADC是很简单和基础的,主要还是掌握好寄存器的使用。
关键字:&&
编辑:什么鱼
引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
微信扫一扫加关注 论坛活动 E手掌握
微信扫一扫加关注
芯片资讯 锐利解读
大学堂最新课程
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。}

我要回帖

更多关于 单片机c语言编程300例 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信