TA的每日心情 | 开心 2019-11-20 15:00 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
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 |
|