⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2_ad.c

📁 一些用于电话管理的pc机下位机程序
💻 C
字号:
//程序实现A/D转换功能,A/D采用中断方式//程序实现A/D转换功能,A/D采用中断方式。该程序通过单片机的RA2模拟通道送入一直流电压,
//当送入的直流电压大于2.5V时,与PORTD口相连的8个发光二极管闪动,当直流电压恢复到
//2.5V以下时,发光二极管停止闪动,且只有低四个发光。
 
#include <p18cxxx.h>
#include  <adc.h>
union                   adres
{
         int              y1;
         unsigned  char  adre[2];
}adresult;                                        //定义一个共用体,用于存放A/D转换的结果
 
unsigned   char i;
unsigned   int    j;
 
void  InterruptHandlerHigh(void);
 
//系统各I/O口初始化子程序
void  initial(void)
{
         TRISD=0X00;                       //D口为输出
         i=0x00;
}
 
//A/D转化初始化子程序
void  adinitial(void)
{
         INTCON=0X00;                   //禁止总中断和外围中断
         ADCON0=0x51;                   //选择A/D通道为RA2,打开A/D转换器
                                        //在工作状态,且使A/D转换时钟为8tosc
         ADCON1=0X80;                   //转换结果右移,及ADRESH寄存器的高6位为"0"
                                        //且把RA2口设置为模拟量输入方式
         PIR1bits.ADIF=0;               //清除A/D转换标志
         PIE1bits.ADIE=1;              	//A/D转换中断允许
         INTCONbits.PEIE=1;         	 //外围中断允许
         IPR1bits.ADIP=1;              //B口变位中断高优先级
         RCONbits.IPEN=1;              //使能中断优先级
         PORTAbits.RA2=1;              //设置RA2为输入方式
}
 
//延时子程序
void  delay(void)
{
         for(j=5535;--j;)    continue;
}
 
//报警子程序
void  alarm(void)
{
         i=i^0xFF;                            //通过异或方式每次把i的各位值取反     
     
         PORTD=i;                             //D口输出i的值
}
 
//高优先级中断向量
#pragma code InterruptVectorHigh=0x08
void  InterruptVectorHigh (void)
{
  _asm
    goto InterruptHandlerHigh             //跳到中断程
  _endasm
}
 
//高优先级中断服务程序
#pragma code
#pragma interrupt InterruptHandlerHigh
void  InterruptHandlerHigh ()
{
         PIR1bits.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个发亮,表示系统正常
         ADCON0bits.GO=1;                     //启动下一次A/D转换
}  
 
//主程序
void main(void)
{
         adinitial();                                        //A/D转换初始化
         initial();                                           //系统各I/O口初始化       
  
         INTCONbits.GIE=1;                     //总中断允许
         ADCON0bits.GO=1;                      //启动A/D转换
         while(1)
         {
                   ;
         }                                                      
//等待中断,在中断中循环检测外部电压
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -