打印

哥发个PIC16F8XX系列的AD转换函数,你直接调用就行了

[复制链接]
1836|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaoyang9992006|  楼主 | 2012-6-19 20:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gaoyang9992006 于 2012-6-19 20:15 编辑

unsigned int ADC(unsigned char AD_FOSC,unsigned char ADC_Channel,unsigned char Alignment,unsigned char ADC_Select);
void ADC_Close(void);
unsigned int ADC(unsigned char AD_FOSC,unsigned char ADC_Channel,unsigned char Alignment,unsigned char ADC_Select)
{
    unsigned int result=0;
    ADCON0 &= 0x3F; //x先把高两位清零,其他位置不变
    AD_FOSC<<=0x06; //把数据左移六位到达高两位。
    ADCON0 |=AD_FOSC;//完成转换时钟选择。
    ADCON0 &= 0xC7;//(把BIT5~BIT3清零)
    ADC_Channel<<=0x03;// 左移三位对应位置。
    ADCON0 |=ADC_Channel;//完成通道选择
    ADCON1 &=0x7F;
    ADCON1|=( Alignment<<7);
    ADCON1&=0xF0;
    ADCON1|=ADC_Select;//完成端口功能选择
    ADCON0|=0x01;//ADON=1;启用AD转换。
    ADCON0|=0x04;//GO/DONE=1;启动转换过程。
    while(ADCON0&0x04);//等待转换完成
    if(Alignment)
         result=(unsigned char)(ADRESH<<8)|ADRESL;
    else result=ADRESH;//如果选择左对齐,也就是选择8位精度,舍弃ADRESL中的低两位。
    return result;
}
void ADC_Close()
{
    ADCON0&=0xFE;
}
沙发
Ryanhsiung| | 2012-6-20 20:58 | 只看该作者
给个建议,写的不是很好,不过还是鼓励一下。
下面写的比较难看懂:
    ADCON0 |=AD_FOSC;//完成转换时钟选择。
    ADCON0 &= 0xC7;//(把BIT5~BIT3清零)
  
  建议:使用位域(PIC自带的),ADCON0bits.XXX=1; 这样加上描述后 更好看

使用特权

评论回复
板凳
gaoyang9992006|  楼主 | 2012-6-21 19:12 | 只看该作者
2# Ryanhsiung 恩,你说的是,我怕这不同的编译器下命名不一样,就这么写啦,实际上转换成汇编后代码是一致的,我就为了个通用,其他的都交给接口啦,哈哈,我感觉使用起来很方便啦,不用重复写代码啦,你有好的想法也发来学习学习啊

使用特权

评论回复
地板
兰天白云| | 2012-6-22 09:17 | 只看该作者
到底采用哪种写法好?本人也在摇摆中

鼓励鼓励

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1958

主题

15904

帖子

207

粉丝