3737|0

1379

帖子

0

TA的资源

裸片初长成(中级)

楼主
 

模拟量输入与输出应用实例(1) [复制链接]

 A/D转换的应用

  A/D转换初始化程序

//A/D转换初始化子程序

void        adinitial( )

{

       ADCON0 = 0x51              //选择A/D通道为RA2,打开A/D转换器

                                             //在工作状态,且使AD转换时钟为8tosc

       ADCON1 = 0X80             //转换结果右移,及ADRESH寄存器的高6位为"0"

                                    //且把RA2口设置为模拟量输入方式

       PIE1 = 0X00

       PIE2 = 0X00

       ADIE = 1                         //A/D转换中断允许

       PEIE = 1                          //外围中断允许

       TRISA2=1                       //设置RA2为输入方式

}

 

  程序清单

下面给出一个调试通过的例程,可作为读者编制程序的参考。该程序中用共用体的方式把A/D转换的10位结果组合在一起。有关共用体的详细资料请参考本书相关章节。

# include        <pic.h>

union             adres

{int         y1

unsigned  char  adre[2]

}adresult                                 //定义一个共用体,用于存放A/D转换的结果

unsigned   char    i

unsigned   int       j

//系统各I/O口初始化子程序

void        initial()

{

       TRISD=0X00                   //D口为输出

       i=0x00

}

//A/D转化初始化子程序

void        adinitial()

{

       ADCON0=0x51                //选择A/D通道为RA2,打开A/D转换器

                                             //在工作状态,且使A/D转换时钟为8tosc

       ADCON1=0X80               //转换结果右移,及ADRESH寄存器的高6位为"0"

                                    //且把RA2口设置为模拟量输入方式

       PIE1=0X00

       PIE2=0X00

       ADIE=1                           //A/D转换中断允许

       PEIE=1                            //外围中断允许

       TRISA2=1                       //设置RA2为输入方式

}

//延时子程序

void        delay()

{

       for(j=5535--j) continue

}

//报警子程序

void        alarm()

{

       i=i^0xFF                          //通过异或方式每次把i的各位值取反     

       PORTD=i                         //D口输出i的值

}

//中断服务程序

void        interrupt         adint(void)

{

       ADIF=0                           //清除中断标志

       adresult.adre[0]=ADRESL

       adresult.adre[1]=ADRESH //读取并存储A/D转换结果,A/D转换的结果通过共

                                                 //用体的形式放入了变量y1  

       if(adresult.y1>0x200)

       {

       alarm()                                   //如果输入的模拟量大于2.5V(对应数字量

                                                 //0X200h),则调用报警子程序

       delay()                             //调用延时子程序,使电压检测不要过于频繁

       }

       else  PORTD=0XF0                  //如果输入的模拟量小于2.5V,则与D口相连的

                                                 //8个发光二极管的低4个发亮,表示系统正常

       ADGO=1                         //启动下一次A/D转换

} 

//主程序

main()

{

       adinitial()                          //A/D转换初始化

       initial()                             //系统各I/O口初始化 

       ei()                                  //总中断允许

       ADGO=1                         //启动A/D转换

while(1)

       {

             

       }                                        //等待中断,在中断中循环检测外部电压

}

此帖出自单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表