欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1649|回復: 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 單片機教程網

快速回復 返回頂部 返回列表