EDN首页   博客首页

日志档案

发表于 2008-7-14 12:41:34

1

标签: W79A9311  单片机  AD  芯唐  华邦  

芯唐(华邦)W79A9311 AD转换C51范例程序

/****************************************************************************/
/*     深圳恒森微电子有限公司  (华邦单片机香港及中国区代理商)          */
/*     香港恒森科技有限公司    (华邦单片机香港及中国区代理商)          */
/*     陈文    email:chenwen@hengsen.cn (有 bug 请提交)                   */
/****************************************************************************/
/*  文件名: adc.c              */
/* 版本     1.0            */
/*  创建日期:    2007-10-29 10:58        */
/*  概述: 本文件为 w79a9311 ADC 测试 软件         */
/*--------------------------------------------------------------------------*/
/*  历史修改记录:               */
/*  名字                   日期                   注释      */
/*  陈文                   2008-7-14 11:11        ver 1.0     */
/****************************************************************************/
#include "W79A9311.H"

#define uint8 unsigned char
uint8 led[2];
//led code 共阳极       0    1   2    3    4    5    6    7    8     9   a     b   c     d    e   f    灭  高位先出  bit顺序 h,g,f,e,d,c,b,a : Q1--a.....Q8--h
//uint8 code tab[17] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0x0a,0x86,0x8e,0xff};
uint8 code tab[17] = {0x41,0xf5,0x0d,0x15,0xb1,0x13,0x03,0xd5,0x01,0x11,0x81,0x83,0xc6,0x0a,0x86,0x8e,0xff};

sbit Csg1 = P1^6;   
sbit Csg0 = P1^7; 


#define  SEL_ADC_CLK_Div1  {ADCCON1 &= 0x04;}
#define  SEL_ADC_CLK_Div2  {ADCCON1 &= 0x04;ADCCON1 |= 0x40;}
#define  SEL_ADC_CLK_Div4  {ADCCON1 &= 0x04;ADCCON1 |= 0x80;}

#define  EnADCExtTrig  ADCCON |= 0x20;
#define  DisADCExtTrig  ADCCON &= ~0x20;
#define  SelADC_RC_Clk  ADCCON |= 0x04;
#define  SelADC_CPU_Clk  ADCCON &= ~0x04;
#define  EnableADC   AUXR1 |= 0x04;
#define  DisableADC   AUXR1 &= ~0x04;
#define     StartADC            {ADCCON&=0xef; ADCCON|=0x08;}
//ADCCON  --ADCI中断请求位 --ADCS开始转换位
//当A/D准备好时ADCI被设置,当ADCI被设置,则ADCS自动清0
//若ADCI为高电平,不能再次作AD转换,若ADC中断允许则ADCI被自动清除

uint8 HexBcd(uint8 h);
void Display(void);

void Dispv(v)
{
 uint8 temp1; 
 temp1 = HexBcd(v); 
 led[0] = (temp1&0x0f);
 led[1] = (temp1&0xf0)>>4; 
 Display();
}

void Display(void)
{
 bit  B_disp_flag; 
 uint8 temp;
 Csg1 = 1;
 Csg0 = 1;
 if(B_disp_flag == 1)
 {
  B_disp_flag = 0;
  temp = led[0];
  temp = tab[temp];
  P0 &= 0xe0;
  P0 |= (temp&0x1f);
  P1 &= 0xe3;
  P1 |= ((temp >> 3)&0x1c);
  Csg1 = 1;
  Csg0 = 0;
 }
 else
 {
  B_disp_flag = 1;
  temp = led[1];
  temp = tab[temp]&0xfe;  //小数点
  P0 &= 0xe0;
  P0 |= (temp&0x1f);
  P1 &= 0xe3;
  P1 |= ((temp >> 3)&0x1c);
  Csg0 = 1;
  Csg1 = 0;
 } 
}

uint8 HexBcd(uint8 h)
{
 uint8 b;
 if(h > 99) return 0x99;
 b=h/10*0x10 + h%10;
 return b;
}

 

//禁止数字输入 
void DisChannelInput(unsigned char Channel)
{
 switch(Channel)
    {
     case 0:PADIDS |= 0x01;break;
     case 1:PADIDS |= 0x02;break;
     case 2:PADIDS |= 0x04;break;
      case 3:PADIDS |= 0x08;break;
      case 4:PADIDS |= 0x10;break;
     case 5:PADIDS |= 0x20;break;
     case 6:PADIDS |= 0x40;break;
      case 7:PADIDS |= 0x80;break;
     default: break;
    }
}

//打开数字输入
void EnChannelInput(unsigned char Channel)
{
 switch(Channel)
    {
     case 0:PADIDS &= ~0x01;break;
     case 1:PADIDS &= ~0x02;break;
     case 2:PADIDS &= ~0x04;break;
      case 3:PADIDS &= ~0x08;break;
      case 4:PADIDS &= ~0x10;break;
     case 5:PADIDS &= ~0x20;break;
     case 6:PADIDS &= ~0x40;break;
      case 7:PADIDS &= ~0x80;break;
     default: break;
    }
}

unsigned int Read_ADC(unsigned char channel)
{
    unsigned int temp;
    EnableADC;
    ADCCON1 &= ~0x04;
 switch(channel)
    {
     case 0:P0M1|=0x08;P0M2&=~0x08;ADCCON=0; P0|=0x08;break;
     case 1:P0M1|=0x10;P0M2&=~0x10;ADCCON=1; P0|=0x10;break;
     case 2:P0M1|=0x20;P0M2&=~0x20;ADCCON=2; P0|=0x20;break;
      case 3:P0M1|=0x40;P0M2&=~0x40;ADCCON=3; P0|=0x40;break;

      case 4:P0M1|=0x04;P0M2&=~0x04;ADCCON=0;ADCCON1|=0x04;P0|=0x04;break;
     case 5:P0M1|=0x02;P0M2&=~0x02;ADCCON=1;ADCCON1|=0x04;P0|=0x02;break;
     case 6:P0M1|=0x01;P0M2&=~0x01;ADCCON=2;ADCCON1|=0x04;P0|=0x01;break;
      case 7:P0M1|=0x80;P0M2&=~0x80;ADCCON=3;ADCCON1|=0x04;P0|=0x80;break;
     default: break;
    }
    ADCCON&=0xef;
    ADCCON|=0x08;//start ADC
    while((ADCCON&0x18)==0x08);//查询,(可用中断实现)
  ADCCON&=0xe7;

    temp="ADCH";
    temp <<=2;
    temp |=(ADCCON >> 6);
    return temp;
}

//测试通过
void main(void)
{
 unsigned int temp,i;
 unsigned char adc_v;
 SEL_ADC_CLK_Div1;
 
 while(1)
 {
  temp=Read_ADC(2);
  adc_v = temp*50/1024;
  Dispv(adc_v);
  for(i=0;i<0xfff0;i++);
  //for(i=0;i<0xfff0;i++);
 }
 
}

系统分类: 单片机   |   用户分类: winbond lpc单片机   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(148)    回复(0)  

投一票您将和博主都有获奖机会!