|
* m: i7 m H: Z3 ^#include <STC15F101W.h> // 包含 STC15F101W 单片机头文件
{5 j j( M4 @' n& |* D
* }0 F1 z4 W+ G3 R) l, O// 定义引脚- P/ o4 Z# _7 V) A
sbit P3_2 = P3^2;
: T& K- e. H$ d8 Csbit P3_3 = P3^3;
7 g' A* h6 o& j/ a: t
( d" W$ s$ Q. M0 n1 q/ Q// 定义模式变量和计时器变量& d, D' R7 j" k- D2 x
unsigned char mode = 1;
6 l9 M4 O7 L5 {+ |! g6 Vunsigned int timer = 0;
' D. g6 [$ u6 J4 y& W4 E7 s( O& r2 s+ W( Y# Q" J- G
// 定义上一次的模式变量,用于断电记忆
7 l: L, J) \' q) Zunsigned char prevMode = 1; // 存储上一次的模式
; X- K, _" H% ^6 r4 W6 @+ R6 G- E; C6 r: {, p
// 用于存储定时器中断计数
9 @5 y' K) M+ w7 L! J8 L1 tunsigned int interruptCount = 0;4 Q, a+ T# p) Z. s9 ^4 V
! v3 r4 p0 c1 w$ y1 |, \2 E
// 定时器中断服务程序
) l9 M, k0 A. }% nvoid Timer0_ISR() interrupt 14 a3 p8 X) G7 m2 d7 Z
{- R6 @) ^% p0 H$ I9 P+ H
switch (mode) {
2 |- R& k% p/ ?( S6 B case 1:
' B+ ]2 g" u. _. v P3_3 = !P3_3; // 切换 P3.3 的电平
' k% V" s2 ]+ i8 S( H interruptCount++; // 中断计数加 1
0 j* S/ q* O1 j2 y if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒% ]+ v8 ~/ W8 ?4 T2 s1 |, r5 k
interruptCount = 0; % U7 V w1 n8 D2 }1 z, Z# C4 i, k6 n
mode = 2; // 切换到下一个模式
5 E {$ u: s! r& v2 n* t }
. y; x1 O/ G% o. s; b- [, c break;: G, K( F, c3 i4 v2 ~5 J
case 2:
1 u9 X0 l1 T) Y: Y" r. x2 l P3_3 = !P3_3; // 切换 P3.3 的电平
; Q8 M8 w) p o. a% A- k: [ interruptCount++; // 中断计数加 1% L0 H) {+ D: r. B% q0 W
if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒0 c! I! P% L5 G$ i
interruptCount = 0;
5 c2 W: n5 h6 M% s9 P mode = 3; // 切换到下一个模式- t( ?2 Q8 C8 `& H% s3 p' f
}# z, o4 ^% z: T, d/ @$ I1 m0 C5 [/ f
break;
% k1 N) @1 N- F6 g9 h case 3:# C- j# A8 a! F0 I0 D
P3_3 = !P3_3; // 切换 P3.3 的电平* E/ s/ o- e3 @: {7 c* ]
interruptCount++; // 中断计数加 1
6 i# |4 V2 }9 R0 ]; x5 A9 r if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒
0 J- W/ c1 d6 f2 o0 V# d! a interruptCount = 0; 1 M* j |0 |4 M j
mode = 4; // 切换到下一个模式( S7 O- q2 f) p* L, L- D3 j# n
}
* Y# [: K* C4 K7 ?& D* M6 J z break;
9 P' ?. P& d* @% f case 4:- l' v3 I9 r" b3 h# N, X3 a0 W6 ]# a
P3_3 = !P3_3; // 切换 P3.3 的电平: L6 V8 X- c6 l& ]( |* V
interruptCount++; // 中断计数加 12 f4 ] y9 B. w2 \0 f: A: a
if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒
7 Q) }9 M3 N! C. c% [ interruptCount = 0; " C3 Y$ b& q- p. S2 Z1 X
mode = 5; // 切换到下一个模式
d/ [( R, L l6 G! [" M }- s h8 G( h* m2 R# m9 P4 U3 o
break;
3 S% k6 S- P- p) K6 b& V case 5:+ T. `: e0 @3 G. q
P3_3 = !P3_3; // 切换 P3.3 的电平' y7 E4 }' m6 m3 Q$ t7 E$ v
interruptCount++; // 中断计数加 1
; ]/ R6 W' N1 f: F# s' ~+ T+ m if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒
. r7 `1 o; v$ e7 P! v: x I" l interruptCount = 0;
# E" S7 ~2 Q4 }" a mode = 6; // 切换到下一个模式# H* L- q, d$ z- d. |! G; L9 u
}4 c, |9 w2 \0 f! U4 |% ^' m& w/ Q& n6 U
break;
) v8 R z6 R6 X case 6:
" R6 r7 U) `2 d$ z' t' i P3_3 = !P3_3; // 切换 P3.3 的电平
; _: C! e) o8 z5 H. q, b; d! P interruptCount++; // 中断计数加 1
( k3 J7 Q" W k* f if (interruptCount == 50) { // 中断计数达到 50,即 0.5 秒4 q3 V9 A4 g+ r7 {+ {; h
interruptCount = 0;
7 J1 u2 Z6 C" I mode = 1; // 切换到第一个模式,开始新的循环
9 z' K" `+ b+ F( ~4 ]: \: ~ }
- M0 M# H, y# o+ F break;. P7 q: c" V3 A* Z; A1 D- H
}
$ a% r- |4 K9 U% D0 H8 X% }: U. R}
+ N* q: o+ L( p% O' m- T# {5 w& [8 q; R3 e
// 初始化定时器
9 {! ]; V: j3 }9 R9 H/ kvoid Init_Timer0(), W+ |5 t5 J, \3 O) B _6 ]; b0 s* |
{
# }6 [+ [2 K/ J4 W# e3 D R TMOD = 0x01; // 设置定时器 0 为工作模式 18 P- K* V: C: b
TH0 = (65536 - 50) / 256; // 设置定时器初值
- x0 U6 V, P2 W: P" p TL0 = (65536 - 50) % 256; // 设置定时器初值
. r5 @( `. Z# z; P& Y7 ]5 Z7 v ET0 = 1; // 使能定时器 0 中断, i% m/ L G' W/ X6 ?
TR0 = 1; // 启动定时器 0; S! C" }( t( u" ?4 k" e
}9 V4 m3 _7 w5 ~3 a1 N
0 w0 c# c) J7 n% z {0 W// 主程序, p1 E0 @- v. i
void main()
2 @/ L' b' b& A \8 \ S& w7 v{- j1 d7 U& y+ L% |2 O) Y
// 初始化引脚和定时器- R/ {; w) Y! i8 H, @& D4 x% Z# c
P3M0 = 0x00; - G* I. Y6 N" C. |3 t
P3M1 = 0x00; 4 m# }( y& A( q( P$ t
Init_Timer0(); 3 m% D5 z! l! A' _. V
% L+ V7 f! B7 s
// 上电默认模式 1
0 a0 a$ I- v- r. i: ~7 s mode = 1;
3 x* S+ c# P5 B2 c; i) V
" J1 J1 d8 H9 ` // 开启总中断
: `+ a8 p; k5 b ` EA = 1; V) X3 ~- P7 }' Y% P! Y
2 k' W# j m; ^" f. G while (1) {
' F/ z8 ^6 q0 N; I: F3 p6 H% l if (P3_2 == 0) { // 检测 P3.2 按键按下
8 Q: Y; A4 c* O: E, M$ H mode++; // 切换模式
6 e6 i- K8 b O3 @5 C% m6 [ if (mode > 6) {5 }' @: k: ^) `7 p$ w& Z* P3 t
mode = 1; // 超出模式范围时,回到模式 1
6 u) N9 k, W8 i: @+ f1 J- W }' e& o, L6 f& Z v, t$ i5 R
prevMode = mode; // 更新上一次的模式
, W5 V- `: v. }( a) q0 ] }
8 e- A5 p) L+ A/ F F }/ v1 I% ] Y& v5 V
}
6 f$ T+ B; d* L; z$ |* K2 m, L# {9 Z# m( }, H
求指点,编译出错!8 t9 W2 @: n: \. U, Q. _
4 n+ {" ]! f% m7 ]6 w# i |
|