找回密码
 注册
关于网站域名变更的通知
查看: 722|回复: 2
打印 上一主题 下一主题

单片机酒精检测仪源程序+仿真 

[复制链接]
  • TA的每日心情
    开心
    2019-11-20 15:00
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2018-11-19 09:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    单片机酒精检测仪源程序+仿真 DXP格式用            altium designer Summer 软件打开 " d  D, F( E; i, E' U
    protel99格式用       protel99SE 软件打开   g1 a' ]- ~$ A" z- i8 ]9 l. D
    PDF格式用            PDF 软件打开 % d' m6 ^" ]) l! p
    Word格式用           Word 或用WPS 软件打开
    ( t$ K* \9 c, y- A; q! g; S" q& f% g+ D7 y7 f
    4种格式的原理图都内容是一样的  只是打开方式不同' o* A' a6 t& B+ K3 Z+ x7 z
    ! y, p  q) C5 I' C; E* ?6 {
    请看原理图焊接,不要看仿真图焊接。; I8 h7 ]' _( W. R: ~! _2 ^
    9 O! F" u8 _' `8 N1 o- W$ V
    wrod格式里面的原理图是复制出来的,有一点点变行变形,麻烦大家注意一下,尽量看其他三种格式的图焊接,- }* O, }7 G; t4 I5 t9 X  e
    6 ?7 X+ e' _- H" |: y6 K3 I. i# ?
    如果论文里面的原理图和原理图文件夹内的图不一样的话,请大家以原理图文件夹内的为准,原理图文件夹的图是和实物配套的,可以自己截图或复制,然后粘贴到论文里面去。% G! ]& I$ y1 b" \+ W
    ! _! ?0 Y9 R! _4 Y! l- A
    单片机源程序:
    - x* i8 O6 _+ h0 t6 E2 Q! P# j7 N, d: j: F0 }$ ?2 x% @# T" S! H
    #include <reg52.h>                 //调用单片机头文件
    / I* h- z# I8 R' S4 e#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255) |+ C8 C$ {% ^' U
    #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535+ W6 a. ?; n' r8 A" a
    uchar a_a;
    4 y/ S! u  z% ?# k. T" p$ y2 W7 Q#include <intrins.h>. T3 o5 \5 I, l$ F, y- T

    8 V4 Z, D. {! q5 U3 d/ P
    4 C) W9 D% |! F//数码管段选定义      0     1    2    3    4    5         6         7          8           9        
    7 \: f$ }, o  N  Y/ J' l+ {- @uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x04,0x14,
    8 ]+ ]$ }! Y& o+ M) ^7 T: Z                                           0x0c,0xa4,0x27,0xc4,0x26,0x2e,0xff};         //断码" Y* y- p% ?( [1 d+ |5 E
    8 W: h+ `! e0 _7 @/ w* ^
    //数码管位选定义
    ) Z1 J" n1 w# d+ f' r* ]$ Y2 kuchar code smg_we[]={0x7f,0xbf,0xdf,0xef};
    + m7 L9 r1 G/ V8 E4 w. suchar dis_smg[8]  = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};        
    " L  Z$ Q  ?" y9 @+ K* W( J' duchar smg_i = 4;    //显示数码管的个位数+ r+ q8 }, E1 g( E- t2 ]" Z
    & u, M6 ~7 U- B4 \8 G4 C4 C
    sbit CS=P3^2;                //CS定义为P1口的第4位脚,连接ADC0832CS脚! @# J5 G( U+ G' J) B
    sbit SCL=P3^3;                //SCL定义为P1口的第3位脚,连接ADC0832SCL脚+ v! ^8 l! W2 S- n
    sbit DO=P3^4;                //DO定义为P1口的第4位脚,连接ADC0832DO脚$ o# F* v3 f+ a- p
      W$ Q5 J7 V/ q4 N: l) H
    sbit beep = P3^6;   //蜂鸣器IO口定义
    8 p) w5 g: g! |5 g9 T3 e* nlong dengji,s_dengji = 50;     //酒精等级6 O+ }. k/ h  M7 S: H' u) S

    " j* S, R& }: ebit flag_300ms = 1;
    ) ?* i4 ?1 P. Uuchar menu_1;        //菜单设计的变量
    7 K3 H9 l- `, L2 L" P9 h& o5 i- j7 b2 V
    #define RdCommand 0x01 //定义ISP的操作命令
    3 j9 c0 o! S+ y3 l- F! M. K" l4 Y#define PrgCommand 0x02
    ( x$ J, P' B3 H% k$ U#define EraseCommand 0x03 1 i" f- t1 B8 J9 [" j3 ^3 d
    #define Error 1; _: p2 ?% }; E" B4 ?
    #define Ok 0! }1 [8 z+ E: f& w4 |* m6 o# ~
    #define WaitTime 0x01 //定义CPU的等待时间
    * p8 b& l3 q7 a2 C( `0 hsfr ISP_DATA=0xe2;  //寄存器申明
    , @! t0 J5 Q! X3 w. c, ~sfr ISP_ADDRH=0xe3;
    # O' J, S1 F! @( K, `1 O( G9 f+ jsfr ISP_ADDRL=0xe4;
    & K* g! D7 U: T7 a8 v5 Csfr ISP_CMD=0xe7;2 K$ |. h: h1 C' S9 R7 ?
    sfr ISP_TRIG=0xe6;7 K$ a, B  T# B0 ^, ~
    sfr ISP_CONTR=0xe5;
    " V2 |* f( _* m) Q/ M& {% |# L4 b1 V$ L+ E2 D+ u' B
    /* ================ 打开 ISP,IAP 功能 ================= */
    - K- C9 l0 Z! H6 k; Bvoid ISP_IAP_enable(void)
    9 T  h( q& W" {# A4 j% S{
    0 G1 e1 h) U# V) T$ H         EA = 0;       /* 关中断   */% t  N! h# D; i5 j5 |6 d: [$ O+ `
             ISP_CONTR = ISP_CONTR & 0x18;       /* 0001,1000 */
    ; s$ J; b+ x% w; s! P         ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */* C' u7 F" g6 }+ k
             ISP_CONTR = ISP_CONTR | 0x80;       /* ISPEN=1  */
    3 p0 H4 p. g" L6 o0 Z# X}; z  @8 j( P  Q
    /* =============== 关闭 ISP,IAP 功能 ================== */
    + n" c) T% x( [void ISP_IAP_disable(void)
    3 f! f6 _) v& X3 G3 ^& w8 r3 {5 T3 k" h{
    8 q" _4 W- H0 U8 b% v         ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */2 }, G7 Z2 W, R5 m$ r2 F
             ISP_TRIG = 0x00;0 ~' H* Z) D3 h2 `
             EA   =   1;   /* 开中断 */
      J( u+ }6 `/ w( N: }}
    : y! [' \* g4 m" e3 Z/* ================ 公用的触发代码 ==================== */
      j/ Y& A) a1 j) r: l% `void ISPgoon(void)
    / v# M) `. ~8 f! ~" q  p* i{
    4 {9 r4 C3 u' ]7 W% y2 ?/ Z         ISP_IAP_enable();   /* 打开 ISP,IAP 功能 */
    " Y. Y. p0 }; X         ISP_TRIG = 0x46;  /* 触发ISP_IAP命令字节1 */
    ' n5 z- s( v2 j& D         ISP_TRIG = 0xb9;  /* 触发ISP_IAP命令字节2 */
    0 ~! t1 `1 x$ L( _* E         _nop_();
    + _% I4 z; _" t* H5 z: }}  F6 a- E0 C2 w6 O. q0 K5 T
    /* ==================== 字节读 ======================== */
    - p% E  F9 i9 N- [1 ?3 Zunsigned char byte_read(unsigned int byte_addr)
    ; S' s* N, u% c+ b) B{9 E0 e5 b5 ~5 p
            EA = 0;5 J$ s  T3 f! M' k! X# s
             ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址赋值 */1 I$ d" |  V5 R' T" t+ s8 C8 d
             ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);; R# j6 m7 }* P, y- g, p
             ISP_CMD   = ISP_CMD & 0xf8;   /* 清除低3位  */# ]- i$ t! K. {* l- v/ F, N
             ISP_CMD   = ISP_CMD | RdCommand; /* 写入读命令 */
    ' I' W+ z% L* F+ N8 a         ISPgoon();       /* 触发执行  */4 x& |8 j4 s$ @; e
             ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
    $ c/ W  F7 P$ C8 V( k3 r         EA  = 1;. J1 C+ R7 F) |
             return (ISP_DATA);    /* 返回读到的数据 */% U9 G& P  W/ G; R( E
    }7 p6 H3 `  U$ S4 r' h# N
    /* ================== 扇区擦除 ======================== */* h- ~9 M- i/ w9 ~' @! X
    void SectorErase(unsigned int sector_addr)9 Z4 s0 l% Q0 z
    {
    8 Z0 f- e! a5 H, B         unsigned int iSectorAddr;1 R0 j: _0 C; d: D( p( F! r3 p9 K
             iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
    9 D5 N6 p( }" x         ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);! D9 X9 h0 I0 \4 R
             ISP_ADDRL = 0x00;. V' k6 Z' k% M' ^
             ISP_CMD = ISP_CMD & 0xf8;   /* 清空低3位  */$ s+ K/ Z( b7 G! b$ E
             ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3  */
    % Y' m, M% h# ]" I" E% [2 }+ ]         ISPgoon();       /* 触发执行  */
    ' V0 M2 W) v: [9 L6 Z1 I         ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
    + t0 P: ?( }" @* [* Z! e}
    - {2 n1 l! k; Q/* ==================== 字节写 ======================== */' o) W  |, c: b$ B$ M
    void byte_write(unsigned int byte_addr, unsigned char original_data)  A3 C, @3 t5 @% C/ c
    {
    0 Q2 H& m$ C) F* }: |% [         EA  = 0;
    5 _, B4 m& |9 i- P7 z9 K; a         SectorErase(byte_addr);1 q6 j, q" S! M$ O7 \1 P
             ISP_ADDRH = (unsigned char)(byte_addr >> 8);  /* 取地址  */6 _6 l. ]9 O0 h4 f2 w
             ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
    $ ]/ Z, @, }, j6 c         ISP_CMD  = ISP_CMD | PrgCommand;  /* 写命令2 *// P" a9 s9 a- v. Q. U$ \
             ISP_DATA = original_data;   /* 写入数据准备 */
    6 ]5 g1 ^1 [/ m4 \! N  z         ISPgoon();       /* 触发执行  */
    3 H/ R2 Y, o/ R+ ~2 {' c         ISP_IAP_disable();     /* 关闭IAP功能 */7 q7 O( `# r% `; T5 _8 x  e8 x1 ~! q
             EA =1;8 d7 X/ A1 M+ R# d+ w6 w; [
    }7 d5 x" }4 @! [7 J! n- `( T0 P

    ) b0 |# s) i& l$ r. Z
    7 ?$ J* O1 m& I7 Q, y2 q9 z, S/***********************1ms延时函数*****************************/7 f, q4 X/ U; l6 x' r3 J
    void delay_1ms(uint q)
    ' ], |, N4 ?0 `8 ~% T2 g{* H1 x! C% J4 S9 o! A2 q  \
            uint i,j;
      ^) N) W4 ]$ f2 D% b/ c        for(i=0;i<q;i++)+ r$ D) Q: U, B/ n  c8 E$ A+ z
                    for(j=0;j<120;j++);; j+ l/ G. A/ k% [. x
    }. A2 s* @) p/ T2 L) q4 b

    3 p# U" Z) [* r( ?- e7 |1 q2 u/******************把数据从单片机内部eeprom中读出来*****************/; j7 Y2 m" b# O
    void read_eeprom()         //读出保存数据. z( d  ?; B, j# X: Q: T
    {
    1 ^* Z- ~" G* W$ k" d4 E* J6 y        s_dengji  = byte_read(0x2001);
    7 o# G% @" l5 K0 Z# N        s_dengji <<= 8;
    - `. Q9 p) n- x: i+ N7 ^        s_dengji  |= byte_read(0x2000);0 Y: f9 L; F- w- x
            a_a      = byte_read(0x2058);/ t' i. ?7 _" ?1 m; P$ X
    }/ h" ~; g" w, a% u" |0 ?& x

    , ~, ]' R% P4 L/ B% a/******************把数据保存到单片机内部eeprom中******************/
    + L! ]1 E5 C! [2 L/ m* X! A7 S6 V2 J* \void write_eeprom()        //保存数据$ S$ ^3 V# ]% Q6 k, {/ }
    {
    ( Y) _' m6 S: G+ s4 h2 a        SectorErase(0x2000);
    3 h, w: W6 t  t7 t7 V4 ]        byte_write(0x2000, s_dengji % 256);, O; n# H& l& I6 e5 A3 ]2 X
            byte_write(0x2001, s_dengji / 256);: [+ @6 e( F' I! T' O# K
            byte_write(0x2058,a_a);        ( B" h5 s! e* _$ m( q& X* h1 C
    }
    $ z( s# w# F# j  A; a9 V6 b: M1 m% w! A1 H  c
    /**************开机自检eeprom初始化*****************/, P7 Z+ y* ]3 z& z/ n
    void init_eeprom()         ////开始初始化保存的数据5 c! H* ?4 w. ?; B2 ~9 t/ c$ N
    {0 |* v: P6 ~) I( P3 D
            read_eeprom();           //读出保存数据
    * ~1 B& g0 x5 Y. g        if(a_a != 33)( [" f) c8 C" a& Z; \4 [
            {
    8 p, S0 \3 U0 e6 h                a_a = 33;
    9 c0 S* \9 N# w2 W9 T                s_dengji = 80;
    & V6 }3 |8 P5 z2 g                write_eeprom();                 //保存数据
    ) O' w2 }: h, l- Q# x  l, V7 a6 e        }
    ; w' g& j% Y8 `. |" N}
    & \+ Z: x8 P# g0 g2 h( a- B1 [2 f
    8 z/ I6 ~2 V$ E, J5 l; F; R2 X/***********读数模转换数据********************************************************/        9 v0 D7 k, ?/ O$ T/ j9 ]6 U
    //请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的2 b6 N3 m( ?6 r) E0 _
                                                    //  1  0  0 通道/ |" B3 p/ @2 Y) G# k
                                                    //  1  1  1 通道
    5 V0 o* Q8 _( D( v5 q) n! z& U8 Kunsigned char ad0832read(bit SGL,bit ODD)# f2 B0 t; |5 _6 J( n4 R: M$ C/ r4 ^
    {
    # A: k4 A) A: z$ ]2 G/ F7 A        unsigned char i=0,value=0,value1=0;                6 m( i2 }9 A  x7 M* b; i2 o5 \
                    SCL=0;
    8 s3 A/ R; i- z2 T- M( ^                DO=1;
    / @2 P# |/ H) D* P( [/ O                CS=0;                //开始. L; O" B: g6 M; C+ e/ A9 q, S3 {
                    SCL=0;                //第一个上升沿        
    . [9 f/ N, e* |" `                SCL=1;3 r1 B( Q. l! b  f( D0 Z( d
                    DO=SGL;
    ' k& ^5 ^- Z8 [5 L. H                SCL=1;          //第二个上升沿" {0 X& h! x. x: T7 r! E- J
                    SCL=0;
    8 s: c1 b$ E, h* x" V+ s- l# j                DO=ODD;. T+ n' R  C) ~# [9 n, D. g
                    SCL=1;            //第三个上升沿) L, ~4 X: _, ?' O: O
                    SCL=0;            //第三个下降沿
    8 {5 `3 e* B4 d: F: n3 H                DO=1;
    ' {# O6 c# H  d( N3 X                for(i=0;i<8;i++)
    : s$ S! C! V6 H9 E1 C2 V4 \9 m1 q. p; B                {
    % w; _  W+ _2 c/ n+ @0 F                        SCL=0;4 w/ _0 ]6 P9 i2 F# l! H
                            SCL=1; //开始从第四个下降沿接收数据
    # J* E- V, X$ X; J! {. B$ ~                        value<<=1;0 `' _2 \9 S# j" V
                            if(DO)7 m  A: i) Y) p, q; L
                                    value++;                                                - f4 \9 G1 U# b  T
                    }- x9 f6 X) e6 f$ X; Y8 N
                    for(i=0;i<8;i++)
    3 g1 H/ n1 s$ n0 g1 {                {                        //接收校验数据2 }3 V- R1 \0 h3 H% E5 t/ @% @8 I
                            value1>>=1;
    ( }4 r) J. l  }/ ^                        if(DO)7 S. }! T: X& z" D- }) L* P
                                    value1+=0x80;% Y' N2 f- k9 h! f* w! S- b
                            SCL=0;7 U( L8 _4 x. E! c
                            SCL=1;! v5 z& t; Q; O: p8 q( l5 D  b
                    }
    : k6 m* Y& A7 l2 e# ~                CS=1;* m. T7 l# o' E+ U
                    SCL=1;        
    + L3 }0 a* h/ S3 q9 j# c                if(value==value1)                                //与校验数据比较,正确就返回数据,否则返回0        
    ! c6 y* k8 v& h' F, u; b0 Z6 H& s8 l                        return value;! }! p! k( f4 }+ D; G8 p2 @$ P" w
            return 0;
    2 q6 b3 J7 V7 E, j/ i% m$ {}
    . a' x5 G$ @  c' [# F7 S9 K0 X) l& F/ ?
    /********************独立按键程序*****************/9 J! n  R# ^- x% X* J) y
    uchar key_can;         //按键值
    . W- x. N7 f+ D/ k9 A9 p/ K
    $ P4 R9 {! m5 `& {& A$ C- E" zvoid key()         //独立按键程序( V( T2 Z- ?+ t7 Y7 m
    {
    5 W  x. j) ^- X2 L3 {$ K        static uchar key_new;! _% T. }0 F3 z/ B3 I
            key_can = 20;                   //按键值还原# l5 U3 v, _! `) j8 Q' \
            P2 |= 0x0f;                                        //把按键的IO口输出为高电平
    + W$ U( L1 f) a/ q        if((P2 & 0x0f) != 0x0f)                //按键按下
    ( r4 C* n) p" B% v        {
    * ~1 P  m& b1 |" B3 F  T, a                delay_1ms(1);                     //按键消抖动
    . B9 l$ W4 s! j4 A4 \' ^! H9 k0 i                if(((P2 & 0x0f) != 0x0f) && (key_new == 1))
    - @! H* b  d$ o# `9 S7 p0 s8 q+ n                {                                                //确认是按键按下9 Z8 ^7 j7 B$ Z/ D, x
                            key_new = 0;
    0 r& k  w" s" |" ^! y                        switch(P2 & 0x0f)
    $ {% d6 k* f$ V6 v4 X                        {7 g1 S, z$ {- M7 t
                                    case 0x0e: key_can = 3; break;           //得到k1键值
    & e) r" A# r4 u( ~' C3 h- U                                case 0x0d: key_can = 2; break;           //得到k2键值3 o* ?; x3 {8 _
                                    case 0x0b: key_can = 1; break;           //得到k3键值
    ; A# G% F( s9 }  {; t//                                case 0x07: key_can = 1; break;           //得到k4键值, Y9 Y2 L( V4 v9 M# m  ?5 T' B& n
                            }
    ; {7 n: z/ b# [& X9 ]+ z5 }                }                        ; k8 d3 E, {. g! P, b; ~, |
            }9 i" v& v9 E0 g; N
            else - n% `  F9 w) |, ?5 W1 T
                    key_new = 1;        
    # c6 e! G& q7 `& {+ i6 t9 x- |}
    6 l# |! }1 f& e' S7 w8 L. p# v$ Z6 E
    ) m; m& m2 k6 o& D) o. @* @" i& B" ?, {  P

    * z2 Q" G: S; F9 g) o/ q/****************按键处理数码管显示函数***************/
    5 E+ T- l* v8 h: F0 a& ovoid key_with()
    1 f  _4 p4 |0 l! c- x8 n1 c8 |% G( m0 F6 X{
    1 b1 q: k6 ?! \0 ]1 G2 g7 T        if(key_can == 1)                   //设置键
    $ \5 S4 F& A; w% i  W/ w) d        {  l5 ?+ u7 e" a  w5 ^% m
                    menu_1 ++;  o( E3 ~5 ^% D/ p' c
                    if(menu_1 >= 2)
    7 D$ s: _- F8 @( S2 V' g  e/ z                {
    " T0 p+ F( S9 `" k" T9 I# O                        menu_1 = 0;
    0 S  z4 d. N# ]                }6 ?5 x; C6 M- [
            }
    9 o; d8 e- I5 A; l3 ^1 U: \        if(menu_1 == 1)                        //设置酒精报警值
    / H7 L& c) l; E3 @8 _! m8 [        {
    0 N# d; j9 Y. R" P                smg_i = 4;                    //显示4位数码管- `+ P6 z/ H$ k, Y
                    if(key_can == 2)
    # D: ?- {6 @2 ^5 H6 w                {
    " W6 a% I' m% P# n                        s_dengji ++ ;                 //加1 # L. U0 f( g: g: n7 B) o
                            if(s_dengji > 500)
    5 J' m* O: J+ R) m                                s_dengji = 500;+ R. p. @9 j) {  e/ E4 |
                    }( b. b6 P1 y" [5 S+ L
                    if(key_can == 3)2 n) M2 s! {: S9 ?1 J
                    {
    4 Q0 Z# g" w$ `; @' \                        s_dengji -- ;                //减1        # }& h( y  P- p: }& w$ J3 _# i
                            if(s_dengji <= 1)
    $ C0 f" p% {  n, U# J+ A  o9 c3 H                                s_dengji = 1;
    , Z& k" H$ c- ?- Z" ^3 `                }$ ]1 \# }: |! S( `
                    dis_smg[0] = smg_du[s_dengji % 10];                   //取个位显示  O; ]$ _7 ~! h; }' V+ j/ G
                    dis_smg[1] = smg_du[s_dengji / 10 % 10] ;      //取十位显示2 Z$ A) @: i8 M" `* j- k$ @
                    dis_smg[2] = smg_du[s_dengji / 100 % 10] ;           //
    9 {! q: L* D6 L" Q* F: X                dis_smg[3] = 0x0c;         //a6 b2 p( G, n1 a; ]
                    write_eeprom();        //保存数据9 n, r. D# T$ S1 Y2 ^3 F
            }        
    3 C4 b- L$ R( [}  * {) f3 z* V* d# O$ ?& u  P

    0 t& L; P' I6 G7 t  w6 `  s: I1 ~8 N1 S/ X" L
    /***********************数码显示函数*****************************/
    , q+ J9 L: _9 D1 K4 r; Wvoid display()
    3 [3 }" E5 H( x* g$ |' j; y" F{: n- `; ^& P2 S/ m' ~* H# k, @
            static uchar i;        1 t3 }2 l5 t' P% p% n7 G# G: j
            P1 = 0xff;                         //消隐                                          
    0 D+ k3 o. J2 j. v+ [8 v) n7 F        P2 = smg_we;                          //位选
    $ J1 E% I" O! p3 P" m        P1 = dis_smg;                 //段选           
    ; ]0 @8 U% E0 s1 I) V( r        i ++;7 S% {& h. @& k3 `. \% U5 a. ]
            if(i >= smg_i)
    . K. t# I: H6 Y/ D                i = 0;          & h- C- @0 W0 K" P7 U
    }) H+ ?# q6 x/ _. N) X6 v2 }
    . ?1 n9 F( O; N2 H7 `# f/ h0 {. b
    4 X# e1 F" ^& E5 P7 U
    /*************定时器0初始化程序***************/
    + J  X1 Z3 S3 G1 ^$ \. Gvoid time_init()         
    % v; j5 D7 r: i0 i{; W4 K+ B9 D1 i& j7 a, V
            EA   = 1;                   //开总中断
    + z; h* a/ r. b. H; O        TMOD = 0X01;          //定时器0、定时器1工作方式1! v; W% j) ]- y$ Q; a
            ET0  = 1;                  //开定时器0中断
    2 o/ \/ L) e$ d, S( m        TR0  = 1;                  //允许定时器0定时8 G" O8 l) m  h  m7 [: T; _# c
    }
    ' o2 f. `7 l6 y
    8 Y: \7 f# c* [) u8 H& S/ H, Y! Y$ S

    , |7 I- u1 [: E/ h7 s/****************报警函数***************/+ ]$ P  ~+ l2 o( \2 u
    void clock_h_l()  [% D7 @$ [% d2 U. W4 ~& C
    {
    % n. C% M/ A6 U# B: x. {        static uchar value;
    6 b* ]6 p: ]) g+ Q. K3 O* L8 h+ Y        if((dengji >= s_dengji))                //报警$ }% T) T6 r+ `; a
            {1 }8 T: G+ V; @* }- R
                    value ++;
    3 }6 A9 D  z* v- }& w# n5 f                if(value >= 2)1 |- J4 q0 T0 _" K: ~8 K. h
                    {
    5 ?; D& t) Q( Y                        value = 10;8 t1 O! [5 W; W2 ]: C: f( R
                            beep = ~beep;          //蜂鸣器报警
    " m; p2 v' ?9 `) @                }+ Y- T4 a7 r  I5 E! e
            }else
    + d* X6 ^( L/ X; r) k$ M        {  X% L" G& X6 n( y) b3 C
                    if((dengji < s_dengji))          //取消报警
    2 n  ?+ z% H% x                {( G3 `+ g" {, O. T: T
                            value = 0;
    " G5 E" H% @7 N$ {- U                        beep = 1;: w$ K# S  Y6 X1 T/ Q
                    }        
    % `8 U! W( W: l9 g( o6 A) }9 e7 O        }3 {6 t" H/ ]/ A! u

    * }& S5 m; o2 S! T3 W9 |- J* H8 A}
    , z4 E/ `( S7 ?- r/ `# l& @
    ; [- ?* U  p  S9 B$ h" U% X/ d/****************主函数***************/
    % i: q8 r3 V7 A) f: Vvoid main()
    $ g8 ]5 Y, |, C0 j5 x0 c: e{
    0 D) e- E/ [: ~* E  p: D$ h        beep = 0;                                //开机叫一声   
    ( B2 |2 b$ c; c8 O        delay_1ms(150);
    " Y% {0 }' b# `& p( ?' N# U        P0 = P1 = P2 = P3 = 0xff;                //单片机IO口初始化为10 u3 x- i- P6 p6 }4 J1 U8 w( W- }( t
            time_init();                                //初始化定时器
    $ S7 I% X: R0 g) ~2 }        init_eeprom();              //开始初始化保存的数据5 P8 U8 v: F% i# a
            while(1)- m# a2 Q2 Q6 U3 Z* n% p
            {- M$ L5 w7 Z1 F( \3 L
                    key();                                        //独立按键程序
    - i' I& Y% Z8 |/ \2 c! d                if(key_can < 10)
    . c( O3 i7 m( k3 g% |& |                {
    / ?2 p/ [) s0 A  c* \                        key_with();                        //按键按下要执行的程序3 J+ F5 b* W) O3 a$ f8 l" f
                    }
    ; L, M- ^9 O5 L& D# ^  \                if(flag_300ms == 1)9 W# K! r5 }# Q( u
                    {                / s3 u+ Q# E: |5 R
                            flag_300ms = 0;
    # \5 }. [* ^' f% F, t/ C                        clock_h_l();
    5 S9 `% j4 T1 a- I& l                        dengji = ad0832read(1,0);        3 S5 @) E# G. s. r
                            dengji = dengji * 450 / 255.0;( K- `/ b+ ]2 {5 g1 H
                        dengji = dengji - 100;              //首先减去零点漂移,一般是100mV! u! Q/ y$ l, F
                            if(dengji < 0)
    4 x2 o9 C/ b% S/ O: S                                dengji = 0;        
    / {5 q- x0 g) i( C                        dengji = dengji * 2;             //将mV转变成mg/L,系数需要校准   
    7 N! Y5 H) i5 o$ w8 q! u                                                                  //电压每升高0.1V,实际被测气体的浓度增加20ppm ! v1 N" M+ i- S; Q; T8 ?! e0 S
                                                                      //1ppm=1mg/kg=1mg/L=1×10-6 常用来表示气体浓度,或者溶液浓度。       - E( Y# @$ ~4 E1 r8 H8 }
                            if(menu_1 == 0)
    ( o& s. m% L8 S( q) Z2 f. z  U+ n                        {1 p* S# S! q! g1 u8 w) X7 y
                                    if(dengji >= 1000)$ B' U  K' M' g' b& `6 s4 E# t! [
                                            smg_i = 4;/ \, q8 |: f+ k! {
                                    else ; A7 R; c4 d+ r
                                            smg_i = 3;
    : g' Y- C: |& g# c                                dis_smg[3]=smg_du[dengji/1000%10];        //千位: f% O4 K' i9 k7 ~8 g
                                    dis_smg[2]=smg_du[dengji/100%10];        //百位
    6 i. ^+ S' S! I( G) k- I                                dis_smg[1]=smg_du[dengji/10%10];        //十位
    - ~. E7 F; g- T& u$ i                                dis_smg[0]=smg_du[dengji%10];            //个位        ADC0832为8位ADC,数值为0~255,我们将其分开放入l_tmpdate数组中显示3 }. N6 A/ W7 J" y7 j3 N6 w2 q
                            }
    0 f9 C: o8 u  F6 `) L                } 5 i8 C6 v+ F, e# X" k! T
            }
    $ ^6 i* t$ v/ T3 |5 S}6 X3 i" _  L% {  r" D* a+ g; @
    ! o8 |3 [2 l  V; ]5 ?4 Q% v/ J
    /*************定时器0中断服务程序***************/; @& u1 n6 g! C7 F: H
    void time0_int() interrupt 1
    ( H% }9 C, `6 o& |) e0 V{        + n4 N: F2 W8 U% ~! L  ^
            static uchar value;
    - t: s9 d0 v0 i; V+ q% s& X9 Q* a% G: a9 Q6 W- u& C* Z7 r+ L) s

    3 x- S" c9 Y, m! U3 i3 H: U…………限于本文篇幅 余下代码请从论坛下载附件…………! ?6 d  i( T/ h9 |
    2 S+ Q* \+ H' ]1 P/ z3 R8 g1 p1 C
    游客,如果您要查看本帖隐藏内容请回复

    & P) t2 `% _' ~- o- F5 M9 {: A# G" j- L" s

    ) c1 v  Y$ J+ |9 U

    该用户从未签到

    3#
    发表于 2019-1-24 15:26 | 只看该作者
    看看楼主的代码,谢谢分享
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-8-11 20:58 , Processed in 0.171875 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表