A/D模数转换

时间:2021-05-23 16:33:30

先上AD574功能表:

A/D模数转换

硬件电路图:

A/D模数转换

程序流程图:

A/D模数转换

c程序:

/************************************************************************************************
    
    A/D实验程序选择的晶振是3MHz,选用地址Q0,Q1,用定时器1在1s后重新启动AD转换(important)
    程序是copy seataes的,感谢ing,我只是把注释补全,自己能更快的理解罢了


************************************************************************************************/
#include <reg51.h>
#include <absacc.h>

/**************************************“A0,A1选择”七者选其一*************************************/
#define AD_START PBYTE[0xF9]      // Q1 Q2    11111001     启动AD转换的地址 
#define AD_HIGH  PBYTE[0xFD]      //        11111101     读AD转换高8位数据的地址
#define AD_LOW   PBYTE[0xFF]                            //读AD转换低4位数据的地址
/*
#define AD_START PBYTE[0xFC]      // Q0 Q1    11111100
#define AD_HIGH  PBYTE[0xFE]      //         11111110
#define AD_LOW   PBYTE[0xFF]

#define AD_START PBYTE[0xF3]      // Q2 Q3    11110011
#define AD_HIGH  PBYTE[0xFB]      //         11111011
#define AD_LOW   PBYTE[0xFF]

#define AD_START PBYTE[0xE7]      // Q3 Q4    11100111
#define AD_HIGH  PBYTE[0xF7]      //         11110111
#define AD_LOW   PBYTE[0xFF]

#define AD_START PBYTE[0xCF]      // Q4 Q5    11001111
#define AD_HIGH  PBYTE[0xEF]      //         11101111
#define AD_LOW   PBYTE[0xFF]

#define AD_START PBYTE[0x9F]      // Q5 Q6    10011111
#define AD_HIGH  PBYTE[0xDF]      //         11011111
#define AD_LOW   PBYTE[0xFF]

#define AD_START PBYTE[0x3F]      // Q6 Q7    00111111
#define AD_HIGH  PBYTE[0xBF]      //         10111111
#define AD_LOW   PBYTE[0xFF]
*/
/************************************************************************************************/

unsigned char code tab[] = {0xC0,0xF9,0xA4,0xB0,
                            0x99,0x92,0x82,0xF8,
                            0x80,0x90,0x88,0x83,
                            0xC6,0xA1,0x86,0x8E,};          //共阳数码管码表


unsigned char code tab1[] ={0x3F,0x06,0x5B,0x4F,
                            0x66,0x6D,0x7D,0x07,
                            0x7F,0x6F,0x77,0x7C,
                            0x39,0x5E,0x79,0x71,};          //共阴数码管码表

unsigned char data byhigh,bylow;

sbit P2_0 = P2^0;    //数码管的位选信号
sbit P2_1 = P2^1;    //数码管的位选信号
sbit P2_2 = P2^2;   //数码管的位选信号

void delay(void);
void display(void);

//主程序
void main()
{
/*************************************关闭数码显示二者选其一*************************************/
//    P1 = 0xFF;
//    P2 = 0x00;         // 关闭共阳数码管

    P1 = 0x00;          // 关闭共阴数码管段选
    P2 = 0xFF;         // 关闭共阴数码管位选
/************************************************************************************************/


/***************************************外部中断二者选其一***************************************/
//    IT0 = 1;
//    EX0 = 1;         //    外部中断0

    IT1 = 1;         //外部中断采用下降沿触发
    EX1 = 1;         //允许外部中断中断   
/************************************************************************************************/


    TH0 = (65536 - 50000)/256;    //赋初值50*4 = 200ms
    TL0 = (65536 - 50000)%256;
    TMOD = 0x01;                 //选择定时器方式1
    ET0 = 1;                     //允许定时器0中断
    TR0 = 1;                     //启动定时器0   
    EA  = 1;                     //中断总允许   
    AD_START = 0;                  //启动AD转换
    for(;;)
    {
        display();
    }
}
/***************************************外部中断二者选其一***************************************/
/*
void Int0(void) interrupt 0            // 外部中断0
{
    byhigh = AD_HIGH;
    bylow  = AD_LOW;
}
*/

//外部中断服务子程序,用于读取AD的高8位和低四位
void Int1(void) interrupt 2            
{
    byhigh = AD_HIGH;                //读AD转换的高8位 
    bylow  = AD_LOW;                //读AD转换的低4位   
}
/************************************************************************************************/

//定时器中断1服务子程序上
void Timer0(void) interrupt 1
{
    static unsigned char data bycounter = 0;    //将byCounter设置为静态变量 
    TL0 = (65536 - 50000)%256;
    TH0 = (65536 - 50000)/256;
    bycounter ++;
    if(bycounter == 5)
    {
        bycounter = 0;
        AD_START = 0;                       //  启动AD转换
    }
}

//数码管显示程序
void display(void)
{
/************************************************************************************************/

    P2_0 = 1;
    P1   = tab[byhigh >> 4];        //显示最高4位
    delay();
    P2_0 = 0;

    P2_1 = 1;
    P1   = tab[byhigh & 0x0F];        //显示中间4位 
    delay();
    P2_1 = 0;

    P2_2 = 1;
    P1   = tab[bylow >> 4];           //显示最低4位,怎么要左移4为呢?(高)xxxx-xxxx-xxxx-****(低)星号表示没用到的
    delay();
    P2_2 = 0;                        //共阳数码管显示

/************************************************************************************************/


    P2_0 = 0;
    P1   = tab1[byhigh >> 4];
    delay();
    P2_0 = 1;

    P2_1 = 0;
    P1   = tab1[byhigh & 0x0F];
    delay();                       
    P2_2 = 0;
    P2_1 = 1;

    P1   = tab1[bylow >> 4];
    delay();
    P2_2 = 1;                        //共阴数码管显示
/************************************************************************************************/
}

//延时子程序1ms
void delay(void)
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}

 

注意了:P2口是当做IO口用,而不是地址总线,另外要注意D0-D7在AD1674怎么接单片机的IO口的,P0口地址总线,数据总线复用