標題:
基于51單片機ADC0832轉換MQ3酒精傳感器OLED顯示程序與Proteus仿真
[打印本頁]
作者:
binggg
時間:
2022-11-12 17:30
標題:
基于51單片機ADC0832轉換MQ3酒精傳感器OLED顯示程序與Proteus仿真
如果仿真打不開,把Proteus升級到8.13版本。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
批注 2022-11-12 172932.png
(224.43 KB, 下載次數(shù): 18)
下載附件
2022-11-12 17:30 上傳
單片機源程序如下:
#include<reg51.h>
#include<intrins.h>
#include<oled.h>
#define uchar unsigned char
#define uint unsigned int
uchar Get_AD_Result(); //模數(shù)轉換結果
uint boundaries=80;//初始酒精報警設定為80
uint vt;
uchar AD;
uint x,y;
//ADC0832引腳定義
sbit CS = P1^0;
sbit CLK = P1^2;
sbit DIDO = P1^1;
sbit K1 = P2^2;
sbit K2 = P2^3;
sbit LEDR=P0^0;
sbit Beep=P2^7;
void Delayms(unsigned int n)//延時函數(shù)
{
unsigned int i,j;
for(j=n;j>0;j--)
for(i=112;i>0;i--);
}
void main()
{
OLED_Init();//初始化OLED
OLED_ColorTurn(0);//0正常顯示,1 反色顯示
OLED_DisplayTurn(1);//0正常顯示 1 屏幕翻轉顯示
OLED_ShowChinese(0,0,0,16);
OLED_ShowChinese(16,0,1,16);
OLED_ShowChinese(32,0,2,16);
OLED_ShowChinese(48,0,3,16);
OLED_ShowChinese(64,0,4,16);
OLED_ShowChinese(80,0,5,16);//顯示酒精濃度測試
Delayms(2000);
OLED_Clear();
OLED_ShowChinese(0,0,0,16);//顯示酒
OLED_ShowChinese(16,0,1,16);//顯示精
OLED_ShowChinese(0,2,6,16);//顯示設
OLED_ShowChinese(16,2,7,16);//顯示定
OLED_ShowString(32,0,":",16);//顯示:
OLED_ShowString(32,2,":",16);//顯示:
OLED_ShowString(88,2,"mg/ml",16);//顯示mg/ml
OLED_ShowString(88,0,"mg/ml",16);//顯示mg/ml
CLK = 0; //ADC0832初始化
CS = 1;
while(1)
{
AD = Get_AD_Result();
vt = (500.0/256.0)*AD;//得到輸出電壓
x=(vt-3)/2.778;//酒精濃度
y=x/10;
OLED_ShowNum(40,0,x,3,16);//顯示整數(shù)
OLED_ShowNum(72,0,y,1,16);//顯示小數(shù)
OLED_ShowString(64,0,".",16);//顯示小數(shù)點
OLED_ShowNum(40,2,boundaries,3,16);//顯示設定值
if(x>=boundaries)//酒精濃度大于等于設定,蜂鳴器響,紅燈亮
{
Beep=0;
LEDR=0;
}
else//酒精濃度小于設定值,蜂鳴器不響,紅燈不亮
{
Beep=1;
LEDR=1;
}
if(K1==0)//按下K1時,設定值減1
{
Delayms(15);//消抖
if(K1==0)
{
boundaries--;
}
while(!K1);//判斷K1是否彈起
}
if(K2==0)//按下K2時,設定值減+
{
Delayms(15);//消抖
if(K2==0)
{
boundaries++;
}
while(!K2);//判斷K2是否彈起
}
}
}
//------------------------------
// 獲取AD轉換結果(0通道)
//------------------------------
uchar Get_AD_Result() //包含11個CLK下降沿
{
uchar i, dat;
CS = 1; //ADC0832未工作時,CS端為高電平,此時芯片禁用
_nop_; //對于延時很短的,要求在us級的,采用“_nop_”函數(shù)
CLK =1;
CS = 0;
DIDO = 1; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第一個下降沿來到時,DI = 1啟動ADC0832
DIDO = 1; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第二個下降沿
DIDO = 0; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第三個下降沿,發(fā)送1,0選擇通道cho
DIDO = 1; //釋放總線
for(i = 0; i < 8; i++) //第4個下降沿到第11個下降沿
{
CLK = 0; //clk處于下降沿,每一個下降沿DO端輸入下一個
_nop_; //對于延時很短的,要求在us級的,采用_nop_函數(shù)
if(DIDO) dat |= 0x01; // dat = dat | 0x01,dat和0x01做“或”的運算,意思是最低位置1,其它位保持不變。
CLK = 1; _nop_; //clk處于上升沿
dat <<= 1; //數(shù)據(jù)左移
}
return (dat);
CS = 1; //ADC0832停止工作
}
復制代碼
Keil代碼與Proteus8.13版本的仿真(注意其他版本打不開的)下載:
51酒精報警.zip
(91.61 KB, 下載次數(shù): 71)
2022-11-12 17:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
tens1on
時間:
2024-12-9 14:21
用的lcd?代碼里咋寫oled
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1