hanfei08131106的笔记 https://bbs.21ic.com/?628143 [收藏] [复制] [RSS]

日志

最近搞的一个小的项目

已有 5445 次阅读2010-6-19 13:15 |系统分类:单片机| AD转换, 数码管显示

利用12C5A60S2做的一个AD转换,并将模拟量值和数字量值仪器显示在数码管上,(初学者)。



#include  <reg52.h>
sfr P1ASF=0x9d;
sfr ADC_CONTR =0xbc;    //power  speed1 speed0 flag  st chs2 chs1 chs0
sfr ADC_RES=0xbd;
sfr  ADC_RESL=0xbe;



#define uint unsigned int
#define uchar unsigned char


 


sbit ser=P2^1;     //LED显示 595数据输入
sbit srclk1=P2^2;  //
sbit rclk1=P2^3;   //


uchar idata  LED[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xfe,0xbf};//共阳极段码表说明
uchar idata  bb[]={0,0,10,0,11,11,11,11};
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++)   //位码移位串行输出
   {     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};


      //  P1M0=0x01;
         //  P1M1=0x01;
      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;
                e=0x7f;
  a=0xfe;
  for(i=0;i<3;i++)      //模拟量显示0-5v
  {
  c=LED[aa];
  if(i==2) c=c&0x7f;
      outbyte(a,c);
  a=(a<<1)|0x01;        //a数字量显示位码
  }
                for(i=0;i<4;i++)      //数字量显示1024
  {
  d=LED[bb];
  if(i==2) c=c&0x7f;
      outbyte(e,d);
  e=(e>>1)|0x80;        //e数字量显示位码
  }
 }
 }


 


 


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)