找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1622|回复: 0
收起左侧

单片机+PCF8591T AD实验数码管显示程序

[复制链接]
ID:523206 发表于 2020-7-27 08:14 | 显示全部楼层 |阅读模式
  1. /********************************************************************
  2. * 文件名  :  PCF8591TAD实验.c
  3. * 描述    :  该程序实现了用PCF8591T同时采集4路AD输入的功能。
  4.                          通过P3.2,P3.3两个按键,来切换所显示的AD输入通道。
  5.                          按S19(P3.2)则显示的精密可调电阻分压的值。
  6.                          按S20(P3.3) 则显示的光敏电阻和热敏电阻的值。
  7.                          大家可以调节精密可调电阻,或者挡住光敏电阻的光,或者手接触温敏电阻,
  8.                          数码管上显示的AD采集值都会有相应的变化。                         
  9. ***********************************************************************************/

  10. #include<reg52.h>
  11. #include <I2C.H>

  12. #define  ADDR 0x90    //PCF8591 地址

  13. // 此表为 LED 的字模            // 0    1    2    3    4    5    6   7    8    9    A    b    c    d    E    -    L   P    U    Hidden  _ (20)
  14. unsigned char code  Disp_Tab[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x88,0x83,0xC6,0xA1,0x86,0xbf,0xc7,0x8c,0xc1, 0xff,  0xf7 };
  15. unsigned char TABLEW[8] ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  16. unsigned char AD_CHANNEL;
  17. unsigned char LedOut[8];
  18. unsigned int  D[32];
  19.                  
  20. sbit KEY1 = P3^2;
  21. sbit KEY2 = P3^3;

  22. /********************************************************************
  23. * 名称 : Delay_1ms()
  24. * 功能 : 延时子程序,延时时间为 1ms * x
  25. * 输入 : x (延时一毫秒的个数)
  26. * 输出 : 无
  27. ***********************************************************************/
  28. void Delay_1ms(unsigned char i)//1ms延时
  29. {
  30.         unsigned char x,j;
  31.         for(j=0;j<i;j++)
  32.         for(x=0;x<=148;x++);       
  33. }
  34. /*******************************************************************
  35. DAC 变换, 转化函数               
  36. *******************************************************************/
  37. bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
  38. {
  39.    Start_I2c();              //启动总线
  40.    SendByte(sla);            //发送器件地址
  41.    if(ack==0)return(0);
  42.    SendByte(c);              //发送控制字节
  43.    if(ack==0)return(0);
  44.    SendByte(Val);            //发送DAC的数值  
  45.    if(ack==0)return(0);
  46.    Stop_I2c();               //结束总线
  47.    return(1);
  48. }

  49. /*******************************************************************
  50. ADC发送字节[命令]数据函数               
  51. *******************************************************************/
  52. bit ISendByte(unsigned char sla,unsigned char c)
  53. {
  54.    Start_I2c();              //启动总线
  55.    SendByte(sla);            //发送器件地址
  56.    if(ack==0)return(0);
  57.    SendByte(c);              //发送数据
  58.    if(ack==0)return(0);
  59.    Stop_I2c();               //结束总线
  60.    return(1);
  61. }

  62. /*******************************************************************
  63. ADC读字节数据函数               
  64. *******************************************************************/
  65. unsigned char IRcvByte(unsigned char sla)
  66. {  unsigned char c;

  67.    Start_I2c();          //启动总线
  68.    SendByte(sla+1);      //发送器件地址
  69.    if(ack==0)return(0);
  70.    c=RcvByte();          //读取数据0

  71.    Ack_I2c(1);           //发送非就答位
  72.    Stop_I2c();           //结束总线
  73.    return(c);
  74. }

  75. //******************************************************************/
  76. main()
  77. {  
  78. unsigned char i,temp=1;
  79. while(1)
  80. {/********以下AD-DA处理*************/  
  81.    switch(AD_CHANNEL)
  82.    {
  83.      case 0: ISendByte(ADDR,0x41);
  84.              D[0]=IRcvByte(ADDR)*2;  //ADC0 模数转换1
  85.                          break;  

  86.          case 1: ISendByte(ADDR,0x42);
  87.              D[1]=IRcvByte(ADDR)*2;  //ADC1  模数转换2
  88.                          break;  

  89.          case 2: ISendByte(ADDR,0x43);
  90.              D[2]=IRcvByte(ADDR)*2;  //ADC2        模数转换3
  91.                          break;  

  92.          case 3: ISendByte(ADDR,0x40);
  93.              D[3]=IRcvByte(ADDR)*2;  //ADC3   模数转换4
  94.                          break;  

  95.          case 4: DACconversion(ADDR,0x40, D[4]/4); //DAC          数模转换
  96.                  break;
  97.    }

  98.    if(++AD_CHANNEL>4) AD_CHANNEL=0;
  99.        
  100.                  if(KEY1==0 || KEY2==0 )       
  101.                 {
  102.                         Delay_1ms(20);                   //20毫秒软件防抖
  103.                         if(KEY1 == 0)
  104.                         {
  105.                                 temp =1;
  106.                                        
  107.                         }
  108.                         else if(KEY2 == 0)
  109.                         {
  110.                                 temp=2;                                       
  111.                         }
  112.                        
  113.                 }
  114.                 if(temp ==1)
  115.                 {
  116.                         LedOut[0]=Disp_Tab[D[0]%10000/1000];
  117.                      LedOut[1]=Disp_Tab[D[0]%1000/100];
  118.                      LedOut[2]=Disp_Tab[D[0]%100/10]&0x7f;
  119.                      LedOut[3]=Disp_Tab[D[0]%10];
  120.          
  121.                          LedOut[4]=Disp_Tab[D[1]%10000/1000];
  122.                         LedOut[5]=Disp_Tab[D[1]%1000/100]&0x7f;
  123.                         LedOut[6]=Disp_Tab[D[1]%100/10];
  124.                         LedOut[7]=Disp_Tab[D[1]%10];         
  125.                 }
  126.                 if(temp ==2)
  127.                 {
  128.                         LedOut[0]=Disp_Tab[D[2]%10000/1000];
  129.                     LedOut[1]=Disp_Tab[D[2]%1000/100];
  130.                     LedOut[2]=Disp_Tab[D[2]%100/10]&0x7f;
  131.                     LedOut[3]=Disp_Tab[D[2]%10];
  132.          
  133.                          LedOut[4]=Disp_Tab[D[3]%10000/1000];
  134.                     LedOut[5]=Disp_Tab[D[3]%1000/100]&0x7f;
  135.                      LedOut[6]=Disp_Tab[D[3]%100/10];
  136.                      LedOut[7]=Disp_Tab[D[3]%10];          
  137.                 }
  138.                 for(i=0;i<8;i++)
  139.                 {
  140.                         P0 = LedOut[7-i];
  141.                         P2 = 7-i;
  142.                         Delay_1ms(2);                       
  143.                 }
  144.         }   
  145. }
复制代码


PCF8591T AD实验数码管显示.zip

38.12 KB, 下载次数: 23, 下载积分: 黑币 -5

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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