|
$ C. g5 i( {0 Y: D# F& N# O
#include <STC15F101W.h> // 包含 STC15F101W 单片机头文件0 f4 z, _# F; ~7 k0 J: N
# D* q- X8 _! @0 w+ y% S& C% R) P// 定义引脚: Z5 @! P/ D% t: K% @
sbit P3_2 = P3^2;( r$ i; E( g* p, ], r
sbit P3_3 = P3^3;1 m) C) ?) ] ?# q* }2 z8 ^
5 J o, l0 Q. y
// 定义模式变量和计时器变量! E# R" R9 R, \# O, e9 m
unsigned char mode = 1; 7 h: k- W5 e3 l+ n8 F
unsigned int timer = 0; " f' C& `* W! V0 b2 [; @& z
1 Z( V6 P* O0 r* H( F1 x: k& W9 U& L// 定义上一次的模式变量,用于断电记忆
, \8 V" r2 I. S- v9 C4 wunsigned char prevMode = 1; // 存储上一次的模式, r( r+ a$ X* _1 R! a) Q2 O% } \1 }
5 n0 Y$ J1 V2 M0 p5 @3 y// 用于存储定时器中断计数
9 I6 o( f$ t4 |6 o) Nunsigned int interruptCount = 0;! E! f$ [: x* t( G8 R7 ?! y
: D: I/ W& R: P* I& t: K9 @
// 定时器中断服务程序% {0 X8 A9 J( k5 F; G; j
void Timer0_ISR() interrupt 1
; G, u6 h) E9 p4 E{
* H+ j' z$ R. Q1 ~# V- ^ switch (mode) {5 }# g" _$ O' D1 Q
case 1:
2 E* T4 O" ~: L* n0 [ P3_3 = !P3_3; // 切换 P3.3 的电平9 U# r, x1 g" O5 [
interruptCount++; // 中断计数加 1
1 W$ C' `/ t! |! | if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒3 X. K& c8 l( u
interruptCount = 0;
# v3 p n3 q% t/ u+ o. u E mode = 2; // 切换到下一个模式8 \% f9 f3 M' b# F2 S: L
}0 L8 ]: Q Y' C4 |" E
break;
% r1 E9 k3 i% N4 v" k# B case 2:7 n/ e9 x5 _! u" ^9 C& Q
P3_3 = !P3_3; // 切换 P3.3 的电平
. |1 x% [& Q% }& _4 S7 j interruptCount++; // 中断计数加 1" r6 `$ W' ]+ z+ H; ~+ }; d
if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒9 H" _+ r2 B0 ~7 X, W! `
interruptCount = 0;
: H) X# J' q7 }, S2 b- T mode = 3; // 切换到下一个模式
/ D, g2 w2 L1 @ }' `% [0 X( T# n* T+ J. @
break;
3 {8 x: |( E; o2 \7 B% Z6 I case 3:
% d: N# Y3 D+ g' x P3_3 = !P3_3; // 切换 P3.3 的电平
* P1 p% b: M; s8 W interruptCount++; // 中断计数加 1- A/ L2 i) m; p
if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒
5 Q3 q" [% G4 i; }$ C& n- [ interruptCount = 0;
( p4 d* N$ t# q8 C/ @5 S! ~1 F mode = 4; // 切换到下一个模式
. J% Q0 |: z+ u6 O! J9 a }, [2 L& ]" C" L# Q8 H
break;2 q- ^: Y; Y3 c! E. a
case 4:
5 L+ K" N+ T- c/ \ P3_3 = !P3_3; // 切换 P3.3 的电平5 O2 U( r. B4 l* B
interruptCount++; // 中断计数加 1
4 o; {. A1 f; L( z if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒
5 I$ k5 B7 Z- k; ~, r* \# s0 z interruptCount = 0;
7 B: v5 {) U4 T8 {5 \1 { mode = 5; // 切换到下一个模式2 d' Z8 O3 v& \0 k0 b( |% l
}
6 {# H9 K6 A* c# K, Y7 { ~; J break;8 G) C2 C1 V W5 V- u
case 5:
& M, o! W8 G8 r) v P3_3 = !P3_3; // 切换 P3.3 的电平0 E. ~, _6 z) C3 P) _9 Z
interruptCount++; // 中断计数加 1
' }! d) }" Q; J6 ~2 P5 w/ x0 E% w if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒7 r! J7 Y/ ]* n9 H' x- e
interruptCount = 0;
# C) D& t' p9 ?9 P mode = 6; // 切换到下一个模式8 N' w' s3 J% B. b
}
4 Z, L* S" ~( J8 ]: Y! G" `0 t break;8 m4 m8 a. D+ F M& Q( K) S/ y
case 6:
) y4 g' I, ]5 R, p1 L2 }1 e$ { P3_3 = !P3_3; // 切换 P3.3 的电平
0 B2 [/ t* ^" U) L6 J; j interruptCount++; // 中断计数加 1
) y8 M- |. `1 p0 _2 l/ D% X) ^( Z if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒, Q+ @! c9 i- s" h
interruptCount = 0; + s' b; P' b! f( D- Z1 {
mode = 1; // 切换到第一个模式,开始新的循环
7 _7 w( E$ }" ~6 { }
( N g+ |( c1 k' t- c break;' ?8 d6 L- k& I: }9 I8 z
}* ^' [+ ?/ F4 s' k- t6 `8 x
}4 J0 ~( j$ c% w1 W' Z$ F
. B: [9 w! F6 x// 初始化定时器
( k" P- P* U) `- I, k4 }3 H: \. zvoid Init_Timer0()
( r/ y" |$ U6 o& _{
2 n T3 T$ |: O6 F& l0 T TMOD = 0x01; // 设置定时器 0 为工作模式 19 _0 h! V' Z7 y
TH0 = (65536 - 50) / 256; // 设置定时器初值
+ [3 |* S$ p: ]. o% T5 w' Q TL0 = (65536 - 50) % 256; // 设置定时器初值9 Z) p; F3 s4 g' H3 l* g
ET0 = 1; // 使能定时器 0 中断
& V4 j. T* L0 P1 U! G8 d% U! g TR0 = 1; // 启动定时器 0
1 H/ J2 n# b- s G* h; O" N}
2 X( S$ }/ z% W% n1 N( n- w% }- v0 q
// 主程序
; [/ A- N7 d& d' [void main()6 F, R& f, B) G: Q0 R4 z3 y+ y
{3 ?: G L1 [' ^/ N8 I8 J
// 初始化引脚和定时器
, h: G4 t0 G7 v9 `+ P+ u- N/ I P3M0 = 0x00;
" e+ L$ E- d) X6 `# @/ W0 g* Q P3M1 = 0x00;
) R9 T: |" ]6 P" x+ |5 n) _. } Init_Timer0();
7 [2 j9 P+ P( _, z- q
9 E0 R, S5 x3 c8 { t- H // 上电默认模式 1" C% |, N1 W6 _$ ~8 C# X& U: J8 b
mode = 1; ) S1 }5 ~# |5 P# Y: |1 E* x. s
9 V8 ?! R2 o! M# |4 g // 开启总中断
0 V- e& F' g0 t( e9 J EA = 1; ) p4 H9 D n0 Q4 q- o
$ Z3 v* _2 `! k1 V+ h! Q7 R while (1) {
, S: Z6 v% c, h5 _ if (P3_2 == 0) { // 检测 P3.2 按键按下
/ C, I4 |& d! n mode++; // 切换模式$ \+ J$ X* A: M9 F2 r
if (mode > 6) {
" l+ }1 d6 k) j1 M7 ] mode = 1; // 超出模式范围时,回到模式 1
; h7 \4 X4 I o }
: ]/ A' ~+ E0 u: V' P prevMode = mode; // 更新上一次的模式
. z/ I& U% m2 f- i }- l; C+ g" Q( g! g9 O, d) C
}4 U5 K4 Q, O' h; Q( c
}: n' ?1 l- @# K) _8 @# I
! m& M8 v: w- F$ o$ j% g( g
求指点,编译出错!
5 G W) M) H- q9 q- {
( K e5 ?9 [/ Q: h |
|