代碼如下,利用PCF8591和iic采集模擬信號然后通過iic接口的OLED顯示出來
代碼不完善有BUG,望大神斧正!
這個示波器推薦輸入電壓0-5V,顯示的時候右上角會顯示實時電壓(單位毫伏)
但是由于前置硬件的存在輸入超過5V的電壓甚至是負電壓也是可以的,但是超過±5V的電壓會被鉗位二極管鉗住到±5V
電路原理圖如下:
Schematic_shiboqi_2021-07-11.png (279.46 KB, 下載次數: 91)
下載附件
電路圖
2021-7-12 00:07 上傳
單片機源程序如下:
- /*********************************************************************************
- * 【函數功能】: DA-AD實驗/ADC示波器顯示
- * 【使用說明】: 單片機:STC89C52/STC15F104w
- 1 光敏電阻
- 2 熱敏電阻
- 3 輸入端
- 4 可調0-5V電壓(藍色電位器調節)
-
- **********************************************************************************/
- /********************************************************************************************/
- #include<stc15.h> //包含單片機寄存器的頭文件
- #include <I2C.H>
- #define uchar unsigned char
- #define PCF8591 0x90 //PCF8591 地址
- int xx=0;int y11,y22;
- // 變量定義
- unsigned char AD_CHANNEL;
- unsigned int D[32];
- int ii,hh;
- // 函數申明
- void delay(uchar i);
- bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val);
- bit ISendByte(unsigned char sla,unsigned char c);
- unsigned char IRcvByte(unsigned char sla);
- //******************************************************************/
- int main()
- {
- oled_init();//初始化
- /*oled_wr_byte(0x2e,0);//關滾動
- oled_showstring(0,0,"TM VALUE",16);
- oled_showstring(0,2,"PR VALUE",16);
- oled_showstring(0,4,"NO VALUE",16);
- oled_showstring(0,6,"AR VALUE",16);*/
- while(1)
- {
- oled_DrawLine(0,0,0,63);
- oled_DrawLine(0,63,127,63);
- /********以下AD-DA處理*************/
- for(xx=0;xx<128;xx++)
- {
- switch(AD_CHANNEL)
- {
- case 0: ISendByte(PCF8591,0x41);
- D[0]=IRcvByte(PCF8591); //ADC0 模數轉換1 光敏電阻
- break;
-
- case 1: ISendByte(PCF8591,0x42);
- D[1]=IRcvByte(PCF8591); //ADC1 模數轉換2 熱敏電阻
- break;
-
- case 2: ISendByte(PCF8591,0x43);
- D[2]=IRcvByte(PCF8591); //ADC2 模數轉換3 輸入端
- break;
-
- case 3: ISendByte(PCF8591,0x40);
- D[3]=IRcvByte(PCF8591); //ADC3 模數轉換4 可調0-5v
- break;
-
- case 4: DACconversion(PCF8591,0x40, D[4]); //DAC 數模轉換
- break;
-
- }
- D[4]=D[2];//把模擬輸入采樣的信號 通過數模轉換輸出
-
- if(++AD_CHANNEL>4) AD_CHANNEL=0;
- ii=map(D[2],0,255,63,9);
- hh=map(D[2],0,255,0,5000);
- /********以下將AD的值通過OLED顯示*************/
- oled_shownum(64,0,hh,4,32);
- //oled_shownum(80,1,ii,3,32);
- Setpos(xx,ii);
- delay(200);
-
- }
- oled_clear();
- }
- }
- void delay(uchar i)
- {
- uchar j,k;
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
- /*******************************************************************
- DAC 變換, 轉化函數
- *******************************************************************/
- bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val)
- {
- Start_I2c(); //啟動總線
- SendByte(sla); //發送器件地址
- //if(ack==0)return(0);
- SendByte(c); //發送控制字節
- //if(ack==0)return(0);
- SendByte(Val); //發送DAC的數值
- //if(ack==0)return(0);
- Stop_I2c(); //結束總線
- return(1);
- }
- /*******************************************************************
- ADC發送字節[命令]數據函數
- *******************************************************************/
- bit ISendByte(unsigned char sla,unsigned char c)
- {
- Start_I2c(); //啟動總線
- SendByte(sla); //發送器件地址
- //if(ack==0)return(0);
- SendByte(c); //發送數據
- //if(ack==0)return(0);
- Stop_I2c(); //結束總線
- return(1);
- }
- /*******************************************************************
- ADC讀字節數據函數
- *******************************************************************/
- unsigned char IRcvByte(unsigned char sla)
- { unsigned char c;
- Start_I2c(); //啟動總線
- SendByte(sla+1); //發送器件地址
- //if(ack==0)return(0);
- c=RcvByte(); //讀取數據0
- Ack_I2c(1); //發送非就答位
- Stop_I2c(); //結束總線
- return(c);
- }
復制代碼 void oled_init(void)//初始化ssd1306
{
delay_ms(500);//延時(必須有)
oled_wr_byte(0xAE,0);//關閉oled面板
oled_wr_byte(0x00,0);//設置低位列地址
oled_wr_byte(0x10,0);//設置高位列地址
oled_wr_byte(0x40,0);//設置起始行地址設置映射RAM顯示起始行(0x00~0x3F)
oled_wr_byte(0x81,0);//--設置對比度控制寄存器
oled_wr_byte(0xCF,0);//設置SEG輸出電流亮度
oled_wr_byte(0xA1,0);//設置分段/列映射0xa0左右反置 0xa1型正常
oled_wr_byte(0xC8,0);//設置COM/行掃描方向0xc0上下反置 0xc8型正常
oled_wr_byte(0xA6,0);//設置正常顯示
oled_wr_byte(0xA8,0);//設置復用比(1到64)
oled_wr_byte(0x3F,0);//1/64負載
oled_wr_byte(0xD3,0);//設置顯示偏移映射RAM計數器(0x00~0x3F)
oled_wr_byte(0x00,0);//不補償
oled_wr_byte(0xD5,0);//設置顯示時鐘分頻比/振蕩器頻率
oled_wr_byte(0x80,0);//設置分頻比,將時鐘設置為100幀/秒
oled_wr_byte(0xD8,0);
oled_wr_byte(0x05,0);
oled_wr_byte(0xD9,0);//設置預充電時間
oled_wr_byte(0xF1,0);//將預充電設置為15個時鐘,放電設置為1個時鐘
oled_wr_byte(0xDA,0);//設置com引腳硬件配置
oled_wr_byte(0x12,0);//
oled_wr_byte(0xDB,0);//設置vcomh
oled_wr_byte(0x40,0);//設置VCOM取消選擇級別
oled_wr_byte(0x20,0);//設置頁面尋址模式(0x00/0x01/0x02)
oled_wr_byte(0x02,0);//
oled_wr_byte(0x8D,0);//設置電荷泵啟用/禁用
oled_wr_byte(0x14,0);//設置(0x10)禁用
oled_wr_byte(0xA4,0);//禁用整個顯示打開(0xa4/0xa5)
oled_wr_byte(0xA6,0);//禁用反轉顯示打開(0xa6/a7)
oled_wr_byte(0xAF,0);//打開oled面板
fill_picture(0x00);//初始清屏
oled_set_pos(0,0);//初始光標
}
制作出來的實物圖如下:
cb860d59ca0139cae2bbc9c5bfca0afba7becf9a.gif (2.07 MB, 下載次數: 76)
下載附件
效果
2021-7-12 00:08 上傳
51hei.png (3.11 KB, 下載次數: 71)
下載附件
2021-7-12 03:07 上傳
以上3個文件下載(需要自己建立Keil工程):
c文件與頭文件.7z
(6.44 KB, 下載次數: 27)
2021-7-12 03:09 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|