久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1686|回復: 1
打印 上一主題 下一主題
收起左側

51單片機AD四路采集串口顯示雙IIC及OLED顯示

[復制鏈接]
跳轉到指定樓層
樓主
ID:866576 發(fā)表于 2023-11-6 14:51 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
為了讓后來者少走彎路,分享一個51單片機AD四路采集PCF8591實時采集的例程。雙IIC接口,還附上Proteus防真。
地址:AD四路采集串口顯示雙IIC

單片機源程序如下:
  1. #include "main.h"

  2. // 變量定義

  3. u32 V0=0,V1=0,V2=0,V3=0;
  4. u8 num;

  5. //******************************************************************/

  6. main()
  7. {  
  8.         OLED_Init();
  9.         OLED_ColorTurn(0);     //0正常顯示,1 反色顯示
  10.   OLED_DisplayTurn(0);   //0正常顯示 1 屏幕翻轉顯示        
  11.         OLED_DrawBMP(0,0,128,64,BMP1);
  12.         
  13.         Uart_Init();        
  14.         Timer0_Init();
  15.         
  16.         delayms(500);
  17.   OLED_Clear();
  18.         
  19.         OLED_ShowChinese(24,1,0,16);//祝
  20.         OLED_ShowChinese(40,1,1,16);//你
  21.         OLED_ShowChinese(56,1,2,16);//好
  22.         OLED_ShowChinese(72,1,3,16);//運
  23.         OLED_ShowChinese(88,1,4,16);//!
  24.         delayms(500);
  25.          OLED_Clear();
  26.         
  27.         OLED_ShowString(0,0,"CHANNEL1:",16);   
  28.         OLED_ShowString(0,2,"CHANNEL2:",16);   
  29.         OLED_ShowString(0,4,"CHANNEL3:",16);   
  30.         OLED_ShowString(0,6,"CHANNEL4:",16);   
  31.         
  32.         while(1)
  33.         {
  34.              if(num==10)         
  35.                          {
  36.                          V0=ADC(0x40);         
  37.                              delayms(10);        
  38.                    V1=ADC(0x41);      
  39.                        delayms(10);        
  40.                          V2=ADC(0x42);
  41.                                    delayms(10);        
  42.                          V3=ADC(0x43);
  43.                              delayms(10);        
  44.                          DAC(V1);      
  45.                              delayms(10);        
  46.                                  
  47.                                   UartPrintASCII(V0);
  48.                         delayms(2);
  49.           UartPrintASCII(V1);
  50.             delayms(2);
  51.                 UartPrintASCII(V2);
  52.                    delayms(2);
  53.                 UartPrintASCII(V3);
  54.                                   UartPrintf("OK !");
  55.                  
  56.                    V0=V0*50000/255;
  57.                          V1=V1*50000/255;
  58.                          V2=V2*50000/255;
  59.                          V3=V3*50000/255;
  60.                                  
  61.                                 num=0;
  62.                        
  63.                                                   OLED_ShowNum(80,0,V1/10000,1,16);
  64.                                                         OLED_ShowString(88,0,".",16);
  65.                                                         OLED_ShowNum(96,0,V1%10000,4,16);
  66.                                                         
  67.                                                   OLED_ShowNum(80,2,V2/10000,1,16);
  68.                                                         OLED_ShowString(88,2,".",16);
  69.                                                         OLED_ShowNum(96,2,V2%10000,4,16);
  70.                                                         
  71.                                                   OLED_ShowNum(80,4,V3/10000,1,16);
  72.                                                         OLED_ShowString(88,4,".",16);
  73.                                                         OLED_ShowNum(96,4,V3%10000,4,16);
  74.                                                         
  75.                                                   OLED_ShowNum(80,6,V0/10000,1,16);
  76.                                                         OLED_ShowString(88,6,".",16);
  77.                                                         OLED_ShowNum(96,6,V0%10000,4,16);
  78.                         
  79.                          }
  80.                           
  81.    }
  82. }


  83. //*******************************************************************

  84. void Timer0_Isr() interrupt 1
  85. {
  86.         TF0 = 0;                      /*清除中斷標志*/
  87.   TR0 = 0;                      /*關中斷*/
  88.         
  89.         num++;
  90.         
  91.   TL0 = 0x00;                                //設置定時初始值
  92.         TH0 = 0x4C;                                //設置定時初始值
  93.   TR0 = 1;                      /*開中斷*/        
  94. }
  95. //*******************************************************************
復制代碼




  1. #include "ADC.h"  


  2. //*****串口初始化函數(shù)***********

  3. //******************************

  4. void Uart_Init(void)                                                                     
  5. {
  6.         REN  = 1;       //允許串行口接收數(shù)據(jù)
  7.         PCON &= 0x7F;                //波特率不倍速
  8.         SCON = 0x50;                //8位數(shù)據(jù),可變波特率
  9.         AUXR &= 0xBF;                //定時器時鐘12T模式
  10.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發(fā)生器
  11.         TMOD &= 0x0F;                //設置定時器模式
  12.         TMOD |= 0x20;                //設置定時器模式
  13.         TL1 = 0xFD;                        //設置定時初始值
  14.         TH1 = 0xFD;                        //設置定時重載值
  15.         EA   = 1;       //打開全局中斷控制
  16.         ES   = 0;       //打開串行口中斷        
  17.         ET1 = 0;                          //禁止定時器中斷
  18.         TR1 = 1;                          //定時器1開始計時
  19. }


  20. void UartPrintASCII(u8 dat)                                //發(fā)送一個字符
  21. {
  22.           TI=0;   
  23.     SBUF=dat;   
  24.     while(TI==0);   
  25.     TI=0;   
  26. }

  27. void UartPrintf(u8 *p)                                //發(fā)送字符串
  28. {        
  29.          while(*p)
  30.          {
  31.                  SBUF=*(p++);
  32.                 while(TI==0)
  33.                         {

  34.                   };
  35.                 TI=0;
  36.   }
  37. }

  38. void Timer0_Init(void)                //50毫秒@11.0592MHz
  39. {
  40.         EA=1;
  41.         ET0 = 1;        /*允許定時中斷*/
  42.         TMOD &= 0xF0;                //設置定時器模式
  43.         TMOD |= 0x01;                //設置定時器模式
  44.         TL0 = 0x00;                                //設置定時初始值
  45.         TH0 = 0x4C;                                //設置定時初始值

  46.         TR0 = 1;        /*啟動定時中斷*/
  47. }



  48. /*******************************************************************
  49.                      起動總線函數(shù)               
  50. 函數(shù)原型: void  IIcStart();  
  51. 功能:     啟動I2C總線,即發(fā)送I2C起始條件.  
  52. ********************************************************************/
  53. void IIcStart()
  54. {
  55.   SCL=1;
  56.         SDA=1;         /*發(fā)送起始條件的數(shù)據(jù)信號*/
  57.       delay5us();
  58.   SDA=0;                     /*發(fā)送起始信號*/
  59.            delay5us();   
  60. }

  61. /*******************************************************************
  62.                       結束總線函數(shù)               
  63. 函數(shù)原型: void  IIcStop();  
  64. 功能:     結束I2C總線,即發(fā)送I2C結束條件.  
  65. ********************************************************************/
  66. void IIcStop()
  67. {
  68.         SCL=1 ;
  69.   SDA=0;      /*發(fā)送結束條件的數(shù)據(jù)信號*/
  70.            delay5us();
  71.   SDA=1;      /*發(fā)送I2C總線結束信號*/
  72.            delay5us();
  73. }

  74. /********************************************************************
  75.                    發(fā)送應答
  76. 函數(shù)原型:  IIc_ACK(bit a);
  77. 功能:      主控器進行應答信號(注意:0表示發(fā)送應答,1表示發(fā)送非應答)
  78. ********************************************************************/
  79. void IIc_Ack(bit ack)
  80. {
  81.     SCL=1;
  82.         delay5us();
  83.     SDA=ack;                           /*清時鐘線,鉗住I2C總線以便繼續(xù)接收*/
  84.                             delay5us();
  85.           SCL=0;
  86. }

  87. /********************************************************************
  88.                    等待應答
  89. 函數(shù)原型:  IIc_WaitACK(void);
  90. 功能:      主控器進行應答信號(0是就幫答)
  91. ********************************************************************/
  92. bit IIc_WaitAck(void)
  93. {
  94.           SCL=0;
  95.               delay5us();         
  96.           SCL=1;
  97.               delay5us();
  98.     if(SDA==1)
  99.                 {
  100.                 SCL=0;
  101.                 return 0;        
  102.           }
  103.           else
  104.                 {
  105.                  SCL=0;
  106.                  return 1;
  107.                 }        
  108. }



  109. /*******************************************************************
  110.                  字節(jié)數(shù)據(jù)發(fā)送函數(shù)               
  111. 函數(shù)原型: void  SendByte(UCHAR c);
  112. 功能:     將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應答,并對
  113.           此狀態(tài)位進行操作.(不應答或非應答都使ack=0)     
  114.            發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應答或損壞。
  115. ********************************************************************/
  116. void SendByte(unsigned char date)
  117. {
  118.     unsigned char temp,i;                   //用于探測字節(jié)內某一位值的掩碼變量
  119.             temp=date;
  120.     for (i=0; i<8; i++)           //從高位到低位依次進行
  121.     {
  122.                           temp=temp<<1;
  123.                           SCL=0 ;
  124.                              delay5us();
  125.                                 SDA = CY;
  126.            delay5us();
  127.         SCL = 1;              //拉高SCL
  128.           delay5us();
  129.     }
  130.                 SCL = 0;
  131.     SDA = 1;                 //8位數(shù)據(jù)發(fā)送完后,主機釋放SDA,以檢測從機應答
  132. }

  133. /*******************************************************************
  134.                  字節(jié)數(shù)據(jù)接收函數(shù)               
  135. 函數(shù)原型: UCHAR  RcvByte();
  136. 功能:        用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應答信號),
  137.           發(fā)完后請用應答函數(shù)應答從機。  
  138. ********************************************************************/   
  139. unsigned char RcvByte(void)
  140. {
  141.     unsigned char  i,j,k;
  142.            SCL=0;
  143.                   delay5us();
  144.   for(i=0;i<8;i++)
  145.       {
  146.         SCL=1;
  147.                                     delay5us();
  148.          j=SDA;  
  149.                                  k=(k<<1)|j;
  150.                                  SCL=0;
  151.                                     delay5us();
  152.       }
  153.                         return k;
  154. }


  155. /*******************************************************************
  156. D/A 變換, 轉化函數(shù)               
  157. *******************************************************************/
  158. void DAC(unsigned char dat)
  159. {
  160.    IIcStart();              //啟動總線
  161.    SendByte(0x90);            //發(fā)送器件地址0x90是寫,0x91是讀
  162.     IIc_WaitAck();
  163.    SendByte(0x41);                //發(fā)送控制字節(jié)//允許DA輸出
  164.           IIc_WaitAck();
  165.    SendByte(dat);            //發(fā)送DAC的數(shù)值  
  166.     IIc_WaitAck();
  167.    IIcStop();               //結束總線
  168. }


  169. /*******************************************************************
  170. ADC讀字節(jié)數(shù)據(jù)函數(shù)               
  171. *******************************************************************/
  172. unsigned char ADC(unsigned char addr)
  173. {  
  174.          unsigned char temp;

  175.    IIcStart();          //啟動總線
  176.    SendByte(0x90);      //發(fā)送器件地址0x90是寫,0x91是讀
  177.     IIc_WaitAck();
  178.          SendByte(addr);                //控制字節(jié):選擇光敏電阻(0x41)還是滑動變阻器(0x43
  179.     IIc_WaitAck();
  180.    IIcStart();         
  181.    SendByte(0x91);                                
  182.           IIc_WaitAck();
  183.          temp=RcvByte();
  184.           IIc_Ack(1);            //0表示發(fā)送應答,1表示發(fā)送非應答
  185.          IIcStop();
  186.          return temp;         
  187. }
復制代碼
Proteus8.15版本的仿真: Proteus8.15版本的仿真.7z (133.22 KB, 下載次數(shù): 50)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:1098747 發(fā)表于 2023-11-8 17:05 | 只看該作者
你好,請問是采了四路的電壓值嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人av片在线观看 | 91精品国产综合久久久久 | 国产免费人成xvideos视频 | 精品一区二区av | 一级片免费在线观看 | 成人欧美一区二区三区色青冈 | 午夜视频一区二区三区 | 亚洲成人免费在线 | 国产一区二区三区四区五区3d | 91高清视频在线观看 | 国产精品久久久久久久久久免费 | 亚洲一区| 国产一级毛片视频 | 欧美日产国产成人免费图片 | 美女视频一区 | 精品一二区 | 黄色毛片黄色毛片 | 老牛嫩草一区二区三区av | 久久岛国 | 久久精品电影 | 免费成人毛片 | 国产美女自拍视频 | 四虎成人精品永久免费av九九 | 91在线看 | 久久亚洲国产 | 亚洲久久| 亚洲一区国产精品 | 久久伊人在 | 欧美精品一二区 | 水蜜桃久久夜色精品一区 | 欧美亚洲国产一区二区三区 | 欧美精品成人一区二区三区四区 | 黄视频免费在线 | 亚洲美女在线一区 | 国产精品一区二区电影 | 黄免费观看视频 | 国产视频一区二区三区四区五区 | 日韩精品一区二区三区视频播放 | 在线午夜| 麻豆久久久9性大片 | 成年人网站在线观看视频 |