微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机的A/D转换应用(郭天祥TX-1C实验板):ADC0804

51单片机的A/D转换应用(郭天祥TX-1C实验板):ADC0804

时间:10-02 整理:3721RD 点击:

        此实验是通过ADC0804芯片,将采集到的模拟信号转换为数字量信号,并将数字量的变化通过LED灯以及数码管的显示实时反应出来。
        对于ADC0804芯片,当片选信号CS=0(低电平有效)时,写信号WR在一个上升沿时,启动ADC芯片,并将模拟量信号输入ADC;读出时,在片选信号有效的同时,读出信号RD由低电平转换为高电平的过程中,将数字量信号输出到单片机的I/O口。
        本实验是采用郭天祥的TX-1C实验板来实现程序的功能,原理图如下附件:        程序代码如下:

  1. #include<reg52.h>                 //52系列单片机的头文件
  2. #include<intrins.h>               //包含_nop_()函数,实行空操作
  3. #define uint unsigned int         
  4. #define uchar unsigned char

  5. /*----------------------特殊功能位的声明-----------------------*/

  6. sbit adcs=P0^7;                   //adcs为ADC0804的片选信号端
  7. sbit wr=P3^6;                     //wr表示写入功能控制位
  8. sbit rd=P3^7;                     //rd表示读出功能控制位
  9. sbit dula=P2^6;                   //dula控制数码管的段选
  10. sbit wela=P2^7;                   //wela控制数码管的位选

  11. uchar num;                        //用来存放转换后的数字量值
  12. uchar bai,shi,ge;                 //用来存放num分离出来的各位数
  13. uchar i;                           //用来控制循环次数
  14. uchar code table[]=               //编码数组table保存段选字形码0~9的编码
  15. {0x3f,0x06,0x5b,0x4f,0x66,
  16. 0x6d,0x7d,0x07,0x7f,0x6f};

  17. /*----------------------子函数的的声明-----------------------*/

  18. void delayms(uint);               
  19. void display(uchar);              
  20. void ADCStart();                 
  21. void main()                       
  22. {        
  23.         while(1)                    //while(1)循环,使模拟量实时发生变化
  24.         {
  25.             ADCStart();            
  26.             adcs=0;                 //选中ADC
  27.             _nop_();                //空操作,延时一机器周期,使ADC响应
  28.             rd=0;                   //准备读出数字量数据
  29.             _nop_();
  30.             _nop_();
  31.             num=P1;                 //将P1端口的数字量赋给num,用于数码显示
  32.           for(i=0;i<50;i++)       //循环50次,此时LED灯保持常亮直到执行语     
  33.                                   //句"rd=1;"才熄灭,且数码管显示同一数值                 {
  34.                display(num);      //将数字量的数值显示到数码管上
  35.           }                       
  36.             rd=1;                   //rd一个上升沿将数据读出,此时灯灭
  37.             _nop_();
  38.             adcs=1;                 //片选信号置于高电平,关闭ADC芯片
  39.         }
  40. }

  41. /*-------ADC启动函数,并往ADC中写入模拟量数据-------*/

  42. void ADCStart()                  
  43. {
  44.     adcs=0;                       //选中ADC,片选信号CS低电平有效
  45.     _nop_();                     
  46.     wr=0;
  47.     _nop_();
  48.     wr=1;                         //wr一个上升沿脉冲,启动ADC,并写入数据
  49.     _nop_();
  50.     adcs=1;                       
  51. }

  52. /*-------显示子函数,将模拟量数据值显示到数码管上-------*/

  53. void display(uchar num)           
  54. {
  55.         bai=num/100;               
  56.         shi=num%100/10;
  57.         ge=num%10;

  58.         dula=1;                     
  59.         P0=table[bai];
  60.         dula=0;
  61.         P0=0xff;
  62.         wela=1;
  63.         P0=0x77;
  64.         wela=0;
  65.         delayms(2);

  66.         dula=1;
  67.         P0=table[shi];
  68.         dula=0;
  69.         P0=0xff;
  70.         wela=1;
  71.         P0=0x6f;
  72.         wela=0;
  73.         delayms(2);

  74.         dula=1;
  75.         P0=table[ge];
  76.         dula=0;
  77.         P0=0xff;
  78.         wela=1;
  79.         P0=0x5f;
  80.         wela=0;
  81.         delayms(2);        
  82. }

  83. void delayms(uint z)              
  84. {
  85.         uint x,y;
  86.         for(x=z;x>0;x--)
  87.                 for(y=110;y>0;y--)
  88.                                 ;
  89. }

复制代码

      
      
注意:LED灯亮的时间段为从"rd=0;"语句执行完到"rd=1;"语句结束为止,其余时间由于P0=0xff,导致LED灯全灭。因此在一个while(1)循环周期内,通过控制此段时间的长度,即LED灯亮的时间百分比,就可控制LED灯的亮度




6位数码管连接原理图


ADC0804连接原理图


LED流水灯连接原理图


第一次发帖,希望大家多提意见,多多支持,谢谢!

学习一下怎么用

很好的,尝试一些这程序

非常感谢小编 RD赋值那个地方之前一直没搞对,看了小编的程序终于知道自己错在哪了,thanks a lot.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top