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

📄 ad.lst

📁 pic18f485的AD采样程序
💻 LST
字号:
     1: //程序实现A/D转换功能,A/D采用中断方式。该程序通过单片机的RA2模拟通道送入一直流电压,
     2: //当送入的直流电压大于2.5V时,与PORTD口相连的8个发光二极管闪动,当直流电压恢复到
     3: //2.5V以下时,发光二极管停止闪动,且只有低四个发光。
     4: 
     5: #include        "p18f458.h"
     6: 
     7: union           adres
     8: {
     9:         int             y1;
    10:         unsigned  char  adre[2];
    11: }adresult;                                      //定义一个共用体,用于存放A/D转换的结果
    12: 
    13: unsigned   char i;
    14: unsigned   int  j;
    15: 
    16: void    InterruptHandlerHigh(void);
    17: 
    18: //系统各I/O口初始化子程序
    19: void    initial()
    20: {
    21:         TRISD=0X00;                     //D口为输出
    22:         i=0x00;
    23: }
    24: 
    25: //A/D转化初始化子程序
    26: void    adinitial()
    27: {
    28:         INTCON=0X00;            //禁止总中断和外围中断
    29:         ADCON0=0x51;            //选择A/D通道为RA2,打开A/D转换器
    30:                                         //在工作状态,且使A/D转换时钟为8tosc
    31:         ADCON1=0X80;            //转换结果右移,及ADRESH寄存器的高6位为"0"
    32:                                         //且把RA2口设置为模拟量输入方式
    33:         PIR1bits.ADIF=0;                //清除A/D转换标志
    34:         PIE1bits.ADIE=1;                //A/D转换中断允许
    35:         INTCONbits.PEIE=1;              //外围中断允许
    36:         IPR1bits.ADIP=1;                //B口变位中断高优先级
    37:         RCONbits.IPEN=1;                //使能中断优先级
    38:         PORTAbits.RA2=1;                //设置RA2为输入方式
    39: }
    40: 
    41: //延时子程序
    42: void    delay()
    43: {
    44:         for(j=5535;--j;)        continue;
    45: }
    46: 
    47: //报警子程序
    48: void    alarm()
    49: {
    50:         i=i^0xFF;                                       //通过异或方式每次把i的各位值取反       
    51:         PORTD=i;                                //D口输出i的值
    52: }
    53: 
    54: //高优先级中断向量
    55: #pragma code InterruptVectorHigh=0x08
    56: void    InterruptVectorHigh (void)
    57: {
    58:   _asm
    59:     goto InterruptHandlerHigh           //跳到中断程
    60:   _endasm
    61: }
    62: 
    63: //高优先级中断服务程序
    64: #pragma code
    65: #pragma interrupt InterruptHandlerHigh
    66: void    InterruptHandlerHigh ()
    67: {
    68:         PIR1bits.ADIF=0;                        //清除中断标志
    69:         adresult.adre[0]=ADRESL;
    70:         adresult.adre[1]=ADRESH;                //读取并存储A/D转换结果,A/D转换的结果通过共
    71:                                                         //用体的形式放入了变量y1中   
    72:         if(adresult.y1>0x200)
    73:         {
    74:         alarm();                                        //如果输入的模拟量大于2.5V(对应数字量
    75:                                                         //0X200h),则调用报警子程序
    76:         delay();                                        //调用延时子程序,使电压检测不要过于频繁
    77:         }
    78:         else    PORTD=0XF0      ;               //如果输入的模拟量小于2.5V,则与D口相连的
    79:                                                         //8个发光二极管的低4个发亮,表示系统正常
    80:         ADCON0bits.GO=1;                        //启动下一次A/D转换
    81: }  
    82: 
    83: //主程序
    84: main()
    85: {
    86:         adinitial();                                    //A/D转换初始化
    87:         initial();                                      //系统各I/O口初始化     
    88:         INTCONbits.GIE=1;                       //总中断允许
    89:         ADCON0bits.GO=1;                        //启动A/D转换
    90:         while(1)
    91:         {
    92:                 ;
    93:         }                                               //等待中断,在中断中循环检测外部电压
    94: }

⌨️ 快捷键说明

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