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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4206|回復: 5
打印 上一主題 下一主題
收起左側

酒精測試儀程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:254369 發(fā)表于 2017-11-27 20:54 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
我現(xiàn)在有原理圖,實物已經(jīng)按照原理圖接線,程序現(xiàn)在有問題,望各位大神指教
#include "reg52.H"
#include <STC89c52.h>
#include <L1602.h>
#include <2402.h>

#define uchar unsigned char
#define uint  unsigned int

//聲明常量
#define ALCH       80       //醉駕標準80mg/L
//K_MG_MV和K_ZERO為傳感器校準系數(shù),要根據(jù)每個MQ-3模塊校準
#define K_MG_MV    160/66  //傳感器靈敏度系數(shù),每毫克/L對應的10毫伏數(shù)
#define K_ZERO     15       //傳感器零點漂移,約130mV

//定義按鍵
sbit Key_Up = P3^6;
sbit Key_Down = P3^7;

//定義LED報警燈
sbit Led_Warn1 = P2^0;
sbit Led_Warn2 = P2^1;
sbit Led_Warn3 = P2^2;


//定義乙醇傳感器TTL電平輸出引腳
sbit DOUT = P1^4;

//定義標識
volatile bit FlagStartAL = 0;  //開始轉換標志
volatile bit FlagKeyPress = 0; //有鍵彈起標志

//全局變量定義
uchar Threshold;                   //酒精濃度上限報警值
uint  ALCounter;                //酒精轉換計時器
long   ALValue;                   //酒精測量值
float ALtemp;                    //計算臨時變量

uint keyvalue, keyUp, keyDown; //鍵值
char * pSave;                  //EEPROM存盤用指針

//函數(shù)聲明
void Data_Init();
void Timer0_Init();
void Port_Init();
void ADC_Init();
uchar GetADVal();
void KeyProcess(uint );

//數(shù)據(jù)初始化
void Data_Init()
{
   ALCounter = 0;
   ALValue = 0;
   Led_Warn1 = 1;
   Led_Warn2 = 2;
   Led_Warn3 = 3;
   keyvalue = 0;
   keyUp = 1;
   keyDown = 1;
}

//定時器0初始化,中斷時間約2毫秒
//計算:晶振11.0592MHz,定時器時鐘11059200/12=921600,每毫秒922個脈沖
//      16位定時器初值65536-1844=63692=0xf8cc
void Timer0_Init()
{
        ET0 = 1;        //允許定時器0中斷
        TMOD = 1;       //定時器工作方式選擇
        TL0 = 0xcc;     //
        TH0 = 0xf8;     //定時器賦予初值,大約為2毫秒中斷1次
        TR0 = 1;        //啟動定時器
}

//定時器0中斷
void Timer0_ISR (void) interrupt 1 using 0
{
        TL0 = 0xcc;
        TH0 = 0xf8;     //定時器賦予初值

        //每1秒鐘啟動一次AD轉換
    ALCounter ++;
    if (ALCounter >= 500)
    {
       FlagStartAL = 1;
           ALCounter = 0;
    }                                 
}

//存入設定值

void Save_Setting()
{
   pSave =  (char *)&Threshold;          //地址低位對應低8位,高位對應高8位
   wrteeprom(0, *pSave);              //存醉酒閾值低8位
   DELAY(300);
   pSave ++;
   wrteeprom(1, *pSave);              //存醉酒閾值高8位
   DELAY(300);
}

//載入設定值
void Load_Setting()
{
   pSave =  (char *)&Threshold;
   *pSave++ = rdeeprom(0);
   *pSave = rdeeprom(1);
   if ((Threshold>=255)||(Threshold<0)) Threshold = 80;
}

//按鍵處理程序,參數(shù)為鍵值,1為Up鍵,2為Down鍵
void KeyProcess(uint num)
{
   switch (num)
   {
      case 1:
             if (Threshold<255) Threshold++;
             break;
          case 2:
             if (Threshold>1) Threshold--;
             break;
          default:
             break;
   }
   L1602_int(2,9,Threshold);
   Save_Setting();
}

void main()
{
   uint i,j;

   EA = 0;
   Data_Init();     //數(shù)據(jù)初始化
   Timer0_Init();   //定時器0初始化
   Port_Init();     //端口初始化
   ADC_Init();      //ADC初始化
   EA = 1;
   L1602_init();
   L1602_string(1,1,"Welcome to ALCT! ");
   L1602_string(2,1,"Designed by AAA  ");
   //延時
   for (i=0;i<1000;i++)
      for (j=0;j<1000;j++)
             {;}
   //清屏
   L1602_string(1,1,"                ");
   L1602_string(2,1,"                ");
   L1602_string(1,1,"Alcohol:    mg/L");
   L1602_string(2,1,"Thresho:    mg/L");
   //載入設定值
   Load_Setting();
   L1602_int(2,9,Threshold);
   while(1)
   {
      //如果FlagStartAL標志置位,則進行AD轉換
          if (FlagStartAL == 1)
          {
             //酒精濃度換算,50mg/L=62.5ppm,傳感器靈敏度應事先校準
         ALValue = 500 * GetADVal() / 256;        //8位ADC,首先得到電壓值,單位10毫伏
             ALValue = ALValue - K_ZERO;              //首先減去零點漂移,一般是130mV
                 if (ALValue < 0) ALValue = 0;                          
                 ALValue = ALValue * K_MG_MV;             //將mV轉變成mg/L,K_MG_MV系數(shù)需要校準           
         L1602_int(1,9,ALValue);
                 if (ALValue > Threshold) Led_Warn1 = 0;  //超過閾值,則 Led_Warn1燈報警,否則報警燈滅。
                 else Led_Warn1 = 1;
                 FlagStartAL = 0;
           }
       //查詢乙醇傳感器TTL電平,該指示燈為傳感器模塊報警
           if (DOUT == 0)  Led_Warn2 = 0;
           //鍵盤查詢,在彈起時響應
           if ((Key_Up)&&(keyUp==0)) {FlagKeyPress = 1; keyvalue = 1;}
       else if ((Key_Down)&&(keyDown==0)) {FlagKeyPress = 1; keyvalue = 2;}
           if (FlagKeyPress == 1)
           {
          KeyProcess(keyvalue);
          FlagKeyPress = 0;           
           }
       if (!Key_Up) keyUp = 0;
           else keyUp = 1;
       if (!Key_Down) keyDown = 0;
           else keyDown = 1;
           DELAY(100);
   }
}


$0DCJ[BSD`$$))DS{NRNUVR.png (161.41 KB, 下載次數(shù): 62)

原理圖

原理圖
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發(fā)
ID:515069 發(fā)表于 2019-4-26 17:30 | 只看該作者
看不懂
回復

使用道具 舉報

板凳
ID:512465 發(fā)表于 2019-4-28 20:03 | 只看該作者
感謝分享
回復

使用道具 舉報

地板
ID:684148 發(fā)表于 2020-12-12 23:46 來自手機 | 只看該作者
wrteeprom這個報錯了
回復

使用道具 舉報

5#
ID:280000 發(fā)表于 2020-12-30 17:02 | 只看該作者
是顯示問題嗎
回復

使用道具 舉報

6#
ID:1121316 發(fā)表于 2024-5-18 20:06 | 只看該作者
ALValue = 500 * GetADVal() / 256;        //8位ADC,首先得到電壓值,單位10毫伏

這個500和256有什么說法
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 2018国产精品 | 日本精品一区二区三区视频 | 午夜天堂精品久久久久 | 精品视频成人 | 亚洲成av人片在线观看无码 | 麻豆va| 成人欧美一区二区三区在线播放 | 91大神在线资源观看无广告 | 欧美日韩手机在线观看 | 欧美日韩精品一区二区 | www狠狠干| 日韩视频免费在线 | www.成人在线视频 | 欧美精品一区二区三区在线播放 | 人人亚洲| h视频免费在线观看 | 欧美日韩亚洲国产 | 日韩成人免费av | 欧美国产视频 | 国产精品高 | 欧美在线一区二区三区 | 国产高清视频在线观看 | 偷拍亚洲色图 | 91精品国产一区二区在线观看 | 在线一区 | 91精品国产综合久久久久久漫画 | 懂色中文一区二区三区在线视频 | 国产一区高清 | 久久久久久久91 | 日日夜夜天天综合 | 亚洲精品不卡 | 欧美日韩福利 | 欧美一区二区三区视频在线播放 | 久久国产精品无码网站 | 99re在线视频免费观看 | 国产成人免费一区二区60岁 | 91精品国产一区二区三区香蕉 | 国产精品久久久久久久7777 | 在线视频一区二区三区 | 日韩一区二区三区视频 | 中文字幕免费视频 |