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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1623|回復(fù): 1
收起左側(cè)

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

[復(fù)制鏈接]
ID:866576 發(fā)表于 2023-11-6 14:51 | 顯示全部樓層 |閱讀模式
為了讓后來者少走彎路,分享一個(gè)51單片機(jī)AD四路采集PCF8591實(shí)時(shí)采集的例程。雙IIC接口,還附上Proteus防真。
地址:AD四路采集串口顯示雙IIC

單片機(jī)源程序如下:
  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 屏幕翻轉(zhuǎn)顯示        
  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);//運(yùn)
  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;                      /*清除中斷標(biāo)志*/
  87.   TR0 = 0;                      /*關(guān)中斷*/
  88.         
  89.         num++;
  90.         
  91.   TL0 = 0x00;                                //設(shè)置定時(shí)初始值
  92.         TH0 = 0x4C;                                //設(shè)置定時(shí)初始值
  93.   TR0 = 1;                      /*開中斷*/        
  94. }
  95. //*******************************************************************
復(fù)制代碼




  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;                //定時(shí)器時(shí)鐘12T模式
  10.         AUXR &= 0xFE;                //串口1選擇定時(shí)器1為波特率發(fā)生器
  11.         TMOD &= 0x0F;                //設(shè)置定時(shí)器模式
  12.         TMOD |= 0x20;                //設(shè)置定時(shí)器模式
  13.         TL1 = 0xFD;                        //設(shè)置定時(shí)初始值
  14.         TH1 = 0xFD;                        //設(shè)置定時(shí)重載值
  15.         EA   = 1;       //打開全局中斷控制
  16.         ES   = 0;       //打開串行口中斷        
  17.         ET1 = 0;                          //禁止定時(shí)器中斷
  18.         TR1 = 1;                          //定時(shí)器1開始計(jì)時(shí)
  19. }


  20. void UartPrintASCII(u8 dat)                                //發(fā)送一個(gè)字符
  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;        /*允許定時(shí)中斷*/
  42.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  43.         TMOD |= 0x01;                //設(shè)置定時(shí)器模式
  44.         TL0 = 0x00;                                //設(shè)置定時(shí)初始值
  45.         TH0 = 0x4C;                                //設(shè)置定時(shí)初始值

  46.         TR0 = 1;        /*啟動(dòng)定時(shí)中斷*/
  47. }



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

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

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

  87. /********************************************************************
  88.                    等待應(yīng)答
  89. 函數(shù)原型:  IIc_WaitACK(void);
  90. 功能:      主控器進(jìn)行應(yīng)答信號(hào)(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ā)完后等待應(yīng)答,并對(duì)
  113.           此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0)     
  114.            發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。
  115. ********************************************************************/
  116. void SendByte(unsigned char date)
  117. {
  118.     unsigned char temp,i;                   //用于探測(cè)字節(jié)內(nèi)某一位值的掩碼變量
  119.             temp=date;
  120.     for (i=0; i<8; i++)           //從高位到低位依次進(jìn)行
  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ā)送完后,主機(jī)釋放SDA,以檢測(cè)從機(jī)應(yīng)答
  132. }

  133. /*******************************************************************
  134.                  字節(jié)數(shù)據(jù)接收函數(shù)               
  135. 函數(shù)原型: UCHAR  RcvByte();
  136. 功能:        用來接收從器件傳來的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號(hào)),
  137.           發(fā)完后請(qǐng)用應(yīng)答函數(shù)應(yīng)答從機(jī)。  
  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 變換, 轉(zhuǎn)化函數(shù)               
  157. *******************************************************************/
  158. void DAC(unsigned char dat)
  159. {
  160.    IIcStart();              //啟動(dòng)總線
  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();               //結(jié)束總線
  168. }


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

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

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:1098747 發(fā)表于 2023-11-8 17:05 | 顯示全部樓層
你好,請(qǐng)問是采了四路的電壓值嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩一卡 | 欧美日韩国产精品一区 | 毛片综合 | 精品国产乱码久久久久久1区2区 | 在线国产一区二区 | 日韩高清电影 | 精品国产乱码久久久久久闺蜜 | 国产在线观看一区二区 | 国产成人精品一区二区三区四区 | av国产精品 | 亚洲h视频 | 日本大香伊一区二区三区 | 特级生活片 | 国产成人免费视频网站高清观看视频 | 日韩欧美不卡 | 欧美日韩综合精品 | 福利久久 | 中文字幕在线二区 | 韩日在线视频 | 欧美一级欧美一级在线播放 | 国产粉嫩尤物极品99综合精品 | 国产激情自拍视频 | 国产精品久久久久9999鸭 | 国产一级片久久久 | 91精品国产一二三 | 国产精品久久久爽爽爽麻豆色哟哟 | 成人欧美一区二区三区色青冈 | 国产美女永久免费无遮挡 | 不卡的av一区 | 一区二区三区四区在线 | 精品一区二区av | 亚洲一二三区不卡 | 亚洲永久| h视频免费在线观看 | 国产一区二区在线免费观看 | av网站在线播放 | 91免费在线| 成人在线免费 | 有码一区 | 亚洲国产免费 | 久久综合一区 |