找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2858|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机ADC0808采集 数码管显示

[复制链接]
跳转到指定楼层
楼主

程序和仿真工程请在附件中下载

单片机源程序如下:
  1. #include<reg52.h>         
  2. #include<intrins.h>
  3. #define ulong unsigned long
  4. #define uint unsigned int
  5. #define uchar unsigned char

  6. //定义ADC的控制接口
  7. #define                ADC_DATA                P1               
  8. sbit                  ADC_EOC                 = P3^2;              
  9. sbit                  ADC_CLK                 = P3^1;               
  10. sbit                  ADC_START                 = P3^0;            
  11. sbit                  ADC_OE                         = P3^3;  
  12. sbit                  ADC_A                         = P3^4;  
  13. sbit                  ADC_B                         = P3^5;   
  14. sbit                  ADC_C                         = P3^6;

  15. //定义数码管接口
  16. #define                SEG_DATA                P0
  17. sbit seg_1=P2^0;
  18. sbit seg_2=P2^1;
  19. sbit seg_3=P2^2;
  20. sbit seg_4=P2^3;


  21. uchar code SEG_Table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xf7};//CA共阳
  22. uchar dis_data_buf[4]={0,0,0,0};

  23. //============================
  24. //ADC获取函数
  25. //============================
  26. uchar ADC_GET(uchar temp_channel)
  27. {
  28.         if(temp_channel==0)
  29.         {
  30.            ADC_A=0;
  31.            ADC_B=0;
  32.            ADC_C=0;
  33.         }
  34.         else if(temp_channel==1)
  35.         {
  36.            ADC_A=1;
  37.            ADC_B=0;
  38.            ADC_C=0;
  39.         }
  40.         else if(temp_channel==2)
  41.         {
  42.            ADC_A=0;
  43.            ADC_B=1;
  44.            ADC_C=0;
  45.         }
  46.         else if(temp_channel==3)
  47.         {
  48.            ADC_A=1;
  49.            ADC_B=1;
  50.            ADC_C=0;
  51.         }
  52.         else if(temp_channel==4)
  53.         {
  54.            ADC_A=0;
  55.            ADC_B=0;
  56.            ADC_C=1;
  57.         }
  58.         else if(temp_channel==5)
  59.         {
  60.            ADC_A=1;
  61.            ADC_B=0;
  62.            ADC_C=1;
  63.         }
  64.         else if(temp_channel==6)
  65.         {
  66.            ADC_A=0;
  67.            ADC_B=1;
  68.            ADC_C=1;
  69.         }
  70.         else if(temp_channel==7)
  71.         {
  72.            ADC_A=1;
  73.            ADC_B=1;
  74.            ADC_C=1;
  75.         }

  76.         ADC_START = 0;
  77.         ADC_OE = 0;
  78.         ADC_START = 1;
  79.         ADC_START = 0;
  80.         while(ADC_EOC == 0);
  81.         ADC_OE = 1;
  82.         return ADC_DATA;
  83. }

  84. void Delay_1ms(uint i)//1ms延时
  85. {
  86.   uchar x,j;
  87.   for(j=0;j<i;j++)
  88.     for(x=0;x<=148;x++);       
  89. }


  90. //数码管的显示函数
  91. void diplay(uchar *dis_p)
  92. {
  93.   static uchar temp_num=0;
  94.   //消隐       
  95.   seg_1=0;seg_2=0;seg_3=0;seg_4=0;
  96.   switch(temp_num) //动态扫描数码管
  97.   {
  98.   case 0:
  99.                  SEG_DATA=SEG_Table[*(dis_p+temp_num)]&0x7f;//传递数码管断码到数据段
  100.                 seg_1=1;seg_2=0;seg_3=0;seg_4=0;
  101.                
  102.   break;
  103.   case 1:
  104.            SEG_DATA=SEG_Table[*(dis_p+temp_num)];//传递数码管断码到数据段
  105.            seg_1=0;seg_2=1;seg_3=0;seg_4=0;
  106.                
  107.   break;
  108.   case 2:
  109.                 SEG_DATA=SEG_Table[*(dis_p+temp_num)];//传递数码管断码到数据段
  110.                 seg_1=0;seg_2=0;seg_3=1;seg_4=0;
  111.                
  112.   break;
  113.   case 3:
  114.                 SEG_DATA=SEG_Table[*(dis_p+temp_num)];//传递数码管断码到数据段
  115.                 seg_1=0;seg_2=0;seg_3=0;seg_4=1;
  116.                
  117.   break;
  118.   }
  119.   Delay_1ms(2);

  120.   temp_num++;
  121.   if(temp_num>3) temp_num=0;

  122. }
  123. //************************************
  124. //定时器初始化
  125. //************************************
  126. void Time0_init()
  127. {
  128.         TMOD |= 0x02;                         //使用模式2,8位定时器
  129.         TH0=256-50;//  50US
  130.           TL0=256-50;//
  131.         EA    = 1;  //总中断
  132.         ET0   = 1;//定时器0初始化
  133.         TR0   = 1;

  134. }

  135. //转换采集的数据进行显示
  136. void Trans_data(uchar temp_channel)
  137. {
  138.         ulong temp_data=0;
  139.         temp_data=ADC_GET(temp_channel);
  140.         temp_data=temp_data*5000/255;        //把AD数值换算成电压并放大1000倍,避免小数运算
  141.         //解析数据到数码管
  142.         dis_data_buf[3]=temp_data%10;
  143.         dis_data_buf[2]=temp_data%100/10;
  144.         dis_data_buf[1]=temp_data%1000/100;;         //数组的最后一个是下划线编码
  145.         dis_data_buf[0]=temp_data/1000;
  146. }
  147. /********************************************************************
  148. * 名称 : Main()                       
  149. * 功能 : 主函数                       
  150. * 输入 : 无               
  151. * 输出 : 无               
  152. ***********************************************************************/
  153. void Main(void)
  154. {

  155.   Time0_init();                                        //初始化定时器
  156.   while(1)
  157.   {                 
  158.         Trans_data(0);                        //采集指定通道的数据       
  159.     diplay(dis_data_buf);        //刷新显示       
  160.   }
  161. }

  162. //===========================
  163. //定时器0中断,为ADC提供时钟信号
  164. //===========================
  165. void timer0() interrupt 1
  166. {
  167.         ADC_CLK = ~ADC_CLK;
  168. }
复制代码

所有资料51hei提供下载:
ADC809.zip (236.54 KB, 下载次数: 70)




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表