注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

 
 
 

日志

 
 

STC单片机AD转换(外部中断01促发,比较)  

2010-02-08 21:12:09|  分类: DIY资料 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

#include <REG51.H>

sfr ADC_CONTR=0xC5;/*A/D 转换寄存器*/

sfr  ADC_DATA=0xC6;/*A/D 转换结果寄存器, 为10 位 A/D 转换结果的高8 位*/

sfr  ADC_LOW2=0x0BE;/*A/D 转换结果寄存器, 低2 位有效, 为10 位 A/D 转换结果的低2 位*/

sfr P1M0=0x91;//P1 口模式选择寄存器0

sfr  P1M1=0x92;//P1 口模式选择寄存器1

#define  ADCPowerChannel_7 0xE7;/*P1.7 作为A/D 输入11100111B*/

unsigned  char ADC_Channel_7_Result;/*7 通道A/D 转换结果*/

unsigned  char ADC_Channel_72_Result;/*通道A/D 转换结果低2位*/

unsigned char dis_0 ;     // 个位值  

unsigned char dis_1 ;     // 十位值  

unsigned char dis_2 ;     // 百位值  

unsigned char dis_3;     // 千位值

unsigned char dis_4;     // 万位值

unsigned code dis_code1[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //段码表  0    1    2    3    4   5    6    7    8    9  

unsigned code dis_code[10]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void Delay(unsigned i)                                              //;延时子程序

{

   unsigned a,b;

    for(a=i;a>0;a--)

   for(b=248;b>0;b--);

}  

void ADC_Power_On(void)                                         //开ADC 电源, 第一次使用时要打开内部模拟电源开ADC 电源     

{  ADC_CONTR=ADC_CONTR|0x80;

   Delay(20);

}   

void Set_P17_Open_Drain()                             //设置P1.7,设置A/D 通道所在的I/O 为开漏模式

{

   P1M0=0x80;//#10000000B

   P1M1=0x80;

}

void Set_ADC_Channel_7()                                           //  设P1.7 作为A/D 转换通道

{

   ADC_CONTR=ADCPowerChannel_7;

   Delay(10);

}

void Set_P12_Normal_IO()                                      //设置 P1.7 为普通IO

{

P1M0=0x7F;//01111111B

P1M1=0x7F;

}

void Get_AD_Result()                                        //;AD转换

{  unsigned i="1";

  ADC_CONTR=ADC_CONTR|0x08;//启动 AD 转换00001000B

  do{;}

  while((ADC_CONTR&0x10)==0);// 判断 AD 转换是否完成00010000B 

  ADC_CONTR=ADC_CONTR&0xE7;  //清0 ADC_FLAG, ADC_START 位, 停止A/D 转换

  ADC_Channel_7_Result=ADC_DATA;//保存 AD 转换结果高8位

  ADC_Channel_72_Result=ADC_LOW2;//保存 AD 转换结果低2位

}

void Deal_AD_Result()    //10位高8与低2存储调整结果存入dis_0-dis_4变量

{

 unsigned char q;

 unsigned int P;  //调整结果存入dis_0-dis_4变量

 q=ADC_Channel_7_Result;  //10位高8与低2存储调整

 ADC_Channel_7_Result=ADC_Channel_7_Result<<2;

 ADC_Channel_72_Result=ADC_Channel_72_Result&0x03;

 ADC_Channel_72_Result=ADC_Channel_72_Result|ADC_Channel_7_Result;

 ADC_Channel_7_Result=q>>6;

 

 P=ADC_Channel_7_Result*256+ADC_Channel_72_Result;

 dis_4=P/10000;//存入dis_0-dis_4变量

 dis_3=(P-dis_4*10000)/1000;

 dis_2=(P-dis_4*10000-dis_3*1000)/100;

 dis_1=(P-dis_4*10000-dis_3*1000-dis_2*100)/10;

 dis_0=P-dis_4*10000-dis_3*1000-dis_2*100-dis_1*10;

}

void DisPlay()

{

        P1=0xFF;

        P1 = dis_code[dis_0]; // 取个位的段码  

        P3 = 0x01;            // 开个位显示(P2.7口控制个位数码管)  

        Delay(4);          // 延时1ms使四位数码管动态显示时能看清

        P1=0x80;  

          

        P1 = dis_code[dis_1]; // 取十位的段码  

        P3 = 0x02;            // 开十位显示(P2.6口控制十位数码管)  

        Delay(4);          // 延时1ms作用同上 

      P1=0x80; 

          

        P1 = dis_code[dis_2]; // 取百位的段码  

        P3 = 0x04;            // 开百位显示(P2.5口控制十位数码管)  

        Delay(4);          // 延时1ms作用同上  

        P1=0x80;

  

        P1 = dis_code[dis_3]; // 取千位的段码  

        P3 = 0x08;            // 开千位显示(P2.4口控制十位数码管)  

        Delay(4);          // 延时1ms作用同上  

        P1=0x80;

     P1 = dis_code[dis_4]; // 取千位的段码  

        P3 = 0x10;            // 开千位显示(P2.4口控制十位数码管)  

        Delay(4);          // 延时1ms作用同上 

        P1=0x80;

 

void int_0() interrupt 0                                        // 外部中断0中断服务程序  

    EA="0";//关中断总开关

 P1=0xFF;

    ADC_Power_On();//开ADC 电源, 第一次使用时要打开内部模拟电源开ADC 电源, 可适当加延时,1mS 以内就足够了

    set_P17_Open_Drain();//设置 P1.7为开漏/实际上开

    Set_ADC_Channel_7(); //;设置 P1.7 作为A/D 转换通道

   while(1)

 {

    Get_AD_Result();//测量电压并且取A/D 转换结果

 //ADC_Channel_7_Result=0x02;

 //ADC_Channel_72_Result=0x01;

    Deal_AD_Result() ;//10位高8与低2存储调整结果存入dis_0-dis_4变量

 DisPlay();//显示到复位

    }

}  

void int_1() interrupt 2                                      // 外部中断1中断服务程序  

    /*EA=0;//关中断总开关

 P1=0xFF;

    ADC_Power_On();//开ADC 电源, 第一次使用时要打开内部模拟电源开ADC 电源, 可适当加延时,1mS 以内就足够了

    set_P17_Open_Drain();//设置 P1.7为开漏/实际上开

    Set_ADC_Channel_7(); //;设置 P1.7 作为A/D 转换通道

   while(1)

 {

    Get_AD_Result();//测量电压并且取A/D 转换结果

 //ADC_Channel_7_Result=0x02;

 //ADC_Channel_72_Result=0x01;

    Deal_AD_Result() ;//10位高8与低2存储调整结果存入dis_0-dis_4变量

 DisPlay();//显示到复位

    }

 */

    unsigned char p,q;

    EA="0";//关中断总开关

    P1=0xFF;

    ADC_Power_On();//开ADC 电源, 第一次使用时要打开内部模拟电源开ADC 电源, 可适当加延时,1mS 以内就足够了

    set_P17_Open_Drain();//设置 P1.7为开漏/实际上开

    Set_ADC_Channel_7(); //;设置 P1.7 作为A/D 转换通道

    Get_AD_Result();//测量电压并且取A/D 转换结果

   p=ADC_Channel_7_Result;//比较本次与前次的AD转换值,小于则退出AD转换

 q=ADC_Channel_72_Result;

 do {p=ADC_Channel_7_Result;

 q=ADC_Channel_72_Result;

 Get_AD_Result();

     }

 while((p>ADC_Channel_7_Result)||((p==ADC_Channel_7_Result)&&(q>ADC_Channel_72_Result)));

 Set_P12_Normal_IO();//设置 P1.7 为普通IO

    Deal_AD_Result() ;//10位高8与低2存储调整结果存入dis_0-dis_4变量

 while(1)

 {

 DisPlay();//显示到复位

 }

   

}

  

void main()                                                       //主程序

{  

    P3 = 0xff;           // 关所有数码管  

    IT0 = 1;             // 外部中断0下降沿触发

    EX0 = 1;             // 开外部中断0

    IT1=1;

 EX1=1;

    EA = 1;              // 开总中断    

      

    while(1)  

    {  

           // 等待中断  

    }  

}

  评论这张
 
阅读(1042)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017