打印

A/D转换实现0~5V测量并控制显示与报警

[复制链接]
3066|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hanfei08131106|  楼主 | 2010-6-26 09:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
A/D转换实现0~5V测量0~1V数码管显示数字量与模拟量;
1~2V显示学号;
2~3V显示HAPPY!!!;
3~4V从右至左滚动显示HAPPY!!!;
4.5V~ 报警

#i nclude  <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
sfr P1ASF=0x9d;
sfr ADC_CONTR=0xbc;    //power  speed1 speed0 flag  st chs2 chs1 chs0
sfr ADC_RES=0xbd;
sfr ADC_RESL=0xbe;
sbit ser=P2^1;            //LED显示 595数据输入
sbit srclk1=P2^2;  
sbit rclk1=P2^3;   
sbit speak=P3^2;
                                                                          //      H    A     P    Y    !
uchar idata  LED[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xfe,0xbf,0x89,0x88,0x8c,0x99,0x7d,0xff};//共阳极段码表说明
uchar idata  bb[]={0,0,10,0,11,11,11,11},cc[]={0,0,10,0,11,11,11,11},dd[]={0,0,10,0,11,11,11,11},jj[]={0,0,10,0,11,11,11,11};
//--------------------------------------------------------------------
void delayXms(uint n)
{
    uint i,j;
    for(i=0;i<n;i++)
       for(j=0;j<125;j++);
}
//--------------------------------------------------------------------
void outbyte(uchar a,b)
{
uchar j;
   for(j=0;j<8;j++)   //位码移位串行输出
   {     if(a&0x80) ser=1;  else  ser=0;
            a=a<<1;
            srclk1=0;
            srclk1=1;
    }
  for(j=0;j<8;j++)   //duan码移位串行输出
   {     if(b&0x80) ser=1;  else  ser=0;
            b=b<<1;
            srclk1=0;
            srclk1=1;
    }
   rclk1=0;   //595锁存脉冲
      rclk1=1;
  }
//--------------------------------------------------------------------
uint GET_AD_Result()//启动AD转换并返回转换值
{
uchar temp;
uint data_temp;
data_temp=0;
ADC_RES=0;
ADC_RESL=0;
ADC_CONTR|=0x08;//启动AD
re: temp=0x10;
temp&=ADC_CONTR;//查询ADC_FLAG,忙标志,转换完否
if(temp==0)
  goto re;
ADC_CONTR&=0xe0;//P1.0为AD输入口
data_temp=ADC_RES;
data_temp<<=2;
data_temp+=ADC_RESL;
return data_temp;
}
//--------------------------------------------------------------------
void main(void) using 0
{
        uint result,temp,i,a,c,d,e;
        uchar aa[3]={0,0,0};
P1ASF=0x01;
ADC_CONTR=0xe0;                   //P1.0为AD输入口
        while(1)
        {
  result=GET_AD_Result();
  aa[2]=result*5/1024;     //模拟量显示0-5v   数学转换
  temp=result*5%1024;
  temp=temp*10;
         aa[1]=temp/1024;
  temp=temp%1024;
  temp=temp*10;
  aa[0]=temp/1024;
                bb[0]=result/1000;         //数字量显示1024   数学转换
                bb[1]=(result%1000)/100;
                bb[2]=(result%100)/10;
                bb[3]=result%10;
                dd[0]=6;
                dd[1]=0;
                dd[2]=1;
                dd[3]=1;
                dd[4]=3;
                dd[5]=1;
                dd[6]=8;
                dd[7]=0;
                cc[0]=16;
                cc[1]=16;
                cc[2]=16;
                cc[3]=15;
                cc[4]=14;
                cc[5]=14;
                cc[6]=13;
                cc[7]=12;
               
                jj[0]=17;
                jj[1]=17;
                jj[2]=17;
                jj[3]=17;
                jj[4]=17;
                jj[5]=17;
                jj[6]=17;
                jj[7]=17;
                e=0xfe;
                switch(aa[2]%10)
                {
                      case 0:
                             e=0x7f;
               a=0xfe;
               for(i=0;i<3;i++)      //模拟量显示0-5v
                  {
                     c=LED[aa[i]];
                     if(i==2) c=c&0x7f;
                         outbyte(a,c);
                     a=(a<<1)|0x01;        //a数字量显示位码
                  }
                             for(i=0;i<4;i++)      //数字量显示1024
                  {
                     d=LED[bb[i]];
                     if(i==2) c=c&0x7f;
                         outbyte(e,d);
                     e=(e>>1)|0x80;        //e数字量显示位码
                  } break;
                      case 1:
                             for(i=0;i<8;i++)
                  {
                     d=LED[dd[i]];
                     if(i==2) c=c&0x7f;
                         outbyte(e,d);
                     e=(e<<1)|0x01;
                  } break;
                      case 2:
                             for(i=0;i<8;i++)
                  {
                     d=LED[cc[i]];
                     if(i==2) c=c&0x7f;
                         outbyte(e,d);
                     e=(e<<1)|0x01;
                  } break;
                      case 3:
                             for(i=0;i<8;i++)
                  {
                     d=LED[cc[i]];
                         outbyte(e,d);
                                   delayXms(1000);
                                   d=LED[jj[i]];
                     if(i==2) c=c&0x7f;
                         outbyte(e,d);
                     e=(e<<1)|0x01;
                  }break;
                      case 4:
                             if(aa[1]>=5)
                                 {
                                     speak=0;
                                     delayXms(1000);
                                     speak=1;
                                     delayXms(1000);
                                 }
                   break;
                }
}
}

相关帖子

沙发
hanfei08131106|  楼主 | 2010-6-26 12:37 | 只看该作者
给点意见啊!!!!

使用特权

评论回复
板凳
zcc0719| | 2010-7-12 13:56 | 只看该作者
恭喜,写的不错

使用特权

评论回复
地板
ahljj| | 2010-8-4 15:38 | 只看该作者
学习了

使用特权

评论回复
5
goodmoodnow| | 2010-8-4 15:45 | 只看该作者
请各位帮帮我吧,我刚刚开始用C8051F410 的ADC和DAC,但是AD转换老出问题,采集不了外部电压,帮我看看ADC的配置以及时钟设置,谢谢了
//

#include "C8051F410.h"

#define SYSCLK          24500000 // SYSCLK频率(Hz)

// Peripheral specific initialization functions,
// Called from the Init_Device() function
void ADC_Init()
{
    ADC0MX    = 0x06;
   
        ADC0CN    = 0x80;
   
        ADC0TK    = 0xFB;

        ADC0CF = ((SYSCLK/6000000)-1)<<3;
    ADC0CF |= 0x00;                     // right-justify results
}

void DAC_Init()
{
    IDA0CN    = 0xF7;
}

void Voltage_Reference_Init()
{
    REF0CN    = 0x90;
}

void Port_IO_Init()
{
    // P0.0  -  Skipped,     Push-Pull,  Analog
    // P0.1  -  Unassigned,  Push-Pull,  Digital
    // P0.2  -  Unassigned,  Push-Pull,  Digital
    // P0.3  -  Unassigned,  Push-Pull,  Digital
    // P0.4  -  Unassigned,  Push-Pull,  Digital
    // P0.5  -  Unassigned,  Push-Pull,  Digital
    // P0.6  -  Skipped,     Push-Pull,  Analog
    // P0.7  -  Unassigned,  Push-Pull,  Digital

    // P1.0  -  Unassigned,  Push-Pull,  Digital
    // P1.1  -  Unassigned,  Push-Pull,  Digital
    // P1.2  -  Skipped,     Push-Pull,  Analog
    // P1.3  -  Unassigned,  Push-Pull,  Digital
    // P1.4  -  Unassigned,  Push-Pull,  Digital
    // P1.5  -  Unassigned,  Push-Pull,  Digital
    // P1.6  -  Unassigned,  Push-Pull,  Digital
    // P1.7  -  Unassigned,  Push-Pull,  Digital

    // P2.0  -  Unassigned,  Push-Pull,  Digital
    // P2.1  -  Unassigned,  Push-Pull,  Digital
    // P2.2  -  Unassigned,  Push-Pull,  Digital
    // P2.3  -  Unassigned,  Push-Pull,  Digital
    // P2.4  -  Unassigned,  Push-Pull,  Digital
    // P2.5  -  Unassigned,  Push-Pull,  Digital
    // P2.6  -  Unassigned,  Push-Pull,  Digital
    // P2.7  -  Unassigned,  Push-Pull,  Digital

    P0MDIN    = 0xBE;
    P1MDIN    = 0xFB;
   
        P0MDOUT   = 0xFF;
    P1MDOUT   = 0xFF;
    P2MDOUT   = 0xFF;
   
        P0SKIP    = 0x41;
    P1SKIP    = 0x04;
   
        XBR1      = 0x40;
}

void Oscillator_Init()
{
   OSCICN = 0x87;                      // configure internal oscillator for
                                       // 24.5MHz
   RSTSRC = 0x04;                      // enable missing clock detector
}

void Interrupts_Init()
{
    EIE1      = 0x08;
    IE        = 0x80;
}

// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
    ADC_Init();
    DAC_Init();
    Voltage_Reference_Init();
    Port_IO_Init();
    Oscillator_Init();
    Interrupts_Init();
}

// Close        WDT
// Call WDT_DISABLE() from the main program
void WDT_DISABLE(void)
{
        EA=0;
        PCA0MD = ~0x40 ;
        EA=1;
}



void main(void)
{
//        unsigned char i = 0;
        WDT_DISABLE();           //关闭WDT;
        Init_Device();           //主初始化;


        while(1)
        {
//                for(i = 0;i < 32000;i++);
                AD0BUSY = 1;            //开AD
                while(AD0BUSY);         //等待AD转换结束
                while(AD0INT)
                {
                        IDA0L = ADC0L;
                        IDA0H = ADC0H;
                       
                        AD0INT = 0;
                }
        }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:适应环境,不要让环境去适应你、、

5

主题

144

帖子

1

粉丝