단편기 학습 19일째-A/D 변환의 아날로그 전압 변화 디스플레이 실험

예제: 단편기로 ADC0804를 제어하여 모드 변환을 하고 실험판에 있는 A/D 옆에 있는 전위기 Re2를 비틀면 디지털 파이프의 첫 번째 세 자리에서 10진법으로 A/D 변환 후의 디지털 양(8비트 A/D 변환 후 수치가 0~255 변화)을 동적으로 나타낸다.
#include 
#include 
#define uchar unsigned char
#define uint unsigned int
sbit duan=P2^6;
sbit wei=P2^7;
sbit adwr=P3^6;                     //  A/D WR  
sbit adrd=P3^7;                     //  A/D RD   
unsigned char code table[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 
                       0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};\
void delayms(uint xms)
{
  uint i,j;
  for(i=xms;i>0;i--)
     for(j=110;j>0;j--);
}
void display(uchar bai,uchar shi,uchar ge)
{
    duan=1;
    P0=table[bai];                  //     
    duan=0;
    P0=0xff;                        //  
    wei=1;
    P0=0x7e;                        //     
    wei=0;
    delayms(5);
    duan=1;
    P0=table[shi];
    duan=0;
    P0=0xff;
    wei=1;
    P0=0x7d;
    wei=0;
    delayms(5);
    duan=1;
    P0=table[ge];
    duan=0;
    P0=0xff;
    wei=1;
    P0=0x7b;
    wei=0;
    delayms(5);
}
void main()                            //   
{
    uchar a,A1,A2,A3,adval;            
    wei=1;
    P0=0x7f;                           // CSAD 0,  ADCS,      ADCS
    wei=0;
    while(1)
    {
        adwr=1;
        _nop_();
        adwr=0;                        //  A/D  
        _nop_();
        adwr=1;
        for(a=10;a>0;a--)              //TX-1C   A/D      ,             
        {
            display(A1,A2,A3);
        }
        P1=0xff;                       //  P1        1
        adrd=1;                        //  ADCS
        _nop_();
        adrd=0;                        //A/D   
        _nop_();
        adval=P1;                      //A/D       P1 
        adrd=1;
        A1=adval/100;                  //   、 、  
        A2=adval%100/10;
        A3=adval%10;
    }
}    

TX-1C판에서 ADC0804 옆에 핀 ADIN이 있는데 우리가 단락모로 꽂아야만 우리의 전위기가 A/D칩과 연결될 수 있다.이 플러그를 설계한 목적은 사용자가 A/D로 실험판 바깥쪽의 시뮬레이션 신호를 채취할 수 있음을 고려하는 것이다. 이때 이 플러그와 직접 연결하면 된다.
분석 프로그램:
4
  • 메인 프로그램에 들어간 후 U2 레지스터의 출력구의 가장 높은 위치인 저전압을 먼저 낮춘다. 그 목적은 그와 연결된 ADC0804의 CS 필름 선택단을 낮춘다. 즉, A/D 변환기를 선택하는 것이다.앞에서 말했듯이 ADC0804의 CS칩 선택단은 U2의 Q7 출력단, 즉 최고 출력 위치와 연결된다.이 예는 A/D칩을 전문적으로 조작하기 때문에 한 번에 선택하면 나중에 상관하지 않아도 된다.또한 앞으로 U2 레지스터를 조작하는 곳은 ADC의 CS단을 바꾸지 않도록 주의해야 한다. 디지털 파이프 디스플레이 프로그램에서 위치 선택 신호를 보낼 때 U2 레지스터의 가장 높은 위치를 낮은 레벨로 유지하고 위의 디지털 파이프 디스플레이 부분에서'P0=0x7e;P0=0x7d;P0=0x7b'가 바로 이 뜻을 나타낸다

  • 4
  • while(1) 대순환에 들어간 후 A/D 변환을 먼저 시작하는데 그 조작 방식은 앞에서 소개한 시차도에 따라 완성된다.여기서 사용된 "nop ()"는 해당 주기의 지연 시간에 해당하며, 자세히 설명하자면 다음과 같습니다

  • 4
  • A/D 변환을 시작한 후에 변환 결과를 읽지 못하면 바로 디지털 파이프에 결과를 보냅니다. 이렇게 쓴 목적은 A/D 변환에 일정한 시간을 남기는 것입니다.우리가 디지털 파이프의 이 부분을 A/D로 변환하는 시간으로 표시할 때, 처음 표시할 때, 디지털 파이프에 반드시 표시되는 것은 모두 0이다.우리가 프로그램을 인코딩하고 다운로드한 후, 처음으로 전보를 치면 모두 0으로 표시되는 것을 보았지만, 곧 또 숫자가 나왔다.첫 번째 디스플레이가 끝난 후에 A/D 변환의 결과를 읽었기 때문에 프로그램이 다시 순환할 때 지난번 수치가 현실화되었기 때문이다.이렇게 하면 우리가 실험 현상을 관찰하는 데 결코 영향을 주지 않는다

  • 4
  • 일부 사람들은 전위기가 작동될 때 디지털 파이프에 있는 숫자가 시종일관 움직이지 않고 한 번 복원하거나 다시 한 번 전원을 켜야 숫자가 갱신되는 것을 발견할 수 있다.전환 시간이 부족하기 때문에 이런 상황에 직면했을 때 두 가지 해결 방법이 있다.첫째, 실험판에 있는 C11 용량을 150pF로 바꾸기;둘째, A/D 변환 시간을 적당히 연장한다. 즉, 디지털 파이프의 디스플레이 횟수를 늘리면 위쪽의 4for(a=10;a>0;a--)중의 a가 커진다

  • 우리는 전기로서 ADC 내부가 도대체 어떻게 작동하는지에 대해 그리 잘 알지 못한다. 우리는 어떻게 사용하는지 알기만 하면 된다.앞에서 그렇게 많은 ADC 내부의 물건을 말했는데 결국 우리는 WR을 써서 CS로 해결했다.
    _ nop _()
    이 물건, 우리가 이 물건이 존재한다는 것을 알았으면 좋겠다. 그것은 기계의 주기를 늦추는 데 쓰이고 쓸 때 쓰면 된다.

    좋은 웹페이지 즐겨찾기