如果仿真打不開,把Proteus升級到8.13版本。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
批注 2022-11-12 172932.png (224.43 KB, 下載次數: 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(); //模數轉換結果
- 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)//延時函數
- {
- 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);//顯示整數
- OLED_ShowNum(72,0,y,1,16);//顯示小數
- OLED_ShowString(64,0,".",16);//顯示小數點
- 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_”函數
- 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第三個下降沿,發送1,0選擇通道cho
- DIDO = 1; //釋放總線
- for(i = 0; i < 8; i++) //第4個下降沿到第11個下降沿
- {
- CLK = 0; //clk處于下降沿,每一個下降沿DO端輸入下一個
- _nop_; //對于延時很短的,要求在us級的,采用_nop_函數
- if(DIDO) dat |= 0x01; // dat = dat | 0x01,dat和0x01做“或”的運算,意思是最低位置1,其它位保持不變。
- CLK = 1; _nop_; //clk處于上升沿
- dat <<= 1; //數據左移
- }
- return (dat);
- CS = 1; //ADC0832停止工作
- }
復制代碼
Keil代碼與Proteus8.13版本的仿真(注意其他版本打不開的)下載:
51酒精報警.zip
(91.61 KB, 下載次數: 71)
2022-11-12 17:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|