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

QQ登錄

只需一步,快速開始

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

單片機(jī)酒精測(cè)試儀的AD轉(zhuǎn)換問題

[復(fù)制鏈接]
ID:999060 發(fā)表于 2022-1-8 21:20 | 顯示全部樓層 |閱讀模式
30黑幣
在下剛接觸單片機(jī)不久,小白一個(gè),前幾天讓做一個(gè)酒精測(cè)試儀,一開始沒要求使用stc15的芯片,后面要求改掉,并使用自帶的ad轉(zhuǎn)換,增加一個(gè)指示燈,要求指示未飲酒(20毫克/100毫升),飲酒(20-80毫克/100毫升),醉酒(80>毫克/100毫升),目前自己僅做出來這么一點(diǎn)點(diǎn)東西,求助各位大佬幫忙修改一下程序,指點(diǎn)一下,不勝感激!!
Q@U))%5%}]W$H3$WJ0}N~`U.png E00%J_V~LU]B0)G~{CQ@FSC.png
不改好不讓走,幫幫孩子吧,我想早點(diǎn)回家過年0.0

//程序頭函數(shù)
#include <stc15.h>
#include <math.h>
//顯示函數(shù)
#include <display.h>

#include <intrins.h>
#include "eeprom52.h"
//宏定義
#define uint unsigned int
#define uchar unsigned char
#define Data_ADC0809 P1

//管腳聲明
sbit LED_R= P2^2; //紅指示燈
sbit LED_G= P2^0; //綠色指示燈
sbit FENG = P2^5; //蜂鳴器
//ADC
sbit ST=P3^3;

//按鍵
sbit Key1=P2^6;        //設(shè)置按鍵
sbit Key2=P2^7; //加
sbit Key3=P3^7;        //減

bit bdata flag;//指示燈和蜂鳴器閃爍報(bào)警標(biāo)志位
uchar set;          //設(shè)置標(biāo)志位


//函數(shù)聲明
extern uchar ADC0809();
extern void Key();

//酒精含量變量
int temp=0;
int ZERO=0;
char sec=3;          //開機(jī)初始化的時(shí)間


uchar WARNING=25; // 初始報(bào)警值

void delay(uint x)
{
        uint i,j;
        for(i=0;i<x;i++)
        for(j=0;j<121;j++);
}

/******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
void write_eeprom()
{
        SectorErase(0x2000);
        byte_write(0x2000, WARNING);
        byte_write(0x2001, ZERO);
        byte_write(0x2060, a_a);        
}

/******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來*****************/
void read_eeprom()
{
        WARNING   = byte_read(0x2000);
        ZERO      = byte_read(0x2001);
        a_a       = byte_read(0x2060);
}

/**************開機(jī)自檢eeprom初始化*****************/
void init_eeprom()
{
        read_eeprom();                //先讀
        if(a_a != 1)                //新的單片機(jī)初始單片機(jī)內(nèi)問eeprom
        {
                WARNING   = 25;
                ZERO=0;
                a_a = 1;
                write_eeprom();           //保存數(shù)據(jù)
        }        
}

//初始化函數(shù)
void init()         
{
        TMOD=0x01; //定時(shí)器0方式1
         TL0=0xb0;
         TH0=0x3c;  //賦初值
         EA=1;        //開總中斷
        ET0=1;        //允許定時(shí)器0中斷
         TR0=1;        //定時(shí)器0開
}
//主函數(shù)
void main()
{
        init();         //初始化函數(shù)

        Init1602_init();        //1602初始化
        while(sec+1)
        {
                write_com(0x80+0x40+13);
                write_data(sec/10+0x30);
                write_data(sec%10+0x30);
        }
        Init1602();        //1602初始化
        init_eeprom();  //開始初始化保存的數(shù)據(jù)
        
        while(1)//主循環(huán)
        {
                if(set==0) //如果沒有按下設(shè)置(默認(rèn)set是0,就是正常顯示狀態(tài))
                {
                        temp=ADC0809();        //讀取酒精值
                        Display_1602(temp-ZERO,WARNING);         //顯示酒精值
                }
                if(temp-ZERO<WARNING&&set==0)        //如果實(shí)際的酒精值小于報(bào)警值且在正常顯示狀態(tài)下
                {
                        flag=0;         //執(zhí)行下面flag=0的(主要就是綠燈閃,關(guān)蜂鳴器和繼電器)
                }
                else if(temp-ZERO>WARNING&&set==0)  //如果實(shí)際的酒精值大于報(bào)警值且在正常顯示狀態(tài)下
                {
                        flag=1;        //執(zhí)行下面flag=1的(主要就是紅燈閃,開蜂鳴器和繼電器)
                }
                Key();//按鍵掃描
        }
}
//ADC0809讀取信息
uchar ADC0809()
{
        uchar temp_=0x00;
        //初始化高阻太

        OE=0;
        //轉(zhuǎn)化初始化
        ST=0;
        //開始轉(zhuǎn)換
        ST=1;
        ST=0;
        //外部中斷等待AD轉(zhuǎn)換結(jié)束
        while(EOC==0)
        //讀取轉(zhuǎn)換的AD值
        OE=1;
        temp_=Data_ADC0809;
        OE=0;
        return temp_;
}
//按鍵函數(shù)
void Key()
{
        if(Key1==0)        //如果設(shè)置按鍵按下
        {
                delay(20);
                if(Key1==0)
                {
                        FENG=0;        //蜂鳴器響
                        delay(100);
                        FENG=1;        //蜂鳴器關(guān)
                        set++;        //設(shè)置的變量加1
                        if(set==1)
                        {
                                flag=0;        //綠燈閃
                                TR0=0;        //關(guān)定時(shí)器0
                                write_com(0x0f);//打開顯示 無光標(biāo) 光標(biāo)閃爍
                                write_com(0x80+0x40+13);//位置
                        }
                        else
                        {
                                set=0;
                                set=0;        //正常顯示狀態(tài)
                                write_com(0x0c);//打開顯示 無光標(biāo) 無光標(biāo)閃爍
                                FENG=1;        //蜂鳴器關(guān)
                                flag=1;        //紅燈閃
                                TR0=1;        //定時(shí)器0?
                        }
                        
                        while(Key1==0);//等待按鍵釋放
                }
        }
        if(Key2==0&&set!=0)          //在設(shè)置的狀態(tài)下按下加
        {
                delay(20);
                if(Key2==0&&set!=0)          //在設(shè)置的狀態(tài)下按下加
                {
                        FENG=0;                //蜂鳴器響
                        delay(100);
                        FENG=1;         //蜂鳴器關(guān)
                        WARNING++;        //報(bào)警值加1
                        if(WARNING>=255)  //如果報(bào)警值大于等于255
                        WARNING=0;                 //報(bào)警值歸零
                        write_com(0x80+0x40+11);
                        write_data('0'+WARNING/100);
                        write_data('0'+WARNING/10%10);
                        write_data('0'+WARNING%10);           //顯示報(bào)警值
                        write_com(0x80+0x40+13);//調(diào)整位置
                        write_eeprom();                           //保存數(shù)據(jù)        
                        while(Key2==0);          //等待按鍵釋放
                }
        }
        if(Key3==0&&set!=0)         //在設(shè)置的狀態(tài)下按下減
        {
                delay(20);
                if(Key3==0&&set!=0)         //在設(shè)置的狀態(tài)下按下減
                {
                        FENG=0;                 //蜂鳴器響
                        delay(100);
                        FENG=1;         //蜂鳴器關(guān)
                        WARNING--;         //報(bào)警值減1
                        if(WARNING<=0)        //如果報(bào)警值小于等于0
                        WARNING=255;        //那么報(bào)警值為255
                        write_com(0x80+0x40+11);
                        write_data('0'+WARNING/100);
                        write_data('0'+WARNING/10%10);
                        write_data('0'+WARNING%10);
                        write_com(0x80+0x40+13);//調(diào)整位置
                        write_eeprom();                           //保存數(shù)據(jù)        
                        while(Key3==0);         //等待按鍵釋放        
                }
        }
        if(Key2==0&&Key3==0&&set==0)
        {
                delay(1000);
                if(Key2==0&&Key3==0&&set==0)
                {
                        FENG=0;                 //蜂鳴器響
                        delay(200);
                        FENG=1;         //蜂鳴器關(guān)
                        ZERO=temp;
                        while(Key2==0&&Key3==0);
                        write_eeprom();                           //保存數(shù)據(jù)
                }
        }
}

void  time1_int(void) interrupt 1 //定時(shí)器中斷0
{
        uchar count;
        TL0=0xb0;
         TH0=0x3c;  //重賦初值50ms
          count++;  ///溢出值加1
        if(count==10)  //如果時(shí)間到半秒
        {
                if(flag==0)          //如果flag為0
                {
                        LED_G=0;  //綠燈亮
                        LED_R=1;  //紅燈滅
                        FENG=1;          //蜂鳴器關(guān)
                }
                if(flag==1)           //如果flag為1
                {
                        LED_G=1;   //綠燈關(guān)
                        LED_R=0;   //紅燈亮
                        FENG=0;           //蜂鳴器開
                }
        }

           if(count>=20)          //如果時(shí)間到1秒
           {
                count=0;          //溢出值清零
                if(flag==0)         //如果flag為0
                {
                        LED_G=1;        //綠燈關(guān)
                        LED_R=1;        //紅燈滅
                        FENG=1;           //蜂鳴器關(guān)
                }
                if(flag==1)           //如果flag為1
                {
                        LED_G=1;   //綠燈關(guān)
                        LED_R=1;        //紅燈滅
                        FENG=1;           //蜂鳴器關(guān)
                }
                if(sec>=0)
                sec--;
        }
}

酒精.7z

125.14 KB, 下載次數(shù): 10

最佳答案

查看完整內(nèi)容

LCD不顯示是時(shí)序沒有處理好,改了時(shí)序就可以了。實(shí)物正常不代表仿真也行。
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2022-1-8 21:20 | 顯示全部樓層
uhl0 發(fā)表于 2022-1-9 19:25
我導(dǎo)入仿真顯示不了,是我仿真有問題嗎?大佬麻煩再幫忙看看

LCD不顯示是時(shí)序沒有處理好,改了時(shí)序就可以了。實(shí)物正常不代表仿真也行。
無標(biāo)題.jpg

程序構(gòu)架.rar (26.91 KB, 下載次數(shù): 13)

回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2022-1-9 14:58 | 顯示全部樓層
給你寫了個(gè)程序構(gòu)架,管腳配置、PH值計(jì)算、報(bào)警等細(xì)節(jié)部分你自己完善。
程序構(gòu)架.rar (25.31 KB, 下載次數(shù): 9)

回復(fù)

使用道具 舉報(bào)

ID:999060 發(fā)表于 2022-1-9 19:25 | 顯示全部樓層
wulin 發(fā)表于 2022-1-9 14:58
給你寫了個(gè)程序構(gòu)架,管腳配置、PH值計(jì)算、報(bào)警等細(xì)節(jié)部分你自己完善。

我導(dǎo)入仿真顯示不了,是我仿真有問題嗎?大佬麻煩再幫忙看看
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2022-1-9 21:49 | 顯示全部樓層
uhl0 發(fā)表于 2022-1-9 19:25
我導(dǎo)入仿真顯示不了,是我仿真有問題嗎?大佬麻煩再幫忙看看

這個(gè)程序只是根據(jù)以往編程經(jīng)驗(yàn)構(gòu)建的一個(gè)基礎(chǔ)構(gòu)架,各功能模塊相對(duì)獨(dú)立,通過全局變量、標(biāo)志位和定時(shí)器中斷協(xié)調(diào)運(yùn)行。雖然通過編譯但既沒有仿真也沒有經(jīng)實(shí)物驗(yàn)證。充其量只能算是一個(gè)編程思路。注釋也還算比較詳細(xì),應(yīng)該不難理解。
回復(fù)

使用道具 舉報(bào)

ID:57657 發(fā)表于 2022-1-10 17:29 | 顯示全部樓層
uhl0 發(fā)表于 2022-1-9 19:25
我導(dǎo)入仿真顯示不了,是我仿真有問題嗎?大佬麻煩再幫忙看看

仿真模型不是完整的,有很多STC新增的寄存器、中斷在仿真里面都是空白,只能實(shí)物驗(yàn)證,只適合仿真一些基本寄存器、算法類程序。
回復(fù)

使用道具 舉報(bào)

ID:999060 發(fā)表于 2022-1-10 17:37 | 顯示全部樓層
wulin 發(fā)表于 2022-1-10 15:06
LCD不顯示是時(shí)序沒有處理好,改了時(shí)序就可以了。實(shí)物正常不代表仿真也行。

我使用其他的程序也試了下,使用proteus只能使用stc15w4k32s4,好像Proteus的STC15元件不能仿真AD,當(dāng)然也可能是我自己仿真有錯(cuò),感謝大佬耐心幫助,非常感謝
回復(fù)

使用道具 舉報(bào)

ID:999060 發(fā)表于 2022-1-11 11:39 | 顯示全部樓層
wulin 發(fā)表于 2022-1-8 21:20
LCD不顯示是時(shí)序沒有處理好,改了時(shí)序就可以了。實(shí)物正常不代表仿真也行。

大佬stc的原理圖有嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表