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

📄 adccaijinonidianya.c

📁 主要演示使用ADC0832通道1(CH1)采集模拟电压,并显示在数码管上 由于ADC0832的 Vref=5V,故当外部输入为5V时,转换值实际为255(#0FFH) 当然也可以直接用手按用来模拟
💻 C
字号:
/************************************************************
作者:邱星凌
版本:3.0
描述:主要演示使用ADC0832通道1(CH1)采集模拟电压,并显示在数码管上
由于ADC0832的 Vref=5V,故当外部输入为5V时,转换值实际为255(#0FFH)
当然也可以直接用手按用来模拟0-5V的电压。
硬件:在:"AD输入口"的"CH1"上加0-5V的电压,并调节大小,观查显示变化
*************************************************************/

#include <reg52.h>
#define FOSC  (12000000UL)
#define OSC  (12)
#define TIMER0 1
typedef unsigned char uchar;
typedef unsigned int uint;
#define T_05ms  (65536-(uchar)(FOSC/(12*200)))
code scan[6]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};
code scan1[6]={0x7D,0xBD,0xDD,0xED,0xF5,0xF9};
code v[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar a[6]={0xFF,0xFF,0xFF,0,0,0};
uchar a1=0,c=0;  //采集电压转换结果
uchar b=0;   
uchar kg=0,n=0,m=0;//标志变量
uchar i=0,j=0,i1=0,i2=0,i3=0,i4=0;  //循环与延时变量
sbit ADC_CS=P3^5;
sbit ADC_CLK=P2^1;
sbit ADC_DI=P3^6;
sbit ADC_DO=P3^7;
bit FADC_CLK;  //ADC_CLK的标志变量
/*========延时函数============*/
void delay(void)
{
    for(i=0;i<5;i++)
    {
       for(j=0;j<10;j++) ;
    }
}

void delay1(void)
{
   for(i1=0;i1<3;i1++);
}

void delay2(void)
{
   for(i2=0;i2<3;i2++);
}

/*==============自定义脉冲函数================*/
void pulsh(void)
{
   FADC_CLK=1;
   ADC_CLK=1;
   delay1();
   ADC_CLK=0;
   FADC_CLK=0;
   delay1();
}

/*=============二进制到bcd码的转换====================*/
void bin_bcd(void)
{
   b=a1/10;
   a[5]=a1%10;
   a[4]=b%10;
   a[3]=b/10;
   a1=0;
   b=0;
}

/*==========ADC采集函数电压转换============*/
void ADC_CH1(void)
{
   ADC_CS=0;
   m++;   //NOP一下
   ADC_CS=1;
   m--;
   delay2();
   ADC_CS=0;
   ADC_DI=1;
   pulsh();
   pulsh();
   pulsh();
   for(i3=0;i3<8;i3++)
   {
       pulsh();
       a1 |= ADC_DO;
       a1=a1<<1;
   }
   c=a1;
   pulsh();
   a1=0;
   for(i4=0;i4<8;i4++)
   {
      pulsh();
      a1 |=ADC_DO;
      a1=a1<<1;  //此处a已经清零了,所有可以用同样地方法
   }
   if(c==a1)
   {
       n=1;
       ADC_CS=1;
       ADC_CLK=0;
       ADC_DI=1;
       ADC_DO=1;  
   }
}

/*==========此处用CH0是为了用手按起显示灵活=======================*/
void ADC_CH0(void)
{
   ADC_CS=0;
   m++;   //NOP一下
   ADC_CS=1;
   m--;
   delay2();
   ADC_CS=0;
   ADC_DI=1;    //CH0与CH1的区别在这里:CH1是ADC_DI置一后来三个脉冲---
   pulsh();     //---而CH0是ADC_DI置一后,先来两个脉冲在将ADC_DI置零--
   pulsh();     //---在一个脉冲后,CH0置一
   ADC_DI=0;
   pulsh();
   ADC_DI=1;
   for(i3=0;i3<8;i3++)
   {
       pulsh();
       a1 |= ADC_DO;
       a1=a1<<1;
   }
   c=a1;
   pulsh();
   a1=0;
   for(i4=0;i4<8;i4++)
   {
      pulsh();
      a1 |=ADC_DO;
      a1=a1<<1;  //此处a已经清零了,所有可以用同样地方法
   }
   if(c==a1)
   {
       n=1;
       ADC_CS=1;
       ADC_CLK=0;
       ADC_DI=1;
       ADC_DO=1;  
   }
}


/*==================中断服务函数===================*/
static void Timer0_isr(void) interrupt TIMER0
{
   TR0=0;
   TH0=T_05ms/256;
   TL0=T_05ms%256;
   TR0=1;
   switch (kg)
   {
       case 0:
             if(FADC_CLK==1)
             {
                P2=scan[kg];
                P0=0xFF;
             }
             else
             {
                  P2=scan1[kg];
                  P0=0xFF;
             }
             break;
       case 1:
             if(FADC_CLK==1)
             {
                P2=scan[kg];
                P0=v[a[kg]];
             }
             else
             {
                  P2=scan1[kg];
                  P0=v[a[kg]];
             }
             break;
       case 2:
             if(FADC_CLK==1)
             {
                P2=scan[kg];
                P0=v[a[kg]];
             }
             else
             {
                  P2=scan1[kg];
                  P0=v[a[kg]];
             }
             break;
       case 3:
             if(FADC_CLK==1)
             {
                P2=scan[kg];
                P0=v[a[kg]];
             }
             else
             {
                  P2=scan1[kg];
                  P0=v[a[kg]];
             }
             break;
       case 4:
             if(FADC_CLK==1)
             {
                P2=scan[kg];
                P0=v[a[kg]];
             }
             else
             {
                  P2=scan1[kg];
                  P0=v[a[kg]];
             }
             break;
       case 5:
             if(FADC_CLK==1)
             {
                P2=scan[kg];
                P0=v[a[kg]];
             }
             else
             {
                  P2=scan1[kg];
                  P0=v[a[kg]];
             }
             break;
       default :
               break;
   }
   kg++;
   if(kg==6)
   {
       kg=0;
   }
}

/*====================中断初始函数==========================*/
static void Timer0_initialize(void)
{
    EA=0;
    TR0=0;
    TMOD=0x11;
    TH0=T_05ms/256;
    TL0=T_05ms%256;
    TF0=0;
    PT0=1;
    ET0=1;
    TR0=1;
    EA=1;  
}

void main (void)
{
   P0=0xFF;
   P1=0xFF;
   P2=0xFF;
   P3=0xFF;
   Timer0_initialize();
   delay();
   while(1)
   {
     while(n!=1)
     {
        ADC_CH1();
        ADC_CH0();
     }
     bin_bcd();
     delay();
     delay();
     n=0;
   }
}

⌨️ 快捷键说明

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