[讨论] 模拟量输入与输出应用实例(1)

rain   2006-7-15 17:13 楼主

 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)

       {

             

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

}

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复