单片机/MCU论坛
直播中

陈兴洋

11年用户 56经验值
擅长:可编程逻辑 EDA/IC设计 处理器/DSP 接口/总线/驱动
私信 关注
[文章]

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

本帖最后由 Cxyelecfans 于 2014-11-23 15:18 编辑

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

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

  6. ***it adcs=P0^7;                   //adcs为ADC0804的片选信号端
  7. ***it wr=P3^6;                     //wr表示写入功能控制位
  8. ***it rd=P3^7;                     //rd表示读出功能控制位
  9. ***it dula=P2^6;                   //dula控制数码管的段选
  10. ***it 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位数码管连接原理图.PNG
  • 8位LED流水灯的连接原理图.PNG
  • AD连接原理图.PNG
  • 6位数码管连接原理图
  • ADC0804连接原理图
  • LED流水灯连接原理图

回帖(5)

陈兴洋

2014-11-23 15:12:45
第一次发帖,希望大家多提意见,多多支持,谢谢!
举报

古look仔

2015-3-27 15:37:16
学习一下怎么用
举报

古look仔

2015-3-27 15:45:47
很好的,尝试一些这程序
举报

吴悦

2015-5-30 15:46:57
非常感谢楼主 RD赋值那个地方之前一直没搞对,看了楼主的程序终于知道自己错在哪了,thanks a lot.
举报

张南

2018-4-10 10:55:36
学习了  楼主好人
举报

更多回帖

发帖
×
20
完善资料,
赚取积分